ST_Within

Definition

ST_Within gibt 1 (Oracle) oder t (PostgreSQL) zurück, wenn das erste ST_Geometry-Objekt vollkommen innerhalb des zweiten ST_Geometry-Objekts liegt. Andernfalls wird 0 (Oracle) oder f (PostgreSQL) zurückgegeben.

Syntax

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

Rückgabetyp

Boolesch

Beispiel

Im nachfolgenden Beispiel werden zwei Tabellen erstellt: die Tabelle "bfootprints" enthält die Grundrisse aller Gebäude einer Stadt, und die Tabelle "lots" enthält die Grundstücke. Das Bauamt möchte sicherstellen, dass sich alle Gebäudegrundrisse innerhalb der zugehörigen Grundstücke befinden.

In beiden Tabellen wird mit dem Datentyp "ST_MultiPolygons" das ST_Geometry-Objekt mit den Gebäudegrundrissen und den Grundstücken gespeichert. Der Datenbankentwickler hat den Datentyp ST_MultiPolygons für beide Features gewählt, da ein Grundstück durch eine natürliches Feature, z. B. einen Fluss, durchkreuzt werden und ein Gebäudegrundriss aus mehreren Gebäuden bestehen kann.

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)
);

Das Bauamt wählt die Gebäude aus, deren Grundriss sich nicht vollkommen innerhalb des zugehörigen Grundstücks befindet.

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

3/6/2012