在 R 中创建具有简单特征的 voronoi 多边形

Posted

技术标签:

【中文标题】在 R 中创建具有简单特征的 voronoi 多边形【英文标题】:Create voronoi polygon with simple feature in R 【发布时间】:2018-01-24 23:08:57 【问题描述】:

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

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)

output

有解决办法吗?

【问题讨论】:

一个要素的 Voronoi 多边形没有任何意义吗? 【参考方案1】:

使用sf doc pages 中的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)

这里是如何获得正确的状态边界而不是原始边界框。

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

我正在尝试对标记点做类似的事情,我需要为生成的图块保留点的属性。还没有想通。

【讨论】:

您是否设法保留了这些属性?我也有同样的问题。 我不得不使用 st_join 对 Voronoi 瓦片和原始点数据进行另一个空间连接,请参见 github.com/andybega/r-misc/blob/master/spatial/… 的第 28 行;这显示了结果的样子github.com/andybega/r-misc/blob/master/spatial/… 在做st_voronoi时,多面体中的多边形是否与多点中的点顺序相同?我在文档中没有看到它... 我不知道,但可以安全地假设它们可能不是。 如何查看?

以上是关于在 R 中创建具有简单特征的 voronoi 多边形的主要内容,如果未能解决你的问题,请参考以下文章

unity urp 实现泰森多边形Voronoi扰动

来自 Emgu CV(或 OpenCV)中多边形集的 Voronoi 图

使用 D3.js geom 缩放 voronoi 多边形,结果为 lat long,而不是 px 坐标

如何界定 ​​Voronoi 多边形的外部区域并与地图数据相交

Voronoi图及matlab实现

如何在 Python 中创建具有分类特征的易于解释的回归模型?