Існують щонайменше два хороших методу кластеризації для PostGIS: k -значення (через kmeans-postgresql
розширення) або кластеризація геометрії в межах порогової відстані (PostGIS 2.2)
1) k -значить сkmeans-postgresql
Встановлення: Вам потрібно мати PostgreSQL 8.4 або новішої версії в хост-системі POSIX (я не знаю, з чого почати для MS Windows). Якщо ви встановили це з пакетів, переконайтеся, що у вас є також пакети розробки (наприклад, postgresql-devel
для CentOS). Завантажте та витягніть:
wget http://api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip
unzip kmeans-1.1.0.zip
cd kmeans-1.1.0/
Перш ніж будувати, вам потрібно встановити USE_PGXS
змінну середовища (мій попередній пост доручив видалити цю частину Makefile
, що було не найкращим варіантом). Одна з цих двох команд повинна працювати для вашої оболонки Unix:
# bash
export USE_PGXS=1
# csh
setenv USE_PGXS 1
Тепер складіть та встановіть розширення:
make
make install
psql -f /usr/share/pgsql/contrib/kmeans.sql -U postgres -D postgis
(Примітка. Я також спробував це з Ubuntu 10.10, але не пощастило, оскільки шлях до pg_config --pgxs
не існує! Це, мабуть, помилка упаковки Ubuntu)
Використання / Приклад: У вас повинна бути десь таблиця точок (я намалював купу псевдо випадкових точок у QGIS). Ось приклад того, що я зробив:
SELECT kmeans, count(*), ST_Centroid(ST_Collect(geom)) AS geom
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
5
я забезпечив у другому аргументі kmeans
функції вікна є До цілому числу , щоб зробити п'ять кластерів. Ви можете змінити це на будь-яке ціле число, яке ви хочете.
Нижче представлено 31 псевдо випадкову точку, яку я намалював, і п’ять центроїдів з міткою, що показує кількість у кожному кластері. Це було створено за допомогою вищезазначеного запиту SQL.
Ви також можете спробувати проілюструвати, де ці кластери знаходяться з ST_MinimumBoundingCircle :
SELECT kmeans, ST_MinimumBoundingCircle(ST_Collect(geom)) AS circle
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
2) Скупчення в межах порогової відстані с ST_ClusterWithin
Ця агрегатна функція входить до PostGIS 2.2 і повертає масив GeometryCollections, де всі компоненти знаходяться на відстані один від одного.
Ось приклад використання, де відстань 100,0 - це поріг, що призводить до 5 різних кластерів:
SELECT row_number() over () AS id,
ST_NumGeometries(gc),
gc AS geom_collection,
ST_Centroid(gc) AS centroid,
ST_MinimumBoundingCircle(gc) AS circle,
sqrt(ST_Area(ST_MinimumBoundingCircle(gc)) / pi()) AS radius
FROM (
SELECT unnest(ST_ClusterWithin(geom, 100)) gc
FROM rand_point
) f;
Найбільший середній скупчення має радіус оточуючого кола 65,3 одиниці або приблизно 130, що більше порога. Це відбувається тому, що окремі відстані між геометріями членів менші за поріг, тому вони пов'язують його разом як один більший кластер.