ST_Relate — Testar om två geometrier har en topologisk relation som matchar ett Intersection Matrix-mönster, eller beräknar deras Intersection Matrix
boolean ST_Relate(
geometry geomA, geometry geomB, text intersectionMatrixPattern)
;
text ST_Relate(
geometry geomA, geometry geomB)
;
text ST_Relate(
geometry geomA, geometry geomB, integer boundaryNodeRule)
;
Dessa funktioner gör det möjligt att testa och utvärdera det spatiala (topologiska) förhållandet mellan två geometrier, enligt definitionen i Dimensionally Extended 9-Intersection Model (DE-9IM).
DE-9IM specificeras som en matris med 9 element som anger dimensionen på skärningspunkterna mellan inre, yttre och yttre delar av två geometrier. Den representeras av en textsträng med 9 tecken som använder symbolerna "F", "0", "1", "2" (t.ex. "FF1FF0102
").
En viss typ av spatial relation kan testas genom att matcha intersektionsmatrisen med ett intersektionsmatrismönster. Mönster kan innehålla tilläggssymbolerna "T" (som betyder "skärningspunkten är inte tom") och "*" (som betyder "vilket värde som helst"). Vanliga spatiala relationer tillhandahålls av de namngivna funktionerna ST_Contains, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, och ST_Within. Genom att använda ett explicit mönster kan man testa flera villkor för skärningar, korsningar osv. i ett steg. Det gör det också möjligt att testa spatiala relationer som inte har en namngiven spatial relationsfunktion. Till exempel har relationen "Interior-Intersects" DE-9IM-mönstret T********
, som inte utvärderas av något namngivet predikat.
Mer information finns på Section 5.1, “Fastställande av spatiala relationer”.
Variant 1: Testar om två geometrier är spatialt relaterade enligt det angivna intersectionMatrixPattern
.
![]() |
|
Till skillnad från de flesta namngivna spatiala relationspredikaten innehåller detta INTE automatiskt ett indexanrop. Anledningen är att vissa relationer är sanna för geometrier som INTE korsar varandra (t.ex. Disjoint). Om du använder ett relationsmönster som kräver intersektion, inkludera då indexanropet &&. |
![]() |
|
Det är bättre att använda en namngiven relationsfunktion om en sådan finns tillgänglig, eftersom de automatiskt använder ett spatialt index om ett sådant finns. De kan också implementera prestandaoptimeringar som inte är tillgängliga med fullständig relationsutvärdering. |
Variant 2: Returnerar DE-9IM-matrissträngen för det spatiala förhållandet mellan de två indatageometrierna. Matrissträngen kan testas för att matcha ett DE-9IM-mönster med hjälp av ST_RelateMatch.
Variant 3: Som variant 2, men tillåter specificering av en Boundary Node Rule. En Boundary Node Rule ger möjlighet till finare kontroll över om MultiLineStrings ändpunkter anses ligga i DE-9IM Interior eller Boundary. Värdena för boundaryNodeRule
är:
1
: OGC-Mod2 - linjens ändpunkter är i Boundary om de förekommer ett udda antal gånger. Detta är den regel som definieras av OGC SFS-standarden och är standard för ST_Relate
.
2
: Slutpunkt - alla slutpunkter ligger i Boundary.
3
: MultivalentEndpoint - ändpunkterna är i Boundary om de förekommer mer än en gång. Med andra ord är gränsen alla de "anslutna" eller "inre" ändpunkterna (men inte de "icke anslutna/yttre").
4
: MonovalentEndpoint - ändpunkterna ligger i Boundary om de bara förekommer en gång. Med andra ord är gränsen alla de "obundna" eller "yttre" ändpunkterna.
Denna funktion finns inte i OGC-specifikationen, men är underförstådd. se s2.1.13.2
Denna metod implementerar OGC:s implementeringsspecifikation för enkla funktioner för SQL 1.1. s2.1.1.2 // s2.1.13.3
Denna metod implementerar SQL/MM-specifikationen. SQL-MM 3: 5.1.25
Utförs av GEOS-modulen
Förbättrad: 2.0.0 - stöd för att ange en regel för gränsnoder har lagts till.
![]() |
|
Förbättrad: 3.0.0 aktiverade stöd för |
Använda den booleska värderingsfunktionen för att testa spatiala relationer.
SELECT ST_Relate('POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '0FFFFF212'); st_relate ----------- t SELECT ST_Relate(POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '*FF*FF212'); st_relate ----------- t
Testa ett anpassat spatialt relationsmönster som ett frågevillkor, med &&
för att aktivera användning av ett spatialt index.
-- Find compounds that properly intersect (not just touch) a poly (Interior Intersects) SELECT c.* , p.name As poly_name FROM polys AS p INNER JOIN compounds As c ON c.geom && p.geom AND ST_Relate(p.geom, c.geom,'T********');
Beräkning av intersektionsmatrisen för spatiala relationer.
SELECT ST_Relate( 'POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2)); ----------- 0FFFFF212 SELECT ST_Relate( 'LINESTRING(1 2, 3 4)', 'LINESTRING(5 6, 7 8)' ); ----------- FF1FF0102
Använda olika Boundary Node Rules för att beräkna det spatiala förhållandet mellan en LineString och en MultiLineString med en duplicerad ändpunkt (3 3):
:
Med hjälp av OGC-Mod2-regeln (1) är den duplicerade ändpunkten i det inre av MultiLineString, så DE-9IM-matrisposten [aB:bI] är 0
och [aB:bB] är F.
.
Med hjälp av ändpunktsregeln (2) ligger den duplicerade ändpunkten i gränsen för MultiLineString, så DE-9IM-matrisens post [aB:bI] är F
och [aB:bB] är 0.
.
WITH data AS (SELECT 'LINESTRING(1 1, 3 3)'::geometry AS a_line, 'MULTILINESTRING((3 3, 3 5), (3 3, 5 3))':: geometry AS b_multiline ) SELECT ST_Relate( a_line, b_multiline, 1) AS bnr_mod2, ST_Relate( a_line, b_multiline, 2) AS bnr_endpoint FROM data; bnr_mod2 | bnr_endpoint -----------+-------------- FF10F0102 | FF1F00102