首页 > 解决方案 > 通过扩展周围的多边形而不重叠来填充开放空间

问题描述

我正在尝试通过合并相同类型的相邻批次来减小分区数据集的大小,以便我可以创建传单地图(我正在使用原始数据进行分析)。问题是它们并不完全相邻。我已经从数据集中删除了通行权并缓冲了剩余的多边形,以便它们重叠并且可以合并。然后使用原始剩余多边形来剪裁此联合/缓冲层以移除缓冲区。这种方法很有效,除非有一个空白空间分隔不同土地利用类型的多边形。是否有可能使这些多边形相遇而不重叠?(注意: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)

这是原文: 在此处输入图像描述

这是联合的,显示了该方法在哪里产生了不必要的重叠: 在此处输入图像描述

标签: rgissf

解决方案


推荐阅读