我正在使用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()
,这需要大约一秒钟。但是,我计划对超过一百万次观测的数据进行此操作。如果它需要一段时间才能运行,我不介意,但由于我对此很新,我不知道长时间运行是否只是获取数据的必然部分,或者是由于功能设计不佳所致。是否有明显的方法可以显着加快这种操作?
编辑:
我从评论者那里了解到,我将限制免费请求(2,500 /天)。我的所有数据都来自纽约,其目的是将纬度/经度坐标与自治市镇名称相匹配。在我发现免费用户的每日限制之前,我曾计划使用lat / long坐标从Google获取地址,从此地址中提取邮政编码,然后将zip匹配到自治市镇。有没有人建议如何在不使用Google Maps Geocoding API的情况下执行此操作?
答案 0 :(得分:3)
您可以找到自治市镇的“空间”数据源,然后使用sf
库执行几何运算以在多边形中查找点
查找空间数据源。这是geojson格式的邻域之一
library(sf)
sf <- sf::st_read("https://raw.githubusercontent.com/blackmad/neighborhoods/master/new-york-city-boroughs.geojson")
将坐标转换为sf
对象。我换了你的lat&amp; lon column order。
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")
答案 1 :(得分:0)
据我所知,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)))
}