2012-06-26 1 views
9

J'ai un nom d'adresse et je veux obtenir une longitude précise & longitude pour cela. Je sais que nous pouvons l'obtenir en utilisant getFromLocationName de Geocoder (adresse, maxresult). Le problème est, le résultat que j'obtiens est toujours nul - contrairement au résultat que nous obtenons avec https://maps.google.com/. Cela me permet toujours d'obtenir des résultats, contrairement à Geocoder.Obtenir la latitude et la longitude à partir du nom d'adresse donné. NOT Geocoder

J'ai également essayé d'une autre façon: "http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false" (Voici a link!) Il donne de meilleurs résultats que le géocodeur, mais renvoie souvent l'erreur (java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer). C'est ennuyant.

Ma question est: Comment pouvons-nous obtenir le même résultat latlong que nous obtiendrions en recherchant sur https://maps.google.com/ du code java?

supplémentaires: où est le document api sur l'utilisation de "http://maps.google.com/maps/api/geocode/json?address=" + adresse + "& capteur = false"

+0

GeoCoder n'est pas une science parfaite. Rappelez-vous cela. Par exemple, je voulais "Wadgaon Sheri", et il me montre la route principale de Kharadi à proximité du parc informatique EON. J'ai donc ajouté "bureau de poste" à l'adresse. Et au lieu de "wadgaon sheri" j'ai utilisé le code PIN. Longue histoire courte, ne vous attendez pas Geocodeing à faire de la magie pour vous. Il y a de fortes chances que les API que vous utilisez finissent par obtenir les mêmes résultats, puisqu'ils utiliseront aussi le géocodage. – Siddharth

Répondre

16

Albert, je pense que votre préoccupation est que le code vous ne fonctionne pas. Voilà, le code ci-dessous fonctionne vraiment bien pour moi. Je pense qu'il vous manque URIUtil.encodeQuery pour convertir votre chaîne en URI. J'utilise la bibliothèque gson, téléchargez-la et ajoutez-la à votre chemin.

Pour obtenir la classe pour votre analyse grammaticale, vous devez aller à jsonschema2pojo. Lancez http://maps.googleapis.com/maps/api/geocode/json?address=Sayaji+Hotel+Near+balewadi+stadium+pune&sensor=true sur votre navigateur, obtenez les résultats et collez-le sur ce site. Il va générer votre pojo pour vous. Vous devrez peut-être également ajouter un annotation.jar.

Croyez-moi, il est facile de travailler. Ne soyez pas encore frustré.

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

Les travaux http géocodage, je viens a tiré, les résultats ci-dessous

{ 
    "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" 
} 

Modifier

sur « les réponses ne contiennent pas assez detail`

De toutes les recherches vous vous attendez à ce que google map ait une référence à chaque combinaison de localité, région, ville.Mais le fait demeure que google map contient géo et reverse-geo dans son propre contexte. Vous ne pouvez pas vous attendre à avoir une combinaison comme Sayaji Hotel, Near balewadi stadium, pune. Web google maps le localisera pour vous car il utilise un backend google riche et varié. La seule adresse de géo inversée de google api reçue de leurs propres api. Pour moi, il semble comme un moyen raisonnable de travailler, étant donné la complexité de notre système d'adresse indienne est, la route 2 croix peut être miles de 1ère route Cross :)

+0

grand travail siddharth, mais si vous vérifiez l'endroit sur http://ctrlq.org/maps/address/ il ne me donne pas l'emplacement exact, comme nous On peut dire du code ci-dessus que nous avons obtenu le latLag comme 18.52043030 73.85674370, si nous donnons cela comme entrée au géocodeur, il pointera quelque part près de Kasaba Peth, Pune qui est incorrect. Ce site utilise également le géocodeur. J'ai utilisé le latLag dans mon code, mais il donne le même mauvais résultat. – KAsh

+0

Ok, donc je pense que nous pouvons conclure sans risque que google map n'a pas une référence à chaque combinaison de localité, région, ville. En fait, la seule façon que vous pouvez obtenir une adresse appropriée est si vous prenez l'adresse de google lui-même. Donc, dans votre cas, vous devez prendre l'adresse de saisie semi-automatique de google, l'enregistrer l'utiliser et inverser la géo sur elle. Vous ** ne pouvez pas ** juste prendre une adresse réelle et la convertir (comme vous pouvez le faire pour les adresses américaines.) Pour moi, cela semble être une manière raisonnable de travailler, vu la complexité de notre système d'adresse indien, le deuxième carrefour peut être milles loin du 1er croisement :) – Siddharth

+0

Je suis d'accord. L'auto correct ne fonctionnera pas pour nos adresses indiennes, j'ai essayé cela aussi, mais parfois trouver de tels scripts devient tellement imp si le client le demande. :(laisse voir si n'importe quelle solution est là, elle sera bonne pour moi – KAsh

0

J'utilise, dans l'ordre:
- API Google géocodage v3 (dans quelques cas, il y a un problème décrit here)
- Géocodeur (dans certains cas, il y a un problème décrit here).

Si je ne reçois pas les résultats de l'API Google Geocoding, j'utilise le Geocoder.

2

Hope this vous aide:

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