2010-11-12 44 views
4

我能够成功获取经纬度并将其传递给地址解析器以获取地址。但是,我并不总是收到回复地址。似乎需要几次尝试?我不知道为什么。Geocoder并不总是返回值

现在有没有更好的方法来获取地址?

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

有很多lats和longs没有人住在附近? – John 2010-11-12 21:33:05

+0

有趣的是,它可以检测到我的确切邮编,它只需要几次尝试?测试期间我没有移动位置。 – 2010-11-12 21:33:53

+0

你应该测试这个代码,并列出一些经验证的纬度/经度点,你知道它的地址(或缺少它)。 – 2010-11-12 21:35:47

回答

4

在我的经验,谷歌的地理编码器总不上班,我有一对夫妇在地图上的固定点,当我点击覆盖它弹出一个为这个经纬度的地址加油,这些点不会改变,有时我点击10次相同的点,但我只能得到7个地址。

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

+0

你是怎么得到它的? – 2010-11-12 22:45:00

+2

不完全聪明或有效,但我做了一段时间的循环,我要求的地址,直到我得到它或最多3次。网络上的压力并不是那么糟糕,99%的时间在我第三次得到我正在寻找的答案时。我在第三节我没有得到它,我认为这是根本没有信息的那一点。 我知道,这可以解决得更好。 – blindstuff 2010-11-13 15:26:04

+0

有趣,生病得试试看。 – 2010-11-13 23:42:10

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

strZipcode = address.get(count).getPostalCode(); – Jambaaz 2015-04-28 19:22:53

0

的情况下,任何人都还在寻找一个解决方法,这里是我做过什么: 首先,我确信所有的点都很好(将加载),但并不一定能够获得通过地理编码抓住(获取数据被击中或未命中) 秒,我们强制代码做我们希望它做的事,换句话说,如果我们知道它可以找到一个经纬度,让它继续尝试,直到它!这diddnt似乎也影响我的加载时间!所以这里是代码:

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 == ''); 

这将继续循环,直到经度和长度都不是空字符串!

快乐编码! :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(); 
    } 
}; 

这个回调应该被注册为遵循内部适配器视图。OnItemClickListener:

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