Android反向地理编码getLocality通常返回null

Posted

技术标签:

【中文标题】Android反向地理编码getLocality通常返回null【英文标题】:Android reverse geocoding getLocality returns often null 【发布时间】:2012-01-29 12:24:39 【问题描述】:

我正在使用 android 地理编码通过Address.getLocality() 获取当前城市。它运行良好,直到最近它似乎经常为本地返回 null。

这是一个例子:

try 
    Geocoder c = new Geocoder(this, Locale.getDefault());
    double lat = 51.481;
    double lon = 0.0;
    List<Address> l = c.getFromLocation(lat, lon, 5);
    for (Address a: l) 
        Log.i("GeocoderTest", "Locality " + a.getLocality() + " (" + a + ")");
    
 catch (IOException e) 
    Log.e("GeocoderTest", "", e);

这现在为第一个返回的地址记录以下消息:

Locality null (Address[addressLines=[0:"14-18 Park Vista",1:"London 伦敦格林威治区 SE10",2:"UK"],feature=,admin=null,sub-admin=null,locality=null,thoroughfare=Park Vista,postalCode=null,countryCode=GB,countryName=United Kingdom,hasLatitude=true,latitude=51.4819069,hasLongitude=true,longitude=-6.327E-4,phone=null,url=null,extras=null])

有些位置确实会返回当地的城市,而旁边的位置则不会。

所以它之前确实工作得很好,实际上我以前没有见过空位置。所以我想谷歌的地理编码服务一定发生了一些变化。知道发生了什么,这种情况是永久性的吗?如果是,从某个位置确定城市的最佳方法是什么?

【问题讨论】:

【参考方案1】:

我注意到,getLocality() 通常会为列表中的第一个地址返回 null,由 Geocoder 返回。 另一方面,正确的城市名称保留在下一个地址的位置。 所以我正在使用这种解决方法,它适用于大城市:

 private String getCityNameByCoordinates(double lat, double lon) throws IOException 
    List<Address> addresses = mGeocoder.getFromLocation(lat, lon, 10);
    if (addresses != null && addresses.size() > 0) 
        for (Address adr : addresses) 
            if (adr.getLocality() != null && adr.getLocality().length() > 0) 
                return adr.getLocality();
            
        
    
    return null;

【讨论】:

感谢 sn-p。这比空值要好:) 感谢您的更新! @Leo Droidcoder 你有没有见过这也失败了?我的意思是所有地址都失败了? 可能会失败...发生在我身上 我的代码停在List&lt;Address&gt; addresses = mGeocoder.getFromLocation(lat, lon, 10);。有什么问题?【参考方案2】:

现在我住在加拿大安大略省汉密尔顿(汉密尔顿是我的城市,安大略是省)

我注意到getLocality() 返回 null,getAdminArea() 返回安大略,getSubLocality() 返回 Hamilton。 ch

【讨论】:

【参考方案3】:

在 Kotlin 中我做了类似的事情,给定地址 a

var place = a.locality
if (place == null) place = a.subLocality
if (place == null) place = a.subAdminArea
if (place == null) place = a.adminArea

它甚至适用于偏远地区

【讨论】:

【参考方案4】:

使用 getSubAdminArea() 对我来说效果很好。

【讨论】:

以上是关于Android反向地理编码getLocality通常返回null的主要内容,如果未能解决你的问题,请参考以下文章

Android 反向地理编码

Android:反向地理编码不起作用

Android 反向地理编码需要 Internet 连接或后端数据提供程序

Android - 获取位置(地理编码器/谷歌播放服务)?

反向数据编码是啥

iOS5 反向地理编码限制