2009-12-04 27 views
49

Tôi có bản đồ chi tiết của hạt ở Hoa Kỳ, từ các tập dữ liệu TIGER LINE. Làm thế nào tôi có thể lấy mẫu, làm mịn hoặc làm suy giảm dữ liệu để tôi trở nên thẳng thắn hơn, hình hộp hơn, ít ồn hơn để đại diện cho các đặc điểm địa lý - trong trường hợp này chỉ là ranh giới hạt và đường trạng thái, nhưng cũng có thể trong trường hợp chung?Làm thế nào để làm suy giảm thông minh hoặc làm mịn dữ liệu GIS (đa giác đơn giản)?

Việc lấy mẫu có thể xảy ra vào thời gian hiển thị nếu có thể thực hiện hiệu quả hoặc tập hợp dữ liệu song song có thể được tạo và lưu trữ. Tôi đang sử dụng PostGIS và các đường là đa polylines được tạo bởi shp2pgsql - nhưng bất kỳ giải pháp nào mà bạn có đường kẻ nguệch ngoạc và giảm nó thành một đường thẳng mượt mà có cùng ý nghĩa với một thông dịch viên của con người sẽ rất hữu ích.

Trả lời

29

Vấn đề chỉ đơn giản là ném đi các điểm là bạn có thể nhanh chóng bóp méo hình dạng của đa giác gốc. Cách tiếp cận tốt hơn là đi theo hướng đó từ hướng khác; bắt đầu với một xấp xỉ cơ bản của đa giác và sau đó tinh chỉnh nó trở lên hướng tới hình dạng phức tạp của bạn.

Một ví dụ tuyệt vời về phương pháp này là Douglas-Puecker algorithm. Bạn bắt đầu với hai đỉnh được vẽ từ đa giác đầy đủ. Thêm một đỉnh thứ ba bằng cách chọn một đỉnh nằm xa nhất từ ​​một cạnh được vẽ giữa hai đỉnh đầu tiên. Tiếp tục thêm điểm cho đến khi bạn có một cái gì đó đủ giống với đa giác ban đầu của bạn.

8

Dưới đây là một đơn giản lặp đi lặp lại thuật toán làm mịn:

cho mỗi ba điểm liên tiếp trên mọi con đường, nếu điểm trung không có nút giao thông và nằm trong một số góc ngưỡng nhỏ của con đường trực tiếp giữa hai điểm bên ngoài, loại bỏ nó .

Lặp lại cho đến khi hài lòng.

58

Douglas-Peucker chắc chắn là phương pháp phù hợp. Có một số cách đơn giản để truy cập các triển khai của nó trong PostGIS và QGIS mà tôi nghĩ rằng tôi sẽ thêm ở đây cho những người gặp phải bài đăng này với một câu hỏi tương tự. Mục đích là để bắt đầu với một cái gì đó như thế này:

alt text

và kết thúc với một cái gì đó như thế này:

alt text

Trong PostGIS Douglas-Peucker được thực hiện như simplify, cú pháp, chi tiết here at bostongis.org, là một số biến thể của:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

Điều này làm việc rất tốt ngay cả trên toàn bộ tập dữ liệu quốc gia, với một số lỗi ít có vẻ do dữ liệu cơ bản xấu. Nó cũng chỉ ra rằng trong QGIS, mục menu Tools > Geometry Tools > Simplify Geometries sẽ xuất một shapefile được đơn giản hóa của bất kỳ hình học nào và thêm nó làm lớp cho dự án hiện tại của bạn.

Đây là bộ công cụ khá cơ bản và tôi đặt câu hỏi ở mức quá thấp, mặc dù thật tuyệt khi học toán cơ bản, có một giải thích tốt về số here: http://www.mappinghacks.com/code/PolyLineReduction/, cùng với mã mẫu không xuất hiện quá cần thiết!

+5

Tốt. Có cách nào để làm điều này trong khi vẫn duy trì các cạnh chung với các đa giác khác không? ví dụ. các quốc gia đơn giản hóa ở châu Âu, với các biên giới chung. – naught101

+0

các tùy chọn tổng quát đa giác khác với QGIS tại [Làm thế nào để mịn/tổng quát đa giác trong qgis] (http://gis.stackexchange.com/questions/25914/how-to-smooth-generalize-a-polygon-in-qgis) trên trang web GIS-SE. –

+2

cool, nhưng howto xử lý nhiều đa giác khi chúng ở cạnh nhau? như khi bạn có hình dạng của các vùng mã zip khác nhau? – Gerwald

7

Bạn cũng có thể thử thuật toán của Visvalingam, thuật toán này sẽ loại bỏ phần ít nhận biết nhất của một dòng.Dưới đây là một lời giải thích tuyệt vời của thuật toán:

17

Thay vì QGIS, tôi đề nghị sử dụng ogr2ogr vì nó does not delete polygons!

ogr2ogr output.shp input.shp -simplify 0.0001 
+3

Các đơn vị đơn giản hóa các đơn vị chiếu? Ví dụ có lẽ đó là lat hoặc độ dài? –

+0

Có vẻ như các đơn vị thực sự là các đơn vị được sử dụng cho các tọa độ trong tệp. –

4

Bạn cũng có thể sử dụng Simplify.js trong đó sử dụng một sự kết hợp của Douglas-Peucker và Radial cách thuật toán. Ngoài ra còn có các liên kết đến nhiều cổng đến các ngôn ngữ khác được liệt kê trên github project

Các vấn đề liên quan