Tách chồng chéo giữa các đa giác và gán cho đa giác gần nhất bằng PostGIS?


8

Câu hỏi của tôi khá liên quan đến sự trùng lặp Chia không được trả lời giữa các đa giác thành các tập hợp rời rạc trừ khi tôi không sử dụng shapely, tôi đang sử dụng PostGIS 2.4 trên PostgreQuery 10.

Tôi có một bảng chứa nhiều bộ dữ liệu cho các đơn vị hành chính. Các hình học chỉ bao gồm diện tích đất. Mục tiêu của tôi là kéo dài chúng một khoảng cách nhất định xuống nước.

Để mở rộng các đa giác hiện tại vào trong nước, tôi thực hiện một bộ đệm theo sau bằng cách trừ tất cả các hình học khác trong bảng. Điều này cắt bộ đệm trong đó hình học có hàng xóm và giữ lại bộ đệm nơi lớp hiện không có gì. Vì vậy, một cái gì đó như:

SELECT c1.name
     , ST_Difference( ST_Buffer( ST_Union(c1.geom), 250 )
                    , (SELECT ST_Union(c2.geom)
                         FROM foo.county AS c2
                        WHERE c2.name <> c1.name)
                    )
  FROM foo.county AS c1
 GROUP BY c1.name;

Tuy nhiên, điều này tất nhiên mang lại cho tôi bộ đệm chồng chéo trong đó hai đa giác gặp nhau ở mép nước, cũng như trên các eo hẹp:

bản đồ

(Lưu ý rằng mảnh màu tím nhỏ ở bên trái phải được gán hoàn toàn cho đa giác màu đỏ, vì không có điểm nào trong hình học đó gần với màu xanh hơn màu đỏ do bán đảo giống như phụ lục.)

Đây là nơi tôi bị mắc kẹt. Tôi muốn cắt các phần chồng chéo (các phần màu tím) thành hai đa giác rời rạc dọc theo một đường thẳng tương đương với các đa giác không có bộ đệm, và sau đó trừ đi các phần tử từ các hạt được đệm.

Tôi không nghĩ rằng tôi có một trường hợp có ba hoặc nhiều bộ đệm chồng chéo. Tôi sẽ đi qua cây cầu đó nếu và khi tôi đến đó.

Nó có mùi đối với tôi giống như một cái gì đó tương tự nhưng không hoàn toàn giống với việc sử dụng ST_VoronoiPolygonsnhưng xung quanh các đa giác thay vì các điểm.

Điều này có tồn tại hay không - lý tưởng - như các chức năng của PostGIS, như chức năng xử lý địa lý của QGIS hoặc có thể trong một số thư viện python?


Trong hình ảnh trên, đó có phải là đốm nhỏ của vùng biển quốc tế không màu xanh? hoặc bạn điền nó vào?
Evan Carroll

Không phải màu xanh đơn giản là bên ngoài tất cả các đa giác - Tôi chỉ thực hiện bộ đệm 250 mét nên nó vẫn là vùng nước quốc gia. Đối với mục đích của tôi, tôi chỉ cần một bộ đệm nhỏ để đảm bảo tôi bắt được các tính năng "trong lướt web". Nhìn thấy cái lỗ ở phía nam của đảo vòng ở giữa chắc chắn khiến tôi cũng muốn làm một bãi rác bên ngoài, nhưng điều đó không liên quan đến câu hỏi này. :)
kthy

Bạn đã tìm thấy một giải pháp? Tôi đang đối mặt với một vấn đề tương tự và muốn chia một số đa giác chồng chéo cho hàng xóm của họ.
DanielK

Không có giải pháp nào, thật đáng buồn. Tôi có một ý tưởng để tiến bộ bằng cách sử dụng kết hợp ExteriorRingIntersectsnhưng không có thời gian để thực hiện nó trong các ngày lễ.
kthy

