sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför returnerar st_intersection icke-polygoner?

ST_intersect returnerar flera geometrityper, beroende på den relativa topologin.

Till exempel köra ST_intersect på två intilliggande polygoner returnerar den gemensamma delen av den delade gränsen.

Medan den skickar en enskild tabell (som du kan verifiera i till exempel pgadmin), kommer den i webbläsarprovet för QGIS att visas som flera tabeller av olika geometrityper (till exempel:POLYGON, MULTIPOLY, LINE och POINT) men ( något förvirrande) med samma namn.

Visuellt kan du skilja dem åt genom att observera de medföljande ikonerna till vänster:

Du kan dock välja vilken typ av geometri du vill ha, till exempel genom att lägga till ett 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, för prestations skull, skriv om det på ett sätt som liknar:

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;

Den senare lösningen skapar en anonym temporär tabell, som tillåter ST_Intersection att köra endast en gång.

Du kanske har märkt att tricket är i ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions som filtrerar utdata från ST_Intersection för att bara behålla polygoner (som har en topologisk dimension på 2).




  1. Lägger till "seriell" till befintlig kolumn i Postgres

  2. Hittade:bit, förväntat:boolean efter Hibernate 4-uppgradering

  3. Konvertera mysql frågelogik till Laravel frågebyggare

  4. Att göra-lista-applikation som använder PHP och MySQL-databas