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

时间:2017-08-16 17:33:53

标签: r sf

我不确定我是否完全理解帮助页面来创建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

有什么想法来解决它吗?

1 个答案:

答案 0 :(得分:7)

使用times中的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) 对象起作用:

{{1}}

sf doc pages

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

{{1}}

enter image description here

我正在尝试用标记点做类似的事情,我需要保留结果图块的点的属性。还没想出来。