如何在Android中使用坐标(lat,lon)获取Place ID

时间:2018-05-31 06:39:13

标签: java android google-maps

我使用 Google Maps API ,需要使用lat和lon获取该地点的详细信息。

  

我试图通过Geocoder,但Class" 地址"没有   参数 PLACE_ID

Geocoder gcd = new Geocoder(getApplicationContext(), Locale.getDefault());
            List<Address> addresses = null;
            try {
                addresses = gcd.getFromLocation(52.2641, 76.9597, 1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (addresses.size() > 0) {
                Toast.makeText(this, addresses.get(0).getPlaceID(), Toast.LENGTH_SHORT).show();
            }
            else {
                // do your stuff
            }

4 个答案:

答案 0 :(得分:0)

<强> FYI

Geocoder 未提供 getPlaceID()

  

提供placeId以查找给定地点ID的地址。这个地方   ID是可与其他Google API一起使用的唯一标识符

GeocoderRequest对象文字包含以下字段:

{
 address: string,
 location: LatLng,
 placeId: string,
 bounds: LatLngBounds,
 componentRestrictions: GeocoderComponentRestrictions,
 region: string
}

您应该阅读Retrieving an Address for a Place ID

 /**
   * Requests the details of a Place.
   *
   * <p>We are only enabling looking up Places by placeId as the older Place identifier, reference,
   * is deprecated. Please see the <a
   * href="https://web.archive.org/web/20170521070241/https://developers.google.com/places/web-service/details#deprecation">
   * deprecation warning</a>.
   *
   * @param context The context on which to make Geo API requests.
   * @param placeId The PlaceID to request details on.
   * @return Returns a PlaceDetailsRequest that you can configure and execute.
   */
  public static PlaceDetailsRequest placeDetails(GeoApiContext context, String placeId) {
    PlaceDetailsRequest request = new PlaceDetailsRequest(context);
    request.placeId(placeId);
    return request;
  }

答案 1 :(得分:0)

你可以在标记的基础上获得位置Id。像这样的东西:

   mGoogleMap.setOnPoiClickListener(new GoogleMap.OnPoiClickListener() {
        @Override
        public void onPoiClick(PointOfInterest pointOfInterest)
        {
                addOrSaveMarkerToMap(pointOfInterest.latLng.latitude, pointOfInterest.latLng.longitude, pointOfInterest.name, "", pointOfInterest.placeId, true, true);


            //Toast.makeText(GoogleMapsActivity.this,""+pointOfInterest.name+" (lat: "+pointOfInterest.latLng.latitude+", long: "+pointOfInterest.latLng.longitude+") " +" is added in your favorite list",Toast.LENGTH_LONG).show();
        }
    });

如果您想了解更多有关兴趣点的信息,请查看此文档链接。

https://developers.google.com/maps/documentation/android-sdk/poi

最好的方法是使用google places API。它将为您提供有关特定地点的全部信息。

如果您想使用google places API,请点击以下链接:

How to get place or placeid by latLng in android using google places api?

答案 2 :(得分:0)

要从坐标获取地点ID,您应该使用REST API执行reverse geocoding查找。

原生Android API地理编码器不支持在getFromLocation()结果中获取地点ID。不幸的是,谷歌地图Android SDK既不提供内置的Geocoder。功能请求存在很长时间,但看起来它没有高优先级:

https://issuetracker.google.com/issues/35823852

因此,要获得地点ID,您必须坚持使用REST API。您可以在github上找到适用于Google Maps API Web服务的Java客户端库:

https://github.com/googlemaps/google-maps-services-java

您可以使用此库从Java代码中调用Geocoding API。

GeoApiContext context = new GeoApiContext.Builder()
    .apiKey("AIza...")
    .build();
GeocodingResult[] results =  GeocodingApi.newRequest(context)
    .latlng(new LatLng(52.2641, 76.9597)).await();
System.out.println(results[0].placeId);

请注意,网络服务的API密钥必须与您在Google Maps Android SDK中使用的API密钥不同,因为网络服务不支持Android应用限制。

还要考虑图书馆文档中的这一重要说明

  

Google Maps Services的Java客户端旨在用于服务器应用程序。此库不适用于Android应用内部,因为可能会丢失API密钥。

     

如果您要构建移动应用程序,则需要引入代理服务器作为移动应用程序和Google Maps API Web服务之间的中介。 Google Maps Services的Java客户端将成为这种代理服务器的基础。

我希望这有帮助!

答案 3 :(得分:-1)

尝试这个

Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());

addresses = geocoder.getFromLocation(latitude, longitude, 1); 
// Here 1 represent max location result to returned, by documents it recommended 1 to 5

String address = addresses.get(0).getAddressLine(0); 
// If any additional address line present than only, check with max 
available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName(); 
// Only if available else return NULL