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

5 回答 5

4

根据我的经验,谷歌地理编码器并不总是有效,我在地图上有几个固定点,当我点击覆盖时,它会弹出一个带有该纬度/经度地址的吐司,这些点不会改变,有时我单击同一点 10 次,但我只得到其中的 7 个地址。

这很奇怪,但就是这样,我只是修改了我的应用程序来解决这个问题。

于 2010-11-12T22:33:36.223 回答
2

上述方法以及 Internet 上的许多其他示例的问题在于,它们仅尝试使用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++;
   }
}
于 2012-08-11T16:17:03.023 回答
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

于 2015-04-08T22:49:25.357 回答
0

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

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

于 2016-02-08T15:14:48.363 回答
0

如果您使用自动完成,您可以从 Place 对象获取地点位置:

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);
于 2016-08-23T09:08:26.440 回答