【问题标题】:Incorrect results returned from a partial UK postcode从部分英国邮政编码返回的结果不正确
【发布时间】:2018-06-13 16:52:09
【问题描述】:

我在使用 Google 地图时遇到了一个奇怪的问题,他们的文档似乎没有涵盖。

我们的应用程序中有一个页面,当最终用户输入邮政编码时,该页面会返回按距离排序的工程师位置列表。我们最近注意到一些最终用户正在输入部分英国邮政编码(L1BB7SE10)。

这些往往没问题,可以按预期工作,但如果用户搜索曼彻斯特地区的部分邮政编码,他们会得到奇怪的结果,返回的距离超过 100 英里。

我对此进行了研究,似乎 Google 正在返回高速公路网络的位置,其中道路名称与曼彻斯特的邮政区相匹配。例如:M4 正在返回布里斯托尔北部而不是市中心区域的高速公路。

我发送给 Google 的有效载荷如下:

$url="https://maps.google.com/maps/api/geocode/json?address={$address}&components=country:GB&key={$apikey}";

如果我将有效负载更改为:

$url="https://maps.google.com/maps/api/geocode/json?components=country:GB|postal_code:{$address}&key={$apikey}";

我从 API 获得 ZERO_RESULTS

我在 2014 年看到了这个 question,这是相同的问题,但似乎没有找到解决方案。

我做错了什么?是否有任何解决方法可以尝试获得更准确的结果?我是否最好将输入限制为仅完整的邮政编码?

【问题讨论】:

  • 随便用谷歌搜索一下,好像不行。如果我是你,我会仅限于完整的邮政编码,如果你能在某个地方找到所有可能的邮政编码的公开列表(我相信这是可能的),我会考虑进行自动完成。这应该使您的用户可以轻松使用部分输入,并使结果也能正常工作。
  • @dgig 我将不得不将此添加到以后的更新中,但这似乎是除了让 Google 更新其系统之外的唯一解决方案。

标签: php google-maps geocoding


【解决方案1】:

我想出了一个相当混乱的 hack,似乎可以解决我的问题。

// Check if the postcode is a partial Mancunian postcode
if($postcode[0]==="M" && strlen($postcode) <= 4){
    if($postcode[1]==6){
        $manchester_postcode = "Salford ".$postcode;
    }else{
        $manchester_postcode = "Manchester ".$postcode;
    }
    $address=urlencode($manchester_postcode);
}else{
    $address=urlencode($postcode);
}

$apikey=urlencode(env('GOOGLE_MAP_API'));
$url="https://maps.google.com/maps/api/geocode/json?address={$address}&components=country:GB&key={$apikey}";

如果邮政编码可识别为部分邮政编码(4 个字符或更少)并且以字母 M 开头,我会在其前面加上“曼彻斯特”。这解决了所有错误编码,除了 M6 仍然顽固地选择高速公路。

所以我添加了第二个字符的检查并将前缀更改为“Salford”。这解决了问题。

【讨论】:

    【解决方案2】:

    对于尝试此解决方案的其他人,您将遇到 M60 邮政编码和其他一些随机(非曼彻斯特)邮政编码的问题,这些邮政编码会路由到同样随机的地方(例如尝试 E3)。

    如果您检测到任何部分邮政编码并在其后添加“邮政编码”(例如 M60 邮政编码),它将路由到正确的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多