2017-10-06 4 views
-1

Je fonction qui me donne LAT longue de l'adresse:GÉOCODAGE: Comment éviter OVER_QUERY_LIMIT sur la carte google api -java

public static String[] getLatLongPositions(String address) throws Exception 
    { 
    int responseCode = 0; 
    String api = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + URLEncoder.encode(address, "UTF-8") + "&sensor=true"; 
    //System.out.println("URL : "+api); 
    URL url = new URL(api); 
    HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection(); 
    httpConnection.connect(); 
    responseCode = httpConnection.getResponseCode(); 
    if(responseCode == 200) 
    { 
     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();; 
     Document document = builder.parse(httpConnection.getInputStream()); 
     XPathFactory xPathfactory = XPathFactory.newInstance(); 
     XPath xpath = xPathfactory.newXPath(); 
     XPathExpression expr = xpath.compile("/GeocodeResponse/status"); 
     String status = (String)expr.evaluate(document, XPathConstants.STRING); 
     if(status.equals("OK")) 
     { 
     expr = xpath.compile("//geometry/location/lat"); 
     String latitude = (String)expr.evaluate(document, XPathConstants.STRING); 
     expr = xpath.compile("//geometry/location/lng"); 
     String longitude = (String)expr.evaluate(document, XPathConstants.STRING); 
     return new String[] {latitude, longitude}; 
     } 
     else 
     { 
     throw new Exception("Error from the API - response status: "+status+"street "+ address); 
     } 
    } 
    return null; 
    } 

Mais très souvent, je reçois OVER_QUERY_LIMIT donc j'essayer dormir un instant et courir à nouveau ma fonction ajoutant ceci:

if(status.equals("OVER_QUERY_LIMIT")){ 
       Thread.sleep(1000); 
       getLatLongPositions(address); 
      } 

Mais quand getLatLongPositions est en cours d'exécution à nouveau récursive je reçois null à cette ligne responseCode = httpConnection.getResponseCode();
Comment puis-je éviter ce problème? Aussi dans cette fonction certaines adresses sont sans erreur mais quand je réexécute cette fonction j'obtiens l'erreur avec ces adresses qui étaient bonnes avant.

Répondre

1

Ce que j'ai appris quand je travaillais avec cette API:

  1. Il est « lent ». Je veux dire, cela peut être une opération coûteuse.
  2. Google recommande de ne pas géocoder à chaque fois, mais de stocker les points (lat, long) lors de leur création.
  3. Google a un quota de 2 500 demandes de géocodage maximum par jour.
  4. L'API Google renvoie une exception OVER_QUERY_LIMIT après l'envoi de plus de 10 requêtes de géocodage dans une boucle.

S'il vous plaît lire OVER_QUERY_LIMIT in Google Maps API v3: How do I pause/delay in Javascript to slow it down? et How do I Geocode 20 addresses without receiving an OVER_QUERY_LIMIT response?

1

Il y a un client Java pour les services Web Google Maps que vous pouvez trouver sur github:

https://github.com/googlemaps/google-maps-services-java

Bien que ce soit un projet open source, il a été écrit par Googlers et fournit de nombreuses fonctionnalités que vous pouvez utiliser. En particulier, vous pouvez définir une limite de taux pour vos demandes dans le GeoApiContext: queryRateLimit(int maxQps)

https://googlemaps.github.io/google-maps-services-java/v0.2.3/javadoc/

Cette bibliothèque client vos demandes de papillon des gaz rester dans les limites permises QPS.

Lisez des documents et javadoc et essayez-le.

J'espère que cela aide!

0

juste retour la valeur:

else if(status.equals("OVER_QUERY_LIMIT")) 
{ 
    Thread.sleep(1000); 
    return getLatLongPositions(address); 
} 

a marché pour moi!