Как вычислить наибольшее расстояние между центроидом и краем многоугольника с помощью пакета SF?

У меня есть набор многоугольников разной формы и размера с центроидами. Я хочу рассчитать расстояние от каждого центроида до самой дальней точки соответствующего многоугольника.

Этот вопрос был решен здесь с помощью пакет :: sp и пакет :: rgeos.

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


person John J.    schedule 25.01.2018    source источник


Ответы (2)


Преобразование многоугольника в ТОЧКУ (таким образом, получение вершин), а затем вычисление расстояний относительно центроида должно работать. Что-то вроде:

library(sf)

# build a test poly
geometry <- st_sfc(st_polygon(list(rbind(c(0,0), c(1,0), c(1,3),  c(0,0))))) 
pol <- st_sf(r = 5, geometry)

# compute distances 
distances <- pol %>% 
  st_cast("POINT") %>% 
  st_distance(st_centroid(pol))

distances
#>          [,1]
#> [1,] 1.201850
#> [2,] 1.054093
#> [3,] 2.027588
#> [4,] 1.201850

# maximum dist:
max_dist <- max(distances)
max_dist
#> [1] 2.027588

# plot to see if is this correct: seems so.
plot(st_geometry(pol))
plot(st_centroid(pol), add = T)
plot(st_cast(pol, "POINT")[which.max(distances),],
     cex =3, add = T, col = "red")

Вы получаете одно и то же расстояние дважды, поскольку первая и последняя вершины одинаковы, но, поскольку вас интересует максимум, это не имеет значения.

HTH

person lbusett    schedule 25.01.2018
comment
Я не знал st_cast. Интересно ! Однако, когда я пытаюсь использовать его в своем ответе, он работает правильно для одного многоугольника, но не работает в функции furthest для нескольких многоугольников. Похоже, это потому, что часть lapply в конце выполняет: st_cast(st_geometry(poly)[1], "POINT"), который дает координаты только первой точки, а не st_cast(st_geometry(poly)[[1]], "POINT"), который дает ожидаемые координаты всех вершин. - person Gilles; 26.01.2018

Я не уверен, что понимаю, что именно вы хотите: расстояние до самой дальней точки (это то, что вы спрашиваете) или координаты самой дальней точки (это то, что предоставляется ответом, на который вы указываете).

Вот решение для расчета расстояния (и его можно легко изменить, чтобы извлечь координаты)

# This is an example for one polygon.
# NB the polygon is the same as in the answer pointed to in the question

library(sf)
sfPol <- st_sf(st_sfc(st_polygon(list(cbind(c(5,4,2,5),c(2,3,2,2))))))

center <- st_centroid(sfPol)
vertices <-  st_coordinates(sfPol)[,1:2]
vertices <-  st_as_sf(as.data.frame(vertices), coords = c("X", "Y"))
furthest <- max(st_distance(center, vertices))
furthest

## [1] 1.699673



# You can adapt this code into a function that will work 
# for multiple polygons

furthest <- function(poly) {
    # tmpfun find the furthest point from the centroid of one unique polygon
    tmpfun <- function(x) {
        center <- st_centroid(x)
        vertices <-  st_coordinates(x)[,1:2]
        vertices <-  st_as_sf(as.data.frame(vertices), coords = c("X", "Y"))
        furthest <- max(st_distance(center, vertices))
        return(furthest)
    }

    # We apply tmpfun on each polygon
    return(lapply(st_geometry(poly), tmpfun))
}


poly1 <- cbind(c(5,4,2,5),c(2,3,2,2))
poly2 <- cbind(c(15,10,8,15),c(5,4,12,5))

sfPol <- st_sf(st_sfc(list(st_polygon(list(poly1)), 
                           st_polygon(list(poly2)))))

furthest(sfPol)

## [[1]]
## [1] 1.699673
## 
## [[2]]
## [1] 5.830952
person Gilles    schedule 25.01.2018