反向地理编码速度
Reverse geocoding speed
我正在使用 R 从数据框中提取纬度和经度,然后使用反向地理编码获取地址。
我这里有一些玩具数据:
latitude <- c(40.84935,40.76306,40.81423,40.63464,40.71054)
longitude <- c(-73.87119,-73.90235,-73.93443,-73.88090,-73.83765)
x = data.frame(latitude,longitude)
我编写了一个函数来进行实际的地理编码:
require(ggmap)
get_address <- function(df){
long <- as.numeric(df$longitude)
lat <- as.numeric(df$latitude)
revgeocode(c(long,lat))
}
然后申请:
apply(x,1,get_address)
使用system.time()
,这大约需要一秒钟。但是,我计划对具有超过一百万个观察值的数据执行此操作。如果 运行 需要一段时间,我不介意,但由于我对此还很陌生,所以我不知道长时间 运行ning 是否只是获得数据或者是由于不良的功能设计。有明显加快此操作的明显方法吗?
编辑:
我从评论者那里了解到,我可以提出的免费请求数量将受到限制(2,500/天)。我的所有数据都来自纽约,目的是将 latitude/longitude 坐标与自治市镇名称相匹配。在我发现免费用户的每日限制之前,我计划使用 lat/long 坐标从 Google 获取地址,从该地址提取邮政编码,然后将邮政编码与自治市镇匹配。有没有人对如何在不使用 Google 地图地理编码 API 的情况下执行此操作提出建议?
据我所知,Google 的免费 API 每天限制为 2,500 个请求。或者,Nominatim 由 OSM 提供,但 R 中没有任何 API。但是对于这种数据量,我不会考虑 Web 服务。您是否拥有 ArcGIS 许可?
也许您也可以通过避免这样的赋值来聚合您的函数:
require(ggmap)
get_address <- function(df){
revgeocode(c(as.numeric(df$longitude),as.numeric(df$latitude)))
}
您可以找到行政区的 'spatial' 数据源,然后使用 sf
库
执行几何操作以在多边形中查找点
设置数据
查找空间数据源。这是 geojson 格式的社区之一
library(sf)
sf <- sf::st_read("https://raw.githubusercontent.com/blackmad/neighborhoods/master/new-york-city-boroughs.geojson")
将您的坐标转换为 sf
对象。我已经交换了你的经纬度列顺序。
latitude <- c(40.84935,40.76306,40.81423,40.63464,40.71054)
longitude <- c(-73.87119,-73.90235,-73.93443,-73.88090,-73.83765)
x = data.frame(longitude, latitude)
sf_x <- sf::st_as_sf(x, coords = c("longitude", "latitude"))
要执行空间操作,坐标参考系需要在两个几何之间匹配
## set the cooridnate reference systesm to be the same
st_crs(sf_x) <- st_crs(sf)
使用st_within
找到每个点所在的多边形(邻域)
多边形中的点计算
res <- st_within(sf_x, sf) ## return the indexes of sf that sf_x are within
这为您提供了每个点所在的多边形索引的稀疏矩阵
## view the results
sapply(res, function(x) as.character(sf$name[x]))
# [1] "Bronx" "Queens" "Manhattan" "Brooklyn" "Queens"
视觉
用图确认
library(googleway)
x$neighbourhood <- sapply(res, function(x) as.character(sf$name[x]))
mapKey <- "map_api_key"
google_map(key = mapKey) %>%
add_markers(data = x, info_window = "neighbourhood")
进一步阅读
我正在使用 R 从数据框中提取纬度和经度,然后使用反向地理编码获取地址。
我这里有一些玩具数据:
latitude <- c(40.84935,40.76306,40.81423,40.63464,40.71054)
longitude <- c(-73.87119,-73.90235,-73.93443,-73.88090,-73.83765)
x = data.frame(latitude,longitude)
我编写了一个函数来进行实际的地理编码:
require(ggmap)
get_address <- function(df){
long <- as.numeric(df$longitude)
lat <- as.numeric(df$latitude)
revgeocode(c(long,lat))
}
然后申请:
apply(x,1,get_address)
使用system.time()
,这大约需要一秒钟。但是,我计划对具有超过一百万个观察值的数据执行此操作。如果 运行 需要一段时间,我不介意,但由于我对此还很陌生,所以我不知道长时间 运行ning 是否只是获得数据或者是由于不良的功能设计。有明显加快此操作的明显方法吗?
编辑:
我从评论者那里了解到,我可以提出的免费请求数量将受到限制(2,500/天)。我的所有数据都来自纽约,目的是将 latitude/longitude 坐标与自治市镇名称相匹配。在我发现免费用户的每日限制之前,我计划使用 lat/long 坐标从 Google 获取地址,从该地址提取邮政编码,然后将邮政编码与自治市镇匹配。有没有人对如何在不使用 Google 地图地理编码 API 的情况下执行此操作提出建议?
据我所知,Google 的免费 API 每天限制为 2,500 个请求。或者,Nominatim 由 OSM 提供,但 R 中没有任何 API。但是对于这种数据量,我不会考虑 Web 服务。您是否拥有 ArcGIS 许可?
也许您也可以通过避免这样的赋值来聚合您的函数:
require(ggmap)
get_address <- function(df){
revgeocode(c(as.numeric(df$longitude),as.numeric(df$latitude)))
}
您可以找到行政区的 'spatial' 数据源,然后使用 sf
库
设置数据
查找空间数据源。这是 geojson 格式的社区之一
library(sf)
sf <- sf::st_read("https://raw.githubusercontent.com/blackmad/neighborhoods/master/new-york-city-boroughs.geojson")
将您的坐标转换为 sf
对象。我已经交换了你的经纬度列顺序。
latitude <- c(40.84935,40.76306,40.81423,40.63464,40.71054)
longitude <- c(-73.87119,-73.90235,-73.93443,-73.88090,-73.83765)
x = data.frame(longitude, latitude)
sf_x <- sf::st_as_sf(x, coords = c("longitude", "latitude"))
要执行空间操作,坐标参考系需要在两个几何之间匹配
## set the cooridnate reference systesm to be the same
st_crs(sf_x) <- st_crs(sf)
使用st_within
找到每个点所在的多边形(邻域)
多边形中的点计算
res <- st_within(sf_x, sf) ## return the indexes of sf that sf_x are within
这为您提供了每个点所在的多边形索引的稀疏矩阵
## view the results
sapply(res, function(x) as.character(sf$name[x]))
# [1] "Bronx" "Queens" "Manhattan" "Brooklyn" "Queens"
视觉
用图确认
library(googleway)
x$neighbourhood <- sapply(res, function(x) as.character(sf$name[x]))
mapKey <- "map_api_key"
google_map(key = mapKey) %>%
add_markers(data = x, info_window = "neighbourhood")