Đơn giản hóa các đa giác liền kề bằng cách sử dụng công cụ QGIS Simplify Geometries


10

Tôi có một Shapefile lớn với 200.000 đa giác nhưng tệp quá lớn cho ứng dụng sẽ sử dụng nó. Tôi muốn khái quát các đa giác này và tạo tập tin nhỏ hơn nhiều.

Tôi đã cố gắng thực hiện điều này trong QGIS bằng công cụ "Đơn giản hóa hình học". Tôi đã thử điều này trên một phần rất nhỏ trong Shapefile của tôi và tôi hài lòng với kết quả nhưng có một vấn đề nhỏ mà tôi không biết làm thế nào để giải quyết. Tôi đã thêm hình ảnh để hiển thị vấn đề.

Ranh giới TRẮNG là ranh giới trước khi đơn giản hóa. Ranh giới ĐỎ là sau khi đơn giản hóa. Các khu vực vấn đề được khoanh tròn với màu cam. Như bạn có thể thấy "ranh giới đơn giản hóa" chứa một số khu vực mà sau khi đơn giản hóa không thuộc về bất kỳ đa giác nào trước đó.

Làm cách nào để đơn giản hóa Shapefile này và giữ các ranh giới chung giữa các đa giác thành một dòng duy nhất và loại bỏ các khu vực đã được tạo sau khi đơn giản hóa?

Đa giác đơn giản hóa trong QGIS

THÔNG TIN THÊM:

Sau khi làm theo hướng dẫn

  1. Chuyển đổi đa giác thành dòng
  2. Đơn giản hóa các dòng
  3. Chuyển đổi dòng trở lại đa giác

Tôi nhận được kết quả sau đây. Nó tốt hơn một chút so với trước đây nhưng tôi vẫn nhận được các khu vực bên ngoài đa giác ban đầu (xem các khu vực màu trắng trong hình dưới đây).

@Andrew đề nghị tôi liên kết từng dòng với đa giác liền kề nhưng tôi không biết làm thế nào để làm điều đó trong QGIS.

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

Tôi vẫn đang cố gắng hoàn thành quá trình đơn giản hóa đa giác. Tôi đã làm theo hướng dẫn được đề xuất trong bài đăng này và khi tôi nghĩ rằng tôi nhận được kết quả chấp nhận được thì lại xuất hiện thêm một vấn đề nữa. Dưới đây là tóm tắt những gì tôi đã làm với hình ảnh của kết quả. Tất cả các bước đã được thực hiện bằng cách sử dụng hộp công cụ PROCESSING trong QGIS.

  1. Đầu tiên, tôi chuyển đổi đa giác thành dòng
  2. Thứ hai, tôi đã làm sạch các dòng bằng v.clean với tùy chọn ngắt. Điều này dẫn đến LAYER SẠCH SẠCH và LAYER LRI. Lớp lỗi (các chấm màu xanh lục trên hình ảnh được cung cấp) có dấu chấm màu xanh lá cây trên mỗi giao lộ dòng. Tôi không biết điều này có nghĩa là gì.
  3. Thứ ba, tôi đã đơn giản hóa các dòng bằng công cụ "SIMPLIFY GEOMETRY" (kết quả là các dòng màu đỏ trong hình ảnh). So sánh các dòng màu đỏ đơn giản và dòng màu cam ban đầu tôi hài lòng với kết quả.
  4. Thứ tư, tôi muốn chuyển đổi các dòng trở lại thành đa giác bằng cách sử dụng công cụ "Đa giác hóa" trong "QUY TRÌNH" và nhận được kết quả mà tôi không mong đợi (hình ảnh thứ hai với đa giác màu ô liu tối). Dường như các giao diện lớp lỗi được kết nối đa giác và tạo ra tập hợp đa giác hoàn toàn khác nhau bỏ qua các đường đơn giản.

Ai đó có thể giải thích những gì đã sai ở đây?

Tại sao các dòng đơn giản hóa màu đỏ không được chuyển đổi đúng thành đa giác đơn giản?

Như bạn có thể thấy tôi không phải là một chuyên gia về GIS nhưng cần phải tự làm điều này. Tôi không biết liệu tôi có ở quá xa giải pháp hay không nhưng thật bực bội khi tôi có thể thấy các dòng đơn giản hóa mà tôi thấy chấp nhận được cho những gì tôi muốn làm nhưng không thể chuyển đổi chúng thành đa giác.

Dưới đây là hai hình ảnh với kết quả của hai bước cuối cùng của quy trình:

Dòng đơn giản và dòng gốc

Kết quả của các dòng đơn giản hóa


@nhopton On Polygonizer trang web plugins.qgis.org/plugins/Polygonizer nó nói rằng nó "Tạo đa giác từ đường giao nhau". Điều này cho thấy rằng đa giác sẽ được tạo bất cứ khi nào có giao điểm đường thẳng (nhưng có thể cách hiểu của tôi là sai). Những gì tôi cần là để loại bỏ những khoảng trống đã được tạo ra khi sử dụng công cụ "đơn giản hóa hình học" và nếu Polygonizer có thể làm được thì tôi sẽ rất tỉnh táo.
David

Suy nghĩ về nó, lớp đa giác ban đầu của bạn nên đơn giản hóa mà không có vấn đề. Nếu nó không làm điều này tôi nghĩ có lẽ điều đó có nghĩa là bạn có đa giác xấu trong dữ liệu gốc. Các đa giác chồng lên nhau một chút hoặc có khoảng cách nhỏ giữa chúng. Hãy thử phóng to các khu vực có vấn đề để xem bạn có thể tìm thấy bất cứ thứ gì như thế này không. N.
nhopton

