Описание
ST_Relate сравнивает две геометрии и возвращает значение 1 (Oracle и SQLite) либо t (PostgreSQL), если геометрии соответствуют условиям, указанным строкой шаблонной матрицы DE-9IM. В противном случае возвращается значение 0 (Oracle и SQLite) либо f (PostgreSQL).
При работе в SQLite существует вторая возможность при использовании ST_Relate: можно сравнить две геометрии и возвратить строку с шаблонной матрицей DE-9IM, задающей отношение геометрий друг к другу.
Синтаксис
Oracle и PostgreSQL
sde.st_relate (geometry1 sde.st_geometry, geometry2 sde.st_geometry, patternMatrix string)
SQLite
Опция 1
st_relate (geometry1 st_geometry, geometry2 st_geometry, patternMatrix string)
Опция 2
patternMatrix string st_relate (geometry1 st_geometry, geometry2 st_geometry)
Тип возвращаемого значения
Логический
Опция 2 для SQLite возвращает строку.
Примеры
Шаблонная матрица DE-9IM – это устройство для сравнения геометрий. Существует несколько типов таких матриц. Например, матрица равенства (T*F**FFF*) сообщит, равны ли две геометрии.
В данных примерах создается таблица relate_test с тремя пространственными столбцами, и в каждый вставляются точечные объекты. В выражении SELECT функция ST_Relate используется для определения того, одинаковы ли точки. Помните, что если вы хотите узнать, одинаковы ли геометрии, рекомендуется воспользоваться функцией ST_Equals.
Oracle
CREATE TABLE relate_test (
g1 sde.st_geometry,
g2 sde.st_geometry,
g3 sde.st_geometry
);
INSERT INTO relate_test (g1, g2, g3) VALUES (
sde.st_geometry ('point (10.02 20.01)', 4326),
sde.st_geometry ('point (10.02 20.01)', 4326),
sde.st_geometry ('point (30.01 20.01)', 4326)
);
SELECT sde.st_relate (g1, g2, 'T*F**FFF*') g1_equals_g2,
sde.st_relate (g1, g3, 'T*F**FFF*') g1_equals_g3,
sde.st_relate (g2, g3, 'T*F**FFF*') g2_equals_g3
FROM RELATE_TEST;
Выводится следующее:
g1_equals_g2 g1_equals_g3 g2_equals_g3 1 0 0
PostgreSQL
CREATE TABLE relate_test (
g1 sde.st_geometry,
g2 sde.st_geometry,
g3 sde.st_geometry
);
INSERT INTO relate_test (g1, g2, g3) VALUES (
sde.st_geometry ('point (10.02 20.01)', 4326),
sde.st_geometry ('point (10.02 20.01)', 4326),
sde.st_geometry ('point (30.01 20.01)', 4326)
);
SELECT st_relate (g1, g2, 'T*F**FFF*') AS "g1=g2",
st_relate (g1, g3, 'T*F**FFF*') AS "g1=g3",
st_relate (g2, g3, 'T*F**FFF*') AS "g2=g3"
FROM relate_test;
Выводится следующее:
g1=g2 g1=g3 g2=g3 t f f
SQLite
Первый пример показывает первую опцию ST_Relate, сравнивающую две геометрии на основе шаблонной матрицы DE-9IM и возвращающая 1, если геометрии удовлетворяют требованиям, определенным в матрице, и 0 – если не удовлетворяют.
CREATE TABLE relate_test (id integer primary key autoincrement not null);
SELECT AddGeometryColumn(
NULL,
'relate_test',
'g1',
4326,
'point',
'xy',
'null'
);
CREATE TABLE relate_test2 (id integer primary key autoincrement not null);
SELECT AddGeometryColumn(
NULL,
'relate_test2',
'g2',
4326,
'point',
'xy',
'null'
);
CREATE TABLE relate_test3 (id integer primary key autoincrement not null);
SELECT AddGeometryColumn(
NULL,
'relate_test3',
'g3',
4326,
'point',
'xy',
'null'
);
INSERT INTO relate_test (g1) VALUES (
st_geometry ('point (10.02 20.01)', 4326)
);
INSERT INTO relate_test2 (g2) VALUES (
st_geometry ('point (10.02 20.01)', 4326)
);
INSERT INTO relate_test3 (g3) VALUES (
st_geometry ('point (30.01 20.01)', 4326)
);
SELECT st_relate (relate_test.g1, relate_test2.g2, 'T*F**FFF*') AS "g1=g2",
st_relate (relate_test.g1, relate_test3.g3, 'T*F**FFF*') AS "g1=g3",
st_relate (relate_test2.g2, relate_test3.g3, 'T*F**FFF*') AS "g2=g3"
FROM relate_test, relate_test2, relate_test3;
Выводится следующее:
g1=g2 g1=g3 g2=g3 1 0 0
В этом примере сравниваются две геометрии и возвращается шаблонная матрица DE-9IM.
SELECT st_relate (g1,g3)
FROM relate_test;
Выводится следующее:
st_relate (g1,g3) FF0FFF0F2