Итерация по пространственной точечной сетке с динамическим буфером, чтобы найти пересечение в R - PullRequest
0 голосов
/ 09 сентября 2018

У меня довольно сложная проблема, и я не знаю, с чего начать. У меня есть набор координат пространственных точек (X & Y), которые также включают информацию (Высота).

set.seed(12345)
X = runif(100,  0, 45)
Y = runif(100, 0, 45)
Height = runif(100, 6, 9)
data <- data.frame("X" = X, "Y" = Y, "Height" = Height)
data$Radius_max = 1/3 * data$Height

Координаты выглядят примерно так:

ggplot(data, aes(X, Y)) +
geom_point()

enter image description here

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

  1. Установить нижнюю левую точку radius_max.
  2. Найти пересечение радиуса в любой заданной точке относительно следующей точки.
  3. Сделайте это несколько раз, чтобы установить новый радиус для начальной точки относительно новых соседних радиусов.

Причиной начала в начальной точке является то, что каждый следующий радиус будет ограничен соседними точками (случайное генерирование точек может иметь или не иметь этот эффект). Ни один конус не может быть ниже другого конуса. Думай о деревьях. Если возможно, я хотел бы знать радиус с шагом 45 градусов.

Я согласен с любым решением и подозреваю, что может быть способ сделать это с пространственными пакетами, а не делать это вручную. С чего начать?

1 Ответ

0 голосов
/ 10 сентября 2018

Я не совсем уверен, что вы после. Особенно с шагом в 45 градусов. Вы хотите, чтобы буфер был круглым? Если это так, возможно, ниже приведено решение.

Ваш пример данных

set.seed(12345)
X <- runif(100,  0, 45)
Y <- runif(100, 0, 45)
Height <- runif(100, 6, 9)
data <- data.frame("X" = X, "Y" = Y, "Height" = Height)
data$Radius_max <- 1/3 * data$Height

Возможное решение

library(raster)
x <- pointDistance(data[,1:2], lonlat=FALSE)
diag(x) <- NA
mn <- apply(x, 1, min, na.rm=TRUE)
data$radius <- pmin(data$Radius_max, mn/2)
d <- SpatialPoints(data[, c('X', 'Y')], proj4string=CRS('+proj=utm +zone=1'))
b <- buffer(d, data$radius, dissolve=FALSE)
plot(b)
...