ví dụ của bạn có thể đã được tự động hóa một phần, nhưng hàm st_difference hoạt động khủng khiếp khi cắt, để lại "ria mép" trên các cạnh của vết cắt, điều này buộc nhà phát triển phải tìm cách giải quyết và các trường hợp ghép đa giác có thể vừa đơn giản vừa phức tạp, Điều này sẽ đòi hỏi phải sửa đổi thủ công ... bạn vẫn phải đối mặt với công việc với ví dụ của mình?
Cyril Mikhalchenko

Câu trả lời:


5

Nếu giải pháp cho vấn đề này có liên quan và tôi hiểu nó một cách chính xác, thì giải pháp của nó là như sau: (Dữ liệu ban đầu là trừu tượng, vì tôi hiểu nó nằm liền kề trên bộ đệm với một số mét nhất định, trong trường hợp của tôi là 2 bảng : exper_list3 và exper_list4 xem hình 1):

nhập mô tả hình ảnh ở đây 1) Trong pgAdmin, chạy truy vấn: create table exper_list5 as SELECT st_intersection (exper_list4.geom, exper_list3.geom) AS geom FROM exper_list4, exper_list3 WHERE st_intersects (exper_list4.geom, exper_list3.geom) = true; result: bảng exper_list5 xem hình 2;

nhập mô tả hình ảnh ở đây

2) Trong pgAdmin, hãy chạy truy vấn: create table exper_list6 as SELECT (ST_Dumppoints (geom)). Geom FROM exper_list5; Kết quả là một bảng có dấu chấm, ngoài ra đi đến thuộc tính bảng, tạo trường gid và đặt các hạn chế đối với nó;

3) Trong QGIS, chạy công cụ Đa giác Voronoi trên bảng (lớp vectơ) exper_list6 Kết quả được hiển thị trong Hình 3.

nhập mô tả hình ảnh ở đây

4) Trong pgAdmin, chạy truy vấn: create table exper_list8 as SELECT (ST_Dumppoints (geom)).geom FROM exper_list7; Kết quả được hiển thị trong Hình 4.

nhập mô tả hình ảnh ở đây

5) Chọn từ exper_list8 những điểm nhập đa giác exper_list5 Trong pgAdmin, chạy truy vấn: create table exper_list9 as SELECT st_intersection (exper_list8.geom, exper_list5.geom) AS geom FROM exper_list8, exper_list5 WHERE st_intersects (exper_list8.geom, exper_list5.geom) = true; và sao chép các điểm này vào kết quả bảng exper_list6 hình 5;

nhập mô tả hình ảnh ở đây

6) Trong QGIS Trên bảng exper_list6 chạy công cụ "Delaunay triangulation" và nhận kết quả exper_list10 xem hình 6

nhập mô tả hình ảnh ở đây

7) Trong QGIS ở chế độ chỉnh sửa "Bút chì" trong bảng exper_list10, hãy chọn những hình tam giác chạm vào vùng quan tâm, sử dụng công cụ "Vector" - "Geoprocessing" - "Thống nhất theo tính năng" (kiểm tra "chỉ các đối tượng được chọn" "Phân loại" - bằng tất cả các dấu hiệu) kết quả exper_list11 hình 7;

nhập mô tả hình ảnh ở đây

8) Từ exper_list6 cắt exper_list11 kết quả hình 8 exper_list12;

nhập mô tả hình ảnh ở đây

9) Từ exper_list4 cắt exper_list11 kết quả hình 9 exper_list13;

nhập mô tả hình ảnh ở đây

10) Các hành động tương tự phải được thực hiện với đa giác bên trái (trong trường hợp của tôi, bảng exper_list4)

11) Kết quả chung là hai bảng exper_list13 và exper_list14 xem hình 10.

nhập mô tả hình ảnh ở đây

chúc may mắn, bạn trung thành


Điều này trông giống như vàng rắn. Tôi sẽ đánh dấu nó là được chấp nhận một khi tôi có thời gian để kiểm tra nó vào tuần tới. Cảm ơn!
kthy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.