R:如何正确准备 ggmap geocode / Google Geocode API 的国际地址?
R: How to correctly prepare an international address for ggmap geocode / Google Geocode API?
我发现
loc <- "Dradenaustraße 33, 21129 Hamburg"
library(ggmap)
geocode(loc, source = "google", force = TRUE, messaging = TRUE, output = "more")
returns 要么是 NA,一个“400,错误的请求”错误,要么如果一个人试图准备如下所示的地址,它甚至 returns 堪萨斯某处的一些纬度/经度。
我发现了,
loc <- "Dradenaustraße 33, 21129 Hamburg"
Encoding(loc) <- "UTF-8"
loc <- URLencode(loc, reserved = TRUE)
returns
Warning message:
In strsplit(URL, "") : input string 1 is invalid UTF-8
之后 loc 将是 NA。
顺便说一句。以下内容适用于地理编码,即 returns 正确的地址和 lat/lon:
loc <- "Dradenaustrasse 33, 21129 Hamburg" #manually reformatted
loc <- "Dradenaustraee 33, 21129 Hamburg" #misspelled
以下拼写错误的地址与开头的正常拼写问题相同:
loc <- "Dradenaustraée 33, 21129 Hamburg" #misspelled
我正在调用地址解析 api,其中有数千个地址,如上所示,我不想重新格式化它们(即将“ß”替换为 "ss",除非这是绝对必要的. 在那种情况下,我将不得不对许多其他包含重音符号(`、´ 等)的国际地址做出假设。
有什么想法吗?
非常感谢! :)
编辑以指出我正在寻找一种任意适用于国际地址且不需要域特定知识和手动重新格式化地址的解决方案。
使用法国笔记本电脑,我必须:
- 使用 Hamburg 的法语等价物:Hambourg;
- 将 eszett (ß) 替换为 ss;
- 并将街道名称与 strasse 分开:
loc <- "Dradenau strasse 33, 21129 Hambourg"
进行这些更改后,调用
geocode(loc, source = "google", force = TRUE, messaging = TRUE, output = "more")
返回了期望的结果(lon = 9.89992,lat = 53.52478,等等)
希望对您有所帮助!
这是一个众所周知的棘手编码问题。您的原始文本不是 utf-8,这正是 google 正在寻找的。设置编码只是试图将元数据附加到字符串。这个:
Encoding(loc) <- "UTF-8"
告诉 R 字符串是“UTF-8”,而 R 却说不是。你的德语单词可能在 "Latin9" encoding, which the R function Encoding()
has no idea what that is.
您可以做的是在将编码发送到 google 之前将编码转换为 UTF-8。您可以在每次通话前在带内执行此操作,例如:
loc <- "Dradenaustraße 33, 21129 Hamburg"
utf_encoded <- //some translation algorithm
geocode(utf_encoded, source = "google", force = TRUE, messaging = TRUE, output = "more")
或者您可以尝试创建第二个数据存储(文件、数据库表等),它是通过文件或数据库读取摄取德语文本创建的,运行 全部通过算法,并且通过文件或数据库写入输出编码为 UTF-8 的等效文本。
不管怎样,都有一个字符串转换/翻译包found here。该页面的相关部分看起来是:
stri_trans_general("groß", "upper")
##
"GROSS"
您不必担心以某种方式将您的输入发送到 API。
对我来说,您输入的所有变体都适用于 Geocode.xyz:
https://geocode.xyz/Dradenaustra%C3%9Fe%2033,%2021129%20Hamburg(带 ß)
- 德国 x,y z: 53.52480,9.90007 |
- 33 DRADENAUSTRASSE,德国汉堡置信度得分:0.90
https://geocode.xyz/Dradenaustrasse%2033,%2021129%20Hamburg(没有 ß)
- 德国 x,y z: 53.52480,9.90007 |
- 33 DRADENAUSTRASSE,德国汉堡置信度得分:0.90
https://geocode.xyz/Dradenaustra%2033,%2021129%20Hamburg(拼写错误)
- 德国 x,y z: 53.5248,9.90007 |
- 33 DRADENAUSTRAßE,汉堡,德国置信度得分:0.5
拼写错误的唯一作用是改变置信度分数。
我发现
loc <- "Dradenaustraße 33, 21129 Hamburg"
library(ggmap)
geocode(loc, source = "google", force = TRUE, messaging = TRUE, output = "more")
returns 要么是 NA,一个“400,错误的请求”错误,要么如果一个人试图准备如下所示的地址,它甚至 returns 堪萨斯某处的一些纬度/经度。
我发现了,
loc <- "Dradenaustraße 33, 21129 Hamburg"
Encoding(loc) <- "UTF-8"
loc <- URLencode(loc, reserved = TRUE)
returns
Warning message:
In strsplit(URL, "") : input string 1 is invalid UTF-8
之后 loc 将是 NA。
顺便说一句。以下内容适用于地理编码,即 returns 正确的地址和 lat/lon:
loc <- "Dradenaustrasse 33, 21129 Hamburg" #manually reformatted
loc <- "Dradenaustraee 33, 21129 Hamburg" #misspelled
以下拼写错误的地址与开头的正常拼写问题相同:
loc <- "Dradenaustraée 33, 21129 Hamburg" #misspelled
我正在调用地址解析 api,其中有数千个地址,如上所示,我不想重新格式化它们(即将“ß”替换为 "ss",除非这是绝对必要的. 在那种情况下,我将不得不对许多其他包含重音符号(`、´ 等)的国际地址做出假设。
有什么想法吗?
非常感谢! :)
编辑以指出我正在寻找一种任意适用于国际地址且不需要域特定知识和手动重新格式化地址的解决方案。
使用法国笔记本电脑,我必须:
- 使用 Hamburg 的法语等价物:Hambourg;
- 将 eszett (ß) 替换为 ss;
- 并将街道名称与 strasse 分开:
loc <- "Dradenau strasse 33, 21129 Hambourg"
进行这些更改后,调用
geocode(loc, source = "google", force = TRUE, messaging = TRUE, output = "more")
返回了期望的结果(lon = 9.89992,lat = 53.52478,等等)
希望对您有所帮助!
这是一个众所周知的棘手编码问题。您的原始文本不是 utf-8,这正是 google 正在寻找的。设置编码只是试图将元数据附加到字符串。这个:
Encoding(loc) <- "UTF-8"
告诉 R 字符串是“UTF-8”,而 R 却说不是。你的德语单词可能在 "Latin9" encoding, which the R function Encoding()
has no idea what that is.
您可以做的是在将编码发送到 google 之前将编码转换为 UTF-8。您可以在每次通话前在带内执行此操作,例如:
loc <- "Dradenaustraße 33, 21129 Hamburg"
utf_encoded <- //some translation algorithm
geocode(utf_encoded, source = "google", force = TRUE, messaging = TRUE, output = "more")
或者您可以尝试创建第二个数据存储(文件、数据库表等),它是通过文件或数据库读取摄取德语文本创建的,运行 全部通过算法,并且通过文件或数据库写入输出编码为 UTF-8 的等效文本。
不管怎样,都有一个字符串转换/翻译包found here。该页面的相关部分看起来是:
stri_trans_general("groß", "upper")
##
"GROSS"
您不必担心以某种方式将您的输入发送到 API。
对我来说,您输入的所有变体都适用于 Geocode.xyz:
https://geocode.xyz/Dradenaustra%C3%9Fe%2033,%2021129%20Hamburg(带 ß)
- 德国 x,y z: 53.52480,9.90007 |
- 33 DRADENAUSTRASSE,德国汉堡置信度得分:0.90
https://geocode.xyz/Dradenaustrasse%2033,%2021129%20Hamburg(没有 ß)
- 德国 x,y z: 53.52480,9.90007 |
- 33 DRADENAUSTRASSE,德国汉堡置信度得分:0.90
https://geocode.xyz/Dradenaustra%2033,%2021129%20Hamburg(拼写错误)
- 德国 x,y z: 53.5248,9.90007 |
- 33 DRADENAUSTRAßE,汉堡,德国置信度得分:0.5
拼写错误的唯一作用是改变置信度分数。