【问题标题】: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

标签: javascript api google-maps google-maps-api-3 google-geocoding-api


【解决方案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,在德国无效。

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

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

  3. 使用componentRestrictions — 结果:Deutschland

更新

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2011-02-08
    相关资源
    最近更新 更多