我能够成功获得lat / long并将其传递给地理编码器以获取地址。但是,我并不总是得到一个地址。好像需要几次尝试?我不知道为什么。
此时我有更好的方法获取地址吗?
public List<Address> getAddresses(){
Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
List<Address> addresses = new ArrayList();
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1);
} catch (IOException e) {
e.printStackTrace();
}
return addresses;
}
我在这里称这个方法:
LocationListener onLocationChange=new LocationListener() {
public void onLocationChanged(Location loc) {
//sets and displays the lat/long when a location is provided
String latlong = "Lat: " + loc.getLatitude() + " Long: " + loc.getLongitude();
latitude = loc.getLatitude();
longitude = loc.getLongitude();
List<Address> addresses = getAddresses();
if(addresses.size() > 0 && addresses != null)
zipcode = addresses.get(0).getPostalCode();
Toast.makeText(getApplicationContext(), zipcode,Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:4)
根据我的经验,Googles Geocoder并不总是有效,我在地图上有几个固定点,当我点击覆盖图时它会弹出一个带有该纬度/长度地址的吐司,这些点不会改变,有时我点击同一个点10次,但我只得到一个地址7。
这很奇怪,但就是这样,我只是修改了我的应用来解决这个问题。
答案 1 :(得分:3)
上述方法的问题以及互联网上的许多其他示例是,他们只尝试使用addresses.get(0).getPostalCode()
从第一个返回的提供程序检索数据。当您执行代码List<Address> addresses = getAddresses()
时,它会检索提供程序列表,每个提供程序都提供自己的数据。并非所有提供商都包含相同的数据。
我收到邮政编码时遇到了同样的问题。在我的初步测试中,我发现我正在接收来自6个提供商的数据。这6个提供商中只有2个返回了邮政编码。我尝试使用address.get(0).getPostalCode()
访问的第一个提供程序不是其中之一。更合适的方法是遍历所有返回的提供程序,以查看谁返回了我正在查找的数据。
以下内容应该有效。可能性是,其中一个提供商将返回邮政编码。这可以对提供商返回的任何地理编码数据进行。
List<Address> address = gc.getFromLocation(myLatitude, myLongitude, 10);
if (address.size() > 0) {
strZipcode = address.get(0).getPostalCode();
//if 1st provider does not have data, loop through other providers to find it.
count = 0;
while (strZipcode == null && count < address.size()) {
strZipcode = address.get(count).getPostalCode();
count++;
}
}
答案 2 :(得分:1)
Geocoder在某些地区不起作用。您可以使用地理编码Api,而不是使用Geocoder。点击链接获取有关api的详细信息,
答案 3 :(得分:0)
万一有人还在寻找修复,这就是我所做的: 首先,我确保所有的点都很好(会加载)但可能并不总是被地理编码抓住(获取数据被击中或错过) 第二,我们强制代码执行我们想要的操作,换句话说,如果我们知道它可以找到lat和long,那就让它继续尝试直到它完成!这似乎也影响了我的加载时间!所以这是代码:
do {
$geocode=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr.'&key='.$key.'sensor=false');
$output= json_decode($geocode);
$lat = $output->results[0]->geometry->location->lat;
$long = $output->results[0]->geometry->location->lng;
} while($lat == '' and $long == '');
这将继续循环,直到lat和long都不是空字符串!
快乐的编码! :P答案 4 :(得分:0)
如果您使用自动填充功能,则可以从Place对象获取地点位置:
$file = $path.'mailing_'.date("d-m-Y_H-i-s"). '.docx';
$template->saveAs($file);
此回调应在AdapterView.OnItemClickListener:
中注册如下private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback
= new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (!places.getStatus().isSuccess()) {
// Request did not complete successfully
AALog.e("Geocoder Place query did not complete. Error: " + places.getStatus().toString());
return;
}
// Get the Place object from the buffer.
final Place place = places.get(0);
//--------------here you can recover the place location---------------------
((DrawerActivity)getActivity()).lastPlace = place.getLatLng();
//----------------------------------------------------------------------
places.release();
getActivity().getFragmentManager().beginTransaction().remove(AutocompleteFragment.this).commit();
}
};