如何防止谷歌地理编码器从其他国家返回结果

Posted

技术标签:

【中文标题】如何防止谷歌地理编码器从其他国家返回结果【英文标题】:How to prevent google geocoder from returning results from other countries 【发布时间】:2013-11-28 04:07:18 【问题描述】:

我正在使用谷歌地理编码器,并选择只返回来自德国的结果

这是我的功能的相关部分

    ...
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode("address":address,"region":"DE" , function(results, status) 
        if (status == google.maps.GeocoderStatus.OK) 
            if (results[0].geometry.location) 
                completeGeo(results[0],address);
             else 
                completeGeo(null,address);
            

     ...

但如果我对“cuvry”进行地理编码也能在德国找到那条街道

google 返回例如“Cuvry, France”,它在区域参数之外

如何防止谷歌地理编码器返回不在某个国家/地区的结果? 我的意思是返回,如果国家代码匹配,则不检查回调。

【问题讨论】:

请注意,偏差只偏好特定域的结果;如果在此域之外存在更多相关结果,则它们可能会被包括在内。 是的,我注意到了,这让我问了这个问题:D 嗯,这就是答案......你不能。 答案是 -> 你可以:D 【参考方案1】:

这可能使用组件过滤器。 “组件”:“国家:德国”

var geocoder = new google.maps.Geocoder();
geocoder.geocode("address":address, "componentRestrictions":"country":"DE" ,
function(results, status) 
    if (status == google.maps.GeocoderStatus.OK) 
        if (results[0].geometry.location) 
            completeGeo(results[0],address);
         else 
            completeGeo(null,address);
        
);

【讨论】:

这会导致“Uncaught InvalidValueError: unknown property components” 我想我可以完成我只是还没有想通。 [链接]developers.google.com/maps/documentation/javascript/… 我想我可以试试 "componentRestrictions":"country":"DE" 是的,它有效!我只需要将它作为一个对象传递:'componentRestrictions':'country':'DE' :D 如果你更新你的答案,我会接受它 用户在限制国家以外的地方输入怎么办?【参考方案2】:

当我把它改成 geocoder.geocode("address":address, "componentRestrictions":"country":"DE" , 对于德国,我的搜索结果找到了越南。

我已经改成这样了:

geocoder.geocode( 'address':address + ', Deutschland', function(results, status)

这适用于以本国语言命名的国家/地区。

【讨论】:

不适合我...“布达佩斯,法国”将其定位到真正的匈牙利布达佩斯,并且 FR 上的 componentRestrictions 甚至提出了糟糕的请求(例如:grevrsvrqnrenreoi)为 GeocoderStatus.OK,位于某个随机位置在法国。两个都试了,还是不行…… 我遇到了同样的问题。如果我将 componentRestrictions 包括在美国,无论我尝试进行地理编码什么样的乱码,GeocoderStatus 总是返回 OK。如果我删除 componentRestrictions 并搜索相同的乱码,它会返回 ZERO_RESULTS。 'componentRestrictions' 不再起作用,应该只是'components'。【参考方案3】:

简短的回答是你不能。

此问题已在此处向 Google 提交:

https://code.google.com/p/gmaps-api-issues/issues/detail?id=4233

您可以尝试的唯一方法是将“可接受的界限”传递给地理编码器。它远非完美,但对我的项目确实有所帮助。这是我用来尝试将 Google 地理编码器限制在美国西部的代码的粗略副本。显然,您希望编辑边界以表示您感兴趣的区域。

var geocoder = new google.maps.Geocoder()

var callGoogleGeocoder = function(str) 
  var geo_bounds;
  geo_bounds = setGeoBounds();
  return geocoder.geocode(
    address: str,
    bounds: geo_bounds
  , function(results, status) 
    console.log(results);
  );


var setGeoBounds = function() 
  var geo_bounds, ne, sw;
  geo_bounds = new google.maps.LatLngBounds();
  sw = new google.maps.LatLng(41.24843789608676, -126.5633079709794);
  ne = new google.maps.LatLng(49.01224853841337, -108.3479759397294);
  geo_bounds.extend(sw);
  geo_bounds.extend(ne);
  return geo_bounds;
;

请花点时间就我在上面链接到的 Google 问题投票。对我来说,这是 Google Geocoder 缺少的第一大功能。

祝你好运!

【讨论】:

非常感谢您,这看起来是个好方法!我会在我尝试时反馈 好的方法是的,但仅适用于具有单一边界的国家。对于像法国这样在许多海洋、太平洋等地拥有岛屿的国家来说,这真的行不通。【参考方案4】:

使用完整的国家/地区名称(例如,The Netherlands 而不是 NL,因为后者不起作用(在 NL 之外返回结果):

geocoder.geocode("address":address, "componentRestrictions":"country":"The Netherlands" ,

【讨论】:

不,这对我没有任何改变 您使用的是哪个国家/地区?对我来说,这是唯一可行的方法。 法国,效果是一样的,我觉得iamjpg的回答是对的,当时他写了“you can't”... 'componentRestrictions' 不再起作用,应该只是'components'。【参考方案5】:

我刚刚遇到了同样的问题并以这种方式解决了它(对于德国):

var searchObject = 
    'address': address,
    componentRestrictions: 
        country: 'DE'
    
;


geocoder().geocode(searchObject, function (result, status) 
    if (status !== google.maps.GeocoderStatus.OK) 
        return reject();
    

    if (result[0].formatted_address === 'Deutschland' && address !== 'Deutschland') 
        return reject();
    

    return reject();
);

因此,当您搜索错误的地址时,Google 总是在使用 componentRestrictions 时返回 Deutschland 作为地址。这是我让它工作的唯一方法,因为当您删除 componentRestrictions 时,Google 会产生一个猜测的位置,这对于我的用例来说是不正确的。

示例: 搜索邮政编码 12345,在德国无效。

    没有componentRestrictions — 结果:Schenectady, New York 12345, USA

    Deutschland 添加到地址 — 结果:12345 High Germany Rd SE, Little Orleans, MD 21766, USA

    使用componentRestrictions — 结果:Deutschland

更新

另一种解决方案是检查partial_match 标志:

if (result[0].partial_match) 
    return reject();

【讨论】:

以上是关于如何防止谷歌地理编码器从其他国家返回结果的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图地理编码器返回相同的结果

如何从谷歌地图地理编码返回地址类型?

我可以按城镇限制谷歌地理编码器结果吗?

谷歌地理编码服务返回虚假地址的响应

如何在信息窗口中显示我的地理编码地址?谷歌地图 API

如何使用推文中的位置字段从地理编码器结果中获取坐标