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.


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;

'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

Malheureusement, la requête renvoie uniquement des valeurs NULL.
eclipsed_by_the_moon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.