R语言中经纬度转邮政编码:revgeocode函数报错解决求助
解决
revgeocode()报错:is.numeric(location) && length(location) == 2 is not TRUE 你猜的完全没错,这个报错的核心原因就是the_geom列的POINT()格式字符串不符合revgeocode()的参数要求。ggmap::revgeocode()需要的location参数是长度为2的数值型向量(经度在前,纬度在后),或者是每行对应一组坐标的2列矩阵/数据框,而你直接传入了带文本格式的字符串,自然会触发类型检查错误。
下面是具体的修复步骤和代码:
步骤1:提取经纬度数值
首先我们需要从POINT (lon lat)格式的字符串中提取出纯数值的经度和纬度。这里推荐使用stringr包的正则匹配功能,简单高效:
# 加载所需包 library(ggmap) library(stringr) # 读取数据 ppt <- read.csv("~/Downloads/PPT.csv") # 提取每个POINT中的经纬度数值(返回的是每行2个数值的矩阵) coords_matrix <- str_extract_all(ppt$the_geom, "-?\\d+\\.\\d+", simplify = TRUE) # 将数值矩阵拆分到数据框的单独列中,并转为数值型 ppt$lon <- as.numeric(coords_matrix[, 1]) ppt$lat <- as.numeric(coords_matrix[, 2])
正则表达式-?\\d+\\.\\d+的作用是匹配:可选的负号(-?)+ 整数部分(\\d+)+ 小数点(\\.)+ 小数部分(\\d+),刚好能精准提取POINT里的经纬度数值。
步骤2:批量转换为邮政编码/地址
现在我们有了标准化的经纬度数值列,就可以给revgeocode()传入正确格式的参数了。这里提供两种批量处理的方式:
方式1:使用基础R的apply函数
# 逐行处理经纬度对,生成地址 ppt$address <- apply(ppt[, c("lon", "lat")], 1, function(coord_pair) { revgeocode(location = coord_pair, output = "address") })
方式2:使用purrr包的map2函数(更简洁)
如果你习惯使用tidyverse工具,可以用purrr的map2_chr来逐对处理经纬度:
library(purrr) ppt$address <- map2_chr(ppt$lon, ppt$lat, ~ revgeocode(location = c(.x, .y), output = "address"))
额外注意事项
- 如果你使用的是较新版本的
ggmap,可能需要先注册Google Maps API密钥才能使用反向地理编码功能,否则会遇到API权限错误。注册后可以用以下代码设置密钥:register_google(key = "你的Google Maps API密钥") - 如果数据量较大,批量请求可能会触发API的速率限制,建议适当添加延迟(比如在循环中加入
Sys.sleep(1))避免被限流。
内容的提问来源于stack exchange,提问作者Veerpartap Singh
相关产品推荐
相关产品推荐

