Пересечение полигонов с использованием виртуальных слоев QGIS

10

Я пытаюсь пересечь геометрию многоугольника в QGIS, используя виртуальный слой:

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;

К сожалению, sbqry.rowid AS gidвозвращает NULL вместо автоматически увеличивающихся значений.

введите описание изображения здесь введите описание изображения здесь

Кто-нибудь знает, как создать столбец уникального идентификатора с именем «GID»? Насколько я знаю, виртуальные слои основаны на SQLite / Spatialite.

eclipsed_by_the_moon
источник
Какой тип данных вы используете для виртуального слоя?
DPSSpatial
Входные слои - это файлы .shp, тип выходной геометрии - «многоугольник».
eclipsed_by_the_moon
Я не знал, что вы можете запускать пространственные функции (ST_ *) для шейп-файлов! Замечательно!!!
DPSSpatial
Вы пытались удалить sbqry из «SELECT rowid as gid» ... Я нашел другой пост с таким примером.
kttii
rowid AS gid работает с простыми инструкциями SELECT, такими как создание буфера, но не с подзапросом.
eclipsed_by_the_moon

Ответы:

3

В PostGIS, если вы просто хотите номер строки, вы можете сделать это:

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
источник
row_number () over (), похоже, работает в PostGIS, но не в SpatiaLite (виртуальные слои 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
Александр Нето
источник
К сожалению, запрос возвращает только значения NULL.
eclipsed_by_the_moon