Intersection de polygones à l'aide de couches virtuelles QGIS

10

J'essaie d'intersecter des géométries de polygones dans QGIS en utilisant une couche virtuelle:

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;

Malheureusement, sbqry.rowid AS gidretourne NULL au lieu de valeurs auto-incrémentées.

entrez la description de l'image ici entrez la description de l'image ici

Quelqu'un sait-il comment créer une colonne d'identifiant unique nommée 'gid'? Autant que je sache, les couches virtuelles sont basées sur SQLite / Spatialite.

eclipsed_by_the_moon
la source
Quel type de données utilisez-vous pour la couche virtuelle?
DPSSpatial
Les couches en entrée sont des fichiers .shp, le type de géométrie en sortie est «polygone».
eclipsed_by_the_moon
Je ne savais pas que vous pouviez exécuter des fonctions spatiales (ST_ *) sur des fichiers de formes! C'est génial!!!
DPSSpatial
avez-vous essayé de supprimer sbqry de 'SELECT rowid as gid' ... J'ai trouvé un autre post avec un tel exemple.
kttii
'rowid AS gid' fonctionne avec des instructions SELECT simples comme la création d'un tampon mais pas avec une sous-requête.
eclipsed_by_the_moon

Réponses:

3

Dans PostGIS, si vous voulez simplement le numéro de ligne, vous pouvez le faire:

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
la source
'row_number () over ()' semble fonctionner dans PostGIS mais pas dans SpatiaLite (couches virtuelles 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
la source
Malheureusement, la requête renvoie uniquement des valeurs NULL.
eclipsed_by_the_moon