Многоточечный st_buffer с разным расстоянием

У меня есть sfc_multipoint объект и хотите использовать st_buffer но с разными расстояниями для каждой отдельной точки в многоточечном объекте. Это возможно?

Многоточечный объект - это координаты. таблица = данные

Каждая координатная точка (в таблице в "lon" и "lat") должна иметь буфер с разным размером. Этот размер буфера содержится в таблице в строке "dist". Таблица называется данными.

Это мой код:

library(sf)
coords <- matrix(c(data$lon,data$lat), ncol = 2)
tt     <- st_multipoint(coords)
sfc    <- st_sfc(tt, crs = 4326) 
dt     <- st_sf(data.frame(geom = sfc))
web    <- st_transform(dt, crs = 3857)
geom   <- st_geometry(web)
buf    <- st_buffer(geom, dist = data$dist)

Но он использует только первый dist (0.100). Это результат. Просто очень маленькие буферы. небольшой буфер

Для наглядности смотрите эту картинку. Это просто пример, показывающий, что буфер должен увеличиваться. пример результата

1 ответ

Я думаю, что его проблема в том, как вы "создаете" набор данных точек.

Репликация вашего кода с фиктивными данными, делая это:

library(sf)
data   <- data.frame(lat = c(0,1,2,3), lon = c(0,1,2,3), dist = c(0.1,0.2,0.3, 0.4))
coords <- matrix(c(data$lon,data$lat), ncol = 2)
tt     <- st_multipoint(coords)

не дает вам несколько очков, но одну функцию MULTIPOINT:

tt
#> MULTIPOINT (0 0, 1 1, 2 2, 3 3)

Следовательно, ему может быть "передано" только одно буферное расстояние, и вы получите:

plot(sf::st_buffer(tt, data$dist))

Чтобы решить проблему, вам, вероятно, нужно построить набор точечных данных иначе. Например, используя:

tt <- st_as_sf(data, coords = c("lon", "lat"))

дает тебе:

tt
#> Simple feature collection with 4 features and 1 field
#> geometry type:  POINT
#> dimension:      XY
#> bbox:           xmin: 0 ymin: 0 xmax: 3 ymax: 3
#> epsg (SRID):    NA
#> proj4string:    NA
#>  dist    geometry
#> 1  0.1 POINT (0 0)
#> 2  0.2 POINT (1 1)
#> 3  0.3 POINT (2 2)
#> 4  0.4 POINT (3 3)

Ты видишь это tt Теперь это простой набор объектов, состоящий из 4 точек, для которых действительно будет работать буферизация с нескольких расстояний:

plot(sf::st_buffer(tt, data$dist))

НТН!

Другие вопросы по тегам