Как построить / построить выпуклые оболочки многоугольников из точек по фактору, используя sf? - PullRequest
1 голос
/ 30 октября 2019

У меня есть набор данных о происхождении видов, которые я пытаюсь преобразовать в районы залегания путем создания выпуклых оболочек. Я могу сделать это вручную (т. Е. Один вид за раз), но я бы очень хотел иметь возможность автоматически обрабатывать его по названию вида.

Пример уменьшенного набора данных можно найти здесь: 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()

Я искал несколько дней, а также копался в куче документации. Многие из этих пространственных вещей не интуитивны для меня, поэтому я ожидаю, что мне не хватает базового понимания. Можно ли это сделать?

1 Ответ

1 голос
/ 30 октября 2019

Вот возможное решение с использованием tidyverse (фактически только dplyr) и sf -пакета (и пакета mapview для быстрого просмотра).

Вы были оченьзакрой свое собственное решение (Кудо). Хитрость заключается в том, чтобы 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 )

enter image description here

#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 ) )

enter image description here

...