2009-04-21 4 views
2

Wir haben eine ASP.NET-Anwendung entwickelt, die mit der Google Maps-API zusammenarbeitet und die Logistik und Planung für eine kleine Reederei in unserer Region unterstützt. Eine der Funktionen ist, dass das Unternehmen eine Liste von Kunden eingibt und das System alle Kundenadressen als eine Reihe von Wegpunkten zusammenfasst, es an Google sendet und die Richtungsinformationen für die Route zurück erhält.Google Maps API - Finden eines Wegpunkts, der einen Fehler verursacht

Ein Problem, das wir hatten, ist, dass viele der Adressen in unserer Datenbank nicht groß sind und oft nicht von Google Maps verarbeitet werden können. Wenn wir dies tun, erhalten wir einen Fehlercode zurück, aber ich möchte in der Lage sein zu bestimmen, welcher Wegpunkt der Fehler war (auf diese Weise kann der Client dann die Adresse in der Datenbank korrigieren).

EDIT Hier ist ein Stück des Codes, der die Initialisierung und aktuelle Fehlerbehandlung behandelt:

function initialize() { 
      if (GBrowserIsCompatible()) {  
      map = new GMap2(document.getElementById("map")); 
      map.addControl(new GSmallMapControl()); 
      gdir = new GDirections(map); 
      GEvent.addListener(gdir, "load", onGDirectionsLoad); 
      GEvent.addListener(gdir, "error", handleErrors); 

      if (document.getElementById("<%=hiddenWayPoints.ClientID %>").getAttribute("value") != '') 
      { 
       setDirections(); 
      } 

      } 
     } 


     function setDirections() { 
      var waypoints = new Array(); 
      var str = document.getElementById("<%=hiddenWayPoints.ClientID%>").getAttribute("value"); 

      waypoints = document.getElementById("<%=hiddenWayPoints.ClientID %>").getAttribute("value").split(":"); 

      gdir.loadFromWaypoints(waypoints, {getSteps:true}); 

     } 

     function handleErrors(){ 
      if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS) 
      alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + gdir.getStatus().code); 
      else if (gdir.getStatus().code == G_GEO_SERVER_ERROR) 
      alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gdir.getStatus().code); 

      else if (gdir.getStatus().code == G_GEO_MISSING_QUERY) 
      alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code); 

      else if (gdir.getStatus().code == G_GEO_BAD_KEY) 
      alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gdir.getStatus().code); 

      else if (gdir.getStatus().code == G_GEO_BAD_REQUEST) 
      alert("A directions request could not be successfully parsed.\n Error code: " + gdir.getStatus().code); 

      else alert("An unknown error occurred."); 

     } 

Das Problem ist, dass die LoadFromWayPoints() -Methode in GDirections Objekt nicht Status zurückzukehren scheinen basierend auf jedem einzelnen Wegpunkt, aber nur von der ganzen Liste (wenn einer fehlschlägt, schlägt alles fehl). Die einzige wirkliche Lösung, die ich mir vorstellen kann (ohne Prüfungen in anderen Bereichen des Systems), besteht darin, jeden Wegpunkt in einer separaten Anfrage an Google Maps zu senden und seine Gültigkeit zu prüfen, bevor die gesamte Wegpunktliste gesendet wird für das GDirections-Objekt, aber das scheint unglaublich ineffizient zu sein (besonders wenn es sich um eine größere Anzahl von Kundenstandorten handelt).

Antwort

2

Wenn Sie das GClientGeocoder Objekt verwenden, um Ihre Anfragen zu tun, dann erhalten Sie eine entsprechende Antwortcode für jede getLocations rufen zurück:‘

function logAddress (response) 
{ 
    if (!response || response.Status.code != 200) 
    { 
     // log the response.name and the response.Status.code 
     return; 
    } 

    // otherwise everything was fine 
} 

for (var i = 0; i < addresses.length; i++) 
{ 
    var geocoder = new GClientGeocoder(); 
    geocoder.getLocations (addresses[i], logAddress); 
} 

Ihre various response codes sind, aber ich bin zu raten, Ihnen mitteilen zu wollen der Benutzer, wenn Sie eine 602 - unbekannte Adresse erhalten.

EDIT:

Yep, werden Sie nur einen einzigen Fehler-Callback erhalten für loadFromWaypoints für die gesamte Routenanforderung. Was Sie tun, ist mehr als nur eine einfache Geocodierungsanforderung. Sie generieren Anweisungen und Rendering-Overlays für eine Folge von Adresswerten. Ich schlage vor, ein paar Lösungen:

  • Sie könnten einen getLocation Antrag tun, bevor Sie Ihre loadFromWaypoints Anfrage (wie Sie vorgeschlagen) und dann die Breite verwenden, zurückLängenDaten für jede Adresse als Parameter für Ihre loadFromWayPoints. Dadurch wird die Geocodierungsverarbeitung von der loadFromWayPoints-Anforderung getrennt, jedoch wird für jede Geocodierungssuche ein zusätzlicher Umlauf hinzugefügt. Dies ist wirklich etwas, was Sie nur einmal machen möchten, wenn der Benutzer die Adresse zum ersten Mal eingibt (siehe nächste).
  • Wenn der Benutzer die Adressinformationen zum ersten Mal eingibt, können Sie zu diesem Zeitpunkt eine GCLientGeocoder getLocations-Suche durchführen und den Breiten- und Längengrad zusammen mit der Adresse in Ihrer Datenbank speichern. Wenn der Benutzer eine Adresse eingibt, die nicht geokodiert werden kann, können Sie ihn auffordern, die Adresse erneut einzugeben, oder Sie können den Standort auf einer Google-Karte auswählen (und den Lat, lng daraus erhalten). Dies löst die Probleme mit Adressdaten, die Sie jetzt haben, nicht, aber vielleicht können Sie Code schreiben, um Ihre vorhandenen Daten zu durchlaufen (offline) und die Adressen in der db kennzeichnen, die nicht geocodiert werden können.
+0

Ihre Bearbeitung (die ich gerade sehe, tut mir leid) lieferte viel bessere Informationen zu meinem speziellen Problem.Die beiden Punkte, die Sie angesprochen haben, waren genau das, was mir durch den Kopf ging (was die zusätzlichen Rundreisen betrifft, wenn ich sie aufteile und einzelne Adressen überprüfe, wenn sie zum ersten Mal eingegeben oder ausgewählt werden). Was ich beschlossen habe, ist das Hinzufügen eines Überprüfungsknopfes, der nur die individuelle Adresse prüft, die sie wollen (und nur wenn sie es wollen). Dies wird viele unnötige Überprüfungen ersparen. – TheTXI