给定纬度/经度/坐标后,如何自动确定状态?

时间:2018-07-10 13:11:50

标签: r geocoding

我希望使用〜17,000 lat / lon值的数据框,以获取并填充具有等效状态的新列。

到目前为止,我已经尝试了其他Stack Overflow答案中建议的几种解决方案(在此无法列出太多,但超过十种),但没有一个对我有用。

我找到解决方案的最接近方法是使用ggmap软件包,但是问题是,尽管只发送了一个lat / { {1}}有价值。

我有单独的lonlat值,甚至也将它们组合成lon格式,尽管如此,上述解决方案都不适合我。

我要做的是根据给定的lat,lon / lat/lon值确定状态,并将状态保存在新列(coord)中。

我最初匹配所有城市值以获得匹配状态,但是问题在于,由于多个州包含同名城市,因此匹配过程在第一次成功匹配后就停止了;结果,我发现自己有2800多个属于AK的城市,尽管它们实际上相距几千英里。

任何建议都会很棒。

以下是我的数据的df$statecoordslat列的前100行:

lon

2 个答案:

答案 0 :(得分:6)

使用over包中的函数sp

library(geojsonio)
library(sp)

# get usa polygon data
# http://eric.clst.org/tech/usgeojson/
usa <- geojson_read(
  "http://eric.clst.org/assets/wiki/uploads/Stuff/gz_2010_us_040_00_500k.json", 
  what = "sp"
)

df$state <- NA

# compare points
for (i in 1:nrow(df)) {
  coords <- c(df$origin_lon[i], df$origin_lat[i])
  if(any(is.na(coords))) next
  point <- sp::SpatialPoints(
    matrix(
      coords,
      nrow = 1
    )
  )
  sp::proj4string(point) <- sp::proj4string(usa)
  polygon_check <- sp::over(point, usa)
  df$state[i] <- as.character(polygon_check$NAME)
}

> head(df)
origin_coords origin_lat origin_lon      state
1  31.9618,-83.0588    31.9618   -83.0588    Georgia
2  44.8782,-69.4718    44.8782   -69.4718      Maine
3 37.3894,-121.8868    37.3894  -121.8868 California
4  36.0485,-93.5044    36.0485   -93.5044   Arkansas
5  37.652,-120.7292    37.6520  -120.7292 California
6  33.7942,-84.2018    33.7942   -84.2018    Georgia

答案 1 :(得分:3)

这是一个SF解决方案,其中使用具有美国状态st_join(从USAboundaties包创建)的空间对象的空间连接states_sf,以及包含数据点{{1}的空间对象}}。

请验证结果,因为我对R中的空间工作还很陌生。

只需为您需要的列过滤结果data.frame。

points_sf