Создайте многоугольник Вороного с помощью простого объекта в R

Я не уверен, что полностью понял справочную страницу по созданию полигонов вороного.

library(sf)

# function to get polygon from boundary box
bbox_polygon <- function(x) {
  bb <- sf::st_bbox(x)

  p <- matrix(
    c(bb["xmin"], bb["ymin"], 
      bb["xmin"], bb["ymax"],
      bb["xmax"], bb["ymax"], 
      bb["xmax"], bb["ymin"], 
      bb["xmin"], bb["ymin"]),
    ncol = 2, byrow = T
  )

  sf::st_polygon(list(p))
}

nc <- st_centroid(st_read(system.file("shape/nc.shp", package="sf")))["BIR79"]
box <- st_sfc(bbox_polygon(nc))
v <- st_voronoi(nc, box)

plot(v)

вывод

Есть идеи исправить это?


r sf
person Italo Cegatta    schedule 16.08.2017    source источник
comment
Разве многоугольник Вороного одного объекта не имеет смысла?   -  person loki    schedule 16.08.2017


Ответы (1)


Используя пример st_voronoi() из sf страниц документации в качестве отправной точки, кажется, что st_voronoi() не работает с sf объектом, состоящим из точек.

library(sf)

# function to get polygon from boundary box

bbox_polygon <- function(x) {
  bb <- sf::st_bbox(x)

  p <- matrix(
    c(bb["xmin"], bb["ymin"], 
      bb["xmin"], bb["ymax"],
      bb["xmax"], bb["ymax"], 
      bb["xmax"], bb["ymin"], 
      bb["xmin"], bb["ymin"]),
    ncol = 2, byrow = T
  )

  sf::st_polygon(list(p))
}

nc <- st_read(system.file("shape/nc.shp", package="sf"))["BIR79"]
nc_centroids <- st_centroid(nc)
box <- st_sfc(bbox_polygon(nc_centroids))

head(nc_centroids)

Каждая точка имеет отдельную запись геометрии.

Simple feature collection with 6 features and 1 field
geometry type:  POINT
dimension:      XY
bbox:           xmin: -81.49826 ymin: 36.36145 xmax: -76.0275 ymax: 36.49101
epsg (SRID):    4267
proj4string:    +proj=longlat +datum=NAD27 +no_defs
  BIR79                       geometry
1  1364 POINT(-81.4982613405682 36....
2   542 POINT(-81.125145134236 36.4...
3  3616 POINT(-80.6857465738484 36....
4   830 POINT(-76.0275025784544 36....
5  1606 POINT(-77.4105635619488 36....
6  1838 POINT(-76.9947769754215 36....

Это объединяет точки в многоточечную геометрию:

head(st_union(nc_centroids))

Выход:

Geometry set for 1 feature 
geometry type:  MULTIPOINT
dimension:      XY
bbox:           xmin: -84.05976 ymin: 34.07663 xmax: -75.80982 ymax: 36.49101
epsg (SRID):    4267
proj4string:    +proj=longlat +datum=NAD27 +no_defs
MULTIPOINT(-84.0597597853139 35.131067104959, -...

Использование объединения точек вместо исходного объекта sf работает:

v <- st_voronoi(st_union(nc_centroids), box)
plot(v, col = 0)

введите описание изображения здесь

А вот как получить правильную государственную границу вместо исходной ограничительной рамки.

plot(st_intersection(st_cast(v), st_union(nc)), col = 0) # clip to smaller box
plot(nc_centroids, add = TRUE)

введите описание изображения здесь

Я пытаюсь сделать что-то подобное с отмеченными точками, и мне нужно сохранить атрибуты точек для полученных плиток. Еще не понял этого.

person andybega    schedule 23.08.2017
comment
Удалось ли сохранить атрибуты? У меня такая же проблема. - person CPhil; 11.01.2018
comment
Мне пришлось сделать еще одно пространственное соединение с плитками Вороного и исходными данными точек, используя st_join, см. Строку 28 в github.com/andybega/r-misc/blob/master/spatial/; это показывает, как выглядят результаты github .com / andybega / r-misc / blob / master / пространственный / - person andybega; 12.01.2018
comment
Находятся ли полигоны в мультиполигоне в том же порядке, что и точки в мультиполигоне при выполнении st_voronoi? Я не вижу этого в документации ... - person Spacedman; 29.05.2018
comment
Я не знаю, но, вероятно, можно предположить, что это не так. - person andybega; 21.06.2018
comment
Как можно проверить? - person Jonno Bourne; 12.07.2019
comment
Простая, но не исчерпывающая проверка может заключаться в построении пары подмножеств полигонов и точек. Если согласованность всех точек попадает во все полигоны, они, вероятно, находятся в одном и том же порядке. - person andybega; 14.07.2019