我有一组林分(SpatialPolygonDataFrame),它们随机分布在整个景观上,即分散并聚集在一起。对于每个多边形,我想确定它是否具有开放边缘。 多边形具有开放边缘如果:
我徘徊如何将属性open_edge = TRUE/FALSE
添加到各个多边形?
我虽然(([[pseudocode):
for
循环中]buffer
与支架的重叠将支架子集包围open_edge = TRUE
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)
spdep::poly2nb
library(raster)
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)
library(spdep)
nb <- poly2nb(polys)
plot(polys)
text(polys, 1:10)
str(nb)
#List of 10
# $ : int 0
# $ : int [1:3] 3 5 6
# $ : int [1:5] 2 4 5 6 7
# $ : int [1:3] 3 6 7
# ...
所以poly 1没有邻居,poly 2有邻居3、5、6,等等。>现在您可以使用
sapply
计算事物。例如邻居数
sapply(nb, function(i) length(i[i>0])) #[1] 0 3 5 3 5 8 5 3 5 3