PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Защо st_intersection връща не-многоъгълници?

ST_intersect връща няколко типа геометрия в зависимост от относителната топология.

Например стартиране на ST_intersect на два съседни полигона връща общата част от споделената граница.

Въпреки че извежда една таблица (както можете да проверите в pgadmin, например), в образеца на браузъра на QGIS тя ще бъде показана като множество таблици с различни типове геометрия (например:МНОГОГОЛНИК, МНОГОПОЛИ, ЛИНИЯ и ТОЧКА), но ( донякъде объркващо) със същото име.

Визуално можете да ги различите, като наблюдавате придружаващите икони вляво:

Можете обаче да изберете кой тип геометрия искате, например като добавите филтър WHERE с 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;

или, за производителност, го пренапишете по начин, подобен на:

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;

Последното решение създава анонимна временна таблица, която позволява ST_Intersection да се изпълнява само веднъж.

Може би сте забелязали, че трикът е в ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions който филтрира изходите от ST_Intersection така че да запазите само полигони (които имат топологична размерност 2).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите играч с максимален резултат от всяка група с помощта на SQL?

  2. Команда COPY:копирайте само определени колони от csv

  3. Импортирайте необработени байтове като необработени байтове в R

  4. LISTEN/NOTIFY pgconnection прекъсва java?

  5. SQL заявка, използваща IN със списък, много бавна