Перечислите все 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 чтобы избежать этого, но это может привести к ошибкам, если нет точек в пределах диапазона, поэтому я прокомментировал шляпу.

Другие вопросы по тегам