4 votos

Intersección de varias capas a la vez QGIS

Soy muy nuevo en QGIS y estoy aprendiendo la función intersect. Tengo unos 10 polígonos que se solapan (no perfectamente) y una capa de unos 15 puntos. Quiero saber con cual de los polígonos interseca cada punto. El objetivo es llegar a tener datos que se parecen a:

enter image description here

TRUE/FALSE no es necesario. Cualquier manera de indicar si el punto se cruza con el polígono o no lo hace será suficiente.

5voto

ARUNBALAN NV Puntos 101

Las consultas harán el trabajo, pero probablemente puedan optimizarse, por ejemplo, procediendo con un bucle . Actualmente trabajando en esas mejoras


Probado en QGIS 2.18 y QGIS 3.4

Puedo sugerir el uso de un "Virtual Layer" a través de Layer > Add Layer > Add/Edit Virtual Layer...


Opción 1. Para características en diferentes capas

Supongamos que tenemos las siguientes capas "some_points" y dos capas de polígonos, "Layer_1" (dos funciones) y "Layer_2" (tres características) en consecuencia, véase la imagen siguiente.

input_1

Con la siguiente consulta, es posible crear una variable que sea TRUE o FALSE .

SELECT poi.*,
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "Layer_1" AS l1
         WHERE st_intersects(poi.geometry, l1.geometry)
         AND l1.id = 1)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Layer1_1,
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "Layer_1" AS l1
         WHERE st_intersects(poi.geometry, l1.geometry)
         AND l1.id = 2)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Layer1_2,
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "Layer_2" AS l2
         WHERE st_intersects(poi.geometry, l2.geometry)
         AND l2.id = 1)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Layer2_1,   
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "Layer_2" AS l2
         WHERE st_intersects(poi.geometry, l2.geometry)
         AND l2.id = 2)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Layer2_2,
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "Layer_2" AS l2
         WHERE st_intersects(poi.geometry, l2.geometry)
         AND l2.id = 3)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Layer2_3    
FROM "some_points" AS poi

La Capa Virtual de salida con su tabla de Atributos tendrá el siguiente aspecto.

output_1


Opción 2. Para los elementos de una capa

Supongamos que tenemos las siguientes capas "some_points" y "some_polygons" Ver imagen más abajo.

input_2

Con la siguiente consulta, es posible crear una variable que sea TRUE o FALSE .

SELECT poi.*,
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "some_polygons" AS pol
         WHERE st_intersects(poi.geometry, pol.geometry)
         AND pol.id = 1)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Polygon1,
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "some_polygons" AS pol
         WHERE st_intersects(poi.geometry, pol.geometry)
         AND pol.id = 2)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Polygon2,
(CASE
    WHEN poi.id IN
        (SELECT poi.id
         FROM "some_points" AS poi, "some_polygons" AS pol
         WHERE st_intersects(poi.geometry, pol.geometry)
         AND pol.id = 3)
    THEN 'TRUE'
    ELSE 'FALSE'
    END) AS Polygon3    
FROM "some_points" AS poi

La Capa Virtual de salida con su tabla de Atributos tendrá el siguiente aspecto.

output_2

4voto

nuecaster Puntos 128

Puede hacerlo con la función join attributes by location (summary) herramienta.

Si sus polígonos se encuentran en varias capas, fusiónelos en una sola antes de continuar. Utilice la función merge vector layers o seleccione, copie y pegue los polígonos en una sola capa.

Supongo que su capa de polígonos tiene un campo de tabla de atributos (por ejemplo, "nombre") que contiene los nombres de los polígonos (por ejemplo, polígono1, polígono2, etc). Si no tiene esta columna, puede crearla con la calculadora de campos utilizando esta expresión: 'polygon' || @row_number . O puede utilizar @row_number = 1 en el paso 1 en lugar de la expresión "name" = 'polygon1' .

  1. Utilice la calculadora de campos para añadir un nuevo numérico con el nombre de cada polígono.

    • El primer polígono tendrá el número 1 en la columna "polígono1", y 0 en las columnas llamadas "polígono2", "polígono3", etc. Utilice esta expresión: "name" = 'polygon1'

    enter image description here

    • Para la segunda columna, "polígono2", utilice esta expresión: "name" = 'polygon2'
    • Continúe de la misma manera hasta que tenga una nueva columna para cada polígono.

    enter image description here

  2. Utilice la Join Attributes by Location (Summary) que encontrará en la Caja de herramientas de procesamiento.

    • capa de entrada: Puntos
    • capa de unión: Polígonos
    • predicado geométrico: intersecta
    • campos a resumir: seleccione todos los campos creados en el paso 1
    • resúmenes a calcular: seleccione Sum

    enter image description here

    enter image description here

La salida es una capa de puntos, con una tabla de atributos que tiene este aspecto:

enter image description here

Cada punto tiene un 1 en la columna que representa cada polígono que interseca. Casi todos los puntos tienen un 0 en las columnas de los polígonos que no intersecan.

Los puntos que no intersecan ningún polígono tienen en todas las columnas. Si necesitas que todos los campos no intersecantes tengan 0 (actualmente algunos son nulos), actualiza cada campo con la calculadora de campos.

  • Por ejemplo, para el campo "polígono1" utilice esta expresión: if("polygon1" is null, 0, "polygon1") (Esta expresión significa: Si el valor actual del campo "polígono1" es nulo, sustitúyalo por 0. En caso contrario, mantenga el valor actual).

Si desea que los 0's y los nulos se muestren como FALSE, y los 1's como TRUE, puede configurar widgets de edición de campos de Mapa de Valores en las propiedades de la capa.

enter image description here enter image description here

3voto

Gadget Puntos 81

Yo iría con un Combinación QGIS/LibreOffice (HT Kazuhito):

En QGIS

Utilice la herramienta de intersección para crear una nueva capa, con características repetidas.

Cada vez que una característica (puntual) del Input layer está contenida en una característica (polígono) del Overlay layer se crea un nuevo elemento (punto) en el archivo Output layer .

Los elementos (puntos) que no estén incluidos en ningún elemento (polígono) no se crearán en el archivo Output layer .

Cuidado: esto puede crear un lote de características.

enter image description here

En LibreOffice / Excel

  • Importar/pegar la tabla asociada al Output layer
  • Crear un pivote con un Layout como el de la siguiente captura de pantalla:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X