2013-04-29 11 views
6

Sto cercando di utilizzare il Geocoder API per Java si trova in: http://code.google.com/p/geocoder-java/Geocoder API per Java

Questi sono le righe di codice che ho scritto, e funziona perfettamente quando l'eseguo come applicazione web GAE.

final Geocoder geocoder = new Geocoder(); 
    GeocoderRequest geocoderRequest = new GeocoderRequestBuilder().setAddress(req.getParameter("location").toString()).setLanguage("en").getGeocoderRequest(); 
    GeocodeResponse geocoderResponse = geocoder.geocode(geocoderRequest); 
    List<GeocoderResult> someList = geocoderResponse.getResults(); 
    GeocoderResult data = someList.get(0); 
    GeocoderGeometry data_2 = data.getGeometry(); 
    BigDecimal Latitude = data_2.getLocation().getLat(); 
    BigDecimal Longitude = data_2.getLocation().getLng(); 

ciò che fa è che io do in un testo, ad esempio New York, e si scopre la longitudine e la latitudine di quell'area.

Tuttavia, quando inserisco le stesse linee di codice nel GAE, a volte quando eseguo questo codice, ottengo l'eccezione di limiti di controllo situata a "GeocoderResult data = someList.get(0)";

A volte non viene visualizzato l'errore e vengono visualizzate correttamente le coordinate sulla pagina Web. Quindi sono un po 'confuso, sul sito web, mostra che supporta GAE, o c'è qualcosa di sbagliato con lo geocoder fornito da google stesso ha qualche problema?

Di solito non funziona durante il pomeriggio o la mezzanotte all'ora orientale.

risposta

4

Credo che tu stia raggiungendo i limiti API qui. I limiti di velocità dell'API sono impostati per indirizzo IP e le infrastrutture come Google App Engine usano comunemente un IP condiviso per effettuare la richiesta al server, quindi mentre l'applicazione di per sé non raggiunge questi limiti, a causa dell'infrastruttura condivisa, probabilmente colpisce quei limiti e non ottieni alcun risultato.

3

La tua risposta GeocodeResponse geocoderResponse ha uno stato, che è sempre utile per verificare nel codice. Normalmente lo stato dovrebbe sempre essere restituito, altrimenti il ​​loro sistema è inattivo.

stato possibile:

  • GeocoderStatus.OK (questo è ovvio)
  • GeocoderStatus.ZERO_RESULTS (nessun risultato è stato trovato per il vostro indirizzo)
  • ... (ci sono pochi altri possibili stato)
  • GeocoderStatus.OVER_QUERY_LIMIT

L'ultimo è forse importante per voi, poiché indica y stai inviando a molte richieste al secondo o hai raggiunto il limite giornaliero (puoi pagare una chiave e aggiornare quel limite giornaliero, nulla è gratis)

Per evitare il problema di molte richieste al secondo:

if (firstTry && GeocoderStatus.OVER_QUERY_LIMIT.equals(geocodeResponse.getStatus()) { 
    Thread.sleep(2000); 
    // try again.. 
} else { logger.error("You reached your daily limit of requests"); } 

E 'utile avere questo codice in ogni caso