Определение
ST_SymmetricDiff берет два объекта геометрии и возвращает объект геометрии, который состоит из частей исходных объектов, не являющихся общими для обоих.
Синтаксис
Oracle и PostgreSQL
sde.st_symmetricdiff (geometry1 sde.st_geometry, geometry2 sde.st_geometry)
SQLite
st_symmetricdiff (geometry1 geometryblob, geometry2 geometryblob)
Возвращаемый тип
Oracle и PostgreSQL
ST_Geometry
SQLite
Geometryblob
Пример:
Для специального отчета глава округа должен определить водоразделы и опасные области, которые не пересекаются.
Таблица watershed содержит столбец id, столбец для хранения имени водораздела (wname) и столбец shape, в котором хранится геометрия территории водораздела.
В таблице plumes в столбце id хранятся идентификаторы участков, а фактическое географическое расположение каждого участка хранится в столбце point.
Функция ST_Buffer создает буфер, окружающий точки вредоносных участков. Функция ST_SymmetricDiff возвращает полигоны на основе буферов мест захоронения опасных отходов и водоразделов, которые не пересекаются.
Симметричная разность мест захоронения опасных отходов и водоразделов позволяет отбросить пересекающиеся области.
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