如何使用 sf 按因子从点 construct/plot 多边形的凸包?
How to construct/plot convex hulls of polygons from points by factor using sf?
我有一个物种出现的数据集,我正试图通过制作凸包将其转换为出现区域。我可以手动执行此操作(即一次一个物种),但我真的很想能够通过物种名称自动处理它。
可以在此处找到简化的示例数据集:https://pastebin.com/dWxEvyUB
这是我目前手动执行的方式:
library(tidyverse)
library(sf)
library(rgeos)
library(maps)
library(mapview)
library(mapdata)
library(ggplot2)
fd <- read_csv("occurrence.csv")
spA.dist <- fd %>%
filter(species == "sp.A") %>%
dplyr::select(lon,lat) %>%
as.matrix() %>%
coords2Polygons(ID="distribution") %>%
gConvexHull() %>%
gBuffer()
spB.dist <- fd %>%
filter(species == "sp.B") %>%
dplyr::select(lon,lat) %>%
as.matrix() %>%
coords2Polygons(ID="distribution") %>%
gConvexHull() %>%
gBuffer()
wrld2 = st_as_sf(map('world2', plot=F, fill=T))
ggplot() +
geom_sf(data=wrld2, fill='gray20',color="lightgrey",size=0.07) +
geom_polygon(aes(x=long,y=lat,group=group),color="red",data=spA.dist,fill=NA) +
geom_polygon(aes(x=long,y=lat,group=group),color="blue",data=spB.dist,fill=NA) +
coord_sf(xlim=c(100,300), ylim=c(-60,60))
这显示了一张地图,其中包含两个物种的发生区域,这些区域基于他们观察的凸包。我意识到我在这里混合了不同的空间库,所以如果可能的话最好在 sf 中完成。在我的真实数据中,我有两个以上的物种,我可以复制并粘贴我为每个物种获得的代码,但似乎应该可以简化它,以便多边形(和随后的凸包)按因子级别构建自动地。更像是这样的:
polys <- st_as_sf(fd) %>%
group_by(species) %>%
magically_make_polygons(lon,lat) %>%
st_convex_hull() %>%
st_buffer()
我已经搜索了好几天,还翻阅了大量的文档。很多这种空间的东西对我来说是不直观的,所以我希望我缺少很多基本的理解。这能做到吗?
这是一个可能的解决方案,使用 tidyverse
(实际上只有 dplyr
)和 sf
包(以及 mapview
包以供快速查看) .
您非常接近自己的解决方案 (kudo's)。诀窍是 summarise
分组数据,然后创建外壳..
library( tidyverse )
library( sf )
#create simple feature
df.sf <- df %>%
st_as_sf( coords = c( "lon", "lat" ), crs = 4326 )
#what are we working with?
# perform fast visual check using mapview-package
mapview::mapview( df.sf )
#group and summarise by species, and draw hulls
hulls <- df.sf %>%
group_by( species ) %>%
summarise( geometry = st_combine( geometry ) ) %>%
st_convex_hull()
#result
mapview::mapview( list( df.sf, hulls ) )
我有一个物种出现的数据集,我正试图通过制作凸包将其转换为出现区域。我可以手动执行此操作(即一次一个物种),但我真的很想能够通过物种名称自动处理它。
可以在此处找到简化的示例数据集:https://pastebin.com/dWxEvyUB
这是我目前手动执行的方式:
library(tidyverse)
library(sf)
library(rgeos)
library(maps)
library(mapview)
library(mapdata)
library(ggplot2)
fd <- read_csv("occurrence.csv")
spA.dist <- fd %>%
filter(species == "sp.A") %>%
dplyr::select(lon,lat) %>%
as.matrix() %>%
coords2Polygons(ID="distribution") %>%
gConvexHull() %>%
gBuffer()
spB.dist <- fd %>%
filter(species == "sp.B") %>%
dplyr::select(lon,lat) %>%
as.matrix() %>%
coords2Polygons(ID="distribution") %>%
gConvexHull() %>%
gBuffer()
wrld2 = st_as_sf(map('world2', plot=F, fill=T))
ggplot() +
geom_sf(data=wrld2, fill='gray20',color="lightgrey",size=0.07) +
geom_polygon(aes(x=long,y=lat,group=group),color="red",data=spA.dist,fill=NA) +
geom_polygon(aes(x=long,y=lat,group=group),color="blue",data=spB.dist,fill=NA) +
coord_sf(xlim=c(100,300), ylim=c(-60,60))
这显示了一张地图,其中包含两个物种的发生区域,这些区域基于他们观察的凸包。我意识到我在这里混合了不同的空间库,所以如果可能的话最好在 sf 中完成。在我的真实数据中,我有两个以上的物种,我可以复制并粘贴我为每个物种获得的代码,但似乎应该可以简化它,以便多边形(和随后的凸包)按因子级别构建自动地。更像是这样的:
polys <- st_as_sf(fd) %>%
group_by(species) %>%
magically_make_polygons(lon,lat) %>%
st_convex_hull() %>%
st_buffer()
我已经搜索了好几天,还翻阅了大量的文档。很多这种空间的东西对我来说是不直观的,所以我希望我缺少很多基本的理解。这能做到吗?
这是一个可能的解决方案,使用 tidyverse
(实际上只有 dplyr
)和 sf
包(以及 mapview
包以供快速查看) .
您非常接近自己的解决方案 (kudo's)。诀窍是 summarise
分组数据,然后创建外壳..
library( tidyverse )
library( sf )
#create simple feature
df.sf <- df %>%
st_as_sf( coords = c( "lon", "lat" ), crs = 4326 )
#what are we working with?
# perform fast visual check using mapview-package
mapview::mapview( df.sf )
#group and summarise by species, and draw hulls
hulls <- df.sf %>%
group_by( species ) %>%
summarise( geometry = st_combine( geometry ) ) %>%
st_convex_hull()
#result
mapview::mapview( list( df.sf, hulls ) )