it-swarm.com.ru

получить Lat Lang из place_id, возвращаемого api автозаполнения

Я ищу место в моих приложениях, используя API автозаполнения Google, и теперь я хочу получить широту и долготу места, которое я искал. Как получить широту и долготу от результата, возвращаемого автозаполнением место API от Google в Android?

35
Sajal

Следующий фрагмент кода, который использует Google Places API для Android, работал для меня

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

Посетите Google Places API для Android для получения полного списка методов получения данных с места

44
droidmad

Google Place Details это ответ.

Получив place_id, запросите Place Details что-то вроде https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key}, и вы можете получить lat и lng из result.geometry.location JSON.

23
CallMeLaNN

Каждое место, возвращаемое в ответе place-autocomplete, имеет идентификатор и строку ссылки, как объяснено здесь

Используйте любой (предпочтительно Id, так как ссылка устарела), чтобы запросить у API Places полную информацию об этом месте (включая lat/lng): https://developers.google.com/places/documentation/details#PlaceDetailsRequests

Что касается комментария shyam - геокодирование будет работать, только если вы получили полный адрес в ответе автозаполнения, что не всегда так. Также геокодирование дает список возможных результатов, поскольку описание места, которое вы получаете в ответе автозаполнения, не является уникальным. В зависимости от ваших потребностей геокодирования может быть достаточно.

5
nitzanj

Ссылка: - https://developers.google.com/places/Android/place-details#get-place Приведенная выше ссылка дает объект place, который будет иметь значения lat и long. Объект place получен из placeid, который можно получить из автозаполнения места.

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

С помощью приведенного выше кода вы можете получить LatLng , а также адрес String. Используйте LatLng, где вы хотите.

2
Fahry Mohammed

Геокодирование - это очень косвенное решение, и, как сказал второй респондент, если вы сделаете «Apple Store», оно может не вернуть полный адрес. Вместо:

Place_ID содержит все, что вам нужно. Я предполагаю, что вы знаете, как получить place_id из API Адресов (у них есть полный пример, если нет).

Затем извлеките второй запрос сведений о месте (включая широту и долготу в разделе геометрии), используя place_id, следуя этой документации: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign = MDR-DevDocs

2
Sal

Этот фрагмент позволяет получить широту и долготу места по идентификатору обратно в автозаполнение

    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