У многоугольника есть открытый край? Рассмотрим полных / частичных соседей в R {spdep} - PullRequest
2 голосов
/ 27 января 2020

Интересно, как я могу определить , если у многоугольника есть открытый край или нет . Я считаю, что многоугольник не имеет открытого ребра, если он полностью окружен соседями.

Используя чудесное poly2nb(fc) Я получаю обратно список соседей: но из этого списка я не знаю, сколько соседей должно быть, чтобы клетка была полностью окружена соседями? Вот ситуация:

enter image description here

Мой центральный полигон red имеет в обоих случаях 3 соседа, но имеет открытый край (слева) или полностью окружен по соседям (справа). Если используется формат raster и регистр ферзя , для полностью окруженной ячейки требуется 8 соседей. Если меньше, то это открытая ячейка. Но можно ли получить что-то похожее от объектов poly2nb(fc) и nb? Конечно, мои данные могут содержать осколки и разрывы между отдельными полигонами, поэтому я не хочу полностью полагаться на перекрывающиеся ребра или что-то еще.

Мои реальные данные доступны в dropbox или googleDrive

Пример кода r для вычисления количества соседей:

setwd("U:/Desktop/raw/myDir")

# Read input forest stand data
forest_fc = readOGR(getwd(), 
                    layer = "forest_fc")

# continuity based neighbourhood: 
# import whole 
# shapefile, do not split it by one feature at time
nb <- poly2nb(forest_fc, 
              #row.names = forest_fc,
              snap = 0) # snap to correct for the gaps/slivers 

# store the number of neighbours by cell
forest_fc$nb_count<- card(nb)

plot(forest_fc, 
     col = "white",
     border = "grey")
plot(nb, 
     coordinates(forest_fc), 
     add = T, 
     lwd = 2, 
     col = "black",
     pch = 16,
     cex = 0.5)
text(forest_fc, "nb_count", col = "red", cex = 1.2)

define open edge

Как различить полностью окруженные многоугольники и многоугольники с открытым краем?

1 Ответ

0 голосов
/ 09 марта 2020

Это решение сочетает в себе смежность и соседство на основе расстояния. Соседи - это стенды, которые находятся в пределах буферного расстояния от центрального стенда. Стенд имеет открытый край, если:

  • не имеет соседей
  • разница между высотой дерева в соседях и окружающих стендах меньше 5
  • , если буфер пространственного стирания ` - значение соседей больше определенного значения, здесь я использую 16 м.

Вот схема учета другой ситуации с открытым краем, которая, однако, имеет такое же количество соседей:

enter image description here

Моя функция перебирает шейп-файл строка за строкой. Для каждой строки он идентифицирует набор соседей на основе буфера и сравнивает уровни с его соседями. Если разница меньше 5, он дополнительно проверяет наличие разрыва, стирая соседей из буфера.

Вот вся функция:

defineOpenEdge <- function(spdf, treeHeight, distance = 10, pixel.width = 16, ...) {

  # loop through the dataframe
  spdf@data$open_edge <- FALSE
  for (i in seq_along(spdf)) {

    # define stands and leftover forest
    one  = spdf[i, ]
    left = spdf[-i,]

    # Create buffer and intersectb buffer with neighbors: evalues if any are left?
    buff = buffer(one, distance)


    # Identify neighbors 
    nbrs.buff <- left[which(gOverlaps(sp::geometry(buff),
                                      sp::geometry(left), 
                                      byid = TRUE)),]

    # Conditions for open edge:
    #    - no neighbors
    if (nrow(nbrs.buff) == 0) {
      spdf@data[i,]$open_edge <- TRUE  

    } else {  # neighbors are smaller than the stands

      # Compare the height of the stands: 
      height.one  = rep(one@data$treeHeight, nrow(nbrs.buff))
      height.nbrs = nbrs.buff@data$treeHeight

      # Get the differences between the neighbouring stands
      difference = height.one - height.nbrs

      # compare here the tree heights of stands
      if(any(difference > 5)) {
        spdf@data[i,]$open_edge <- TRUE

      # Check if there is a big gap in neighborhood    
      } else {                     

        # Get the difference between two shapefiles???
        int.buff.one = rgeos::gDifference(buff, nbrs.buff + one)

        # Is the size of the openning larger than one pixel 16x16 m? 
        if (!is.null(int.buff.one) ) {

          # Calculate area of intersected data
          int.buff.one.area = gArea(int.buff.one)

          if (int.buff.one.area > 16*16) {
            spdf@data[i,]$open_edge <- TRUE
          }
        }
      }
    }
  }
 return(spdf) 
} 

Определяет, имеет ли подставка открытый край или нет. При размере буфера 10 м мои стенды с открытым краем:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...