反向地理编码速度

时间:2017-09-17 18:07:14

标签: r apply ggmap

我正在使用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的情况下执行此操作?

2 个答案:

答案 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")

enter image description here

进一步阅读

答案 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)))
}