PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tại sao st_intersection trả về không phải là đa giác?

ST_intersect trả về một số loại hình học, tùy thuộc vào cấu trúc liên kết tương đối.

Ví dụ:chạy ST_intersect trên hai đa giác liền kề trả về phần chung của ranh giới được chia sẻ.

Trong khi nó xuất hiện một bảng (ví dụ như bạn có thể xác minh trong pgadmin), trong mẫu trình duyệt của QGIS, nó sẽ được hiển thị dưới dạng nhiều bảng thuộc các loại hình học khác nhau (ví dụ:POLYGON, MULTIPOLY, LINE và POINT) nhưng ( hơi khó hiểu) với cùng một tên.

Bằng mắt thường, bạn có thể phân biệt chúng khi quan sát các biểu tượng bên trái:

Tuy nhiên, bạn có thể chọn loại hình bạn muốn, ví dụ:bằng cách thêm bộ lọc WHERE với 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;

hoặc, vì lợi ích của hiệu suất, viết lại nó theo cách tương tự như:

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;

Giải pháp thứ hai tạo một bảng tạm thời ẩn danh, cho phép ST_Intersection chỉ chạy một lần.

Bạn có thể nhận thấy rằng thủ thuật nằm trong ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions bộ lọc đầu ra từ ST_Intersection để chỉ giữ lại các đa giác (có kích thước tôpô là 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. Làm cách nào để ngăn CakePHP thoát dữ liệu khi lưu?

  2. Có gì mới trong PgBouncer 1.6

  3. Cách tạo 52 tuần kể từ ngày hiện tại bằng Postgresql

  4. Lỗi sau khi cài đặt gói

  5. Python Postgres psycopg2 ThreadedConnectionPool đã cạn kiệt