【问题标题】:Android GeoCoder: search by zip code returns unexpected resultsAndroid GeoCoder:按邮政编码搜索返回意外结果
【发布时间】:2017-08-11 09:32:21
【问题描述】:

我想通过 Android 的 GeoCoder 类使用用户输入文本进行搜索。这是我的代码:

Geocoder iGeocoder = new Geocoder(getContext(), Locale.GERMAN);

public Address getAdress(String aUserInput) {
    List<Address> tAddressList = iGeocoder.getFromLocationName(aUserInput, 1000, 47.060940, 8.564278, 51.526396, 13.736392);
    if(tAddressList != null &&
                tAddressList.size() > 0) {
        for(Address tAddress : tAddressList) {

            // return the first adress found for germany.
            Log.e(TAG, "returning Adress: " + tAddress );
            if(tAddress.getCountryCode().equals("DE")) {

                return tAddress;
            }

        }
        return null;
    } else {
        return null;
    }
}

我传递给getFromLocationName 的边界框大致代表了德国拜仁。我知道这个边界框并不能保证结果地址确实存在。我发现了一些问题,尤其是在通过邮政编码搜索时。

  • 按邮政编码搜索时返回的某些结果地址没有“管理区域”,因此我无法筛选出我想要的状态 (="Bayern")。
  • 奇怪的是,如果我搜索邮政编码 97070、97078 或 97076,GeoCoder 只返回美国俄勒冈州的地址。然而,这些邮政编码也位于德国维尔茨堡镇。例如。 97082 将返回 Würzburg 地址,但找不到 97070(Würzburg 中心),它只返回俄勒冈州地址。

【问题讨论】:

  • 就是代码。这一切都在一行“getFromLocationName..”中完成。你错过了什么吗?
  • 结果数(1000)和边界坐标是静态的,“aUserInput”是用户正在搜索的内容,它可以是从邮政编码到城市或街道名称甚至兴趣点的任何内容.
  • 非常感谢您的宝贵时间!
  • 你刚刚打错字了。在下面查看我的答案
  • @YvetteColomb 试图最小化错误,因为android developper 说第二个参数是the desired Locale for the query results。我不认为 OP 使用文档失败了。我猜这是对localetypo 的混淆

标签: java android google-maps


【解决方案1】:

尝试自定义您的locale。使用德国和德国。 Germany 用于德国的语言环境,而不是 language

Locale locale = new Locale(langCode, countryCode) 

Locale locale = new Locale("de", "DE");

Geocoder iGeocoder = new Geocoder(getContext(), locale);

GeoCode 默认为美国,因此它似乎首先在搜索邮政编码时进行过滤。如果你test here

97070 给出Wilsonville, OR 97070, USA 的结果

47.060940, 8.564278Spitzibüelstrasse 8, 6410 Goldau, Switzerland

97070, 47.060940, 8.564278 没有给出任何结果(这只是测试人员),它无法区分结果以包括该邮政编码和经度。

如果您需要增加区域设置区域 - 您始终可以创建一个包含 3 个国家/地区区域设置的数组并在每个区域上进行搜索。

你也有太多的返回 - 你只需要在第一个 if 之后的一个 null 返回,如果它没有返回地址,以确保所有路径都有返回值。

public Address getAdress(String aUserInput) {
    .../...
    if(.../...) {
        for(Address tAddress : tAddressList) {
            .../...
            if(tAddress.getCountryCode().equals("DE")) {

                return tAddress;
            }
        }
     }
    return null;
}

还有Region Biasing 感谢jausen brett提供链接

https://maps.googleapis.com/maps/api/geocode/json?address=<some address>&region=de&key=YOUR_API_KEY

Component Filtering

https://maps.googleapis.com/maps/api/geocode/json?components=locality:<desired locality>|country:DE&key=YOUR_API_KEY

【讨论】:

  • 精心制作。
  • 自从您参加主持人选举以来,我认为您会足够合理...人们对我的回答投了反对票,这是正确的(您的捷径) OP 只是打错了。感觉朋友们在联合起来攻击我(编码不会撒谎......你和我的答案都解决了这个问题,我得到了两张反对票。阴谋?哈哈)
  • @YvetteColomb 没错。既然你在 mod 选举中我知道我可以信任你。这就是我什至发布的原因。第一个答案没有解决好的。第二个答案不值得反对。 OP 只是滥用了一个 Java 常量。你走得更深了。如果 OP 知道这只是一个错字,他就不会问这个问题。因此,如果您投赞成票,我想 OP 也对我投了反对票。我将删除我的答案,因为知道这是一个拼写错误没有帮助
  • Google API 文档有另一个按区域过滤的示例(“偏置地理编码结果”)。虽然在这种情况下使用了城市名称,但我希望任何地址组件都有相同的行为。
  • 我刚刚测试过了(抱歉耽搁了)。 97070 现在返回预期的维尔茨堡地址。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多