问题描述
我需要将田地的边界(仅边界)延长 x 米。我尝试使用 rgeos R 包中的 gBuffer - 转换的输出只给我字段的边界,字段内的其余多边形会随数据丢失。
我如何使用 gBuffer/任何其他方式将空间多边形对象(形状文件)的边界仅扩展 10m 并保持所有内容完整(多边形和数据内部)
尝试过的代码 -
field <- raster::shapefile("test.shp")
class(field)
plot(field)
View(field@data)
field <- sp::spTransform(field,CRS("+init=epsg:32632"))
plot(field)
field10m <- rgeos::gBuffer(field,width = 10)
plot(field10m)
可以从这里下载测试 shapefile https://drive.google.com/file/d/1s4NAinDeBow95hxr6gELHHkhwiR3z6Z9/view?usp=sharing
解决方法
我建议您考虑基于 {sf}
包的工作流;它使代码比 sp 和 rgeos 更清晰(它将使用相同的几何引擎,但隐藏了引擎盖下的粗糙部分)。
该代码保留了 shapefile 的所有数据特征(实际上,只有一个 - 名为 Rx 的列)。
请注意,由于黄色元素 / Rx = 120 / 由多个多边形组成,每个多边形都被缓冲,从而产生重叠的特征。这是预期的结果。
如果这是不受欢迎的行为,您可以考虑在应用 dplyr::group_by(Rx)
调用之前使用 dplyr::summarise()
后跟 sf::st_buffer()
来消除内部边界线。
library(sf)
library(dplyr)
library(mapview) # needed only for the final overview
library(leafsync) # dtto.
test_map <- sf::st_read("./Map/test.shp")
# find an appropriate projected metric CRS
crsuggest::suggest_crs(test_map,type = "projected")
result <- test_map %>%
sf::st_transform(5683) %>% # transform to a metric CRS
sf::st_buffer(10) # buffer by 10 meters
# a visual check / note how the polygons are overlaid
leafsync::latticeview(mapview::mapview(test_map),mapview::mapview(result))