将谷歌地点API中的本地化翻译为英文

3
我正在使用Google Places API,以便会员可以添加他们的位置。然后我将这些信息保存在我的数据库中。现在我想搜索来自“哥本哈根”的所有成员。但是这是个问题,因为那些已经使用完整地址保存在丹麦语名称“København”下的成员。对于所有居住在具有不同本地和英文名称的城市的成员也是如此。更糟糕的是,似乎强制address_components(这里是特定于地点的)使用英语并不可行?
我很确定我已经强制将Place API设置为英语,因为国家是正确的。这里是“Denmark”,而不是“Danmark”。
我如何使用Google Places。首先,我注册脚本:
<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”,而不是“Copenhagen”。

更糟糕的是,有时候不是来自“language=en”的国家/地区信息,而是来自成员本地信息。

1个回答

4

我知道这已经是4年后的事情了,但是我在寻找解决相同问题的方法时发现了你的问题,所以我会留下这个解决方法,以便其他人需要。

简短概述:

通过邮政编码对所需城市进行额外的反向地理编码。


问题:我需要将地理位置城市以统一的方式保存到数据库中(即以英语保存),无论用户的区域设置是什么。我还添加了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”不是英语中的城市名称,尽管查询参数为“language=en”。显然,这是API 如此规定 的预期行为。
对我来说,它似乎只本地化了名称中使用的字母,或者默认为拉丁字母。例如,莫斯科在俄语中的原名是“Москва”,使用的是西里尔字母。因此,如果我设置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(类似邮寄格式)。
最后,将此字符串作为地址逆向搜索的输入,并带上所需的语言(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 可能为空,所以确保您检查它并将其从上面的字符串中排除(它仍将起作用)
  • 有时在地点详细信息中没有本地性(在这种情况下,我使用了 sublocality_level_1 代替)

就这样,希望对某些人有所帮助!


非常有趣的解决方法。谢谢!我已经实现了它,但我认为在连接的搜索字符串中包括 postal_code 是有问题的。例如,考虑到 OP 的原始问题是 "København",包括 postal_code 仍然会得到 "København"。如果您删除邮政编码并只发送 "København, Denmark",它就可以工作了,即返回 "哥本哈根" 作为所在地。我可能会用重试来实现这个功能。首先尝试使用 postal_code,如果所在地不同,则很好,使用该所在地。如果所在地相同,则尝试不使用 postal_code - Hooloovoo13
几个月后:这个解决方法运行得相当不错。但是发现一个城市无法正常工作:“Łódź”在波兰。该城市通常被英语化为“Lodz”,但解决方法总是给出波兰语的“Łódź”。 - Hooloovoo13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接