9 votos

¿Identificando polígonos que se intersecan con otra capa usando QGIS?

El uso de QGIS, tengo dos polígonos capas, una vegetación capa y un tratamiento de la capa. Quiero añadir un campo con el atributo de la capa de la vegetación y de la capa para indicar si cualquier parte del polígono ha sido tratado (se superpone con un tratamiento de la capa).

layer example

Para el ejemplo de arriba - quiero una tabla de atributos que termina buscando como

attribute table example

No quiero que se cruzan las dos capas - necesito mantener la plena polígonos en la vegetación de la capa, sólo quiero saber si han sido tratados. Hay demasiados polígonos para hacer esto manualmente.

He mirado a través de las herramientas vectoriales para tratar de identificar a uno que hace esto, esto no fue un éxito. He tratado de encontrar un flujo de trabajo a través de los rásteres en lugar de polígonos, pero no puede averiguar lo que sería necesario para que esto funcione. He buscado por internet pero no ha sido capaz de encontrar nada que responde a esta pregunta, probablemente porque no sé a qué se llama así, no sé qué términos de búsqueda.

La única solución que he encontrado son manuales, pero hay varios cientos de polígonos, así que me gustaría evitar que se enfoque menos que no haya otra opción.

13voto

ARUNBALAN NV Puntos 101

Probado en QGIS 2.18 y QGIS 3.4

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

Supongamos que tenemos tres características en "vegetation" y cuatro en "treatment" en consecuencia, vea la imagen de abajo.

Example

Con la siguiente Consulta, es posible lograr el resultado

SELECT vegetation.*,
(CASE
    WHEN vegetation.id IN
        (SELECT vegetation.id
        FROM vegetation, treatment
        WHERE st_intersection(vegetation.geometry, treatment.geometry) IS NOT NULL)
    THEN '1'
    ELSE '0'
    END) AS Is_Treated
FROM vegetation

La salida Virtual de la Capa mantendrá inicial de los atributos y de las geometrías y de agregar un campo adicional que representan los solapamientos.

Result_1


Además, puede extender la capa de salida como anteriormente se ha sugerido por @spatialthoughts con varias líneas

SELECT vegetation.*,
(CASE
    WHEN vegetation.id IN
    (SELECT vegetation.id
    FROM vegetation, treatment
    WHERE st_intersection(vegetation.geometry, treatment.geometry) IS NOT NULL)
    THEN '1'
    ELSE '0'
    END) AS Is_Treated,
SUM(st_intersection(vegetation.geometry, treatment.geometry) IS NOT NULL) AS Intersections
FROM vegetation, treatment
GROUP BY vegetation.id

Ahora, la salida Virtual de la Capa tendrá un aspecto como el siguiente

Result_2


Referencias:

6voto

Raoul Puntos 1113

Usted puede hacer esto mediante la función de Agregado. Agregar un nuevo campo isTreated en la vegetation de la capa con una expresión como la siguiente

if(aggregate(
 layer:= 'treatment',
 aggregate:='count',
 expression:=fid,
 filter:=intersects($geometry, geometry())
 ) > 0, 1, 0)

La función de agregado devuelve el número de elementos de la treatment de la capa que se intersectan. Como usted está interesado sólo si se cruzan al menos 1 característica, usted puede agregar si la condición para asignar 0 o 1.

Ver mi post sobre las funciones de agregado en QGIS para aprender más https://spatialthoughts.com/2019/04/12/summary-aggregation-qgis/

3voto

mathieu Puntos 53

Una posible mejora del rendimiento para grandes cantidades de funciones y una ligera mejora en la legibilidad:

 SELECT  DISTINCT
        a.*,
        CASE WHEN b.id
          THEN 1
          ELSE 0
        END AS "isTreated"          -- but, better to avoid camelCase as column names
FROM    vegetation AS a
LEFT JOIN
        treatment AS b
  ON    ST_Intersects(a.geometry, b.geometry)
;
 

El LEFT JOIN seleccionará todas las filas en la tabla de la izquierda para la unión, coincidiendo con la condición o no; b.id será NULL si una fila no tiene coincidencia en la tabla de la derecha, y el CASE filtra en consecuencia. El DISTINCT asegura que solo habrá una fila por partido.

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