javascript - 对于 google places API 中的英语本地化

标签 javascript google-places-api

我正在使用 google places API,因此成员(member)可以添加他们的位置。然后我将这些信息保存在我的数据库中。现在我想搜索“哥本哈根”的所有成员。但这是一个问题,因为使用完整地址的成员会保存在丹麦名称“København”下。同样的问题适用于居住在具有不同母语和英语名称的城市的所有成员。更糟糕的是

是否可以强制 address_components,这里是特定于本地的英文?

我很确定我已经将 place API 强制为 Enligsh,因为国家/地区是正确的。这里是“丹麦”而不是“丹麦”。

我如何使用 google places。首先我注册脚本:

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

接下来我在输入元素上添加 google places 自动完成功能:

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

至少但不是最后一次,在成员(member)点击保存按钮后,我通过调用 API 收集数据:

this.autocomplete.getPlace();

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

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

如果您搜索:“Dortheavej”,它将显示城市为“København”而不是“Copenhagen”。

看起来更糟的是,有时是国家,有时是城市,不是来自“language=en”,而是来自本地的成员..

最佳答案

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

tl;博士:

通过您想要的城市的邮政编码进行额外的反向地理编码。


问题:无论用户的区域设置如何,我都需要将位置城市统一(即英文)保存到数据库。我还添加了 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"
        ]
      }

显然 “Moskva” 不是英文城市名称,即使查询参数是 langauge=en。显然,这是 API 的预期行为 as stated here .

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

解决方法:

“官方”城市名称似乎可以翻译成您设置的语言,如果它明确是您正在搜索的城市(而不是作为地址、社区等的一部分)。

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

  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 代替)

就是这样,希望对大家有帮助!

关于javascript - 对于 google places API 中的英语本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328358/

相关文章:

android - 从 GeoDataClient.getPlacePhotos() 获取照片时出现 illegalStateException

android - Google Place Picker 小部件无法正常工作

javascript - 如何为 HTML 输入 ID 命名不同于 Google Places API 的 address_component 的名称?

javascript - 重构的 JavaScript 在谷歌地图上不显示标记

javascript - 如何使一个类的实例同时具有可比性和垃圾回收性?

javascript - 根据目标设备 RAM 限制 DOM 元素的数量

javascript - 最小化或折叠 bootstrap 2.3.2 模态对话框?

javascript - 将 .trim() 与 jquery 验证插件一起使用

javascript - 从 Python 执行提示 Javascript

Android Place Picker 在启动后立即关闭