ST_Distance
Définition
ST_Distance retourne la plus petite distance séparant deux géométries. La distance est mesurée entre les sommets les plus proches des deux géométries.
Syntaxe
sde.st_distance (g1 sde.st_geometry, g2 sde.st_geometry)
Type de retour
Double précision
Exemple
Un agent de mise en application du code doit rechercher si des bâtiments d'une parcelle particulière sont situés à moins d'un pied de la limite du terrain. La colonne building_id de la table buildings identifie chaque bâtiment de façon unique. La colonne lot_id identifie la parcelle correspondant à chaque bâtiment. Le polygone buildings stocke la géométrie de l'emprise de chaque bâtiment. La table des parcelles stocke l'APN qui identifie de manière unique chaque terrain et qui est identique à l'ID du lot dans la classe d'entités buildings, et l'objet ST_Polygon de la parcelle contenant la géométrie de terrain.
CREATE TABLE buildings (building_id integer, lot_id integer, footprint sde.st_geometry); CREATE TABLE parcels (apn integer unique, parcel sde.st_geometry); INSERT INTO buildings (building_id, lot_id, footprint) VALUES ( 1, 400, sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 0) ); INSERT INTO buildings (building_id, lot_id, footprint) VALUES ( 2, 400, sde.st_polygon ('polygon ((12 3, 12 6, 15 6, 15 3, 12 3))', 0) ); INSERT INTO buildings (building_id, lot_id, footprint) VALUES ( 3, 400, sde.st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 0) ); INSERT INTO buildings (building_id, lot_id, footprint) VALUES ( 4, 402, sde.st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 0) ); INSERT INTO parcels (apn, parcel) VALUES ( 400, sde.st_polygon ('polygon ((-1 -1, -1 11, 11 11, 19 11, 31 11, 31 -1, 19 -1, 11 -1, -1 -1))', 0) ); INSERT INTO parcels (apn, parcel) VALUES ( 402, sde.st_polygon ('polygon ((39 -1, 39 11, 51 11, 51 -1, 39 -1))', 0) );
Ensuite, l'agent de mise en application du code interroge les bâtiments et les tables de parcelles pour obtenir une liste de tous les identifiants de bâtiment de la parcelle 400 et la distance à laquelle ils se trouvent de la limite de terrain. (Les unités sont définies dans le système de projection en cours d'utilisation.) Etant donné que cette parcelle compte trois bâtiments, trois enregistrements doivent être renvoyés.
Oracle
SELECT UNIQUE p.apn, b.building_id, sde.st_distance(b.footprint, sde.st_boundary(p.parcel)) DISTANCE FROM BUILDINGS b, PARCELS p WHERE b.lot_id = p.apn AND p.apn = 400 ORDER BY DISTANCE; APN BUILDING_ID DISTANCE 400 1 1 400 3 1 400 3 4
PostgreSQL
SELECT DISTINCT p.apn, b.building_id, sde.st_distance(b.footprint, sde.st_boundary(p.parcel)) AS Distance FROM buildings b, parcels p WHERE b.lot_id = p.apn AND p.apn = 400 ORDER BY Distance; apn building_id distance 400 1 1 400 3 1 400 2 4