ST_Intersection — Beräknar en geometri som representerar den delade delen av geometrierna A och B.
geometry ST_Intersection(
geometry geomA , geometry geomB , float8 gridSize = -1 )
;
geography ST_Intersection(
geography geogA , geography geogB )
;
Returnerar en geometri som representerar punktuppsättningens skärningspunkt mellan två geometrier. Med andra ord, den del av geometri A och geometri B som delas mellan de två geometrierna.
Om geometrierna inte har några gemensamma punkter (dvs. är disjunkta) returneras en tom atomgeometri av lämplig typ.
Om den valfria parametern gridSize
anges (GEOS-3.9.0 eller senare krävs) garanteras att alla resultatpunkter hamnar i ett rutnät med den angivna storleken. För att operationen ska ge förutsägbara resultat måste alla inmatade hörn redan falla på det angivna rutnätet, se ST_ReducePrecision.
ST_Intersection i kombination med ST_Intersects är användbart för att klippa geometrier, t.ex. i frågor om bounding box, buffert eller region där du bara behöver den del av en geometri som ligger inom ett land eller en region av intresse.
![]() |
|
|
![]() |
|
Denna funktion kommer att släppa M-koordinatvärdena om de finns. |
![]() |
|
Om du arbetar med 3D-geometrier kanske du vill använda SFGCAL-baserad ST_3DIntersection som gör en korrekt 3D-överskärning för 3D-geometrier. Även om denna funktion arbetar med Z-koordinat, gör den en medelvärdesbildning av Z-koordinat. |
Utförs av GEOS-modulen
Förbättrad: 3.1.0 accepterar en gridSize-parameter
Kräver GEOS >= 3.9.0 för att använda parametern gridSize
Ändrat: 3.0.0 är inte beroende av SFCGAL.
Tillgänglighet: 1.5 stöd för datatypen Geography infördes.
Denna metod implementerar OGC:s implementeringsspecifikation för enkla funktioner för SQL 1.1. s2.1.1.3
Denna metod implementerar SQL/MM-specifikationen. SQL-MM 3: 5.1.18
Denna funktion stöder 3d och kommer inte att tappa z-index. Resultatet beräknas dock endast med hjälp av XY. De resulterande Z-värdena kopieras, medelvärdesbildas eller interpoleras.
SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry)); st_astext --------------- GEOMETRYCOLLECTION EMPTY SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry)); st_astext --------------- POINT(0 0)
Klipp ut alla linjer (spår) efter land. Här antar vi att landets geom är POLYGON eller MULTIPOLYGON. OBS: vi behåller bara korsningar som resulterar i en LINESTRING eller MULTILINESTRING eftersom vi inte bryr oss om spår som bara delar en punkt. Dumpen behövs för att expandera en geometrisamling till enskilda MULT*-delar. Nedanstående är ganska generisk och kommer att fungera för polys, etc. genom att bara ändra var klausulen.
select clipped.gid, clipped.f_name, clipped_geom from ( select trails.gid, trails.f_name, (ST_Dump(ST_Intersection(country.geom, trails.geom))).geom clipped_geom from country inner join trails on ST_Intersects(country.geom, trails.geom) ) as clipped where ST_Dimension(clipped.clipped_geom) = 1;
För polys, t.ex. polygonlandmärken, kan du också använda det ibland snabbare hacket att buffring av allt med 0,0 utom en polygon resulterar i en tom geometrisamling. (Så en geometrisamling som innehåller polygoner, linjer och punkter som buffras med 0,0 skulle bara lämna kvar polygonerna och upplösa samlingens skal)
select poly.gid, ST_Multi( ST_Buffer( ST_Intersection(country.geom, poly.geom), 0.0 ) ) clipped_geom from country inner join poly on ST_Intersects(country.geom, poly.geom) where not ST_IsEmpty(ST_Buffer(ST_Intersection(country.geom, poly.geom), 0.0));
Observera att detta inte är en sann korsning, jämför med samma exempel med ST_3DIntersection.
select ST_AsText(ST_Intersection(linestring, polygon)) As wkt from ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon; st_astext --------------------------------------- LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10)