2012-06-26 18 views
9

Ho un nome di indirizzo e voglio ottenere una latitudine esatta & longitudine per questo. So che possiamo ottenere questo usando Geocoder getFromLocationName (indirizzo, maxresult).Ottieni latitudine e longitudine dal nome dell'indirizzo specificato. NON Geocoder

Il problema è che il risultato che ottengo è sempre nullo, a differenza del risultato ottenuto con https://maps.google.com/. Questo mi consente sempre di ottenere alcuni risultati, a differenza di Geocoder.

Ho anche provato un altro modo: "http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false" (Ecco a link!) Offre risultati migliori di geocoder, ma spesso restituisce l'errore (java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer). È noioso.

La mia domanda è: come possiamo ottenere lo stesso risultato LatLong otterremmo una ricerca su https://maps.google.com/ dall'interno di codice Java?

ulteriore: dove è il documento api sull'utilizzo "http://maps.google.com/maps/api/geocode/json?address=" + indirizzo + "& sensore = false"

+0

GeoCoder non è una scienza perfetta. Ricordatelo. Ad esempio volevo "Wadgaon sheri" e mi mostra la strada principale di Kharadi vicino al parco EON IT. Quindi ho aggiunto "l'ufficio postale" all'indirizzo. E invece di "wadgaon sheri" ho usato il codice PIN. Per farla breve, non aspettarti che Geocodeing faccia magia per te. È probabile che tutte le API che utilizzi finiranno per ottenere gli stessi risultati, dal momento che anche underneat useranno il geocoding. – Siddharth

risposta

16

Albert, credo che la vostra preoccupazione è che il codice non funziona. Ecco, il codice qui sotto funziona davvero bene per me. Penso che manchi URIUtil.encodeQuery per convertire la stringa in un URI.

Sto usando la libreria gson, scaricalo e aggiungilo al tuo percorso.

Per ottenere la classe per l'analisi gson, è necessario passare a jsonschema2pojo. Basta sparare http://maps.googleapis.com/maps/api/geocode/json?address=Sayaji+Hotel+Near+balewadi+stadium+pune&sensor=true sul tuo browser, ottenere i risultati e incollarlo su questo sito. Genererà il tuo pojo per te. Potrebbe essere necessario aggiungere anche un annotation.jar.

Fidati di me, è facile lavorare. Non essere frustrato ancora.

try { 
     URL url = new URL(
       "http://maps.googleapis.com/maps/api/geocode/json?address=" 
         + URIUtil.encodeQuery("Sayaji Hotel, Near balewadi stadium, pune") + "&sensor=true"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Accept", "application/json"); 

     if (conn.getResponseCode() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); 
     } 
     BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); 

     String output = "", full = ""; 
     while ((output = br.readLine()) != null) { 
      System.out.println(output); 
      full += output; 
     } 

     PincodeVerify gson = new Gson().fromJson(full, PincodeVerify.class); 
     response = new IsPincodeSupportedResponse(new PincodeVerifyConcrete(
       gson.getResults().get(0).getFormatted_address(), 
       gson.getResults().get(0).getGeometry().getLocation().getLat(), 
       gson.getResults().get(0).getGeometry().getLocation().getLng())) ; 
     try { 
      String address = response.getAddress(); 
      Double latitude = response.getLatitude(), longitude = response.getLongitude(); 
      if (address == null || address.length() <= 0) { 
       log.error("Address is null"); 
      } 
     } catch (NullPointerException e) { 
      log.error("Address, latitude on longitude is null"); 
     } 
     conn.disconnect(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Le opere Geocode http, ho appena sparato esso, risultati qui sotto

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Pune", 
       "short_name" : "Pune", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Pune", 
       "short_name" : "Pune", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Maharashtra", 
       "short_name" : "MH", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "India", 
       "short_name" : "IN", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "Pune, Maharashtra, India", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 18.63469650, 
        "lng" : 73.98948670 
       }, 
       "southwest" : { 
        "lat" : 18.41367390, 
        "lng" : 73.73989109999999 
       } 
      }, 
      "location" : { 
       "lat" : 18.52043030, 
       "lng" : 73.85674370 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 18.63469650, 
        "lng" : 73.98948670 
       }, 
       "southwest" : { 
        "lat" : 18.41367390, 
        "lng" : 73.73989109999999 
       } 
      } 
     }, 
     "types" : [ "locality", "political" ] 
     } 
    ], 
    "status" : "OK" 
} 

