2013-04-29 18 views
6

Próbuję użyć Geocoder API dla java pod adresem: http://code.google.com/p/geocoder-java/geocoder API dla Javy

Są to linie kodu mam napisane, i działa idealnie, gdy uruchomię go jako aplikacja internetowa 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(); 

Co robi jest, że dam w tekście, na przykład Nowym Jorku, a ona dowiaduje się długość i szerokość geograficzną tego obszaru.

Jednak, gdy wstawiam te same linie kodu do GAE, czasami gdy uruchomię ten kod, otrzymam wyjątek dotyczący wyjątków w "GeocoderResult data = someList.get(0)";

Czasami nie dostaję błędu i poprawnie wyświetla współrzędne na stronie. Więc jestem trochę zdezorientowany, na stronie internetowej, pokazuje, że obsługuje GAE, czy jest coś nie tak z geocoder dostarczonych przez samo Google ma jakiś problem?

Zazwyczaj nie działa po południu lub północy w czasie wschodnim.

Odpowiedz

4

Uważam, że uderzasz tutaj w limity API. Limity stawki API są ustalane według adresu IP, a infrastruktury takie jak Google App Engine zwykle używają wspólnego adresu IP, aby przesłać żądanie do serwera, a zatem gdy aplikacja sama w sobie nie osiąga tych ograniczeń, ze względu na wspólną infrastrukturę prawdopodobnie trafia te ograniczenia i nie uzyskasz żadnych wyników.

3

Twoja odpowiedź GeocodeResponse geocoderResponse ma status, który jest zawsze przydatny do zweryfikowania w Twoim kodzie. Normalnie status powinien zawsze być zwracany, w przeciwnym razie ich system nie działa.

ewentualny status:

  • GeocoderStatus.OK (to oczywiste)
  • GeocoderStatus.ZERO_RESULTS (wynik nie można znaleźć dla Twojego adresu)
  • ... (istnieje kilka innych możliwości status)
  • GeocoderStatus.OVER_QUERY_LIMIT

Ten ostatni jest chyba dla ciebie ważne, ponieważ wskazuje y wysyłamy do wielu żądań na sekundę lub osiągnąłeś dzienny limit (możesz zapłacić za klucz i uaktualnić dzienny limit, nic nie jest za darmo)

Aby uniknąć problemu wielu zapytań na sekundę:

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

Przydaje się posiadanie tego kodu w każdym razie