¿Identificando agrupaciones en datos de puntos vectoriales usando QGIS?

34

Tengo un conjunto de datos vectoriales de puntos de datos de banda ancha rural (qué tan rápido, etc.) y me gustaría explorar si hay grupos de puntos con características similares, y trazar polígonos que los abarquen.

Por ejemplo, puedo tener 45,000 puntos en un solo conjunto de datos PostGIS distribuidos en un paisaje. Quiero identificar grupos que se encuentran a menos de x km entre sí y donde la velocidad es inferior a y kbps, y producir cascos convexos para cada grupo calificado.

¿Hay una manera simple de hacer esto en QGIS, por ejemplo?

Adrian
fuente
3
Es posible que desee prestar atención a la naturaleza de la banda ancha. Se producirán altas velocidades dentro de las zonas urbanas; conglomeraciones industriales; radiando a lo largo de las carreteras desde COs, módems y otra infraestructura de fibra / cable / DSL; y transmitido desde ciertas torres celulares (dependiendo de su definición de "banda ancha"). Por lo tanto, las altas velocidades parecerán agruparse y las velocidades más bajas se verán como huecos en los grupos. En particular, es poco probable que los cascos convexos sean incluso descripciones decentes de regiones de baja velocidad. Sería bueno saber cómo piensa interpretar cualquier "grupo" que encuentre.
whuber
Gracias por la ayuda. Estoy estudiando las áreas más rurales, donde la arquitectura de banda ancha cableada puede generar situaciones más inusuales debido a la distribución de gabinetes de calle y líneas directamente alimentadas en postes, así como la geografía de las áreas, por ejemplo. Como resultado, encontrará grupos que pueden ser un punto de partida útil para desarrollar soluciones locales y pueden ser un paso importante en el desarrollo de una estrategia. De hecho, incluso puede encontrarlos en áreas urbanas, a menudo debido al patrimonio industrial o cosas como líneas de ferrocarril y ríos que resultan difíciles de cruzar.
Adrian

Respuestas:

15

Combiné partes de varias sugerencias, agregué algunas y encontré una solución que funciona bien para mí, ¡y todo desde QGis!

Primero ejecuté un PostGis SELECT para encontrar los puntos que tienen los atributos comunes correctos y se encuentran a x km el uno del otro:

SELECCIONE DISTINCT s1.postcode, s1.the_geom, s1.gid DESDE broadband_data AS s1 ÚNETE broadband_data AS s2 EN ST_DWithin (s1.the_geom, s2.the_geom, 1000) DONDE s1.postcode! = S2.postcode Y s1.fastest_broadband <= 2000

(Más o menos directamente del muy buen libro de PostGis en acción de Manning , solo agregando una autounión )

Luego cargué el complemento ManageR de Carson Farmer e importé la capa. Desde aquí seguí el proceso de agrupación de PAM sugerido aquí , y exporté el resultado a un archivo de forma, en el que se calcularon los Cascos convexos en segundos usando fTools (¡Carson se mueve!).

Adrian
fuente
La primera edición de PostGIS en acción ahora está agotada. Aquí hay un enlace a la segunda edición manning.com/books/postgis-in-action-second-edition y un enlace al primer capítulo que es gratis manning-content.s3.amazonaws.com/download/a/… que es genial para comenzar a tomar una foto de PostGIS
Martin Hügi
8

Aunque no es una solución QGIS, personalmente optaría por un análisis exploratorio utilizando SaTScan . Es rápido, está bien documentado y se aplica ampliamente, por lo que no debería tener problemas para iniciar. Sin embargo, 45k puntos pueden requerir algo de RAM.

No estoy seguro de si puede leer directamente desde Postgres, pero importa fácilmente desde archivos dbf y de texto.

El resultado del análisis se puede leer fácilmente en Postgres o QGIS. Puede decidir buscar grupos circulares o elipses (podría ser útil si hay un tipo particular de asentamientos en sus datos, por ejemplo, ciudades / pueblos de forma larga en valles, etc.). Luego puede generar polígonos o elipses o mostrar solo las ubicaciones que son miembros de los clústeres.

Para obtener una vista previa rápida de los resultados en Google Earth, también puede utilizar la herramienta de conversión SaTScan a Google Earth de NAACCR .

Es importante: si decide ejecutar simulaciones de Monte Carlo (99 mínimo, creo), también podrá decir algo sobre la importancia estadística de sus clústeres. La interpretación y la justificación de estos grupos serán otro tema, ya que se ha debatido en las ciencias espaciales durante las últimas dos décadas al menos (creo;).

Podría intentar ejecutar un análisis puramente espacial buscando grupos de valores altos, bajos o altos y bajos. Si tiene algunos atributos temporales en sus datos * (agregaciones diarias, semanales), creo que sería realmente interesante ejecutar algunos modelos de espacio-tiempo.

radek
fuente
2
Se ve bien - Buena respuesta
Mapperz
5

SciPy tiene un paquete de agrupación (para python), puede usarlo en la consola de python, escribir un complemento simple para hacerlo o usar PL / python dentro de postgis.

http://docs.scipy.org/doc/scipy/reference/cluster.html

Después del análisis solo use f-tools para crear los cascos convexos.

Pablo
fuente
Soy un usuario simple con muy poca experiencia en python, pero lo echaré un vistazo. ¡Sé que necesito aprender!
Adrian
¿El agrupamiento SciPy tiene en cuenta las relaciones espaciales entre puntos?
radek
1
Simplemente agrega dos covariables más para la coordenada x e y de su punto.
José
5

Hay un ejemplo similar de lo que quieres hacer usando R y GRASS aquí . Como alternativa, es posible que desee utilizar las herramientas de agrupación de scipy como se sugiere, y luego hacer los cálculos de casco convexo utilizando este método .

Jose
fuente
3

Puedes probar el complemento Ftools. Vector> Geoprocessing Tools> Convex Hulls.

Hay una opción para que Create convex hulls based on input fieldel parámetro del campo de entrada provenga de los atributos de sus puntos de entrada.

Maning
fuente
Gracias por la ayuda. El bit de cascos convexos creará los polígonos, pero no identifica si existen grupos o dónde podrían estar. Realmente me gustaría encontrar primero una forma de asociar puntos con características similares dentro de x km el uno del otro. Supongo que necesitaría ejecutar algún script que identifique de forma exclusiva la existencia de clústeres y actualice un campo adicional en la tabla postgis para los miembros de cada clúster. Por ejemplo, crear una triangulación de Delaunay y filtrar todos los puntos donde los lados de los triángulos son más largos que x km, pero no tengo idea de cómo hacerlo
Adrian