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.
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.
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
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.