Một cách tốt để bảo tồn cấu trúc liên kết bao gồm quy trình công việc được đề xuất bởi @radouxju (ngoại trừ tính toán trọng tâm không cần thiết) và được trình bày trong mô hình Xử lý trong câu trả lời của tôi. Ngoài ra, tôi nghĩ rằng GRASS v.generalizelà một lựa chọn tuyệt vời khác. Hi vọng điêu nay co ich.
Antonio Falciano

Câu trả lời:


7

Tôi đã nhận được một kết quả khá tốt khi sử dụng GRASS v.generalize từ Hộp công cụ xử lý bằng các giá trị mặc định:

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

Một số dòng vẫn còn nguyên.


Đã thành công tốt đẹp với phương pháp này sau khi đặt dung sai snap v.in.ogr từ -1 (không snap) thành 0,00001 theo đề xuất của @Kantan.
cm1

4

Tôi đã gặp vấn đề đó với Qgis2.16, nhưng không thể yêu cầu GRASS đưa ra kết quả chính xác về mặt cấu trúc như @AndreJ.

Một cách giải quyết tốt là thay đổi dung sai snap v.in.ogr trong các tham số nâng cao của công cụ v.generalize.simplify . Mặc định là -1, ngăn chặn việc chụp nhanh trong GRASS.

Bằng cách đặt một giá trị nhỏ ở đây (như 1e-05 m), tính năng chụp nhanh được bật và GRASS nhận ra đường viền chung của đa giác. Việc đơn giản hóa sau đó đưa ra một lớp chính xác về mặt tôpô, không có lỗ hổng.

Lưu ý: Bằng cách đặt dung sai snap thành giá trị cao hơn, thậm chí có thể thay đổi đa giác để có thể xóa các đa giác rất mỏng nếu bạn muốn. Thực hiện theo thao tác đó với v.clean bằng rmarea và một ngưỡng đủ lớn để xóa phần còn lại nhỏ, và bạn đã hoàn tất!


3

đầu tiên chuyển đổi đa giác của bạn thành các dòng

sử dụng v.clean để làm sạch cấu trúc liên kết của bạn (với tùy chọn "ngắt")

sau đó bạn đơn giản hóa các dòng của bạn

Cuối cùng, bạn chuyển các dòng của bạn trở lại đa giác. (Sử dụng đa giác)

EDIT: Để có được các thuộc tính của đa giác của bạn, cách tốt nhất, nếu bạn không có đa giác nhiều phần trong tập dữ liệu ban đầu , là lấy các tâm của đa giác cũ và đơn giản hóa và tham gia chúng dựa trên vị trí gần nhất (centroid nên không di chuyển nhiều nếu bạn chỉ sửa đổi một chút ranh giới của mình)


1
Điều này đối với tôi giống như bạn bỏ qua một vài bước, mặc dù cuối cùng thì quy trình làm việc có thể hoạt động. Khi bạn chuyển đổi đa giác thành các dòng, bạn có thể cần liên kết dòng với tất cả các đa giác liền kề. Sau đó, sau khi đơn giản hóa, bạn cần biến các dòng trở lại thành đa giác nhiều phần. Nếu đa giác ban đầu là lồi, bạn có thể khớp với bản gốc với đơn giản hóa bằng cách sử dụng centroid (ví dụ: nếu centroid của bản gốc được chứa trong poly được đơn giản hóa thì đó là một kết hợp). Nếu chúng không lồi mặc dù nó sẽ khó hơn nhiều.
Andy W

Xin chào, tôi đã làm theo quy trình được đề xuất bởi radouxju nhưng tôi vẫn nhận được các phần của đa giác ban đầu bên ngoài ranh giới ban đầu của nó. Làm cách nào để liên kết dòng này với tất cả các đa giác liền kề trong QGIS? Tôi đang lên kế hoạch sử dụng các đa giác này trong các ứng dụng web và cần giảm số lượng nút để tải nhanh hơn. Những gì tôi nhận được bây giờ là giảm tốt nhưng tôi không thể thoát khỏi những khu vực nhỏ đang có sau khi đơn giản hóa. Bất kỳ ý tưởng để giải quyết điều này sẽ được đánh giá rất cao.
David

@David. Tôi nghĩ vấn đề của bạn có thể xảy ra với Bước 3, chuyển sang đa giác. Trong Bộ công cụ xử lý có một công cụ gọi là "Đa giác" và tôi sẽ thử điều này. Tôi nghĩ rằng điều này vẫn cần các gói Shapely và Numpy được cài đặt. Điều này nói rằng, tôi không thể có được "Đa giác" để làm việc cho tôi trong QGIS-Master chỉ trong một phút. N.
nhopton

2

Bạn có thể giải quyết vấn đề với mô hình Xử lý (ví dụ SEXTANTE) như thế này:

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

Phiên bản script:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Lưu ý: các hạn chế duy nhất là thị trường chung có được IDtrong Join attributes table, vì là lĩnh vực duy nhất của sản lượng Lines to polygons. Đó là lý do tại sao trường chung không phải là đầu vào biến của mô hình. Vì vậy, một IDtrường phải có sẵn trong lớp đa giác đầu vào.

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.