Définition
ST_SymmetricDiff accepte deux objets géométrie et retourne un objet géométrie composé des parties des objets source qui ne sont pas communes aux deux.
Syntaxe
Oracle et PostgreSQL
sde.st_symmetricdiff (geometry1 sde.st_geometry, geometry2 sde.st_geometry)
SQLite
st_symmetricdiff (geometry1 geometryblob, geometry2 geometryblob)
Type de retour
Oracle et PostgreSQL
ST_Geometry
SQLite
Geometryblob
Exemple
Pour un rapport spécial, le responsable de l'aménagement du territoire doit identifier les surfaces des bassins versants et des rayons dangereux qui ne s'intersectent pas.
La table des bassins versants (watershed) contient une colonne id, une colonne permettant de stocker le nom des bassins versants (wname) et une colonne shape qui stocke la géométrie des surfaces des bassins versants.
La table plumes stocke l'identité du site dans la colonne id, tandis que l'emplacement géographique réel de chaque site est stocké dans la colonne des points de site.
La fonction ST_Buffer génère une zone tampon qui entoure les points des sites de dépôt de déchets dangereux. La fonction ST_SymmetricDiff retourne les polygones des sites de dépôt de déchets dangereux bufférisés et des bassins versants qui ne s'intersectent pas.
La différence symétrique entre les sites de dépôt de déchets dangereux et les bassins versants a pour résultat la soustraction des zones qui s'intersectent.
Oracle
CREATE TABLE watershed (
id integer,
wname varchar(40),
shape sde.st_geometry
);
CREATE TABLE plumes (
id integer,
site sde.st_geometry
);
INSERT INTO WATERSHED (ID, WNAME, SHAPE) VALUES (
1,
'Big River',
sde.st_geometry ('polygon ((20 30, 30 30, 30 40, 20 40, 20 30))', 4326)
);
INSERT INTO WATERSHED (ID, WNAME, SHAPE) VALUES (
2,
'Lost Creek',
sde.st_geometry ('polygon ((30 30, 30 50, 50 50, 50 30, 30 30))', 4326)
);
INSERT INTO WATERSHED (ID, WNAME, SHAPE) VALUES (
3,
'Szymborska Stream',
sde.st_geometry ('polygon ((40 40, 40 60, 60 60, 60 40, 40 40))', 4326)
);
INSERT INTO PLUMES (ID, SITE) VALUES (
20,
sde.st_geometry ('point (60 60)', 4326)
);
INSERT INTO PLUMES (ID, SITE) VALUES (
21,
sde.st_geometry ('point (30 30)', 4326)
);
SELECT ws.id WS_ID,
sde.st_area (sde.st_symmetricdiff (sde.st_buffer (p.site, .1), ws.shape)) AREA_NO_INT
FROM PLUMES p, WATERSHED ws
WHERE p.id = 20;
SA_ID AREA_NO_INT
1 100.031393
2 400.031393
3 400.015697
PostgreSQL
CREATE TABLE watershed (
id serial,
wname varchar(40),
shape sde.st_geometry
);
CREATE TABLE plumes (
id serial,
site sde.st_geometry
);
INSERT INTO watershed (wname, shape) VALUES (
'Big River',
sde.st_geometry ('polygon ((20 30, 30 30, 30 40, 20 40, 20 30))', 4326)
);
INSERT INTO watershed (wname, shape) VALUES (
'Lost Creek',
sde.st_geometry ('polygon ((30 30, 30 50, 50 50, 50 30, 30 30))', 4326)
);
INSERT INTO watershed (wname, shape) VALUES (
'Szymborska Stream',
sde.st_geometry ('polygon ((40 40, 40 60, 60 60, 60 40, 40 40))', 4326)
);
INSERT INTO plumes (site) VALUES (
sde.st_geometry ('point (60 60)', 4326)
);
INSERT INTO plumes (site) VALUES (
sde.st_geometry ('point (30 30)', 4326)
);
SELECT ws.id AS WS_ID,
sde.st_area (sde.st_symmetricdiff (sde.st_buffer (p.site, .1), ws.shape)) AS "no intersection"
FROM plumes p, watershed ws
WHERE p.id = 1;
ws_id no intersection
1 100.031393502001
2 400.031393502001
3 400.01569751
SQLite
CREATE TABLE watershed (
id integer primary key autoincrement not null,
wname text(40)
);
SELECT AddGeometryColumn(
NULL,
'watershed',
'shape',
4326,
'polygon',
'xy',
'null'
);
CREATE TABLE plumes (
id integer primary key autoincrement not null
);
SELECT AddGeometryColumn(
NULL,
'plumes',
'site',
4326,
'point',
'xy',
'null'
);
INSERT INTO watershed (wname, shape) VALUES (
'Big River',
st_geometry ('polygon ((20 30, 30 30, 30 40, 20 40, 20 30))', 4326)
);
INSERT INTO watershed (wname, shape) VALUES (
'Lost Creek',
st_geometry ('polygon ((30 30, 30 50, 50 50, 50 30, 30 30))', 4326)
);
INSERT INTO watershed (wname, shape) VALUES (
'Szymborska Stream',
st_geometry ('polygon ((40 40, 40 60, 60 60, 60 40, 40 40))', 4326)
);
INSERT INTO plumes (site) VALUES (
st_geometry ('point (60 60)', 4326)
);
INSERT INTO plumes (site) VALUES (
st_geometry ('point (30 30)', 4326)
);
SELECT ws.id AS WS_ID,
st_area (st_symmetricdiff (st_buffer (p.site, .1), ws.shape)) AS "no intersection"
FROM plumes p, watershed ws
WHERE p.id = 1;
WS_ID no intersection
1 400.031393502001
2 100.031393502001
3 400.01569751