我在使用 Google Maps PlacePicker API 时得到了错误的地名(坐标)

i got wrong place name (got coordinate) when using Google Maps PlacePicker API

我现在正在使用 Google Maps SDK 和 PlacePicker SDK for android(iOS 即将推出)使用此代码:

int REQUEST_PLACE_PICKER = 1;

PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder();                    
Intent intent = intentBuilder.build(getActivity());
startActivityForResult(intent, REQUEST_PLACE_PICKER);

这是我的 onActivityResult 覆盖函数:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_PLACE_PICKER) {

        if (resultCode == Activity.RESULT_OK) {

            final Place place = PlacePicker.getPlace(getActivity(), data);

            final CharSequence name = place.getName();

            mLocationNameTextView.setText(name);

        }

    }

    super.onActivityResult(requestCode, resultCode, data);
}

这是我的许可:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

如果我使用自动完成搜索,结果很好,它得到了正确的地名(中央公园购物中心)

但是,如果我使用 Select 这个位置,我会弄错地名

地名的输出将是我选择位置的坐标而不是街道名称,所以如果我为我的用户输入坐标将是错误的信息

有什么办法可以得到正确的地名吗?这应该是可能的,因为我找到了使用 Google Maps SDK 和 placePicker 的应用程序,并从 'Select this location' 按钮获得了正确的地名。

这是成功获取适当地名的示例应用程序

总而言之,问题是当我使用 PlacePicker select 一个随机点时,我无法获取那个地方的名称?

回答-

原因是 google 为地球上的每个地方提供经纬度。所以几乎所有的地方都有地址。但是说到名字,所有的地方都没有名字。因此,当您 select 来自 PlacePicker 的随机点时,它可能有也可能没有分配名称。如果它有名称,那么 place.getName() 将为您提供。但如果它没有名称 place.getName() 将为您提供该地点的纬度和经度。

我还使用 GeoDataClient API 验证了这一点,方法是传递 place.getId() 并检索地点名称。但它也 returns 那个地方有名字的名字 else returns 那个地方的纬度和经度。

而当涉及到 PlaceAutoComplete 时,它​​只显示可以按名称搜索的地方。

我得到了解决方案!只需检查地点类型,如果地点类型为 0,只需使用地址,因为它是随机选择的地点 'select this location',输出是坐标

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_PLACE_PICKER) {

        if (resultCode == Activity.RESULT_OK) {

            final Place place = PlacePicker.getPlace(getActivity(), data);

            if (place.getPlaceTypes().get(0).intValue() == 0) {
                mLocationNameTextView.setText(place.getAddress().toString());
            } else {
                mLocationNameTextView.setText(place.getName(););
            }              
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}