对于当地的英语在谷歌地方API

问题描述 投票:1回答:1

我使用google places API,所以会员可以添加他们的位置。然后我把这些信息保存在我的数据库中。现在,我想搜索所有来自 "哥本哈根 "的会员,但这是一个问题,因为使用全称的会员被保存在丹麦名字 "København "下。但这是一个问题,因为成员谁已经使用他们的完整地址保存在丹麦名称 "København"。同样的问题也适用于所有居住在不同城市的会员,这些会员有不同的本地和英文名。更糟糕的是,似乎

有没有可能强制地址_组件,这里的locality specific是英文的?

我很确定我已经强制地方API为Enligsh,因为国家是正确的。这里是 "丹麦 "而不是 "Danmark"。

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

<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']
    });
}

最不重要的是,当一个成员点击保存按钮后,我调用API来收集数据。

this.autocomplete.getPlace();

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

我从谷歌克隆了Fiddle的例子,来说明我的问题。https:/jsfiddle.netdnrn71t99yzs。

如果你在 "Dortheavej "上搜索,它显示的城市是 "København "而不是 "哥本哈根"。"Dortheavej",它显示的城市是 "København",而不是 "Copenhagen"。

为了使事情变得更糟,似乎,有时它的国家其他时间它的城市,不是从 "语言=en",但成员当地......

javascript google-places-api
1个回答
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的预期行为。如上所述.

对我来说,它看起来像它只本地化的字母被用于名称,或它默认为拉丁语。例如,莫斯科在俄语中的原名是 "Москва",他们使用西里尔字母。所以如果我设置 language=en (使用拉丁字母)它将 "翻译 "为 "Moskva"(拉丁字母写的是 "Москва",但不是英语)。同样的,如果我设置了 "Moskva"(拉丁语字母),它就会 "翻译 "成 "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_code, localitycountry 并把它们连成一串,像这样。109012, Moskva, Russia (类似于邮件格式).

最后把这个字符串作为输入,让geocode API通过地址进行反向搜索,同时输入所需的语言(en)。https://maps.googleapis.com/maps/api/geocode/json?address=109012, Moskva, Russia&language=en

现在只需要输入英文的locality就可以了。

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

就这样!

到目前为止,已知的 "陷阱"。

  • postal_code 可能是空的,所以你一定要检查一下,然后把它从上面的字符串中排除掉(它仍然会工作)。
  • 有时,在地方细节中没有一个地方性的细节(在这种情况下,我使用的是 sublocality_level_1 而不是)

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

© www.soinside.com 2019 - 2024. All rights reserved.