Android GeoCoder:按邮政编码搜索会返回意外结果

最白目*_*最白目 4 java android google-maps

我想通过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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我传给getFromLocationName大致代表德国拜仁的边界框.我知道这个边界框不能保证结果地址真的存在.我发现一些问题,特别是在通过邮政编码搜索时.

  • 通过邮政编码搜索时返回的一些结果地址没有"管理区域",因此我无法过滤我想要的状态(="拜仁").
  • 奇怪的是,如果我搜索邮政编码97070,97078或97076,GeoCoder只返回美国俄勒冈州的地址.然而,这些邮政编码也是德国维尔茨堡镇的地方.例如97082将返回Würzburg地址,但是97070(维尔茨堡中心)将无法找到,它只返回俄勒冈州的地址.

Yve*_*omb 8

尝试自定义您的区域设置.使用德国和德国.德国被用于德国的国家而不是语言.

Locale locale = new Locale(langCode, countryCode) 

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

Geocoder iGeocoder = new Geocoder(getContext(), locale);
Run Code Online (Sandbox Code Playgroud)

GeoCode默认为美国,因此它首先会过滤搜索邮政编码.如果你在这里测试:

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

47.060940, 8.564278给出Spitzibüelstrasse8,6410Goldau,瑞士

97070, 47.060940, 8.564278 没有给出结果(这只是测试者),它无法区分结果以包含该邮政编码和lat long.

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

您还有太多的返回 - 您只需要在第一个null之后返回一个if并且如果它不返回地址,则确保所有路径都有返回值.

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

                return tAddress;
            }
        }
     }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

还有Region Biasing感谢jausen brett的链接

https://maps.googleapis.com/maps/api/geocode/json?address=<some address>&region=de&key=YOUR_API_KEY
Run Code Online (Sandbox Code Playgroud)

组件过滤

https://maps.googleapis.com/maps/api/geocode/json?components=locality:<desired locality>|country:DE&key=YOUR_API_KEY
Run Code Online (Sandbox Code Playgroud)