25

Ich suche den Ort in meinen Apps mit dem Google Autocomplete Ort API und jetzt möchte ich den Breitengrad und die Länge des Ortes, die ich gesucht habe, zu bekommen. Wie bekomme ich den Breiten- und Längengrad von dem Ergebnis, das von AutoComplete Place API durch Google in Android zurückgegeben wurde?Get Lat Lang von einem Ort_id zurückgegeben von Autocomplete Ort api

+0

Geocoder verwenden. Siehe: http://developer.android.com/reference/android/location/Geocoder.html – shyam

+0

Aktuelle API erlaubt es nicht, es mit einer Anfrage zu tun, wie es mit Web-API möglich ist. Bitte update https://issuetracker.google.com/issues/35828699, um Koordinaten anzufordern, die in der Vorhersageantwort exponiert sind. – AlexKorovyansky

Antwort

5

Jeder Ort, der in der Place-Autocomplete-Antwort zurückgegeben wird, hat eine ID und eine Referenzzeichenfolge wie erklärt here.

Verwendung entweder (vorzugsweise Id seit Referenz veraltet ist) Places API für die vollständigen Informationen über diesen Ort abzufragen (einschließlich lat/lng): https://developers.google.com/places/documentation/details#PlaceDetailsRequests

Bezüglich shyam Kommentar - Geocoding funktioniert nur, wenn Sie ein bekommen vollständige Adresse in der Autocomplete-Antwort, was nicht immer der Fall ist. Geocoding gibt auch eine Liste möglicher Ergebnisse, da die Ortsbeschreibung in der Autocomplete-Antwort nicht eindeutig ist. Abhängig von Ihren Anforderungen könnte Geocodierung ausreichen.

1

Geocoding ist eine sehr indirekte Lösung, und wie der zweite Responder sagte, wenn Sie "Apple Store" tun, kann es nicht die vollständige Adresse zurückgeben. Stattdessen:

Place_ID enthält alles, was Sie brauchen. Ich gehe davon aus, dass Sie wissen, wie Sie die place_id von der Places API erhalten (wenn nicht, haben sie ein vollständiges Beispiel).

Dann eine zweite Anforderung für die Ortsdetails (einschließlich Breite und Länge unter dem Geometrie Abschnitt) mit dem place_id im Anschluss an dieser Dokumentation ziehen: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs

+0

Dies war sehr nützlich, um die vollständigen Daten eines Ortes zu erhalten. – karenms

20

Google Place Details ist die Antwort.

Von der place_id du hast, Abfrage Platz Details der so etwas wie https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key} und Sie können die lat und lng von result.geometry.location JSON erhalten.

0

Dieser Ausschnitt ermöglicht die geografische Breite und Länge eines Ortes erhalten nach der Kennung zurück in die Auto-Vervollständigen

public class PlacesDetails { 
    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; 
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; 
    private static final String TYPE_DETAIL = "/details"; 
    private static final String OUT_JSON = "/json"; 



    //private static final String API_KEY = "------------ make your specific key ------------; // cle pour le serveur  
    public PlacesDetails() { 
     // TODO Auto-generated constructor stub 
    } 
    public ArrayList<Double> placeDetail(String input) { 
     ArrayList<Double> resultList = null; 

     HttpURLConnection conn = null; 
     StringBuilder jsonResults = new StringBuilder(); 
     try { 
      StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_DETAIL + OUT_JSON); 
      sb.append("?placeid=" + URLEncoder.encode(input, "utf8")); 
      sb.append("&key=" + API_KEY); 
      URL url = new URL(sb.toString()); 
      //Log.e("url", url.toString()); 
      System.out.println("URL: "+url); 
      System.out.println("******************************* connexion au serveur *****************************************"); 
      //Log.e("nous sommes entrai de test la connexion au serveur", "test to connect to the api"); 
      conn = (HttpURLConnection) url.openConnection(); 
      InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

      // Load the results into a StringBuilder 
      int read; 
      char[] buff = new char[1024]; 
      while ((read = in.read(buff)) != -1) { 
       jsonResults.append(buff, 0, read); 

      } 
      System.out.println("le json result"+jsonResults.toString()); 
     } catch (MalformedURLException e) { 
      //Log.e(LOG_TAG, "Error processing Places API URL", e); 
      return resultList; 
     } catch (IOException e) { 
      //Log.e(LOG_TAG, "Error connecting to Places API", e); 
      return resultList; 
     } finally { 
      if (conn != null) { 
       conn.disconnect(); 
      } 
      System.out.println("******************************* fin de la connexion*************************************************"); 
     } 

