Я ищу алгоритм пространственной кластеризации для использования его в базе данных с поддержкой PostGIS для точечных объектов. Я собираюсь написать функцию plpgsql, которая принимает расстояние между точками в пределах одного кластера в качестве входных данных. На выходе функция возвращает массив кластеров. Наиболее очевидным решением является создание буферных зон на указанном расстоянии вокруг объекта и поиск объектов в этом буфере. Если такие функции существуют, продолжайте создавать буфер вокруг них и т. Д. Если такие функции не существуют, это означает, что создание кластера завершено. Может быть есть какие-нибудь умные решения?
postgis
clustering
drnextgis
источник
источник
Ответы:
Существует как минимум два хороших метода кластеризации для PostGIS: k-средства (через
kmeans-postgresql
расширение) или кластеризация геометрии в пределах порогового расстояния (PostGIS 2.2)1) k -значит с
kmeans-postgresql
Установка: Вам нужно иметь PostgreSQL 8.4 или выше на хост-системе POSIX (я не знаю, с чего начать для MS Windows). Если вы установили это из пакетов, убедитесь, что у вас также есть пакеты разработки (например,
postgresql-devel
для CentOS). Скачать и извлечь:Перед сборкой необходимо установить
USE_PGXS
переменную окружения (мой предыдущий пост проинструктировал удалить эту частьMakefile
, что было не лучшим вариантом). Одна из этих двух команд должна работать для вашей оболочки Unix:Теперь соберите и установите расширение:
(Примечание: я тоже пробовал это с Ubuntu 10.10, но не повезло, так как путь к нему
pg_config --pgxs
не существует! Это, вероятно, ошибка упаковки Ubuntu)Использование / Пример: у вас должна быть где-то таблица точек (я нарисовал кучу псевдослучайных точек в QGIS). Вот пример того, что я сделал:
5
я обеспечил во втором аргументеkmeans
функции окна является К целому числу , чтобы произвести пять кластеров. Вы можете изменить это на любое целое число, которое вы хотите.Ниже приведены 31 псевдослучайная точка, которую я нарисовал, и пять центроидов с меткой, показывающей счет в каждом кластере. Это было создано с использованием вышеуказанного SQL-запроса.
Вы также можете попытаться проиллюстрировать, где находятся эти кластеры, с помощью ST_MinimumBoundingCircle :
2) Кластеризация в пределах порогового расстояния с
ST_ClusterWithin
Эта агрегатная функция включена в PostGIS 2.2 и возвращает массив GeometryCollections, где все компоненты находятся на расстоянии друг от друга.
Вот пример использования, где расстояние 100,0 является порогом, который приводит к 5 различным кластерам:
Самый большой средний кластер имеет радиус окружающего круга 65,3 единиц или около 130, что больше, чем пороговое значение. Это связано с тем, что отдельные расстояния между геометриями элементов меньше порога, поэтому он связывает их вместе как один более крупный кластер.
источник
Я написал функцию, которая вычисляет кластеры объектов на основе расстояния между ними и строит выпуклую оболочку над этими объектами:
Пример использования этой функции:
'poi' - имя слоя, 'wkb_geometry' - имя столбца геометрии, 'ogc_fid' - первичный ключ таблицы, 14000 - расстояние кластера.
Результат использования этой функции:
источник
geometry
столбец в вашей таблице, чтобы не хранить lonlat отдельно и создать столбец с уникальными значениями (идентификаторами).На сегодняшний день наиболее многообещающим я считаю это расширение для кластеризации K-средних в качестве оконной функции: http://pgxn.org/dist/kmeans/
Однако я еще не смог установить его успешно.
В противном случае для базовой кластеризации сетки вы можете использовать SnapToGrid .
источник
Дополняю ответ @MikeT ...
Для MS Windows:
Требования:
Что ты сделаешь:
cl.exe
компилятора, чтобы сгенерировать DLL сkmeans
функцией.шаги:
Откройте
kmeans.c
в любом редакторе:После
#include
строк определите макрос DLLEXPORT с помощью:Поставьте
DLLEXPORT
перед каждой из этих строк:Откройте командную строку Visual C ++.
В командной строке:
kmeans-postgresql
.SET POSTGRESPATH=C:\Program Files\PostgreSQL\9.5
Бегать
Скопируйте
kmeans.dll
в%POSTGRESPATH%\lib
Теперь запустите команду SQL в вашей базе данных, чтобы «СОЗДАТЬ» функцию.
источник
Вот способ отображения в QGIS результата запроса PostGIS, данного в 2) в этом ответе
Поскольку QGIS не обрабатывает ни геометрические коллекции, ни разные типы данных в одном и том же геометрическом столбце, я создал два слоя, один для кластеров и один для кластеризованных точек.
Во-первых, для кластеров вам нужны только полигоны, остальные результаты - одинокие точки:
Затем для кластеризованных точек необходимо преобразовать геометрические коллекции в многоточечные:
Некоторые точки имеют одинаковые координаты, поэтому метка может сбить с толку.
источник
Вы можете более легко использовать решение Kmeans с помощью метода ST_ClusterKMeans, который доступен в postgis из 2.3. Пример:
Ограничительная рамка объектов используется в качестве геометрии кластера в примере выше. Первое изображение показывает исходную геометрию, а второе - результат выбора выше.
источник
Решение для кластеризации снизу вверх Получите один кластер из облака точек с максимальным диаметром в postgis, который не требует динамических запросов.
и тип с идентификатором кластера
Следующая функция алгоритма
Использование:
источник