wake-up-neo.com

holen Sie sich Lat Lang von einer place_id, die von autocomplete place api zurückgegeben wird

Ich suche den Ort in meinen Apps mit der automatischen Autokomplizierungsstelle von Google und nun möchte ich die geografische Breite und Länge des Ortes ermitteln, den ich gesucht habe. Wie kann man Breitengrad und Längengrad aus dem Ergebnis ermitteln, das von autocomplete place api von google in android zurückgegeben wird?

35
Sajal

Das folgende Code-Snippet, das die Google Places-API für Android verwendet, hat für mich funktioniert

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 Sie Google Places-API für Android , um eine vollständige Liste der Methoden zum Abrufen von Daten von einem Ort anzuzeigen

44
droidmad

Google Place Details ist die Antwort.

Fragen Sie aus dem place_id, den Sie erhalten haben, nach Ortsangaben wie https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key} und Sie können lat und lng von result.geometry.location JSON erhalten.

23
CallMeLaNN

Jede in der Ortsautovervollständigungsantwort zurückgegebene Stelle hat eine ID und eine Referenzzeichenfolge, wie in here erläutert. 

Verwenden Sie eine der folgenden Optionen (vorzugsweise Id, da die Referenz nicht mehr empfohlen wird), um die Places-API nach den vollständigen Informationen zu diesem Ort (einschließlich lat/lng) abzufragen: https://developers.google.com/places/documentation/details#PlaceDetailsRequests

In Bezug auf den Kommentar von shyam - Geokodierung funktioniert nur, wenn Sie in der Antwort zum automatischen Vervollständigen eine vollständige Adresse erhalten haben, was nicht immer der Fall ist. Geokodierung enthält auch eine Liste möglicher Ergebnisse, da die Ortsbeschreibung, die Sie in der Antwort zur automatischen Vervollständigung erhalten, nicht eindeutig ist. Je nach Ihren Anforderungen reicht die Geokodierung möglicherweise aus.

5
nitzanj

Ref: - https://developers.google.com/places/Android/place-details#get-place Der obige Link gibt ein Ortsobjekt an, das lat und long haben wird. Das Ortsobjekt wird von der Ortskennung entfernt, die man vom Ortsautovervollständigen erhält.

2
rohitsakala
@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 String-Adresse erhalten. Verwenden Sie den LatLng, wo immer Sie möchten.

2
Fahry Mohammed

Geokodierung ist eine sehr indirekte Lösung, und wie der Second-Responder sagte, wenn Sie "Apple Store" verwenden, wird möglicherweise nicht die vollständige Adresse zurückgegeben. 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 (sie haben ein vollständiges Beispiel, falls nicht).

Ziehen Sie anschließend eine zweite Anforderung für die Ortsdetails (einschließlich Breitengrad und Längengrad unter dem Geometrieabschnitt) mit der place_id nach dieser Dokumentation ab: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign = mdr-devdocs

2
Sal

geben Sie Place.Field.LAT_LNG an, um den Breiten- und Längengrad für den Ort abzurufen.

 autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, 
 Place.Field.NAME,Place.Field.LAT_LNG));

dann hol dir LatLng

LatLng destinationLatLng = place.getLatLng();

und kann durch Toast sehen

 destlat = destinationLatLng.latitude;
 destLon = destinationLatLng.longitude;
 Toast.makeText(getApplicationContext(), "" + destlat + ',' + destLon, Toast.LENGTH_LONG).show();
2
rachna patwal

Basierend auf der neuesten Version der AutoComplete-Dokumentation

Option 1: Integrieren Sie ein AutocompleteSupportFragment

AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);

 autocompleteFragment
    .setPlaceFields(Arrays.asList(Place.Field.ID, 
    Place.Field.NAME,Place.Field.LAT_LNG,Place.Field.ADDRESS));

Option 2: Verwenden Sie eine Absicht, um die Autocomplete-Aktivität zu starten

List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME,Place.Field.LAT_LNG,Place.Field.ADDRESS);

// Start the autocomplete intent.
Intent intent = new Autocomplete.IntentBuilder(
        AutocompleteActivityMode.FULLSCREEN, fields)
        .build(this);
startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);

für welche Bereiche Sie sich interessieren, müssen Sie wie oben erwähnt angeben.

Sie erhalten das Ergebnis wie folgt:

 onPlaceSelected: 

{

"a":"#90, 1st Floor, Balaji Complex, Kuvempu Main Road, Kempapura, Hebbal 
    Kempapura, Bengaluru, Karnataka 560024, India",
"b":[],
"c":"ChIJzxEsY4QXrjsRQiF5LWRnVoc",
"d":{"latitude":13.0498176,"longitude":77.600347},
    "e":"CRAWLINK Networks Pvt. Ltd."
}

Hinweis: Das angezeigte Ergebnis besteht darin, das Objekt Place nach json zu analysieren

1
Ravi Rajput

fügen Sie diese Zeile unter Funktion hinzu

 autocomplete.addListener('place_changed', function() {});
 var place = autocomplete.getPlace();
 autocomplete.setFields(['place_id', 'geometry', 'name', 'formatted_address']);
 var lng = place.geometry.location.lng();
 var lat = place.geometry.location.lat();
 var latlng = {lat , lng};
 console.log(latlng);
1
Muhammad Yasir

Mit diesem Snippet können Sie den Breitengrad und den Längengrad eines Ortes gemäß der Kennung zurück in die automatische Vervollständigung bringen

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