使用R中的简单要素创建Voronoi多边形

14

我不确定我是否完全理解了创建泰森多边形的帮助页面。

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)

输出

有什么办法可以修复它吗?


2
一个特征的沃罗诺伊多边形没有任何意义,对吧? - loki
1个回答

24

使用sf文档页面中的st_voronoi()示例作为起点,似乎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)

enter image description here

以下是如何获取正确的州边界而不是原始边界框。

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

enter image description here

我正在尝试类似标记点的操作,并且需要保留这些点的属性以便生成瓷砖。但是我还没有想出如何做到这一点。


你成功保留了属性吗?我也遇到了同样的问题。 - CPhil
2
我不得不使用st_join在Voronoi图块和原始点数据之间进行另一个空间连接,详见https://github.com/andybega/r-misc/blob/master/spatial/marked-points-to-polygons.R第28行左右的内容;这里展示了结果的样子:https://github.com/andybega/r-misc/blob/master/spatial/marked-points-to-polygons.md。 - andybega
1
在执行 st_voronoi 函数时,多边形是否与多点中的点按相同顺序排列?我没有在文档中找到相关说明... - Spacedman
我不知道,但可能可以安全地假设它们可能不是。 - andybega
你怎么检查? - Jonno Bourne
一个简单但不全面的检查可能是绘制一些多边形和点的子集。如果所有点都在所有多边形中,则它们可能按相同顺序排列。 - andybega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接