【发布时间】:2020-01-23 12:29:50
【问题描述】:
我有一组森林林分 (SpatialPolygonDataFrame) 随机分布在景观中,即分散和聚集。对于每个多边形,我想确定它是否具有开放边缘。 多边形有开放边如果:
- 没有邻居
- 至少在一侧没有邻居;
- 有邻居, 但是树高之间的差异 邻居超过 5 个
我想知道如何将属性open_edge = TRUE/FALSE 添加到单个多边形?在raster 包中,有一种使用moving window 的有前途的方法。但是,我的原始数据是要素类,不幸的是不像工作示例中那样栅格化。
我想(伪代码):
- 一个接一个的子集(在
for循环中) - 创建环绕缓冲区
-
buffer与看台重叠的围绕看台的子集 - 如果有邻居 -> 比较高度。如果差值 > 5,
open_edge = TRUE
但是,这种方法没有考虑看台有什么让我们说只有 3 个侧面的邻居,即作为车邻居。 poly2nb 工具看起来很有前景,但如何为单个展台添加属性?
这是我的虚拟方法,但我想知道您是否有更有效的解决方案?
创建虚拟数据:
library(ggplot2) # for choropleth map plot
library(broom) # to convert spatial data to dataframe
library(mapproj)
library(spdep) # neighbours
library(rgdal)
library(rgeos)
library(sf)
library(raster)
library(dplyr)
library(spData)
library(sf)
r <- raster(nrow=6, ncol=6, crs = "+init=epsg:2957")
values(r) <- matrix(data = c(9, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA,
NA, NA, NA, 1, 1, 1,
NA, NA, NA, 1, 9, 1,
NA, NA, NA, 1, 1, 1),
nrow = 6,
ncol = 6,
byrow = TRUE)
# Convert raster to polygon
polys <- rasterToPolygons(r)
识别支架是否有开口边缘,以一个支架为例:
# Subset first row in SpatialPolygonDataFrame
i = 10
one = polys[i, ]
# Keep the remaining polygons
left = polys[-i,]
# Create buffer within distance
buff = buffer(one, width = 100)
# subset set of neighbours by spatial overlap
nbrs <- left[which(gContains(sp::geometry(buff),
sp::geometry(left), byid = T)),
# Compare if the values are different
height.one = rep(one$layer[1], nrow(nbrs))
height.nbrs = nbrs$layer
# Get the differences between the neighbouring stands
difference = height.one - height.nbrs
# If the difference in at least one stand is
# in more than 5, set open_edge = TRUE
# or if no neighbours find
one$open_edge <- any(difference > 5)
【问题讨论】:
标签: r geospatial nearest-neighbor neighbours