地理编码器并不总是返回值

我能够成功获得lat / long并将其传递给地理编码器以获取地址。 但是,我并不总是得到一个地址。 好像需要几次尝试? 我不知道为什么。

在这一点上,我有更好的方法来获取地址吗?

public List
getAddresses(){ Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault()); List
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
addresses = getAddresses(); if(addresses.size() > 0 && addresses != null) zipcode = addresses.get(0).getPostalCode(); Toast.makeText(getApplicationContext(), zipcode,Toast.LENGTH_SHORT).show(); }

根据我的经验,谷歌地理编码器并不总是有效,我在地图上有几个不动点,当我点击覆盖层时,它会弹出一个烤面包片,这个点不会改变,有时我点击一个同一点10次,但我只得到了其中的7个地址。

这很奇怪,但事实就是如此,我只是修改了我的应用来解决这个问题。

上述方法的问题,以及互联网上的许多其他示例,是它们只尝试使用addresses.get(0).getPostalCode()从第一个返回的提供程序检索数据。 当您执行代码List

addresses = getAddresses()

,它会检索提供程序列表,每个提供程序都提供自己的数据。 并非所有提供商都包含相同的数据。

我收到邮政编码时遇到了同样的问题。 在我的初步测试中,我发现我正在接收来自6个提供商的数据。 这6个提供商中只有2个返回了邮政编码。 我尝试使用address.get(0).getPostalCode()访问的第一个提供程序不是其中之一。 更合适的方法是遍历所有返回的提供程序,以查看谁返回了我正在查找的数据。

像下面这样的东西应该工作。 可能性是,其中一个提供商将返回邮政编码。 这可以对提供商返回的任何地理编码数据进行此操作。

 List
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++; } }

地理编码器在某些区域不起作用。 您可以使用地理编码Api,而不是使用Geocoder。 点击链接获取有关api的详细信息,

https://developers.google.com/s/results/?q=geocoding+api

万一有人还在寻找修复,这就是我所做的:首先,我确保所有的点都很好(会加载)但可能并不总是被地理编码抓住(获得数据被击中或错过)第二,我们强制代码执行我们想要它做的事情,换句话说,如果我们知道它可以找到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

如果您使用自动填充function,则可以从Place对象获取地点位置:

 private ResultCallback mUpdatePlaceDetailsCallback = new ResultCallback() { @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(); } }; 

此回调应在AdapterView.OnItemClickListener中注册如下:

  PendingResult placeResult = Places.GeoDataApi .getPlaceById(mGoogleApiClient, placeId); placeResult.setResultCallback(mUpdatePlaceDetailsCallback);