我在使用 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);
}
我现在正在使用 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);
}