Saltar al contenido

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

Basta ya de indagar en otros sitios ya que has llegado al espacio necesario, poseemos la respuesta que buscas y sin complicarte.

Solución:

Existe la posibilidad de utilizar un “Capa virtual” mediante Layer > Add Layer > Add/Edit Virtual Layer...

Supongamos que tenemos tres características en 'vegetation' y cuatro en 'treatment' en consecuencia, vea la imagen a continuación.

Ejemplo

Con la siguiente Query, es posible para agregar un campo a la attribute capa de la capa de vegetación para indicar si alguna parte del polígono ha sido tratada (se superpone con una capa de tratamiento).

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 capa virtual de salida mantendrá la inicial attributes y geometrías y agregue un campo adicional que represente las superposiciones.

Resultado_1


Además, puede extender su capa de salida como sugirió anteriormente @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 capa virtual de salida se verá de la siguiente manera

resultado_2


Referencias:

  • Capítulo 8. Referencia de PostGIS | 8.5. Accesorios de geometría
  • Contando attributes de intersecciones de línea con polígonos en QGIS?
  • ¿Comprender los atributos de unión por ubicación en QGIS?

Puede hacer esto usando la función Agregado. Agregar un nuevo campo "isTreated" en el 'vegetation' capa con una expresión como la siguiente:

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

La función agregada devuelve el número de características de la 'treatment' capa que se cruzan. Como solo le interesa si intersecan al menos 1 característica, puede agregar la condición si para asignar 0 o 1.

Vea mi publicación sobre funciones agregadas en QGIS para obtener más información https://spatialthoughts.com/2019/04/12/summary-aggregation-qgis/

Una posible mejora de rendimiento para una gran cantidad 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)
;

los LEFT JOIN seleccionará todos filas en la tabla de la izquierda para la combinación, coincidiendo o no con la condición; b.id estarán NULL si una fila no tiene coincidencia en la tabla de la derecha, y el CASE filtros en consecuencia. los DISTINCT se asegura de que solo haya una fila por coincidencia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *