Intersección de polígonos usando capas virtuales QGIS

10

Estoy tratando de intersectar geometrías de polígonos en QGIS usando una capa virtual:

SELECT
    sbqry.rowid AS gid,
    sbqry.geom
FROM
    (SELECT
        ST_Intersection(land_parcels.geometry, flood_zone.geometry) AS geom
    FROM land_parcels, flood_zone
    WHERE ST_Intersects(land_parcels.geometry, flood_zone.geometry) AND NOT ST_Touches(land_parcels.geometry, flood_zone.geometry))
    AS sbqry;

Desafortunadamente, sbqry.rowid AS giddevuelve NULL en lugar de valores de incremento automático.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

¿Alguien sabe cómo crear una columna de identificador único llamada 'gid'? Hasta donde yo sé, las capas virtuales se basan en SQLite / Spatialite.

eclipsado_por_la_luna
fuente
¿Qué tipo de datos está utilizando para la capa virtual?
DPSEspacial
Las capas de entrada son archivos .shp, el tipo de geometría de salida es 'polígono'.
eclipsed_by_the_moon
¡No sabía que podía ejecutar funciones espaciales (ST_ *) en archivos shape! ¡¡¡Eso es genial!!!
DPSEspacial
¿Has intentado eliminar sbqry de 'SELECT rowid as gid'? Encontré otra publicación con ese ejemplo.
kttii
'rowid AS gid' funciona con instrucciones SELECT simples como crear un búfer pero no con una subconsulta.
eclipsed_by_the_moon

Respuestas:

3

En PostGIS, si solo desea el número de fila, puede hacer esto:

SELECT
    row_number() over () as gid,
    sbqry.geom
FROM
    (SELECT
        ST_Intersection(land_parcels.geometry, flood_zone.geometry) AS geom
    FROM land_parcels, flood_zone
    WHERE ST_Intersects(land_parcels.geometry, flood_zone.geometry) AND NOT ST_Touches(land_parcels.geometry, flood_zone.geometry))
    AS sbqry;
kttii
fuente
'row_number () over ()' parece funcionar en PostGIS pero no en SpatiaLite (capas virtuales QGIS).
eclipsed_by_the_moon
2
SELECT  f.rowid AS gid, f.geom
FROM
(SELECT sbqry.geom
FROM (SELECT ST_Intersection(land_parcels.geometry, flood_zone.geometry) AS geom FROM land_parcels, flood_zone 
WHERE ST_Intersects(land_parcels.geometry, flood_zone.geometry) AND NOT ST_Touches(land_parcels.geometry, flood_zone.geometry)) AS sbqry) as f
Alexandre Neto
fuente
Desafortunadamente, la consulta solo devuelve valores NULL.
eclipsed_by_the_moon