从自动完成位置api返回的place_id中获取Lat Lang

Saj*_*jal 40 android google-maps latitude-longitude google-places-api google-maps-android-api-2

我正在使用谷歌自动填充地点api搜索我的应用程序中的位置,现在我想得到我搜索过的地方的纬度和经度.如何从Android中的谷歌自动完成地点api返回的结果获取经度和经度?

小智 44

以下使用Google Places API for 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();
  }
});
Run Code Online (Sandbox Code Playgroud)

访问Google Places API for Android,获取从某个地方检索数据的完整方法列表


Cal*_*aNN 28

Google Place详细信息就是答案.

place_id你有,查询详细地点类似https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key},你可以得到的lat,并lngresult.geometry.locationJSON.


小智 8

请提供 Place.Field.LAT_LNG 以获取该地点的纬度和经度。

 autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, 
 Place.Field.NAME,Place.Field.LAT_LNG));
Run Code Online (Sandbox Code Playgroud)

然后得到 LatLng

LatLng destinationLatLng = place.getLatLng();
Run Code Online (Sandbox Code Playgroud)

并且可以看透吐司

 destlat = destinationLatLng.latitude;
 destLon = destinationLatLng.longitude;
 Toast.makeText(getApplicationContext(), "" + destlat + ',' + destLon, Toast.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)


Rav*_*put 6

基于最新版本的 AutoComplete 文档

选项 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));
Run Code Online (Sandbox Code Playgroud)

选项 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);
Run Code Online (Sandbox Code Playgroud)

无论您对哪个领域感兴趣,都必须如上所述提及。

你会得到如下结果:

 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."
}
Run Code Online (Sandbox Code Playgroud)

注:显示的结果是将Place对象解析为json


nit*_*anj 5

在这个地方,自动完成响应返回的每个地方都有一个ID和一个参考字符串作为解释在这里.

使用任何一个(最好在弃用引用时为Id)来查询Places API以获取有关该地点的完整信息(包括lat/lng):https: //developers.google.com/places/documentation/details#PlaceDetailsRequests

关于shyam的评论 - 只有在自动完成响应中有完整地址时,地理编码才有效,但情况并非总是如此.此外,地理编码还会列出可能的结果,因为您在自动填充响应中获得的地点描述不是唯一的.根据您的需要,地理编码可能就足够了.


小智 5

在函数下添加这些行

 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);
Run Code Online (Sandbox Code Playgroud)