st_buffer "missing" 在 R 中使用 sf 的多面体的一部分

st_buffer "missing" part of multipolygon using sf in R

我正在使用 R 中的 sf 包和 arcpullr 包从 ArcGIS REST 服务中提取数据并将其作为 sf 对象使用。我 运行 遇到了 MULTIPOLYGON 的问题,其中 sf 只缓冲了 MULTIPOLYGON 的一部分(即,它缓冲了一个多边形,但只缓冲了另一个多边形的一小部分)。在缓冲找到的示例 .

时,我无法重现该问题

这是一个 MRE(抱歉,如果您没有,则必须安装 arcpullr)。

# install.packages("arcpullr")
library(arcpullr)
library(sf) # redundant since loaded with arcpullr, but here for brevity
library(ggplot2)

tax_parcel_url <- paste0(
  "https://mapservices.legis.wisconsin.gov/arcgis/rest/services/", 
  "WLIP/Parcels/FeatureServer/0"
)
parcel <- 
  get_spatial_layer(tax_parcel_url, where = "PARCELID = 'HA-11'") %>%
  st_transform(crs = 3071)
parcel_buffer <- st_buffer(parcel, dist = 10)

# map of parcel
ggplot(data = parcel) + geom_sf() # this is correct

# map of parcel and buffer - buffer "misses" part of multipolygon
ggplot(data = parcel_buffer) + 
  geom_sf(color = "blue") + 
  geom_sf(data = parcel, color = "red", alpha = 0.3) + 
  theme_bw()

您可以将 st_make_valid 传送到 parcel,这将使用 sf 对象更正几何(即,使几何有效)。这将允许缓冲区在多面体的所有部分上正确绘制。

library(arcpullr)
library(sf)
library(ggplot2)

parcel <-
  arcpullr::get_spatial_layer(tax_parcel_url, where = "PARCELID = 'HA-11'") %>%
  sf::st_transform(crs = 3071) %>%
  sf::st_make_valid()

parcel_buffer <- sf::st_buffer(parcel, dist = 10)

ggplot(data = parcel_buffer) +
  geom_sf(color = "blue") +
  geom_sf(data = parcel,
          color = "red",
          alpha = 0.3) +
  theme_bw()

输出

地图视图

你也可以看到mapview里面的buffer是清空的

library(mapview)

mapview::mapview(parcel_buffer) + mapview::mapview(parcel)