【问题标题】:Converting data.frame to SpatialPolygonsDataFrame将 data.frame 转换为 SpatialPolygonsDataFrame
【发布时间】:2020-01-05 21:26:54
【问题描述】:

以下是可重复使用的数据:

  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的继承者?
  • 而且,与其“打印”您的数据,不如使用dput(df) 的输出。这样我们都可以简单地复制和粘贴您的数据。
  • @SymbolixAU 谢谢,刚刚编辑。我猜它不需要是 SpatialPolygonsDataFrame,如果sf 完成同样的事情?只要可以被leaflet()函数读取

标签: r leaflet geospatial sp


【解决方案1】:

我为此目的开发了sfheaders 库。

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

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

并在传单中显示它的工作原理(其他 plotting libraries 可用;))

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

【讨论】:

  • 谢谢,但我不断收到此错误消息:Downloading GitHub repo dcooley/sfheaders@master Error: Failed to install 'sfheaders' from GitHub: Could not find tools necessary to compile a package Call `pkgbuild::check_build_tools(debug = TRUE)` to diagnose the problem.
  • 奇怪...你跑pkgbuild::check_build_tools(debug = TRUE)了吗?
  • @Sada93 是的,如果您尝试使用 sf::st_polygon() 构造函数构造它,它会出错。但是,有一些方法可以解决它 geo &lt;- '{"type":"Polygon","coordinates":[[[0,0],[1,1]]]}'; res &lt;- sf::st_read( geo ) ,它给你一个有效的 sf 对象
  • @Sada93 我已经接受了你的评论,对于下一个版本,我将强制多边形默认关闭,但你也可以覆盖它 - github.com/dcooley/sfheaders/issues/34
【解决方案2】:

在cmets中提到,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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多