On Thu, 26 Apr 2018 00:40:49 -0700 (PDT), artkraw wrote:
> How to formulate query in Spatialite to obtain the same results
> as in QGIS ?
>
Premise: what QGIS intends for "Union" is completely different
from what OGC (ISO) international standards dictate.
An Union (as implemented by QGIS) seems to be a rather complex
mix of several spatial operations, and cannot be simply translated
into a single SQL function.
the following SQL script represents a sketchy (and probably
incomplete) attempt to emulate the QGIS own Union.
====================
CREATE TABLE p1 (id INTEGER PRIMARY KEY);
SELECT AddGeometyColumn('p1', 'geom', 4326, 'POLYGON', 'XY');
CREATE TABLE p2 (id INTEGER PRIMARY KEY);
SELECT AddGeometyColumn('p2', 'geom', 4326, 'POLYGON', 'XY');
CREATE TABLE p1 (id INTEGER PRIMARY KEY);
SELECT AddGeometryColumn('p1', 'geom', 4326, 'POLYGON', 'XY');
CREATE TABLE p2 (id INTEGER PRIMARY KEY);
SELECT AddGeometryColumn('p2', 'geom', 4326, 'POLYGON', 'XY');
INSERT INTO p1 VALUES (NULL,
ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 4326));
INSERT INTO p1 VALUES (NULL,
ST_GeomFromText('POLYGON((0 15, 30 15, 30 25, 0 25, 0 15))', 4326));
INSERT INTO p1 VALUES (NULL,
ST_GeomFromText('POLYGON((0 30, 10 30, 10 40, 0 40, 0 30))', 4326));
INSERT INTO p2 VALUES (NULL,
ST_GeomFromText('POLYGON((5 2, 15 2, 15 8, 5 8, 5 2))', 4326));
INSERT INTO p2 VALUES (NULL,
ST_GeomFromText('POLYGON((30 0, 40 0, 40 10, 30 10, 30 0))', 4326));
INSERT INTO p2 VALUES (NULL,
ST_GeomFromText('POLYGON((2 34, 20 34, 20 36, 2 36, 2 34))', 4326));
CREATE TEMPORARY TABLE temp_intersections AS
SELECT
p1.id AS id_1,
p2.id AS id_2,
ST_Intersection(p1.geom, p2.geom) AS geom
FROM p1, p2
WHERE ST_Intersects(p1.geom, p2.geom) = 1;
CREATE TEMPORARY TABLE temp_differences AS
SELECT
p1.id AS id_1, NULL AS id_2,
ST_Difference(p1.geom, tmp.geom) AS geom
FROM p1, temp_intersections AS tmp
WHERE ST_Intersects(p1.geom, tmp.geom) = 1
UNION
SELECT NULL AS id1,
p2.id AS id_2,
ST_Difference(p2.geom, tmp.geom) AS geom
FROM p2, temp_intersections AS tmp
WHERE ST_Intersects(p2.geom, tmp.geom) = 1;
CREATE TEMPORARY TABLE temp_disjoints AS
SELECT
p1.id AS id_1, NULL AS id_2, p1.geom AS geom
FROM p1, (SELECT ST_Collect(p2.geom) AS g FROM p2) AS x
WHERE ST_Disjoint(p1.geom, x.g) = 1
UNION
SELECT NULL AS id_1,
p2.id AS id_2, p2.geom AS geom
FROM p2, (SELECT ST_Collect(p1.geom) AS g FROM p1) AS x
WHERE ST_Disjoint(p2.geom, x.g) = 1;
CREATE TABLE qgis_like_union AS
SELECT * from temp_intersections
UNION
SELECT * from temp_differences
UNION
SELECT * from temp_disjoints;
SELECT RecoverGeometryColumn('qgis_like_union', 'geom', 4326,
'POLYGON', 'XY');
====================
bye Sandro