¿Cómo encontrar el polígono dentro del cual se encuentra un punto?

8

Tengo una capa con características poligonales. Cada característica tiene atributos y valores. También tengo una lista de coordenadas y me gustaría saber en qué característica (o polígono) se encuentran las coordenadas.

¿Podría alguien guiarme sobre cómo hacer esto? ¿Hay alguna función en la API que pueda ayudarme a lograr mi objetivo o debería usar algún algoritmo de geometría computacional para hacerlo yo mismo? Sé cómo hacer esto último, pero me ahorraría algo de tiempo si ya hubiera una función integrada.

Gracias.

Shubham Goyal
fuente

Respuestas:

6

Pocas características

Lo que probablemente quieras hacer es:

  1. Crea una lista de QgsPoint a partir de tus coordenadas
  2. Iterar sobre todas las características de su capa (polígonos)
  3. Recorrer la lista de puntos (dentro de la iteración)
  4. Llame a feature.geometry (). Contiene (punto) para verificar si tiene una coincidencia

Por supuesto, ahora puede mejorar el rendimiento si sabe, por ejemplo, que un punto solo puede estar contenido por un polígono, puede eliminar un punto de la lista, una vez que se ha encontrado el polígono apropiado.

Muchas características (Uso de SpatialIndex)

Como se señaló en los comentarios, se puede utilizar un índice espacial para acelerar significativamente el proceso.

Los pasos aquí serían

  1. Crea una lista de QgsPoint a partir de tus coordenadas
  2. Crear un QgsSpatialIndex
  3. Iterar sobre todas las características de su capa (polígonos)
  4. Agregue las características a su índice con insertFeature
  5. Iterar sobre todos tus puntos
  6. Llame index.intersects (QgsRectangle (punto, punto)) para verificar si tiene una coincidencia

También hay un ejemplo de código de NathanW

Matthias Kuhn
fuente
Ah, no sabía acerca de la llamada a feature.geometry.contains (point). Usé mathplotlib. pastebin.com/61LSeMWv Por favor, perdona el desorden de mi código. Tengo prisa y lo limpiaré más tarde.
Shubham Goyal
No he implementado su solución y, por lo tanto, no puedo decir con certeza si funciona o no. Pero sí creo que debería, así que estoy marcando esto como la respuesta correcta :)
Shubham Goyal
2
¿Podría esto ser acelerado usando un QgsSpatialIndex?
Snorfalorpagus
1
Recomiendo encarecidamente utilizar un QgsSpatailIndex. Hay un ejemplo en nathanw.net/2013/01/04/…
Nathan W
6

En primer lugar, debe importar la lista de coordenadas en su proyecto. Este tutorial explica bien cómo hacerlo: http://qgis.spatialthoughts.com/2012/01/importing-spreadsheets-or-csv-files-to.html

Cuando tenga ambas capas (polígonos y puntos) en su proyecto, vaya a vector> herramientas de gestión de datos> unir atributos por ubicación

ingrese la descripción de la imagen aquí

Obtiene una ventana donde puede definir qué capas desea combinar:

ingrese la descripción de la imagen aquí

  • Establezca su capa de puntos como la 'capa de vector de destino'.
  • Establezca su capa de polígono como 'unir capa de vector'.
  • Defina su archivo de forma de salida (se creará uno nuevo. Por lo tanto, si se perdió, los datos originales se conservan).
  • Puede optar por mantener todos los datos en el nuevo archivo de forma, incluso si no hay coincidencia con un polígono: marque 'mantener todos los registros (incluidos los registros de destino no coincidentes)'

Haga clic en Aceptar'. Se crea el nuevo archivo de forma y se le preguntará "¿Desea agregar la nueva capa al TOC?" Haga clic nuevamente en Aceptar.

Abra el atributo del nuevo archivo de forma agregado y verá que todas las características del polígono correspondiente se agregan al punto que se encuentra en ese polígono.

PieterB
fuente
2

Una forma más simple de hacer esto usando PyQGIS. Supuse que puedes construir un QgsRectangleobjeto con un solo punto y usarlo QgsFeatureRequestpara filtrar entidades desde la capa que lo intersecta.

point = QgsPoint(10, 10)
# Construct a QgsRectange with the same point
rect = QgsRectangle(point, point)
req = QgsFeatureRequest()
req.setFilterRect(rect)
# You get the feature that intersects the point
f = layer.getFeatures(req).next()
pensamientos espaciales
fuente
0

En QuantumGIS puede agregar la lista de coordenadas con la función 'agregar capa de texto delimitado' (si es un archivo csv). Agregue también los polígonos. Luego puede hacer una 'intersección' o 'puntos en el polígono'.

Stefan
fuente