我使用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",但成员当地......
我知道这几乎是4年后,但我发现你的问题,而搜索相同的问题的解决方案,所以我将留下这个变通,如果其他人应该需要它。
根据你想要的城市的邮政编码进行额外的反向地理编码。
问题是这样的。我需要统一地把地点城市保存到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 "而不是日语(既不是语言也不是字母),因为它似乎默认为拉丁语。
似乎 "官方 "的城市名称可以被翻译成你所设置的语言 如果你要搜索的是一个明确的城市(而不是作为地址的一部分,邻里等)。
所以为了得到 "莫斯科" (或任何其他语言的莫斯科名称,或任何其他城市的名称),您可以做以下工作。
place_id
从结果来看place_id
(又如上图)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
, locality
和 country
并把它们连成一串,像这样。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
而不是)就这样吧,希望对大家有所帮助!