Đơn giản hóa các đa giác liền kề bằng PostGIS?


24

Tôi gặp phải một vấn đề đơn giản hóa bộ đa giác liền kề. Nếu tôi đơn giản hóa từng đa giác một cách riêng biệt với thuật toán Douglasucker Peucker (được sử dụng bởi nhiều công cụ nguồn mở), thì đa giác kết quả thường không liền kề nữa. Vấn đề này tồn tại, ví dụ, khi đơn giản hóa biên giới của các quốc gia / tỉnh.

Có ai có một giải pháp cho nó bằng PostGIS không?

Câu trả lời:


19

Một mô hình vector cấu trúc liên kết sẽ cung cấp những gì bạn cần. Trong một bộ lưu trữ không tôpô (như shapefile), một cạnh duy nhất giữa hình học được lưu trữ hai lần. Trong một vectơ tô pô, các khu vực được lưu trữ riêng biệt với các dòng, do đó điều chỉnh có thể được thực hiện mà không ảnh hưởng đến cấu trúc liên kết. Tôi không thể tìm thấy một sơ đồ tốt, vì vậy tôi đã tạo ra ví dụ đơn giản này, trong đó các khu vực A, B và C được tính từ các giao điểm của các đường (nối 1-4) tách chúng ra. ví dụ về một vectơ tôpô

Mô hình này được ArcInfo sử dụng làm lớp phủ, trong GRASS làm mô hình vectơ mặc định của nó và có thể được sử dụng trong PostGIS với công cụ Topology của PostGIS thử nghiệm . Có lẽ một giải pháp đơn giản hơn là chuyển đổi dữ liệu của bạn thành linework, loại bỏ các phân đoạn dư thừa và sau đó tạo lại đa giác của bạn sau khi đơn giản hóa.


15

Bạn muốn biến đa giác của mình thành các đường, biến các đường đó thành các cạnh bao phủ đơn giản, đơn giản hóa các cạnh đó, sau đó xây dựng lại chúng thành đa giác một lần nữa và cuối cùng sử dụng đa giác điểm để nối lại các thuộc tính của đa giác cũ với những cái mới.

CREATE TABLE rings AS SELECT (ST_DumpRings(polys)).geom AS rings FROM polytable;
CREATE TABLE simplerings AS SELECT ST_Union(rings) AS simplerings FROM rings;
CREATE TABLE newpolycollection AS SELECT ST_Polygonize(ST_Simplify(simplerings, 10.0)) AS geom FROM simplerings;
CREATE TABLE newpolysnoattributes AS SELECT (ST_Dump(geom)).geom FROM newpolycollection;
CREATE TABLE newpolytable AS SELECT new.geom, old.attr FROM newpolysnoattributes new, polytable old WHERE ST_Contains(new.geom, ST_PointOnSurface(old.polys));

Có lỗi ở trên, nhưng khái niệm cốt lõi là có. Bạn có thể làm tất cả trong một truy vấn nếu bạn muốn.



-1

Bạn cần phải tessellate. Trong lý thuyết tạo hình học ARC / INFO cũ, hai hình học liền kề được tạo bởi một đa tuyến và chia sẻ đa tuyến này. Do đó, khi bạn khái quát hóa, nó khái quát cả hai đường viền vì nó tham chiếu cùng một đa tuyến.

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.