DNR*_*NRN 3 javascript google-places-api
我正在使用 Google Places API,因此成员可以添加他们的位置。然后我将这些信息保存在我的数据库中。现在我想搜索来自“Copenhagen”的所有成员。但这是一个问题,因为使用完整地址的会员会以丹麦语名称“K\xc3\xb8benhavn”保存。对于居住在具有不同母语和英文名称的城市的所有会员来说,同样的问题。更糟糕的是
\n\n是否可以强制地址组件(此处特定于地区)使用英语?
\n\n我很确定我已经将地方 API 强制改为英语,因为国家/地区是正确的。这里是“丹麦”而不是“丹麦”。
\n\n我如何使用谷歌地点。首先我注册脚本:
\n\n<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBQuOpK6nVv7bmGJbB6WoZcnWxKE2yGIGM&libraries=places&language=en"></script>\nRun Code Online (Sandbox Code Playgroud)\n\n接下来,我在输入元素上添加谷歌地点自动完成功能:
\n\nvar autocompleteElm = <HTMLInputElement>document.getElementById(\'autocomplete\');\nif (autocompleteElm) {\n this.autocomplete = new google.maps.places.Autocomplete(\n (autocompleteElm), {\n types: [\'geocode\']\n });\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我至少但不是最后一次调用,在会员点击保存按钮后,我通过调用 API 来收集数据:
\n\nthis.autocomplete.getPlace();\nRun Code Online (Sandbox Code Playgroud)\n\n这是一个用 TypeScript 编写的 Angular2 组件。
\n\n我从谷歌克隆了 Fiddle 示例,以说明我的问题:\n https://jsfiddle.net/dnrn/71t99yzs/
\n\n如果您搜索:“Dortheavej”,它会显示城市为“K\xc3\xb8benhavn”,而不是“哥本哈根”。
\n\n更糟糕的是,有时是国家,有时是城市,不是来自“语言= en”,而是来自当地的成员。
\n小智 5
我知道这已经是近 4 年后的事了,但我在寻找同一问题的解决方案时发现了你的问题,所以如果其他人需要它,我将保留此解决方法。
\n通过您想要的城市的邮政编码进行额外的反向地理编码。
\n问题:无论用户的区域设置是什么,我都需要将位置城市统一保存到数据库(即用英语)。我还添加了language=en我的所有查询,但它似乎不起作用。
示例:\nhttps://maps.googleapis.com/maps/api/place/autocomplete/json?input=St. Basil\'s Cathedral&language=en返回:
{\n "description": "St. Basil\'s Cathedral, Red Square, Moscow, Russia",\n ...\n "place_id": "ChIJBZbmYllKtUYR5TrL54oWz6Q",\n}\nRun Code Online (Sandbox Code Playgroud)\n到目前为止一切顺利,我正在寻找的城市是“莫斯科”。
\n然而,另一个获取地点详细信息(即地点)的搜索https://maps.googleapis.com/maps/api/place/details/json?place_id=ChIJBZbmYllKtUYR5TrL54oWz6Q&language=en会返回(除其他外):
{\n "long_name": "Moskva",\n "short_name": "Moskva",\n "types": [\n "locality",\n "political"\n ]\n }\nRun Code Online (Sandbox Code Playgroud)\n显然“Moskva”不是英语中的城市名称,即使查询参数是langauge=en。显然,这是 API 的预期行为,如此处所述。
对我来说,它看起来只是本地化用于名称的字母,或者默认为拉丁文。例如,莫斯科的俄语原始名称是“\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0”,并且使用西里尔字母。因此,如果我设置language=en(使用拉丁字母),它将“翻译”为“Moskva”(即“\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0”)用拉丁字母,但不是英语)。同样,如果我设置language=sr,我将收到“\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0”,因为塞尔维亚语也正式用西里尔字母书写,因此它将其写为原来是这样。第三个选项是language=ja它也会返回“Moskva”而不是日语(既不是语言也不是字母表),因为它似乎默认为拉丁语。
如果“官方”城市名称明确是您正在搜索的城市(而不是作为地址、社区等的一部分),则似乎可以将其翻译为您设置的语言。
\n因此,为了获得“莫斯科”(或任何其他语言的莫斯科名称,或任何其他城市的名称),您需要执行以下操作:
\nplace_id从结果中获取(如上例所示)place_id(也如上所示)address_components除其他外: "address_components": [\n ...\n {\n "long_name": "Moskva",\n "short_name": "Moskva",\n "types": [\n "locality",\n "political"\n ]\n },\n ...\n {\n "long_name": "Russia",\n "short_name": "RU",\n "types": [\n "country",\n "political"\n ]\n },\n {\n "long_name": "109012",\n "short_name": "109012",\n "types": [\n "postal_code"\n ]\n }\n ]\nRun Code Online (Sandbox Code Playgroud)\n现在将postal_code、locality和country将它们连接在一起形成一个字符串,如下所示:(109012, Moskva, Russia几乎像邮件格式)。
最后将此字符串作为地理编码 API 的输入,以按地址以及所需的语言 (en) 进行反向搜索:\nhttps://maps.googleapis.com/maps/api/geocode/json?address=109012, Moskva, Russia&language=en
现在只取英文的地方:
\n {\n "long_name": "Moscow",\n "short_name": "Moscow",\n "types": [\n "locality",\n "political"\n ]\n }\nRun Code Online (Sandbox Code Playgroud)\n就是这样!
\n迄今为止已知的“陷阱”:
\npostal_code可以为空,所以请确保检查它并将其从上面的字符串中排除(它仍然有效)sublocality_level_1代替)就是这样,希望对某人有帮助!
\n