Нахождение радиуса окружности, которая описывает многоугольник - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь найти наилучший способ получения: длины самой длинной линии от центра многоугольника до его края .

В приведенном ниже коде я загружаю данные о многоугольнике почтового индекса 75254, расположенного в Техасе, США. Затем я определяю местоположение его центра с помощью sf::st_centroid() и строю геометрию с помощью пакета tmap.

# Useful packages

library(dplyr)
library(sf)
library(tigris)
library(tmap)

# Download polygon data

geo <- tigris::zctas(cb = TRUE, starts_with = "75254")
geo <- st_as_sf(geo)

# Determine the location of the polygon's center

geo_center <- st_centroid(geo)

# Plot geometries

tm_shape(geo) +
  tm_polygons() +
  tm_shape(geo_center) +
  tm_dots(size = 0.1, col = "red")

Zip code: 75254

Еще раз Существует ли эффективный способ определения длины линии, проходящей от центра многоугольника до самой дальней точки на краю многоугольника? Другими словами, как я могу найти радиус круга, который идеально описывает многоугольник, если круг и многоугольник имеют один и тот же центр?

Большое спасибо за помощь.

1 Ответ

1 голос
/ 15 февраля 2020

Одна точка здесь, хотя я и упомянул, st_bbox не будет работать как центроид bbox, а центр вашей фигуры не совпадает, так как центроид является взвешенным. Посмотрите здесь один подход, основанный на дальнейшем расстоянии до точек границы, но вам нужно спроецировать вашу форму (в настоящее время не проецируется):

library(dplyr)
library(sf)
library(tigris)
library(tmap)

# Download polygon data
geo <- tigris::zctas(cb = TRUE, starts_with = "75254")
geo <- st_as_sf(geo)

st_crs(geo)
#> Coordinate Reference System:
#>   EPSG: 4269 
#>   proj4string: "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs"

#Need to project
geo=st_transform(geo,3857)

# Determine the location of the polygon's center

geo_center <- st_centroid(geo)
#> Warning in st_centroid.sf(geo): st_centroid assumes attributes are constant over
#> geometries of x

plot(st_geometry(geo))
plot(st_geometry(geo_center), col="blue", add=TRUE)

#Cast to points
geopoints=st_cast(geo,"POINT")
#> Warning in st_cast.sf(geo, "POINT"): repeating attributes for all sub-geometries
#> for which they may not be constant

r=max(st_distance(geo_center,geopoints))
r
#> 3684.917 [m]
buffer=st_buffer(geo_center,dist=r)
plot(st_geometry(buffer), add=TRUE, border="green")

enter image description here

...