从多边形质心到R中的最大距离边界绘制一条线

disbfnqx  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(86)

我有德国邮政编码的多边形形状数据。对于每个邮政编码,我喜欢计算从质心到其边界的最大距离,并在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上显示连接?


的数据

3ks5zfa0

3ks5zfa01#

您的代码通过将边界MULTIPOLYGON转换为构成该多边形的一组点,然后计算到每个点的距离来计算最大距离。
因此,我们可以做的是找到这些点中的哪一个是最大距离,创建一个包含该点和质心的sf Dataframe ,并使用st_cast()summarise()转换为LINESTRING

# create sf object of border points
border_points <- test %>%
    st_cast("POINT")

# compute distances
distances <- border_points |>
    st_distance(st_centroid(test))

max_dist_linestring <- border_points |>
    filter(as.logical(distances == max(distances))) |>
    bind_rows(st_centroid(test)) |>
    summarise() |>
    st_cast("LINESTRING")

ggplot() +
    geom_sf(data = test, size = 1, shape = 16, alpha = 0.1) + # shape
    geom_sf(data = st_centroid(test)) + # centroid
    geom_sf(data = max_dist_linestring) +
    theme_bw()

字符串
x1c 0d1x的数据

计算质心和投影的注意事项

经度/纬度格式的数据。st_crs(GER_postcode)返回4326,即WGS84,纬度/经度系统。但是,st_centroid()不能为纬度/经度数据给予准确的结果。
您应该将数据转换为projected coordinate system,即飞机。由于您的数据是德国,您可能需要使用DE_ETRS89。您可以通过以下方式执行此操作:

GER_postcode <- st_transform(GER_postcode, crs = 25831)


如果您选择不同的CRS,只需确保st_is_longlat(GER_postcode)FALSE。这将使您获得更准确的最大距离。在你发布的例子中,它造成了大约10米的差异。但是,根据位置的不同,您可能会得到完全错误的结果(即实际上不是最远距离的线)。更多信息请参见伦敦预测与地理缓冲区图。

相关问题