我使用谷歌地方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”,而是来自当地的成员......
答案 0 :(得分:0)
我知道这将在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 as stated here的预期行为。
在我看来,它仅本地化了用于该名称的字母,或者默认为拉丁字母。因此,例如,莫斯科的俄语原名是“Москва”,并且使用西里尔字母。因此,如果我设置language=en
(使用拉丁字母),它将“翻译”为“ 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
(几乎像邮件格式一样)。
最后,将此字符串作为地理编码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
)就这样,希望对您有所帮助!