У меня есть набор древостоев (SpatialPolygonDataFrame), распределенных случайным образом по ландшафту, то есть разбросанных и агрегированных. Для каждого многоугольника я хочу решить, имеет ли он открытый край или нет. Полигон имеет открытый край , если:
- не имеет соседей
- не имеет соседей хотя бы на одной стороне;
- имеет соседей, но разница между высотой дерева между трибунами и соседями составляет более 5
Мне интересно, как добавить атрибут open_edge = TRUE/FALSE
к отдельным полигонам? В пакете raster
есть многообещающий подход с использованием moving window
. Однако мои исходные данные являются классами пространственных объектов, и, к сожалению, они не такие растровые, как в рабочем примере.
Хотя я ( псевдокод ):
- подмножество каждого стенда один за другим (в
for
l oop) - создание окружающего буфера
- подмножество окружающего стенда путем перекрытия
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)