【问题标题】:Removing overlapping polygons, too many points删除重叠的多边形,太多的点
【发布时间】:2019-10-13 15:13:50
【问题描述】:

我有很多数据点。其实点太多了。没有一个点是重叠的,但有些点彼此非常接近。我希望获得更少的积分,但不移动任何位置。

我希望得到尽可能多的点,但只有与任何其他点至少相距约 5.7 公里的点。 (如果有一点重叠也没关系——0.5km的误差是可以接受的)

我尝试write an algorithm in R 来完成此操作,但有很多意想不到的结果。我有一些覆盖地球的大约 300,000 个点的数据。我还有其他几百万的数据。当我执行算法时,我可以按国家/地区对数据进行分段,这可以将这些数字减少到 20,000 到 100,000 范围内。如果点的位置无关紧要,那么我可能只是制作一个插值栅格并将其称为好,但对于这个问题,我需要保持特定位置不变。

我尝试的另一件事是制作一个 0.028 度的规则网格并运行 NNJoin 以查找最近的数据点。这比我的 R 代码工作得更好,但结果有点有趣,你可以想象。

我的另一个想法是缓冲点,计算有多少点与缓冲层相交。我还在研究这个

是否有已经建立的方法来得出这个结果?如果有可以做到这一点的包或库,我很乐意使用 PostGIS、QGIS、Python、R。

tl;dr 我如何减少密集的点簇,但使用减少的点集保持覆盖范围?

【问题讨论】:

  • lidR 包具有一些降低点密度的功能,例如homogenize(),它将保持覆盖范围并暗示点的距离,但您无法准确设置距离。
  • 有趣...我如何在没有 Z 坐标的情况下使用这个库?

标签: python r postgis qgis


【解决方案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 时创建偏移变化。有关更多信息,请参见 ?raster 和 ?extent。你也可以使用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")

【讨论】:

  • 啊是的,这非常快。有没有办法偏移或移动光栅的边缘?我想我会用各种偏移或分辨率多次运行它以使其完美
  • 一些点在单元格边缘附近聚集。如果有一种方法可以将单元格边界向右移动一半分辨率并向下移动一半分辨率,那么这可能是完美的
猜你喜欢
  • 2021-09-30
  • 2015-01-16
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2022-09-27
  • 2020-06-19
  • 2012-04-22
相关资源
最近更新 更多