r - 通过扩展周围的多边形而不重叠来填充开放空间
问题描述
我正在尝试通过合并相同类型的相邻批次来减小分区数据集的大小,以便我可以创建传单地图(我正在使用原始数据进行分析)。问题是它们并不完全相邻。我已经从数据集中删除了通行权并缓冲了剩余的多边形,以便它们重叠并且可以合并。然后使用原始剩余多边形来剪裁此联合/缓冲层以移除缓冲区。这种方法很有效,除非有一个空白空间分隔不同土地利用类型的多边形。是否有可能使这些多边形相遇而不重叠?(注意:reprex 显示了仅从 2 个多边形开始的问题,因此它没有说明该方法如何有效地合并多边形)
library(tidyverse)
library(sf)
df<-structure(list(LANDUSE_NA = c("INDUSTRY", "PUBLIC AND SEMI-PUBLIC"),
geometry = structure(
list(
structure(
list(
structure(
c(-85.715223381,
-85.715142073, -85.7151295849999, -85.714958238, -85.71497583,
-85.714979414, -85.715355453, -85.715223381, 38.1155518300001,
38.1155546540001, 38.1156196090001, 38.1156701460001, 38.115024116,
38.1150240710001, 38.115043547, 38.1155518300001),
.Dim = c(8L, 2L))),
class = c("XY", "POLYGON", "sfg")),
structure(list(structure(c(-85.71616947, -85.715752325, -85.7157165419999,
-85.7154038639999, -85.715402624,
-85.715223381, -85.715355453, -85.7154474979999,
-85.716344374,
-85.71616947, 38.1154608900001, 38.115422966,
38.1155180800001,
38.1155702450001, 38.1155356730001,
38.1155518300001, 38.115043547,
38.114689308, 38.114711931, 38.1154608900001),
.Dim = c(10L, 2L))),
class = c("XY", "POLYGON", "sfg"))),
class = c("sfc_POLYGON", "sfc"),
precision = 0,
bbox = structure(c(xmin = -85.716344374, ymin = 38.114689308,
xmax = -85.714958238, ymax = 38.1156701460001 ),
class = "bbox"),
crs = structure(list(input = "WGS 84", wkt = "GEOGCRS[\"WGS 84\",\n DATUM[\"World Geodetic System 1984\",\n ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n LENGTHUNIT[\"metre\",1]]],\n PRIMEM[\"Greenwich\",0,\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n CS[ellipsoidal,2],\n AXIS[\"latitude\",north,\n ORDER[1],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n AXIS[\"longitude\",east,\n ORDER[2],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n ID[\"EPSG\",4326]]"), class = "crs"), n_empty = 0L)), row.names = c(NA,
-2L),
sf_column = "geometry",
agr = structure(c(LANDUSE_NA = NA_integer_),
.Label = c("constant","aggregate", "identity"), class = "factor"),
class = c("sf", "tbl_df", "tbl", "data.frame"))
agg_fn <- function(x, df, tol=.0001){
remain<-df %>%
filter(LANDUSE_NA!=x[["LANDUSE_NA"]][1]) %>%
summarize()
x <- x %>% st_buffer(dist = tol, endCapStyle = "SQUARE", joinStyle = "MITRE",mitreLimit=3)
x %>%
st_difference(remain)%>%
group_by(LANDUSE_NA) %>%
summarize() %>%
st_cast("POLYGON")
}
df_split <- df %>% group_by(LANDUSE_NA) %>% group_split
df_unioned <- map(df_split,
~agg_fn(.x, df, tol=.00015)) %>%
reduce(bind_rows)
解决方案
推荐阅读
- google-cloud-platform - 即使不公开,谷歌存储桶文件链接也可以公开访问?
- android - TrafficStats.getUidRxBytes 返回 -1
- php - 在 localhost 上使用带有代理的 CURL 的空响应和错误
- android - 谷歌地图:绘制路线起点和终点相连
- node.js - 如何连接 Google Actions 和 Watson?
- sql - 舍入一个 SQL 值输出?
- r - 使用 pmap 将不同的正则表达式应用于 tibble 中的不同变量?
- git - Git从分支合并到分支的问题
- python - np.arange 在调整大小时创建一个空值矩阵
- c - 期待 2 种类型的输入?