2017-10-06 5 views
-1

ich Funktion haben, die geben mir lat lange von Adresse:Geokodierung: Wie OVER_QUERY_LIMIT in google map api -java vermeiden

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

Aber sehr oft bekomme ich OVER_QUERY_LIMIT i Schlaf so versuchen, für einen Moment und meine Funktion erneut aus diese Zugabe:

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

Aber wenn getLatLongPositions wieder rekursiv ausgeführt i null steigen Sie an dieser Linie responseCode = httpConnection.getResponseCode();
Wie kann ich vermeiden, dieses Problem? Auch in dieser Funktion sind einige Adressen ohne Fehler, aber wenn ich diese Funktion erneut ausführen bekomme ich Fehler mit diesen Adressen, die vorher gut waren. Diese

Antwort

1

ist, was ich gelernt, wenn ich mit dieser API gearbeitet:

  1. Es ist „langsam“. Ich meine, das kann eine kostspielige Operation sein.
  2. Google empfiehlt, nicht jedes Mal zu geocodieren, sondern die (lat, long) Punkte zu speichern, wenn sie erstellt werden.
  3. Google hat eine Quote von 2500 täglichen maximalen Geocodierungsanforderungen.
  4. Die Google API gibt eine OVER_QUERY_LIMIT-Ausnahme nach dem Senden von mehr als 10 Geocodierungsanforderungen in einer Schleife aus.

Bitte lesen Sie OVER_QUERY_LIMIT in Google Maps API v3: How do I pause/delay in Javascript to slow it down? und How do I Geocode 20 addresses without receiving an OVER_QUERY_LIMIT response?

1

Es ist ein Java-Client für Google Maps Web-Services, die Sie auf Github finden:

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

Obwohl dies ein Open-Source-Projekt ist es, wurde von Googlers geschrieben und bietet viele Funktionen, die Sie verwenden können. Insbesondere können Sie eine Ratenbegrenzung für Ihre Anfragen in der GeoApiContext gesetzt: queryRateLimit(int maxQps)

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

Diese Client-Bibliothek Ihre Anfragen drosseln wird innerhalb der zulässigen Grenzen QPS zu bleiben.

Lesen Sie Docs und Javadoc und versuchen Sie es.

Ich hoffe, das hilft!

0

einfach den Wert zurück:

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

für mich gearbeitet!