将包含多边形坐标的数据框转换为 sf
Convert data frame containing coordinates of polygons to sf
我是 sf
包的初学者,我在将我的数据框转换为 sf
对象时遇到了一些困难。
我有一个数据框,其中每行包含多边形的坐标。这些坐标位于一列中。
这是我的数据框结构的示例:
dat <- tibble::tribble(
~code, ~geometry,
"MIE", list(c(1.24, 45), c(1.25, 45), c(1.25, 46), c(1.24, 45)),
"MIS", list(c(1.23, 44), c(1.23, 45), c(1.24, 45), c(1.23, 44))
)
我想从这个数据框创建一个 sf 对象,但 R 无法识别几何列。
我尝试了 st_sf()
、st_geometry()
、st_polygon()
等列表格式和函数,但没有成功。
正在尝试 st_sf(dat)
returns:
st_sf(dat)
中的错误:
Error in st_sf(dat) : no simple features geometry column present
正在尝试 st_polygon(dat$geometry)
returns :
Error in vapply(x, ncol, 0L) : values must be length 1,
but FUN(X[[1]]) result is length 0
有什么方法可以将我的数据框转换为 sf 对象吗?
我正在使用 R
版本 3.6.0。
我也一直在努力进行这种 sf
转换,因为它不是直截了当的。
第一步(也是困难的部分)是为所表示的每个单独的几何体构建一个 st_object
(这里是 st_polygon
)。
为此,将每个现有 list
转换为 matrix
。一旦每个多边形表示是 n-row matrix
(每个点一行),我们将矩阵转换为一个元素 list
以馈入 st_polygon()
。现在 dat$geometry
是一个适当分类的列表 POLYGONS
.
library(tidyverse)
dat %>%
mutate(geometry = map(geometry,
~ do.call(rbind, .) %>% # make each list a matrix
list() %>% # st_polygon() requires a list
st_polygon()
)
) %>%
st_as_sf()
然后最后一步是对整个数据框调用st_as_sf()
。它将 auto-detect 现在格式正确的 geometry
列并为您生成一个漂亮的新 sf
对象。制图愉快!
编辑:如果你想构建带孔的多边形,过程类似。 st_polygon()
将处理 multi-element 列表,就好像第一个元素是多边形,其余元素是第一个中的孔。它确实需要你使用 map
两次,因为你仍然需要从每个列表元素构建一个矩阵,但需要将分组矩阵的列表放在一起以处理空洞。
dat2 <- tibble::tribble( ~code, ~geometry, "MIE", list(list(c(1.24, 45), c(1.25, 45), c(1.25, 46), c(1.24, 45)), list(c(1.245,45.5), c(1.246,45.7), c(1.245,45.5))) )
dat %>%
mutate(geometry = map(dat$geometry,
~ map(.,
~ do.call(rbind, .) # make each list a matrix
) %>%
st_polygon()
)
) %>%
st_as_sf()
我是 sf
包的初学者,我在将我的数据框转换为 sf
对象时遇到了一些困难。
我有一个数据框,其中每行包含多边形的坐标。这些坐标位于一列中。
这是我的数据框结构的示例:
dat <- tibble::tribble(
~code, ~geometry,
"MIE", list(c(1.24, 45), c(1.25, 45), c(1.25, 46), c(1.24, 45)),
"MIS", list(c(1.23, 44), c(1.23, 45), c(1.24, 45), c(1.23, 44))
)
我想从这个数据框创建一个 sf 对象,但 R 无法识别几何列。
我尝试了 st_sf()
、st_geometry()
、st_polygon()
等列表格式和函数,但没有成功。
正在尝试 st_sf(dat)
returns:
st_sf(dat)
中的错误:
Error in st_sf(dat) : no simple features geometry column present
正在尝试 st_polygon(dat$geometry)
returns :
Error in vapply(x, ncol, 0L) : values must be length 1,
but FUN(X[[1]]) result is length 0
有什么方法可以将我的数据框转换为 sf 对象吗?
我正在使用 R
版本 3.6.0。
我也一直在努力进行这种 sf
转换,因为它不是直截了当的。
第一步(也是困难的部分)是为所表示的每个单独的几何体构建一个 st_object
(这里是 st_polygon
)。
为此,将每个现有 list
转换为 matrix
。一旦每个多边形表示是 n-row matrix
(每个点一行),我们将矩阵转换为一个元素 list
以馈入 st_polygon()
。现在 dat$geometry
是一个适当分类的列表 POLYGONS
.
library(tidyverse)
dat %>%
mutate(geometry = map(geometry,
~ do.call(rbind, .) %>% # make each list a matrix
list() %>% # st_polygon() requires a list
st_polygon()
)
) %>%
st_as_sf()
然后最后一步是对整个数据框调用st_as_sf()
。它将 auto-detect 现在格式正确的 geometry
列并为您生成一个漂亮的新 sf
对象。制图愉快!
编辑:如果你想构建带孔的多边形,过程类似。 st_polygon()
将处理 multi-element 列表,就好像第一个元素是多边形,其余元素是第一个中的孔。它确实需要你使用 map
两次,因为你仍然需要从每个列表元素构建一个矩阵,但需要将分组矩阵的列表放在一起以处理空洞。
dat2 <- tibble::tribble( ~code, ~geometry, "MIE", list(list(c(1.24, 45), c(1.25, 45), c(1.25, 46), c(1.24, 45)), list(c(1.245,45.5), c(1.246,45.7), c(1.245,45.5))) )
dat %>%
mutate(geometry = map(dat$geometry,
~ map(.,
~ do.call(rbind, .) # make each list a matrix
) %>%
st_polygon()
)
) %>%
st_as_sf()