我有德国邮政编码的多边形形状数据。对于每个邮政编码,我喜欢计算从质心到其边界的最大距离,并在Map上说明其中一些。我发现了一篇文章,通过sf
包和st_cast()
和st_distance()
计算这个最大值。我的数据来自sf dataframe。
How to compute the greatest distance between a centroid and the edge of the polygon using the SF package?
library(sf)
library(tidyverse)
# Get German postcode shape polygons
URL <- "https://downloads.suche-postleitzahl.org/v2/public/plz-5stellig.shp.zip"
# use GDAL virtual file systems to load zipped shapefile from remote url
GER_postcode <- paste0("/vsizip//vsicurl/", URL) %>% read_sf()
# convert numeric
GER_postcode$plz <- as.numeric(GER_postcode$plz)
# filter a specific postcode
test <- GER_postcode %>% filter(plz == 15232)
# compute distances
distances <- test %>%
st_cast("POINT") %>%
st_distance(st_centroid(test))
# maximum dist:
max_dist <- max(distances)
max_dist
ggplot() +
geom_sf(data = test, size = 1, shape = 16, alpha = 0.1) + # shape
geom_sf(data = st_centroid(test)) + # centroid
theme_bw()
字符串
最大值(1297.496 [m])的确切位置以及如何在Map上显示连接?
的数据
1条答案
按热度按时间3ks5zfa01#
您的代码通过将边界
MULTIPOLYGON
转换为构成该多边形的一组点,然后计算到每个点的距离来计算最大距离。因此,我们可以做的是找到这些点中的哪一个是最大距离,创建一个包含该点和质心的
sf
Dataframe ,并使用st_cast()
将summarise()
转换为LINESTRING
。字符串
x1c 0d1x的数据
计算质心和投影的注意事项
经度/纬度格式的数据。
st_crs(GER_postcode)
返回4326
,即WGS84,纬度/经度系统。但是,st_centroid()
不能为纬度/经度数据给予准确的结果。您应该将数据转换为projected coordinate system,即飞机。由于您的数据是德国,您可能需要使用DE_ETRS89。您可以通过以下方式执行此操作:
型
如果您选择不同的CRS,只需确保
st_is_longlat(GER_postcode)
是FALSE
。这将使您获得更准确的最大距离。在你发布的例子中,它造成了大约10米的差异。但是,根据位置的不同,您可能会得到完全错误的结果(即实际上不是最远距离的线)。更多信息请参见伦敦预测与地理缓冲区图。