Android地理编码器反向定位-获取城市的可靠方法?

Posted

技术标签:

【中文标题】Android地理编码器反向定位-获取城市的可靠方法?【英文标题】:Android geocoder reverse location - reliable way to get the city? 【发布时间】:2014-03-22 04:50:54 【问题描述】:

到目前为止,我已经搜索了很多次。

android 地理编码器返回 android.location.Address 对象。 据我了解,这座城市应该返回getLocality()。 似乎在美国国内这行得通,但在国外则不然。

我正在编写一个国际应用程序,并努力寻找一种解决方案来找出地理位置所在的城市。

这里是捷克***/布拉格的输出:

Address[addressLines=
[0:"Psohlavců 1764/2",
1:"147 00 Prague-Prague 4",
2:"Czech Republic"],
feature=2,
admin=Hlavní město Praha,
sub-admin=Prague,
locality=null,
thoroughfare=Psohlavců,
postalCode=147 00,
countryCode=CZ,
countryName=Czech Republic,
hasLatitude=true,
latitude=50.0276543,
hasLongitude=true,
longitude=14.4183926,
phone=null,
url=null,
extras=null]

locality 为空,城市在sub-admin 内! 地址本身没问题,所以地理编码器服务器似乎知道城市。

这里有一些随机的欧盟示例,但局部性部分起作用:

Address[addressLines=[0:"Nad lesem 440/34",1:"147 00 Prague-Prague 4",2:"Czech Republic"],feature=34,admin=Hlavní město Praha,sub-admin=Prague,locality=null,thoroughfare=Nad lesem,postalCode=147 00,countryCode=CZ,countryName=Czech Republic,hasLatitude=true,latitude=50.02424,hasLongitude=true,longitude=14.4117568,phone=null,url=null,extras=null]

Address[addressLines=[0:"Hauner Straße 4",1:"84431 Heldenstein",2:"Germany"],feature=4,admin=null,sub-admin=null,locality=Heldenstein,thoroughfare=Hauner Straße,postalCode=84431,countryCode=DE,countryName=Germany,hasLatitude=true,latitude=48.2540274,hasLongitude=true,longitude=12.3413535,phone=null,url=null,extras=null]

Address[addressLines=[0:"Igler Straße",1:"6020 Innsbruck",2:"Austria"],feature=Igler Straße,admin=Tyrol,sub-admin=Innsbruck,locality=Innsbruck,thoroughfare=Igler Straße,postalCode=6020,countryCode=AT,countryName=Austria,hasLatitude=true,latitude=47.2465698,hasLongitude=true,longitude=11.4054237,phone=null,url=null,extras=null]

Address[addressLines=[0:"Durnberg 24",1:"5724 Stuhlfelden",2:"Austria"],feature=24,admin=Salzburg,sub-admin=Zell am See District,locality=null,thoroughfare=Durnberg,postalCode=5724,countryCode=AT,countryName=Austria,hasLatitude=true,latitude=47.3233373,hasLongitude=true,longitude=12.4960482,phone=null,url=null,extras=null]

Address[addressLines=[0:"U Roháčových kasáren 14",1:"100 00 Prague 10",2:"Czech Republic"],feature=14,admin=Hlavní město Praha,sub-admin=Prague,locality=Prague 10,thoroughfare=U Roháčových kasáren,postalCode=null,countryCode=CZ,countryName=Czech Republic,hasLatitude=true,latitude=50.0704092,hasLongitude=true,longitude=14.4673473,phone=null,url=null,extras=null]

也许是我的错,但在我看来,根据国家和地区的不同,城市会出现在不同的领域。 但是,地址本身似乎足以发送一封邮政信函。

是否有人编写了一个巧妙的函数来尝试从地理编码器结果中获得更多意义?遗憾的是,谷歌存储了这些信息,但没有正确提供。

【问题讨论】:

是的。在某些国家情况有所不同。先看locality,如果是空的,检查sub-admin。 如果 locality 为空,您确定 sub-admin 是否可靠? 仅根据我的经验,它要么在本地,要么在子管理员。还没有遇到过两者都为空的情况。 这是一个错误。即使我遇到了同样的问题。不幸的是,我还没有找到解决方法。 【参考方案1】:

要结束我的问题,通过解决方法解决了它。 使用 dannyroa 的建议

String city="unknown";
if (address.getLocality() != null)  city=address.getLocality();
else
  if (address.getSubAdminArea() != null)  city=address.getSubAdminArea();

这可以通过从第二个地址行中获取城市信息来进一步扩展。 删除邮政编码并取其余部分,但此信息在城市内不是唯一的,可能会因地区/区域而异。

【讨论】:

它也不可靠,因为有时 getSubAdminArea() 也返回 null,但 city 停留在 mAdminArea 中(并且以奇怪的格式“city CityName”)。似乎这种反向地理编码不够可靠 也许您可以提供一个示例位置?谷歌在这方面做得很糟糕,他们可能开始并意识到他们的数据对新国家的适应程度有多么糟糕。看起来他们一直在用越来越多的数据扩展他们已经不合适的结构,到处铲。但是:您可以使其可靠。如果此代码在特定国家/地区失败,那么您只需要找到该国家/地区的“正确规则”并为其添加“if”案例。到目前为止,它适用于所有与我相关的国家(到目前为止) 根本不可靠。子管理区域并不总是城市。 你和 Leo 一样重要。没有示例,您的评论毫无用处。

以上是关于Android地理编码器反向定位-获取城市的可靠方法?的主要内容,如果未能解决你的问题,请参考以下文章

Android 反向地理编码

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

javascript 只从Google Maps API反向地理编码器获取城市和州

javascript 只从Google Maps API反向地理编码器获取城市和州

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

如何使用 android 中的 OSM 数据为单个城市实现离线地理编码器?