Удаление перекрывающихся многоугольников, слишком много точек - PullRequest
0 голосов
/ 28 мая 2019

У меня много точек данных.На самом деле, слишком много очков.Ни одна из точек не пересекается, но некоторые находятся довольно близко друг к другу.Я хотел бы иметь меньше точек, но не перемещая ни одно из мест.

Я бы хотел получить как можно больше точек, но только точки, которые находятся на расстоянии не менее ~ 5,7 км от любой другой точки.(если есть небольшое перекрытие, все в порядке - допустима ошибка 0,5 км)

Я пытался написать алгоритм на R , чтобы выполнить это, но есть немалонеожиданные результаты.У меня есть некоторые данные, которые составляют около 300 000 точек, покрывающих Землю.У меня есть другие данные, которые составляют несколько миллионов.Когда я выполняю алгоритм, я могу сегментировать данные по странам, что может уменьшить эти числа в диапазоне от 20000 до 100000.Если бы расположение точек не имело значения, я, вероятно, просто создал бы интерполированный растр и назвал бы его хорошим, но для этой проблемы мне нужно сохранить конкретное местоположение нетронутым.

Еще одна вещь, которую я пытался сделать, это сделатьрегулярная сетка 0,028 градусов и запустить NNJoin, чтобы найти ближайшую точку данных.Это сработало немного лучше, чем мой R-код, но результаты немного забавны, как вы можете себе представить.

Еще одна идея, которая у меня была, заключалась в том, чтобы буферизовать точки, подсчитать, сколько точек пересекается со слоем Buffered.Я все еще работаю над этим

Есть ли уже установленный метод для достижения этого результата?Мне удобно работать с PostGIS, QGIS, Python, R, если есть пакет или библиотека, которые могут это сделать.

tl; dr Как уменьшить плотные кластеры точек, но сохранить покрытие с уменьшенным наборомпункты?

1 Ответ

1 голос
/ 28 мая 2019

Вот подход.

Пример данных

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")
...