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

时间:2010-11-12 21:29:14

标签: java android reverse-geocoding geocode google-geocoder

我能够成功获得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();
        }

5 个答案:

答案 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的详细信息,

https://developers.google.com/s/results/?q=geocoding+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();
    }
};