Estoy buscando un algoritmo de agrupación espacial para usarlo dentro de la base de datos habilitada para PostGIS para características de puntos. Voy a escribir la función plpgsql que toma la distancia entre puntos dentro del mismo clúster como entrada. En la función de salida, devuelve una matriz de clústeres. La solución más obvia es construir zonas de búfer a una distancia especificada alrededor de la característica y buscar características en este búfer. Si tales características existen, entonces continúe construyendo un buffer alrededor de ellas, etc. Si tales características no existen, eso significa que la construcción del clúster se ha completado. Tal vez hay algunas soluciones inteligentes?
postgis
clustering
drnextgis
fuente
fuente
Respuestas:
Existen al menos dos buenos métodos de agrupación para PostGIS: k- medias (a través de la
kmeans-postgresql
extensión) o geometrías de agrupación dentro de una distancia umbral (PostGIS 2.2)1) k- significa con
kmeans-postgresql
Instalación: debe tener PostgreSQL 8.4 o superior en un sistema host POSIX (no sabría dónde comenzar para MS Windows). Si tiene esto instalado desde paquetes, asegúrese de tener también los paquetes de desarrollo (por ejemplo,
postgresql-devel
para CentOS). Descargar y extraer:Antes de compilar, debe establecer la
USE_PGXS
variable de entorno (mi publicación anterior me indicó que eliminara esta parte deMakefile
, que no era la mejor de las opciones). Uno de estos dos comandos debería funcionar para su shell de Unix:Ahora compila e instala la extensión:
(Nota: ¡también probé esto con Ubuntu 10.10, pero no tuve suerte, ya que la ruta
pg_config --pgxs
no existe! Probablemente sea un error de empaquetado de Ubuntu)Uso / Ejemplo: debe tener una tabla de puntos en alguna parte (dibujé un montón de puntos pseudoaleatorios en QGIS). Aquí hay un ejemplo con lo que hice:
El
5
que proporcioné en el segundo argumento de lakmeans
función de ventana es el entero K para producir cinco grupos. Puede cambiar esto a cualquier número entero que desee.A continuación se muestran los 31 puntos seudoaleatorios que dibujé y los cinco centroides con la etiqueta que muestra el conteo en cada grupo. Esto fue creado usando la consulta SQL anterior.
También puede intentar ilustrar dónde están estos grupos con ST_MinimumBoundingCircle :
2) Agrupación dentro de una distancia umbral con
ST_ClusterWithin
Esta función agregada se incluye con PostGIS 2.2 y devuelve una matriz de GeometryCollections donde todos los componentes están a una distancia entre sí.
Aquí hay un ejemplo de uso, donde una distancia de 100.0 es el umbral que da como resultado 5 grupos diferentes:
El grupo central más grande tiene un radio de círculo envolvente de 65.3 unidades o aproximadamente 130, que es más grande que el umbral. Esto se debe a que las distancias individuales entre las geometrías de los miembros son menores que el umbral, por lo que lo une como un grupo más grande.
fuente
He escrito una función que calcula grupos de características basadas en la distancia entre ellas y construye un casco convexo sobre estas características:
Ejemplo de uso de esta función:
'poi' - nombre de la capa, 'wkb_geometry' - nombre de la columna de geometría, 'ogc_fid' - clave primaria de la tabla, 14000 - distancia del clúster.
El resultado de usar esta función:
fuente
geometry
columna dentro de su tabla, no almacenar lonlat por separado y hacer una columna con valores únicos (ID).Hasta ahora, lo más prometedor que encontré es esta extensión para la agrupación de K-means como una función de ventana: http://pgxn.org/dist/kmeans/
Sin embargo, aún no he podido instalarlo con éxito.
De lo contrario, para la agrupación en cuadrícula básica, puede usar SnapToGrid .
fuente
Complementando la respuesta @MikeT ...
Para MS Windows:
Requisitos:
Qué harás:
cl.exe
compilador para generar una DLL conkmeans
función.Pasos:
Abra el
kmeans.c
en cualquier editor:Después de las
#include
líneas, defina la macro DLLEXPORT con:Poner
DLLEXPORT
antes de cada una de estas líneas:Abra la línea de comandos de Visual C ++.
En la linea de comando:
kmeans-postgresql
.SET POSTGRESPATH=C:\Program Files\PostgreSQL\9.5
correr
Copie el
kmeans.dll
a%POSTGRESPATH%\lib
Ahora ejecute el comando SQL en su base de datos para "CREAR" la función.
fuente
Aquí hay una manera de mostrar en QGIS el resultado de la consulta PostGIS dada en 2) en esta respuesta
Como QGIS no maneja ni colecciones de geometría ni diferentes tipos de datos en la misma columna de geometría, he creado dos capas, una para grupos y otra para puntos agrupados.
Primero para los clústeres, solo necesita polígonos, otros resultados son puntos solitarios:
Luego, para los puntos agrupados, debe transformar las colecciones de geometría en multipunto:
Algunos puntos están en las mismas coordenadas, por lo que la etiqueta puede ser confusa.
fuente
Puede usar la solución Kmeans más fácilmente con el método ST_ClusterKMeans que está disponible en postgis desde 2.3 Ejemplo:
El cuadro delimitador de características se utiliza como geometría de clúster en el ejemplo anterior. La primera imagen muestra las geometrías originales y la segunda es el resultado de seleccionar arriba.
fuente
Solución de agrupamiento ascendente de Get a single cluster desde la nube de puntos con un diámetro máximo en postgis que no implica consultas dinámicas.
y un tipo con ID de clúster
Luego la función del algoritmo
Uso:
fuente