ST_Within

Définition

ST_Within renvoie 1 (Oracle) ou t (PostgreSQL) si le premier objet ST_Geometry est entièrement inclus dans le second. Dans le cas contraire, la fonction renvoie 0 (Oracle) ou f (PostgreSQL).

Syntaxe

sde.st_within (g1 sde.st_geometry, g2 sde.st_geometry)

Type de retour

Booléen

Exemple

Dans l'exemple ci-dessous, deux tables sont créées : la première, bfootprints, contient l'emprise des bâtiments d'une municipalité, tandis que l'autre, lots, contient ses terrains. L'ingénieur municipal souhaite s'assurer que toutes les emprises des bâtiments se trouvent entièrement à l'intérieur de leurs terrains.

Dans les deux tables, le type de données multipolygon stocke le type ST_Geometry des emprises des bâtiments et des terrains. Le concepteur de la base de données a sélectionné ST_MultiPolygons pour les deux entités, car il s'est rendu compte qu'un terrain peut être séparé par une entité naturelle, telle qu'un fleuve, et qu'une emprise de bâtiment peut être composée de plusieurs bâtiments.

CREATE TABLE bfootprints (building_id integer,
footprint sde.st_geometry);

CREATE TABLE lots (lot_id integer,
lot sde.st_geometry);


INSERT INTO bfootprints (building_id, footprint) VALUES (
1,
sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 0)
);

INSERT INTO bfootprints (building_id, footprint) VALUES (
2,
sde.st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 0)
);

INSERT INTO bfootprints (building_id, footprint) VALUES (
3,
sde.st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 0)
);

INSERT INTO lots (lot_id, lot) VALUES (
1,
sde.st_polygon ('polygon ((-1 -1, -1 11, 11 11, 11 -1, -1 -1))', 0)
);

INSERT INTO lots (lot_id, lot) VALUES (
2,
sde.st_polygon ('polygon ((19 -1, 19 11, 29 9, 31 -1, 19 -1))', 0)
);

INSERT INTO lots (lot_id, lot) VALUES (3,
sde.st_polygon ('polygon ((39 -1, 39 11, 51 11, 51 -1, 39 -1))', 0)
);

L'ingénieur municipal sélectionne les bâtiments qui ne se trouvent pas entièrement dans un terrain.

Oracle

SELECT bf.building_id
FROM BFOOTPRINTS bf, LOTS l
WHERE sde.st_intersects (bf.footprint, l.lot) = 1 
AND sde.st_within (bf.footprint, l.lot) = 0;

BUILDING_ID

          2

PostgreSQL

SELECT bf.building_id
FROM bfootprints bf, lots l
WHERE sde.st_intersects (bf.footprint, l.lot) = 't' 
AND sde.st_within (bf.footprint, l.lot) = 'f';

building_id

          2

7/10/2012