sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvorfor returnerer st_intersection ikke-polygoner?

ST_intersect returnerer flere geometrityper, afhængigt af den relative topologi.

For eksempel at køre ST_intersect på to tilstødende polygoner returnerer den fælles del af den delte grænse.

Mens den udsender en enkelt tabel (som du for eksempel kan verificere i pgadmin), vil den i browserprøven i QGIS blive vist som flere tabeller af forskellige geometrityper (for eksempel:POLYGON, MULTIPOLY, LINE og POINT) men ( noget forvirrende) med samme navn.

Visuelt kan du adskille dem ved at observere de tilhørende ikoner til venstre:

Du kan dog vælge hvilken type geometri du ønsker, for eksempel ved at tilføje et WHERE-filter med ST_Dimension :

SELECT a.*, b.*, st_intersection(a.geom, b.geom) as geom FROM a,b WHERE st_intersects(a.geom, b.geom) AND ST_Dimension(st_intersects(a.geom, b.geom)) = 2;

eller, for ydeevnens skyld, genskriv det på en måde, der ligner:

SELECT clipped.* 
FROM (
         SELECT a.id, b."fieldName",
             (ST_Dump(ST_Intersection(a.geom, b.geom))).geom AS geom
         FROM "public"."table_A_name" AS a INNER JOIN "public"."table_B_name" AS b   
         ON ST_Intersects(a.geom, b.geom)
     ) AS clipped
WHERE ST_Dimension("clipped"."geom") = 2;
 

Sidstnævnte løsning opretter en anonym midlertidig tabel, som tillader ST_Intersection kun at køre én gang.

Du har måske bemærket, at tricket er i ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions som filtrerer output fra ST_Intersection for kun at beholde polygoner (som har en topologisk dimension på 2).




  1. Oracle SQL - Generer samlede rækker for bestemte rækker ved hjælp af select

  2. Sådan fungerer TRY_CONVERT() i SQL Server

  3. Sådan får du antallet af specifikke rækker fra en anden tabel i en underforespørgsel

  4. SQL Server:Sådan udføres Rtrim på alle varchar-kolonner i en tabel