我有很多数据要点。其实太多了。没有一点是重叠的,但有些彼此很接近。我想减少点数,但不移动任何位置。
我将最终得到尽可能多的点,但只有与其他任何点至少相距约5.7公里的点。 (如果有一点重叠,就可以了-误差为0.5公里是可以接受的)
我尝试write an algorithm in R完成此操作,但是有很多出乎意料的结果。我有一些覆盖地球的大约300,000点数据。我还有其他几百万个数据。执行算法时,我可以按国家/地区细分数据,从而将这些数字减少到20,000到100,000之间。如果这些点的位置无关紧要,那么我可能只是制作一个插值栅格并将其命名为好,但是对于这个问题,我需要保持特定位置不变。
我尝试的另一件事是制作一个0.028度的规则网格并运行NNJoin以查找最近的数据点。这比我的R代码要好一些,但是结果可能有点像您想象的那样有趣。
我的另一个想法是对点进行缓冲,即计数与缓冲层相交的点数。我仍在研究这个
是否已经建立了用于得出此结果的方法?如果有可以执行此操作的软件包或库,我很愿意与PostGIS,QGIS,Python,R一起使用。
tl; dr我如何减少密集的点簇,但保持减少的点集覆盖范围?
答案 0 :(得分:1)
这是一种方法。
示例数据
x <- runif(10000, -180, 180)
y <- runif(10000, -90, 90)
pts <- cbind(x, y)
解决方案
library(raster)
# you will want a lower resolution than this
r <- raster(nrow=18, ncol=36, vals=1)
# get cell numbers
cells <- cellFromXY(r, pts)
# pick one point per cell
sel <- aggregate(pts, list(cells), function(i)i[1]) # or sample
让我们看看
plot(r)
points(pts, cex=.1)
points(sel[,2:3], pch=20, col="red")
请注意,此选项使用lon / lat,因此跨纬度的距离不同。不确定是否重要;但是如果可以的话,就可以转型。
稍后:
有多种方法可以通过更改范围或创建RasterLayer来创建偏移的变体。有关更多信息,请参见栅格和范围。您也可以使用shift
#add a row and a column
r1 <- raster(nrow=19, ncol=37, xmx=190, ymn=-100)
r2 <- shift(r1, -.5*xres(r1), -.5*yres(r1))
plot(as(r1, "SpatialPolygons"))
lines(as(r2, "SpatialPolygons"), col="red")