Przecięcie wielokąta za pomocą wirtualnych warstw QGIS

10

Próbuję przecinać geometrie wielokątów w QGIS przy użyciu warstwy wirtualnej:

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;

Niestety sbqry.rowid AS gidzwraca wartość NULL zamiast wartości auto-inkrementujących.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Czy ktoś wie, jak utworzyć unikalną kolumnę identyfikacyjną o nazwie „gid”? O ile wiem, wirtualne warstwy są oparte na SQLite / Spatialite.

eclipsed_by_the_moon
źródło
Jakiego typu danych używasz dla warstwy wirtualnej?
DPSSpatial
Warstwy wejściowe to pliki .shp, a geometrią wyjściową jest „wielokąt”.
eclipsed_by_the_moon
Nie wiedziałem, że możesz uruchamiać funkcje przestrzenne (ST_ *) na plikach kształtów! To wspaniale!!!
DPSSpatial
próbowałeś usunąć sbqry z 'SELECT rowid as gid' ... Znalazłem inny post z takim przykładem.
kttii
„rowid AS gid” działa z prostymi instrukcjami SELECT, takimi jak tworzenie bufora, ale nie z podzapytaniem.
eclipsed_by_the_moon

Odpowiedzi:

3

W PostGIS, jeśli chcesz tylko numer wiersza, możesz to zrobić:

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
źródło
Wydaje się, że „row_number () over ()” działa w PostGIS, ale nie w SpatiaLite (wirtualne warstwy 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
źródło
Niestety zapytanie zwraca tylko wartości NULL.
eclipsed_by_the_moon