Definition
ST_Touches returns 1 (Oracle and SQLite) or t (PostgreSQL) if none of the points common to both geometries intersect the interiors of both geometries; otherwise, it returns 0 (Oracle and SQLite) or f (PostgreSQL). At least one geometry must be an ST_LineString, ST_Polygon, ST_MultiLineString, or ST_MultiPolygon.
Syntax
Oracle and PostgreSQL
sde.st_touches (geometry1 sde.st_geometry, geometry2 sde.st_geometry)
SQLite
st_touches (geometry1 geometryblob, geometry2 geometryblob)
Return type
Boolean
Example
The GIS technician has been asked by his boss to provide a list of all sewer lines that possess endpoints that intersect another sewer line.
The sewerlines table is created with three columns. The first column, sewer_id, uniquely identifies each sewer line. The integer class column identifies the type of sewer line generally associated with the line's capacity. The sewer column stores the sewer line's geometry.
The SELECT query uses the ST_Touches function to return a list of sewers that touch one another.
Oracle
CREATE TABLE sewerlines (
sewer_id integer,
sewer sde.st_geometry
);
INSERT INTO SEWERLINES VALUES (
1,
sde.st_mlinefromtext ('multilinestring ((20 30, 30 30, 30 40, 20 40, 20 30))', 4326)
);
INSERT INTO SEWERLINES VALUES (
2,
sde.st_mlinefromtext ('multilinestring ((30 30, 30 50, 50 50, 50 30, 30 30))', 4326)
);
INSERT INTO SEWERLINES VALUES (
3,
sde.st_mlinefromtext ('multilinestring ((40 40, 40 60, 60 60, 60 40, 40 40))', 4326)
);
INSERT INTO SEWERLINES VALUES (
4,
sde.st_linestring ('linestring (60 60, 70 70)', 4326)
);
INSERT INTO SEWERLINES VALUES (
5,
sde.st_linestring ('linestring (30 30, 60 60)', 4326)
);
SELECT s1.sewer_id, s2.sewer_id
FROM SEWERLINES s1, SEWERLINES s2
WHERE sde.st_touches (s1.sewer, s2.sewer) = 1;
SEWER_ID SEWER_ID
1 5
3 4
4 3
4 5
5 1
5 3
5 4
PostgreSQL
CREATE TABLE sewerlines (
sewer_id serial,
sewer sde.st_geometry);
INSERT INTO sewerlines (sewer) VALUES (
sde.st_multilinestring ('multilinestring ((20 30, 30 30, 30 40, 20 40, 20 30))', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
sde.st_multilinestring ('multilinestring ((30 30, 30 50, 50 50, 50 30, 30 30))', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
sde.st_multilinestring ('multilinestring ((40 40, 40 60, 60 60, 60 40, 40 40))', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
sde.st_linestring ('linestring (60 60, 70 70)', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
sde.st_linestring ('linestring (30 30, 60 60)', 4326)
);
SELECT s1.sewer_id, s2.sewer_id
FROM sewerlines s1, sewerlines s2
WHERE sde.st_touches (s1.sewer, s2.sewer) = 't';
SEWER_ID SEWER_ID
1 5
3 4
4 3
4 5
5 1
5 3
5 4
SQLite
CREATE TABLE sewerlines (
sewer_id integer primary key autoincrement not null
);
SELECT AddGeometryColumn(
NULL,
'sewerlines',
'sewer',
4326,
'geometry',
'xy',
'null'
);
INSERT INTO sewerlines (sewer) VALUES (
st_multilinestring ('multilinestring ((20 30, 30 30, 30 40, 20 40, 20 30))', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
st_multilinestring ('multilinestring ((30 30, 30 50, 50 50, 50 30, 30 30))', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
st_multilinestring ('multilinestring ((40 40, 40 60, 60 60, 60 40, 40 40))', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
st_linestring ('linestring (60 60, 70 70)', 4326)
);
INSERT INTO sewerlines (sewer) VALUES (
st_linestring ('linestring (30 30, 60 60)', 4326)
);
SELECT s1.sewer_id, s2.sewer_id
FROM SEWERLINES s1, SEWERLINES s2
WHERE st_touches (s1.sewer, s2.sewer) = 1;
sewer_id sewer_id
1 5
3 4
3 5
4 3
4 5
5 1
5 3
5 4