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

4

我能够成功获取经纬度并将其传递给地理编码器以获取地址。然而,并非总是能够得到地址。看起来需要尝试几次?我不确定原因。

在这个阶段,有没有更好的方法让我获取地址?

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

有很多经纬度没有附近的居民吗? - John
有趣的是,它可以检测到我的确切邮政编码,只需要尝试几次?在测试期间,我没有改变位置。 - Sheehan Alam
你应该使用一组已知地址(或缺乏地址)的经纬度点列表来测试此代码。 - Peter Knego
5个回答

4
根据我的经验,谷歌地理编码器并不总是有效的。我在地图上有几个固定点。当我点击覆盖层时,会弹出一个消息框,其中包含该纬度/经度的地址。这些点不会改变,有时我会连续点击同一点10次,但只有7次会返回地址。虽然很奇怪,但事实就是如此。我只好修改我的应用程序来解决这个问题。

你是如何解决这个问题的? - Sheehan Alam
2
不算特别智能或高效,但我用了一个while循环,直到获得地址或尝试3次为止。对网络的压力并不大,99%的情况下在第3次得到了我要找的答案。如果到第3次还没有得到,那我就假设该点没有信息。我知道,这样做可能有更好的解决方法。 - blindstuff
有趣,我得试试看。 - Sheehan Alam
2
所以你知道...你正在访问的地理编码服务每个IP地址每15秒只允许一次请求。 - apesa
我之前并没有意识到这一点,但即使那是真的,肯定有些奇怪的地方,因为我确实得到了连续的响应。 - blindstuff
1
我不认为apesa的评论是正确的,因为我的应用程序对该服务进行了12个连续调用,95%的时间我都获得了所需的数据。另外5%只返回了一部分数据。这也是间歇性的,因为大约3个月前我编写应用程序时根本没有遇到过服务问题。 - bradley4

2
上述方法以及互联网上的许多其他示例存在问题,它们仅尝试使用addresses.get(0).getPostalCode()从第一个返回的提供程序中检索数据。当执行代码List<Address> addresses = getAddresses()时,它会检索一组提供程序,每个提供程序都提供自己的数据。并非所有提供程序都包含相同的数据。
我在接收邮政编码时遇到了同样的问题。在我的初步测试中,我发现我从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++;
   }
}

0

如果有人仍在寻找解决方法,这是我所做的: 首先,我确保所有点都没问题(可以加载),但可能无法被地理编码抓取(获取数据时有时成功有时失败)。 其次,我们强制代码执行我们想要它执行的操作,换句话说,如果我们知道它可以找到纬度和经度,让它一直尝试直到找到为止!这似乎也不会影响我的加载时间!所以这就是代码:

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


0

如果您正在使用自动完成功能,您可以从地点对象中获取位置信息:

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

应该将此回调函数注册为AdapterView.OnItemClickListener中的如下形式:

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接