对于google places API中的英语地点

时间:2016-10-30 10:58:34

标签: javascript google-places-api

我使用谷歌地方API,所以会员可以添加他们的位置。然后我将这些信息保存在我的数据库中。现在我想搜索“哥本哈根”的所有成员。但这是一个问题,因为使用完整地址的成员将以丹麦语“København”保存。同样的问题是所有居住在城市中具有不同本地和英文名称的成员。看起来似乎更糟糕了。

是否可以强制使用address_components,这里的地点是英文的?

我很确定我已经强制将地方API用于Enligsh,因为各国都是对的。这里是“丹麦”而非“丹麦”。

我如何使用谷歌的地方。首先我注册脚本:

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBQuOpK6nVv7bmGJbB6WoZcnWxKE2yGIGM&libraries=places&language=en"></script>

接下来,我在输入元素上添加了Google地方自动填充功能:

var autocompleteElm = <HTMLInputElement>document.getElementById('autocomplete');
if (autocompleteElm) {
    this.autocomplete = new google.maps.places.Autocomplete(
        (autocompleteElm), {
            types: ['geocode']
    });
}

最少但不是最后我打电话,在会员点击保存按钮后,我通过调用API来收集数据:

this.autocomplete.getPlace();

这是一个用TypeScript编写的Angular2组件。

我从谷歌克隆了Fiddle的例子来说明我的问题: https://jsfiddle.net/dnrn/71t99yzs/

如果你搜索:“Dortheavej”它将城市显示为“København”而不是“哥本哈根”。

更糟糕的是,似乎有时候这个国家的城市不是来自“language = en”,而是来自当地的成员......

1 个答案:

答案 0 :(得分:0)

我知道这将在4年后出现,但是我在寻找解决同一问题的方法时发现了您的问题,因此如果其他任何人需要它,我将保留此解决方法。

tl; dr:

通过所需城市的邮政编码进行其他反向地理编码。


问题:无论用户的语言环境如何,我都需要将位置城市统一保存到db(即英语)。我还向所有查询中添加了language=en,但并没有似乎行不通。

示例: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=St. Basil's Cathedral&language=en返回:

{
      "description": "St. Basil's Cathedral, Red Square, Moscow, Russia",
      ...
      "place_id": "ChIJBZbmYllKtUYR5TrL54oWz6Q",
}

到目前为止,我要寻找的城市是“莫斯科”

但是,另一次获取地点详细信息(即地点)https://maps.googleapis.com/maps/api/place/details/json?place_id=ChIJBZbmYllKtUYR5TrL54oWz6Q&language=en的搜索(除其他外)返回:

      {
        "long_name": "Moskva",
        "short_name": "Moskva",
        "types": [
          "locality",
          "political"
        ]
      }

显然,即使查询参数为langauge=en“莫斯科” 也不是英语中的城市名称。显然,这是API as stated here的预期行为。

在我看来,它仅本地化了用于该名称的字母,或者默认为拉丁字母。因此,例如,莫斯科的俄语原名是“Москва”,并且使用西里尔字母。因此,如果我设置language=en(使用拉丁字母),它将“翻译”为“ Moskva”(以拉丁字母而不是英语书写的“Москва”)。类似地,如果我设置language=sr,我会收到“Москва”,因为塞尔维亚语也用西里尔字母正式书写,因此它像原始语言一样书写。第三个选项是language=ja,它也将返回“ Moskva”而不是日语(既不是语言也不是字母),因为它似乎默认为拉丁语。

现在解决方法:

如果“官方”城市名称明确地是您要搜索的城市(而不是地址,邻里等的一部分),则似乎可以将其翻译为您设置的语言。

因此,为了获取“莫斯科” (或以任何其他语言或任何其他城市的莫斯科名称),请执行以下操作:

  1. 搜索您想要的位置(例如在自动填充中)-从结果中获取place_id(如上例所示)
  2. 通过place_id获取地点详细信息(也如上所示)
  3. 这是解决方法的发生位置:在地点详细信息结果中,您会收到address_components
 "address_components": [
      ...
      {
        "long_name": "Moskva",
        "short_name": "Moskva",
        "types": [
          "locality",
          "political"
        ]
      },
      ...
      {
        "long_name": "Russia",
        "short_name": "RU",
        "types": [
          "country",
          "political"
        ]
      },
      {
        "long_name": "109012",
        "short_name": "109012",
        "types": [
          "postal_code"
        ]
      }
    ]

现在将postal_codelocalitycountry并用如下字符串连接在一起:109012, Moskva, Russia(几乎像邮件格式一样)。

最后,将此字符串作为地理编码API的输入,以按地址以及所需的语言(en)进行反向搜索: https://maps.googleapis.com/maps/api/geocode/json?address=109012, Moskva, Russia&language=en

现在只需使用英语的当地语言:

        {
          "long_name": "Moscow",
          "short_name": "Moscow",
          "types": [
            "locality",
            "political"
          ]
        }

就是这样!

到目前为止已知的“陷阱”:

  • postal_code可以为null,因此请确保进行检查并将其从上面的字符串中排除(它将仍然有效)
  • 有时位置详细信息没有位置(在这种情况下,我改用sublocality_level_1

就这样,希望对您有所帮助!