2009-04-21 15 views
2

Nous avons développé une application ASP.NET qui fonctionne avec l'API Google Maps pour aider à la logistique et à la planification d'une petite compagnie maritime dans notre région. L'une des fonctionnalités est que l'entreprise saisisse une liste de clients et que le système regroupe toutes les adresses des clients en une série de points de cheminement, les envoie à Google et récupère les informations de direction pour l'itinéraire. Un problème que nous avons eu, c'est que beaucoup d'adresses dans notre base de données ne sont pas géniales et que souvent, Google Maps ne peut pas les traiter. Lorsque nous faisons cela, nous recevons un code d'erreur, mais je voudrais être en mesure de déterminer quel point de cheminement devait échouer (de cette façon, le client peut alors aller et corriger l'adresse dans la base de données).API Google Maps - Trouver un waypoint qui a causé une erreur

EDIT Voici un morceau de code qui gère l'initialisation et la gestion des erreurs en cours:

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."); 

     } 

Le problème est que la méthode dans le GDirections objet ne semble pas LoadFromWayPoints() pour retourner le statut en fonction de chaque waypoint individuel, mais seulement de la liste entière (si l'un échoue, tout échoue). La seule vraie solution à laquelle je peux penser (sans effectuer de contrôles dans d'autres zones du système) est d'envoyer chaque waypoint à Google Maps dans une requête séparée et de vérifier sa validité avant d'envoyer toute la liste des waypoints pour l'objet GDirections, mais cela semble incroyablement inefficace (surtout lorsqu'il s'agit d'un plus grand nombre d'emplacements de clients).

Répondre

2

Si vous utilisez l'objet GClientGeocoder pour faire vos demandes, vous récupérerez un code de réponse appropriée pour chaque getLocations appellent: »

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); 
} 

Leur sont various response codes, mais je devine que vous voulez informer l'utilisateur lorsque vous obtenez une adresse inconnue 602.

EDIT:

Eh oui, vous obtenez seulement un rappel d'erreur pour loadFromWaypoints pour toute la demande de directions. Ce que vous faites est plus qu'une simple demande de géocodage, vous générez en réalité des directions et des superpositions de rendu vers une carte pour une séquence de valeurs d'adresses. Je suggère deux solutions:

  • Vous pouvez faire une demande de getLocation avant votre loadFromWaypoints demande (comme vous le suggérez), puis utiliser la latitude, les données de longitude retournées pour chaque adresse comme paramètre pour vos loadFromWayPoints. Cela sépare le traitement de géocodage de la demande loadFromWayPoints, mais ajoute l'aller-retour supplémentaire pour chaque recherche de géocodage. C'est vraiment quelque chose que vous ne voulez faire qu'une fois, lorsque l'utilisateur entre d'abord l'adresse (voir ci-dessous).
  • Lorsque l'utilisateur entre l'information d'adresse pour la première fois, vous pouvez faire une recherche GClientGeocoder getLocations au moment et obtenir la latitude, la longitude à stocker dans votre base de données avec l'adresse. De cette façon, si l'utilisateur entre une adresse qui ne peut pas être géocodée, vous pouvez lui demander de saisir à nouveau l'adresse, ou peut-être de le laisser sélectionner l'emplacement sur une carte google (et d'en obtenir le résultat). Cela ne résout pas les problèmes avec les données d'adresse que vous avez maintenant, mais peut-être que vous pouvez écrire du code pour parcourir vos données existantes (hors ligne) et marquer les adresses dans la base de données qui ne peuvent pas être géocodées.
+0

Votre modification (que je suis en train de voir, désolé) a fourni de bien meilleures informations concernant mon problème particulier.Les deux points que vous avez soulevés étaient exactement ce qui me trottait dans la tête (en ce qui concerne les allers-retours supplémentaires si je le divise, et en vérifiant les adresses individuelles quand elles sont entrées ou sélectionnées pour la première fois). Ce que j'ai décidé est d'ajouter un bouton de vérification qui ne vérifiera que l'adresse individuelle qu'ils veulent (et seulement quand ils veulent). Cela permettra d'économiser beaucoup de contrôles inutiles, je crois. – TheTXI