将数据框转换为空间多边形数据框(SpatialPolygonsDataFrame)

4

这里是为了可重复目的而提供的数据:

  structure(list(countyfp10 = c(1, 1, 1, 1, 3, 3, 3, 3, 5, 5, 5, 
5, 7, 7, 7, 7), id = c(7417, 7418, 7419, 7420, 7421, 7422, 7423, 
7424, 7425, 7426, 7427, 7428, 7429, 7430, 7431, 7432), lat = c(39.4797245, 
39.5544678, 39.4681687, 39.199806, 39.4017623, 39.3093943, 39.4272021, 
39.5618129, 39.7934997, 39.4835134, 39.4989196, 39.4819145, 39.4727694, 
39.4675515, 39.4693146, 39.4644503), long = c(-118.7908571, -118.8095638, 
-118.8195712, -118.5429041, -118.754186, -118.8861865, -118.9729817, 
-117.9418517, -118.9516281, -118.8487913, -119.0205114, -118.7695846, 
-118.7938896, -118.76011, -118.7778707, -118.7902103)), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -16L), spec = structure(list(
    cols = list(countyfp10 = structure(list(), class = c("collector_double", 
    "collector")), id = structure(list(), class = c("collector_double", 
    "collector")), lat = structure(list(), class = c("collector_double", 
    "collector")), long = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))

目前这个数据以data.frame的形式存储,但我希望将其转换为SpatialPolygonsDataFrame。最好的方法是什么?


它必须是SpatialPolygonsDataFrame吗?还是可以是简单要素对象(sf),它是sp的继承者? - SymbolixAU
而不是将数据打印出来,最好使用dput(df)的输出。这样我们就可以简单地复制粘贴您的数据。 - SymbolixAU
@SymbolixAU谢谢,我刚刚编辑了它。如果sf可以完成同样的事情,那么它不需要是SpatialPolygonsDataFrame吗?只要它可以被leaflet()函数读取即可。 - user9302275
2个回答

4

我已经开发了sfheaders库来实现这个目的。

devtools::install_github("dcooley/sfheaders")
library(sfheaders)

sf <- sfheaders::sf_polygon(
    obj = df
    , x = "long"
    , y = "lat"
    , polygon_id = "countyfp10"
)

为了展示它在leaflet中的工作方式(其他绘图库也可用;)

library(leaflet)
leaflet() %>%
    addTiles() %>%
    addPolygons(data = sf)

enter image description here


谢谢,但我一直收到这个错误信息:错误:无法从GitHub安装“sfheaders”: 找不到编译软件包所需的工具 调用`pkgbuild::check_build_tools(debug = TRUE)`来诊断问题。``` - user9302275
奇怪...你运行过 pkgbuild::check_build_tools(debug = TRUE) 吗? - SymbolixAU
@SymbolixAU 等等,我想我让这个包工作了! - user9302275
1
@Sada93 如果你尝试使用 sf::st_polygon() 构造函数构造它,那么会出现错误。但是,有绕过这个问题的方法 geo <- '{"type":"Polygon","coordinates":[[[0,0],[1,1]]]}'; res <- sf::st_read( geo ),这将给你一个有效的 sf 对象。 - SymbolixAU
1
@Sada93 我已经注意到了你的评论,并为下一个版本强制多边形默认关闭,但你也可以覆盖这一设置 - https://github.com/dcooley/sfheaders/issues/34 - SymbolixAU
显示剩余8条评论

1

如评论中所提到的,sf是使用最方便的包,这里有一个例子。

请注意数据集已经修改为形成一个闭合多边形,如果我们尝试使用原始数据,则会出现错误。

data = tibble(countyfp10 = c(1, 1, 1, 1,1, 3, 3, 3, 3,3, 5, 5, 5,5,
                              5, 7, 7, 7, 7,7), id = c(7413,7414,7415,7416,7417, 7418, 7419, 7420, 7421, 7422, 7423, 
                                                     7424, 7425, 7426, 7427, 7428, 7429, 7430, 7431, 7432), lat = c(39.4797245, 
                                                                                                                    39.5544678, 39.4681687, 39.199806,39.4797245, 39.4017623, 39.3093943, 39.4272021, 
                                                                                                                    39.5618129,39.4017623, 39.7934997, 39.4835134, 39.4989196, 39.4819145,39.7934997, 39.4727694, 
                                                                                                                    39.4675515, 39.4693146, 39.4644503,39.4727694), lng = c(-118.7908571, -118.8095638, 
                                                                                                                                                                  -118.8195712, -118.5429041,-118.7908571, -118.754186, -118.8861865, -118.9729817, 
                                                                                                                                                                  -117.9418517,-118.754186, -118.9516281, -118.8487913, -119.0205114, -118.7695846,-118.9516281, 
                                                                                                                                                                  -118.7938896, -118.76011, -118.7778707, -118.7902103,-118.7938896))

cords = data%>%
  select(countyfp10,lng,lat)%>%
  mutate(lng = as.numeric(lng),
         lat = as.numeric(lat))%>%
  group_by(countyfp10)%>%
  summarise(coordinates = list(list(matrix(c(lng,lat),ncol = 2)))) %>%
  .$coordinates %>%
  lapply(.,st_polygon) %>%
  st_sfc(.)

cords %>% 
  leaflet() %>%
  addTiles()%>%
  addPolygons()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接