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)
我正在使用 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)