使用Google Maps PlacePicker API时我输入了错误的地名(坐标)

时间:2018-08-06 05:34:53

标签: java android google-maps google-places-api

我现在使用Google Maps SDK和适用于Android的PlacePicker SDK(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" />

如果我使用自动完成搜索,结果很好,它获得了正确的地名(Central Park Mall) place name from Autocomplete Search

但是,如果我使用“选择此位置”,则会输入错误的地名

select

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

bad result

是否有解决方案来获取正确的地名?应该可以,因为我从“选择此位置”按钮中找到了使用Google Maps SDK和placePicker且具有正确地名的应用。

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

Correct place name

2 个答案:

答案 0 :(得分:1)

总而言之,问题是当我使用PlacePicker选择随机点时,我无法获得该地点的名称吗?

答案-

这样做的原因是,谷歌为地球上的每个地方都提供了经度和纬度。所以几乎所有地方都有地址。但是当提到名字时,所有地方都没有名字。因此,当您从PlacePicker中选择一个随机点时,可能会或可能不会为其分配名称。如果它具有名称,那么place.getName()将为您提供。但是,如果它没有名称place.getName()将为您提供该位置的纬度和经度。

我还通过传递place.getId()并检索了地点的名称,使用了GeoDataClient API对此进行了验证。但它还会返回名称为该地点的名称,否则它将返回该地点的纬度和经度。

在谈到PlaceAutoComplete时,它仅显示可以通过名称搜索的地方。

答案 1 :(得分:0)

我找到了解决方案!只需检查位置类型,如果位置类型为0,则只需使用地址,因为它是从带有“选择此位置”的随机选择中放置的,并且输出是坐标

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