PostGIS에 대한 최소 두 가지 클러스터링 방법이 있습니다 : k- 평균 ( kmeans-postgresql
확장을 통해 ) 또는 임계 거리 (PostGIS 2.2) 내의 클러스터링
1) k- 의미kmeans-postgresql
설치 : POSIX 호스트 시스템에 PostgreSQL 8.4 이상이 있어야합니다 (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
(참고 : 우분투 10.10에서도 이것을 시도했지만 경로가 없기 때문에 운 pg_config --pgxs
이 없습니다! 이것은 아마도 우분투 패키징 버그 일 것입니다)
사용법 / 예 : 어딘가에 포인트 테이블이 있어야합니다 (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;
window 함수 5
의 두 번째 인수에서 제공 한 I 는 5 개의 클러스터를 생성 kmeans
하는 K 정수입니다. 원하는 정수로 변경할 수 있습니다.
아래는 내가 그린 31 개의 의사 랜덤 포인트와 각 클러스터의 개수를 나타내는 레이블이있는 5 개의 중심입니다. 이것은 위의 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에 포함되어 있으며 모든 구성 요소가 서로 떨어져있는 GeometryCollection의 배열을 반환합니다.
거리 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의 둘러싸는 원 반경을 가지며, 이는 임계 값보다 큽니다. 멤버 지오메트리 사이의 개별 거리가 임계 값보다 작기 때문에 하나의 더 큰 클러스터로 묶습니다.