2

我有一个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)

但它只使用 (0.100) 的第一个距离。这就是结果。只是非常小的缓冲区。 小缓冲区

对于可视化,请参阅此图片。这只是一个示例,说明缓冲区应该变大。示例结果

4

1 回答 1

4

我认为他的问题在于您如何“创建”点数据集。

使用虚拟数据复制代码,执行以下操作:

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

于 2017-11-01T21:04:13.843 回答