Modifica

On 'risposte non contengono abbastanza detail`

Da tutte le ricerche ti aspetti che la mappa di Google abbia un riferimento a ogni combinazione di località, area, città.Ma resta il fatto che la mappa di google contiene geo e reverse-geo nel proprio contesto. Non puoi aspettarti che abbia una combinazione come Sayaji Hotel, Near balewadi stadium, pune. Web google maps lo localizzerà per te poiché utilizza un backend ricco di google Search ricco. L'unico indirizzo geografico inverso di google api è stato ricevuto dalle proprie API. Per me sembra un modo ragionevole per lavorare, considerando quanto sia complesso il nostro sistema di indirizzi indiano, 2 ° incrocio può essere miglia lontano da 1st Cross road :)

+0

ottimo lavoro siddharth, ma se si controlla il posto su http://ctrlq.org/maps/address/ non mi dà la posizione esatta, come noi possiamo dire dal codice precedente abbiamo ottenuto latLag come 18.52043030 73.85674370, se diamo questo come input a geocoder, esso indicherà da qualche parte vicino a Kasaba Peth, Pune che non è corretto. Anche questo sito Web utilizza Geocoder. Ho usato latLag nel mio codice, ma ha dato lo stesso risultato errato. – KAsh

+0

Ok, quindi penso che possiamo tranquillamente concludere che la mappa di google non ha riferimenti a ogni combinazione di località, area, città. Infatti l'unico modo in cui puoi ottenere un indirizzo appropriato è se prendi l'indirizzo da google stesso. Quindi nel tuo caso devi prendere l'indirizzo di completamento automatico da google, salvarlo, utilizzarlo e invertire geo su di esso. Tu ** non puoi ** solo prendere un indirizzo reale e convertirlo (proprio come puoi fare per gli indirizzi degli Stati Uniti.Per me sembra un modo ragionevole di lavorare, considerando quanto sia complesso il nostro sistema di indirizzamento indiano, 2 ° incrocio può essere miglia di distanza da 1st Cross road :) – Siddharth

+0

Sono d'accordo. La correzione automatica non funzionerà per i nostri indirizzi indiani, ho provato anche quello, ma a volte trovare tali script diventa così tanto imp se il cliente lo sta chiedendo. :(vediamo se c'è qualche soluzione, va bene per me. – KAsh

0

Io uso, in ordine:
- Google Geocoding API v3 (in alcuni casi c'è un problema descritto here)
- Geocoder (in alcuni casi c'è un problema descritto here).

Se non ottengo risultati dall'API di Geocoding di Google, utilizzo Geocoder.

2

Spero che questo ti aiuta:

public static GeoPoint getGeoPointFromAddress(String locationAddress) { 
     GeoPoint locationPoint = null; 
     String locationAddres = locationAddress.replaceAll(" ", "%20"); 
     String str = "http://maps.googleapis.com/maps/api/geocode/json?address=" 
       + locationAddres + "&sensor=true"; 

     String ss = readWebService(str); 
     JSONObject json; 
     try { 

      String lat, lon; 
      json = new JSONObject(ss); 
      JSONObject geoMetryObject = new JSONObject(); 
      JSONObject locations = new JSONObject(); 
      JSONArray jarr = json.getJSONArray("results"); 
      int i; 
      for (i = 0; i < jarr.length(); i++) { 
       json = jarr.getJSONObject(i); 
       geoMetryObject = json.getJSONObject("geometry"); 
       locations = geoMetryObject.getJSONObject("location"); 
       lat = locations.getString("lat"); 
       lon = locations.getString("lng"); 

       locationPoint = Utils.getGeoPoint(Double.parseDouble(lat), 
         Double.parseDouble(lon)); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return locationPoint; 
    } 
Problemi correlati