ST_Contains
Définition
ST_Contains accepte deux objets géométrie et renvoie 1 (Oracle et SQLite) ou t (PostgreSQL) si le premier objet contient complètement le second ; dans le cas contraire, la fonction renvoie 0 (Oracle et SQLite) ou f (PostgreSQL).
Syntaxe
Oracle et PostgreSQL
sde.st_contains (geometry1 sde.st_geometry, geometry2 sde.st_geometry)
SQLite
st_contains (geometry1 geometryblob, geometry2 geometryblob)
Type de retour
Booléen
Exemple
Dans les exemples ci-dessous, deux tables sont créées : la première, buildingfootprints, contient les emprises des bâtiments d'une municipalité, tandis que l'autre, lots, contient les parcelles. L'ingénieur municipal souhaite s'assurer que toutes les emprises des bâtiments se trouvent entièrement à l'intérieur de leurs parcelles.
L'ingénieur municipal utilise ST_Intersects et ST_Contains pour sélectionner les bâtiments qui ne se trouvent pas entièrement dans un terrain.
Oracle
--Create tables and insert values.
CREATE TABLE bfp (
building_id integer,
footprint sde.st_geometry
);
CREATE TABLE lots (
lot_id integer,
lot sde.st_geometry
);
INSERT INTO BFP (building_id, footprint) VALUES (
1,
sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
INSERT INTO BFP (building_id, footprint) VALUES (
2,
sde.st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 4326)
);
INSERT INTO BFP (building_id, footprint) VALUES (
3,
sde.st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 4326)
);
INSERT INTO LOTS (lot_id, lot) VALUES (
1,
sde.st_polygon ('polygon ((-1 -1, -1 11, 11 11, 11 -1, -1 -1))', 4326)
);
INSERT INTO LOTS (lot_id, lot) VALUES (
2,
sde.st_polygon ('polygon ((19 -1, 19 11, 29 9, 31 -1, 19 -1))', 4326)
);
INSERT INTO LOTS (lot_id, lot) VALUES (
3,
sde.st_polygon ('polygon ((39 -1, 39 11, 51 11, 51 -1, 39 -1))', 4326)
);
--Select the buildings that are not completely contained within one lot.
SELECT UNIQUE (building_id)
FROM BFP, LOTS
WHERE sde.st_intersects (lot, footprint) = 1
AND sde.st_contains (lot, footprint) = 0;
BUILDING_ID
2
PostgreSQL
--Create tables and insert values.
CREATE TABLE bfp (
building_id serial,
footprint st_geometry);
CREATE TABLE lots
(lot_id serial,
lot st_geometry);
INSERT INTO bfp (footprint) VALUES (
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
INSERT INTO bfp (footprint) VALUES (
st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 4326)
);
INSERT INTO bfp (footprint) VALUES (
st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 4326)
);
INSERT INTO lots (lot) VALUES (
st_polygon ('polygon ((-1 -1, -1 11, 11 11, 11 -1, -1 -1))', 4326)
);
INSERT INTO lots (lot) VALUES (
st_polygon ('polygon ((19 -1, 19 11, 29 9, 31 -1, 19 -1))', 4326)
);
INSERT INTO lots (lot) VALUES (
st_polygon ('polygon ((39 -1, 39 11, 51 11, 51 -1, 39 -1))', 4326)
);
--Select the buildings that are not completely contained within one lot.
SELECT DISTINCT (building_id)
FROM bfp, lots
WHERE st_intersects (lot, footprint) = 't'
AND st_contains (lot, footprint) = 'f';
building_id
2
SQLite
--Create tables, add geometry columns, and insert values.
CREATE TABLE bfp (
building_id integer primary key autoincrement not null
);
SELECT AddGeometryColumn (
NULL,
'bfp',
'footprint',
4326,
'polygon',
'xy',
'null'
);
CREATE TABLE lots
(lot_id integer primary key autoincrement not null
);
SELECT AddGeometryColumn (
NULL,
'lots',
'lot',
4326,
'polygon',
'xy',
'null'
);
INSERT INTO bfp (footprint) VALUES (
st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);
INSERT INTO bfp (footprint) VALUES (
st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 4326)
);
INSERT INTO bfp (footprint) VALUES (
st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 4326)
);
INSERT INTO lots (lot) VALUES (
st_polygon ('polygon ((-1 -1, -1 11, 11 11, 11 -1, -1 -1))', 4326)
);
INSERT INTO lots (lot) VALUES (
st_polygon ('polygon ((19 -1, 19 11, 29 9, 31 -1, 19 -1))', 4326)
);
INSERT INTO lots (lot) VALUES (
st_polygon ('polygon ((39 -1, 39 11, 51 11, 51 -1, 39 -1))', 4326)
);
--Select the buildings that are not completely contained within one lot.
SELECT DISTINCT (building_id)
FROM bfp, lots
WHERE st_intersects (lot, footprint) = 1
AND st_contains (lot, footprint) = 0;
building_id
2
Thèmes connexes
5/10/2014