Определение
ST_Equals сравнивает две геометрии и возвращает 1 (Oracle и SQLite) либо t (PostgreSQL), если геометрии идентичны. В противном случае возвращается значение 0 (Oracle и SQLite) либо f (PostgreSQL).
Синтаксис
Oracle и PostgreSQL
sde.st_equals (geometry1 sde.st_geometry, geometry2 sde.st_geometry)
SQLite
st_equals (geometry1 geometryblob, geometry2 geometryblob)
Возвращаемый тип
Логический
Пример:
Городской ГИС-специалист подозревает, что какие-то данные в таблице studies были продублированы. Для подтверждения подозрений он запрашивает таблицу, чтобы определить, есть ли равные мультиполигоны объектов.
Таблица studies была создана и заполнена следующими инструкциями. Столбец id таблицы уникально определяет изучаемые территории, а в столбце shape хранится геометрия территории.
После этого таблица bldgs пространственно присоединяется к себе с помощью предиката equal, при этом функция возвращает значение 1 (Oracle и SQLite) либо t (PostgreSQL) при обнаружении двух равных мультиполигонов. Условие s1.id<>s2.id устраняет сравнение геометрии с собой.
Oracle
CREATE TABLE studies (
id integer unique,
shape sde.st_geometry
);
INSERT INTO studies (id, shape) VALUES (
1,
sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
INSERT INTO studies (id, shape) VALUES (
2,
sde.st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 4326)
);
INSERT INTO studies (id, shape) VALUES (
3,
sde.st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 4326)
);
INSERT INTO studies (id, shape) VALUES (
4,
sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
SELECT UNIQUE (s1.id), s2.id
FROM STUDIES s1, STUDIES s2
WHERE sde.st_equals (s1.shape, s2.shape) = 1
AND s1.id <> s2.id;
ID ID
4 1
1 4
PostgreSQL
CREATE TABLE studies (
id serial,
shape st_geometry
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 4326)
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 4326)
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
SELECT DISTINCT (s1.id), s2.id
FROM studies s1, studies s2
WHERE st_equals (s1.shape, s2.shape) = 't'
AND s1.id <> s2.id;
id id
1 4
4 1
SQLite
CREATE TABLE studies (
id integer primary key autoincrement not null
);
SELECT AddGeometryColumn (
NULL,
'studies',
'shape',
4326,
'polygon',
'xy',
'null'
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 4326)
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 4326)
);
INSERT INTO studies (shape) VALUES (
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
SELECT DISTINCT (s1.id), s2.id
FROM studies s1, studies s2
WHERE st_equals (s1.shape, s2.shape) = 1
AND s1.id <> s2.id;
id id
1 4
4 1