Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Следующий фрагмент кода, который использует API Google Places для 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();
  }
});

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

Ответ 2

Сведения о Google Place - это ответ.

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

Ответ 3

Каждое место, возвращенное в место - ответ автозаполнения, содержит Id и ссылочную строку, как описано здесь.

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

@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, где вы хотите.

Ответ 7

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

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

Ответ 8

На основании последней версии документации по автозаполнению

Вариант 1. Встраивание фрагмента 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));

Вариант 2. Использование намерения для запуска операции автозаполнения

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

какие бы поля вы ни интересовали, вы должны упомянуть, как указано выше.

Вы получите результат, как показано ниже:

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

Примечание. Результат отображается при разборе объекта Place на json

Ответ 9

добавить эти строки под функцию

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

Ответ 10

предоставьте Place.Field.LAT_LNG, чтобы получить широту и долготу для места.

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

тогда получите LatLng

LatLng destinationLatLng = place.getLatLng();

и может видеть сквозь тост

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

Ответ 11

Прости нас, мы новички. Мы пытаемся получить широту и долготу адреса в Google Places SDK, но мы получаем только искомый адрес, который использует getLat и getLng, но либо мы не знаем, где его разместить, либо неправильно его указали. Заранее большое спасибо.

//JAVA ДЕЯТЕЛЬНОСТЬ

//PARTE CODIGO AUTOOMPLETE
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}


private static final String TAGGOOGLE = "GoogleActivity";
private static final int RC_SIGN_IN = 1;
private int STORAGE_PERMISSION_CODE= 1;//Para los permisos

final private int REQUEST_CODE_ASK_PERMISSIONS = 111;

private static final String TAG = "CAPublicaOfertaActivity";

//COORDENADAS ENTRE LAS QUE BUSCA EL AUTOCOMPLETE
private static final LatLngBounds LAT_LNG_BOUNDS = new LatLngBounds(
        new LatLng(27.666172, -18.273932), new LatLng(42.772283, 4.747570));

//PARTE CODIGO AUTOOMPLETE
AutoCompleteTextView etdireccionnegocioAutoCA;
PlaceAutocompleteAdapter mPlaceAutocompleteAdapter;
GoogleApiClient mGoogleApiClient;

//DECLARO VARIANTES
TextView tvocultolatitudCA, tvocultolongitudCA, tvocultoCA;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_capublicar_oferta);


    // AUTOCOMPLETE
    etdireccionnegocioAutoCA = (AutoCompleteTextView) findViewById(R.id.etdireccionnegocioAutoCA);
    //INICIAR PROCESO AUTOOMPLETE
    init();



    //ENLAZO VARIANTES

    tvocultolatitudCA = (TextView) findViewById(R.id.tvocultolatitudCA);
    tvocultolongitudCA = (TextView) findViewById(R.id.tvocultolongitudCA);
    tvocultoCA = (TextView) findViewById(R.id.tvocultoCA);

}//FIN ONCREATE




//MANDAR OFERTA
public void publicaroferta(View view) {

    //ENLAZO VARIANTES CAMPOS OBLIGATORIOS

    String direccionnegocioCA = etdireccionnegocioAutoCA.getText().toString();
    String latitudnegocioCA = tvocultolatitudCA.getText().toString();
    //Double latitudint = Double.parseDouble(latitudnegocioCA);
    String longitudnegocioCA = tvocultolongitudCA.getText().toString();
    //Double longitudint = Double.parseDouble(longitudnegocioCA);

}


//PROTOCOLO AUTOCOMPLETE
private void init() {
    Log.d(TAG, "init: initializing");

    mGoogleApiClient = new GoogleApiClient
            .Builder(this)
            .addApi(Places.GEO_DATA_API)
            .addApi(Places.PLACE_DETECTION_API)
            .enableAutoManage(this, this)
            .build();

    mPlaceAutocompleteAdapter = new PlaceAutocompleteAdapter(this, mGoogleApiClient,
            LAT_LNG_BOUNDS, null);

    etdireccionnegocioAutoCA.setAdapter(mPlaceAutocompleteAdapter);


    etdireccionnegocioAutoCA.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH
                    || actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                    || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

            }

            return false;
        }
    });

    hideSoftKeyboard();
}

private void hideSoftKeyboard(){
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

//АДАПТЕР

public class PlaceAutocompleteAdapter
        extends ArrayAdapter<AutocompletePrediction> implements Filterable {

private static final String TAG = "PlaceAutoCompleteAd";
private static final CharacterStyle STYLE_BOLD = new StyleSpan(Typeface.BOLD);
 private ArrayList<AutocompletePrediction> mResultList;
private GoogleApiClient mGoogleApiClient;
private LatLngBounds mBounds;
private AutocompleteFilter mPlaceFilter;
public PlaceAutocompleteAdapter(Context context, GoogleApiClient googleApiClient,
                                LatLngBounds bounds, AutocompleteFilter filter) {
    super(context, android.R.layout.simple_expandable_list_item_2, android.R.id.text1);
    mGoogleApiClient = googleApiClient;
    mBounds = bounds;
    mPlaceFilter = filter;
}
public void setBounds(LatLngBounds bounds) {
    mBounds = bounds;
}
@Override
public int getCount() {
    return mResultList.size();
}
@Override
public AutocompletePrediction getItem(int position) {
    return mResultList.get(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = super.getView(position, convertView, parent);


    AutocompletePrediction item = getItem(position);

    TextView textView1 = (TextView) row.findViewById(android.R.id.text1);
    TextView textView2 = (TextView) row.findViewById(android.R.id.text2);
    textView1.setText(item.getPrimaryText(STYLE_BOLD));
    textView2.setText(item.getSecondaryText(STYLE_BOLD));

    return row;
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            ArrayList<AutocompletePrediction> filterData = new ArrayList<>();

            if (constraint != null) {
                filterData = getAutocomplete(constraint);
            }

            results.values = filterData;
            if (filterData != null) {
                results.count = filterData.size();
            } else {
                results.count = 0;
            }

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            if (results != null && results.count > 0) {
                mResultList = (ArrayList<AutocompletePrediction>) results.values;
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }

        @Override
        public CharSequence convertResultToString(Object resultValue) {
            if (resultValue instanceof AutocompletePrediction) {
                return ((AutocompletePrediction) resultValue).getFullText(null);
            } else {
                return super.convertResultToString(resultValue);
            }
        }
    };
}
private ArrayList<AutocompletePrediction> getAutocomplete(CharSequence constraint) {
    if (mGoogleApiClient.isConnected()) {
        Log.i(TAG, "Starting autocomplete query for: " + constraint);

        PendingResult<AutocompletePredictionBuffer> results =
                Places.GeoDataApi
                        .getAutocompletePredictions(mGoogleApiClient, constraint.toString(),
                                mBounds, mPlaceFilter);

        AutocompletePredictionBuffer autocompletePredictions = results
                .await(60, TimeUnit.SECONDS);

        final Status status = autocompletePredictions.getStatus();
        if (!status.isSuccess()) {
            Toast.makeText(getContext(), "Error contacting API: " + status.toString(),
                    Toast.LENGTH_SHORT).show();
            Log.e(TAG, "Error getting autocomplete prediction API call: " + status.toString());
            autocompletePredictions.release();
            return null;
        }

        Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount()
                + " predictions.");

        return DataBufferUtils.freezeAndClose(autocompletePredictions);
    }
    Log.e(TAG, "Google API client is not connected for autocomplete query.");
    return null;
}

Ответ 12

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

Используйте этот метод для получения lat и lang из placeid.