Menyederhanakan poligon yang berdekatan menggunakan PostGIS?

24

Saya mengalami masalah penyederhanaan seperangkat poligon yang berdekatan. Jika saya menyederhanakan setiap poligon secara terpisah dengan algoritma Douglas-Peucker (yang digunakan oleh banyak alat open source), poligon yang dihasilkan biasanya tidak berdekatan lagi. Masalah ini ada, misalnya, ketika menyederhanakan perbatasan negara / provinsi.

Adakah yang punya solusi untuk itu menggunakan PostGIS?

stachu
sumber

Jawaban:

19

Model vektor topologi akan menyediakan apa yang Anda butuhkan. Dalam penyimpanan non-topologis (seperti shapefile), satu sisi antara geometri disimpan dua kali. Dalam vektor topologi, area disimpan secara terpisah dari garis, sehingga penyesuaian dapat dilakukan tanpa mempengaruhi topologi. Saya tidak dapat menemukan diagram yang baik, jadi saya membuat contoh sederhana ini, di mana area A, B dan C dihitung dari persimpangan garis (menghubungkan 1-4) yang memisahkannya. contoh vektor topologi

Model ini digunakan oleh ArcInfo sebagai cakupan, dalam GRASS sebagai model vektor defaultnya , dan dapat digunakan dalam PostGIS dengan alat Topologi PostGIS eksperimental . Mungkin solusi yang lebih sederhana adalah mengubah data Anda menjadi garis, menghapus segmen yang berlebihan, dan kemudian membuat ulang poligon Anda setelah penyederhanaan.

scw
sumber
15

Anda ingin mengubah poligon Anda menjadi garis-garis, membuat garis-garis menjadi tepi cakupan sederhana, menyederhanakan tepi-tepi itu, kemudian membangunnya kembali menjadi poligon, dan akhirnya menggunakan point-in-poligon untuk bergabung kembali dengan atribut poligon lama dengan yang baru.

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));

Ada kesalahan di atas, tetapi konsep inti ada di sana. Anda dapat melakukan semuanya dalam satu permintaan jika mau.

Paul Ramsey
sumber
2

Untuk menghindari masalah ini, Anda harus memodelkan data Anda menggunakan batasan topologi. http://mapshaper.org/ melakukannya.

Julien
sumber
-1

Anda harus mengirim pemberitahuan. Dalam teori ARC / INFO lama tentang menciptakan geometri, dua geometri yang berdekatan dibuat oleh satu polyline dan membagikan polyline ini. Karena itu ketika Anda digeneralisasi, itu menggeneralisasi kedua perbatasan karena mereferensikan polyline yang sama.

CrazyEnigma
sumber