     try { 

      // Create a JSON object hierarchy from the results 
      //Log.e("creation du fichier Json", "creation du fichier Json"); 
      System.out.println("fabrication du Json Objet"); 
      JSONObject jsonObj = new JSONObject(jsonResults.toString()); 
      //JSONArray predsJsonArray = jsonObj.getJSONArray("html_attributions"); 
      JSONObject result = jsonObj.getJSONObject("result").getJSONObject("geometry").getJSONObject("location"); 
      System.out.println("la chaine Json "+result); 
      Double longitude = result.getDouble("lng"); 
      Double latitude = result.getDouble("lat"); 
      System.out.println("longitude et latitude "+ longitude+latitude); 
      resultList = new ArrayList<Double>(result.length()); 
      resultList.add(result.getDouble("lng")); 
      resultList.add(result.getDouble("lat")); 
      System.out.println("les latitude dans le table"+resultList); 

     } catch (JSONException e) { 
      ///Log.e(LOG_TAG, "Cannot process JSON results", e); 
     } 

     return resultList; 
    } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     PlacesDetails pl = new PlacesDetails(); 
     ArrayList<Double> list = new ArrayList<Double>(); 
     list = pl.placeDetail("ChIJbf7h4osSYRARi8SBR0Sh2pI"); 
     System.out.println("resultat de la requette"+list.toString()); 
    }  
} 
35

Der folgende Code-Schnipsel, die für Android Google Places API verwendet für mich gearbeitet

Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId) 
    .setResultCallback(new ResultCallback<PlaceBuffer>() { 
    @Override 
    public void onResult(PlaceBuffer places) { 
    if (places.getStatus().isSuccess()) { 
     final Place myPlace = places.get(0); 
     LatLng queriedLocation = myPlace.getLatLng(); 
     Log.v("Latitude is", "" + queriedLocation.latitude); 
     Log.v("Longitude is", "" + queriedLocation.longitude); 
    } 
    places.release(); 
    } 
}); 

Besuchen Google Places API for Android für eine vollständige Liste der Methoden, um Daten von einem Ort zum Abrufen

-1
 Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId) 
     .setResultCallback(new ResultCallback<PlaceBuffer>() { 
     @Override 
     public void onResult(PlaceBuffer places) { 
      if (places.getStatus().isSuccess() && places.getCount() > 0) { 
       final Place myPlace = places.get(0); 
       Log.i(TAG, "Place found: " + myPlace.getName()); 
       LatLng latlangObj = myPlace.getLatLng(); 
       Log.v("latitude:", "" + latlangObj.latitude); 
       Log.v("longitude:", "" + latlangObj.longitude); 
      } else { 
       Log.e(TAG, "Place not found"); 
    } 
    places.release(); 
    } 
}); 

Verwenden Sie diese Methode für lat und lang von placeid bekommen.

0
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == Constant.REQUEST_LOCATION_CODE) { 

     Place place = PlaceAutocomplete.getPlace(this, data); 

     if (place != null) { 
      LatLng latLng = place.getLatLng(); 
      mStringLatitude = String.valueOf(latLng.latitude); 
      mStringLongitude = String.valueOf(latLng.longitude); 
      EditTextAddress.setText(place.getAddress()); 
     } 
    } 
} 

Mit dem obigen Code können Sie die LatLng sowie die Adresse String erhalten. Verwenden Sie den LatLng wo immer Sie wollen.

Verwandte Themen