создать концентрические кольца вокруг точки с помощью sf - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь создать концентрические кольца вокруг точки с sf.При поиске кажется, что решение состоит в том, чтобы создать 2 буфера и затем использовать st_difference их так:

library(tidyverse)
library(sf)
point <- c(0,0)
point <- st_point(point)

buff1 <- st_buffer(point, dist=1)
buff2 <- st_buffer(point, dist=2)
ring <- st_difference(buff2, buff1)

ring %>%
ggplot() +
  geom_sf() 

Есть ли лучший (более быстрый) подход.Приложение, которое я использую, требует, чтобы это было сделано для 100 колец около 200 баллов и очень медленно.Есть идеи?Я пытался играть с геометриями CIRCULARSTRING, но не мог понять, как это работает.

1 Ответ

0 голосов
/ 21 сентября 2019

Не очень элегантно, но как насчет репликации точек и создания массива расстояний для колец, которые будут использоваться в st_buffer?Примерно так может сработать:

library(tidyverse)
library(sf)

pts = st_sfc(st_point(1:2), st_point(3:4), st_point(8:9))
pts = st_sf(a=1:3, geometry = pts)

# replicate your points N times (N = number of rings)
N = 20
pts_rep <- pts
for (n in 2:N) pts_rep <- rbind(pts_rep,pts)

# create a array of buffer distances and replicate it N times
dists <- seq(1, 4, 0.05)
dists <- rep(dists, N)

# apply buffer
buff1 <- st_buffer(pts_rep, dists) %>% st_cast("LINESTRING")
#> Warning in st_cast.sf(., "LINESTRING"): repeating attributes for all sub-
#> geometries for which they may not be constant

buff1 %>%
ggplot() +
  geom_sf() 

Создано в 2019-09-21 пакетом prex (v0.3.0)

HTH!

...