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-postgresqlextensión) o geometrías de agrupación dentro de una distancia umbral (PostGIS 2.2)1) k- significa con
kmeans-postgresqlInstalació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-develpara CentOS). Descargar y extraer:Antes de compilar, debe establecer la
USE_PGXSvariable 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 --pgxsno 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
5que proporcioné en el segundo argumento de lakmeansfunció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_ClusterWithinEsta 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
geometrycolumna 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.execompilador para generar una DLL conkmeansfunción.Pasos:
Abra el
kmeans.cen cualquier editor:Después de las
#includelíneas, defina la macro DLLEXPORT con:Poner
DLLEXPORTantes 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.5correr
Copie el
kmeans.dlla%POSTGRESPATH%\libAhora 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