Перечислите все SpatialPoints, которые находятся в пределах gBuffer другого SpatialPoint
Я хочу создать data.frame, где в каждой строке будет указан набор {} пространственных точек, которые лежат в буфере другого SpatialPoint. Я использую rgeos::gBuffer для создания буферов вокруг каждой из моих точек.
Вот несколько точечных локаций:
head(x)
Lon Lat
1 839171.2 3861540
2 838852.4 3861143
3 838945.9 3861240
4 824506.8 3865499
5 838851.8 3861160
6 827834.7 3878655
7 888196.5 3929905
8 508308.4 4031569
9 838750.5 3864169
10 983995.6 3993308
сделать * Пространственный объект:
coordinates(x) <- ~Lon + Lat
создать буфер вокруг точек:
xbuff <- gBuffer(x, width=1000, byid=TRUE)
Теперь, как мне найти список точек (если таковые имеются), которые попадают в каждый из 10 буферов, созданных в xbuff?
2 ответа
Как мне найти список точек (если таковые имеются), которые попадают в каждый из 10 буферов
Вы могли бы сделать
x<-read.table(header=T, text="
Lon Lat
1 839171.2 3861540
2 838852.4 3861143
3 838945.9 3861240
4 824506.8 3865499
5 838851.8 3861160
6 827834.7 3878655
7 888196.5 3929905
8 508308.4 4031569
9 838750.5 3864169
10 983995.6 3993308")
library(sp)
library(rgeos)
coordinates(x) <- ~Lon + Lat
xbuff <- gBuffer(x, width=1000, byid=TRUE)
over(xbuff, x[1:5,], T)
# $`1`
# [1] 1 2 3 5
#
# $`2`
# [1] 1 2 3 5
#
# $`3`
# [1] 1 2 3 5
#
# $`4`
# [1] 4
#
# $`5`
# [1] 1 2 3 5
#
# $`6`
# integer(0)
#
# $`7`
# integer(0)
#
# $`8`
# integer(0)
#
# $`9`
# integer(0)
#
# $`10`
# integer(0)
Вам не нужно использовать операции буфера и пересечения для этой проблемы. Вместо этого вы можете вычислить матрицу расстояний.
x <- matrix(c(839171.2, 838852.4, 838945.9, 824506.8, 838851.8, 827834.7, 888196.5, 508308.4, 838750.5, 983995.6, 3861540, 3861143, 3861240, 3865499, 3861160, 3878655, 3929905, 4031569, 3864169, 3993308), ncol=2)
library(raster)
d <- pointDistance(x, lonlat=FALSE)
diag(d) <- NA
r <- apply(d, 1, function(i) which(i < 1000))
r
Это должно быть в вычислительном отношении более эффективным. Однако, если у вас много точек, матрица расстояний может стать очень (слишком) большой. В этом случае вы можете перебирать фрагменты данных.
chunksize <- 5
nr <- nrow(x)
s <- seq(1, nr, chunksize)
r <- vector(length=nr, mode='list')
for (i in 1:length(s)) {
start <- s[i]
end <- min(nr, start + chunksize)
y <- x[start:end, ,drop=FALSE]
d <- pointDistance(y, x, lonlat=FALSE)
## d[cbind(1:nrow(y), start:end)] <- NA
r[start:end] <- apply(d, 1, function(i) which(i < 1000))
}
Это включает в себя координационные центры. Вы можете установить диагональ NA
чтобы избежать этого, но это может привести к ошибкам, если нет точек в пределах диапазона, поэтому я прокомментировал шляпу.