Làm thế nào để đơn giản hóa một mạng có thể định tuyến?


24

Tôi có một biểu đồ mạng mà tôi cần đơn giản hóa theo nghĩa giảm số cạnh . Ý tưởng sẽ là hợp nhất các nút nằm gần nhau và loại bỏ các cạnh ngắn kết nối.

Làm thế nào điều này có thể đạt được trong PostGIS hoặc GRASS? Hoặc có cách tiếp cận nào tốt hơn để tự động đơn giản hóa một mạng như thế này không?

Tôi đã thử chức năng ST_SnapToGrid nhưng tôi không hài lòng với kết quả (màu xám = bản gốc, màu đen = được chụp):

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


1
Bạn đang làm điều này để đơn giản hóa một phân tích dựa trên mạng hoặc cho mục đích hiển thị? Nếu đó là trước đây, phân tích nào sẽ được thực hiện?
whuber

Đó là để phân tích con đường ngắn nhất.
underdark

2
Bởi vì nhiều thuật toán đường đi ngắn nhất là O (E + V), có lẽ bạn thậm chí không cần sự đơn giản hóa này? Ở một thái cực khác, đối với các phân tích như vậy, bạn thường có thể thực hiện các đơn giản hóa mạnh mẽ hơn. Chẳng hạn, tập hợp ba phân đoạn song song và các phân đoạn liền kề của chúng ở bên trái (trông giống như một hộp chữ H) có thể được thay thế bằng một hình tam giác nếu không có điểm gốc hoặc đích nằm trong các phân đoạn đó. Tôi đề cập đến điều này bởi vì tôi chắc chắn có mã (không phải là GIS) ngoài kia cho các hoạt động như vậy trên các biểu đồ (trừu tượng).
whuber

Bạn có muốn duy trì hình dạng của các cạnh (ví dụ: các đường cong) hoặc chỉ duy trì cấu trúc liên kết + nút XY đủ? Ngoài ra, bạn có cần đảm bảo các nút ở các Z khác nhau (ví dụ cầu vượt) không khớp với nhau không?
AnserGIS

Cấu trúc liên kết là chìa khóa. Hình học có thể thay đổi một chút. Thứ tự Z phải được giữ nguyên.
underdark

Câu trả lời:


7

Gần nhất tôi đã đến cho đến nay là:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

Đó là chụp các con đường với dung sai 5 mét và loại bỏ tất cả các đường có độ dài bằng không. Đây không phải là một giải pháp tối ưu vì nó dường như chụp ngẫu nhiên với một số đỉnh.

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


Thật vậy, kết quả có thể không chính xác nhưng việc sử dụng v.clean rất thú vị, cảm ơn vì đã chia sẻ
simo

Là hình ảnh được tạo ra trong cỏ?
NetConstructor.com

Hình ảnh cho thấy kết quả của GRASS v.clean được trực quan hóa trong QGIS.
underdark

Bất kỳ vấn đề với việc duy trì "giao lộ kỳ lạ" hoặc đường phân cách?
dassouki

Làm thế nào về việc xử lý ST_SnapToGrid sau v.clean?
kttii

5

Bạn đã thử GRASS v.generalize chưa?

v.generalizecho phép bạn chọn thuật toán tổng quát hóa với thuộc tính phương thức . Có một bó: douecraft, douecraft_redraction, lang, giảm, reumann, boyle, trượt_averaging, distance_ weighting, chaiken, ẩn sĩ, rắn, mạng, dịch chuyển .

Và tham số bổ sung như threshold, degree_thresh, angle_thresh(phụ thuộc vào thuật toán lựa chọn) có thể giúp bạn để có được một kết quả chính xác.

Đây là một hướng dẫn .


Cảm ơn vi đương link. Tôi đang dùng thử mặc dù tôi không thực sự có được sự kết hợp giữa các giá trị phương thức và ngưỡng sẽ mang lại kết quả mà tôi đang tìm kiếm.
underdark

Tôi thực sự không thể tìm thấy một phương pháp v.generalize sẽ làm những gì tôi muốn.
underdark

2
Thật đáng tiếc, lệnh này có rất nhiều thuật toán nhưng như bạn đã nói trước đây, có lẽ nó khá phức tạp để thiết lập để có được kết quả mong đợi. Có lẽ một guru tổng quát algoritms, ở đây? Bạn đã thử phương pháp rắn chưa?
simo

Không phải là một algo-guru ở đây, nhưng tôi thấy phương pháp rắn là tốt nhất cho một số hoạt động v.genralize mà tôi đã thực hiện trong quá khứ.
maning

1
Đối với bản ghi, các tham số đã được đơn giản hóa cho đến ngày hôm nay trong GRASS SVN. Để trở thành một phần của GRASS 6.4.2.
markusN

4

Tôi đã không làm điều này nhưng tôi nghĩ rằng tôi có thể đề xuất một hướng.

  1. Tạo một cấu trúc liên kết với PostGIS cho biểu đồ của bạn.
  2. Tìm tất cả các nút chỉ có hai cạnh.
  3. Chữa lành các cạnh.

ST_ModEdgeHeal sẽ hợp nhất một cạnh vào cạnh kia. ST_NewEdgeHeal sẽ thay thế cả hai bằng một cạnh mới.

Hướng dẫn sử dụng PostGIS Topology


Cảm ơn @Sean. Điều đó sẽ làm gì khác hơn là hợp nhất hai cạnh? Bất kỳ ý tưởng về làm thế nào để loại bỏ các cạnh ngắn và chụp các nút của họ với nhau?
underdark

@Underdark, tôi không thấy gì đơn giản cả. Bạn có thể làm tất cả bằng PL / SQL nhưng điều đó có thể không hữu ích. Bạn có thể chạy ST_SnapToGrid trước không?
Sean

1

@underdark, tôi thấy rằng bạn đã viết một công cụ để tăng cường các dòng trong Sextante. Do đó, tôi đề xuất thuật toán sau để tránh "ngẫu nhiên" chụp một trong những điểm của bạn.

Chọn các phân đoạn dòng mà bạn muốn thoát khỏi dựa trên chiều dài của chúng.

Đối với mỗi phân đoạn đó, hãy tạo một điểm ở điểm giữa

Xóa đoạn nhỏ

Bây giờ bạn có thể sử dụng ST_Snap trong PostGIS (xem ví dụ tại đây )

EDIT: lưu ý rằng trong trường hợp của bạn, trước tiên bạn cũng có thể sử dụng v.net để xóa các nút giả (nút chỉ kết nối hai dòng)


Vui lòng giải thích cách v.net có thể được sử dụng để loại bỏ các nút giả. Cảm ơn
osmjit

0

Chuyển tiếp cách Michaël Michaud đã phân tích điều này trên danh sách nhà phát triển OpenJUMP:

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles

Cảm ơn bạn đã gửi câu trả lời này. Tôi hơi bối rối tại sao bạn lại buộc đồ thị lên mặt phẳng. Xét cho cùng, mạng lưới đường phố không phải là đồ thị phẳng (cầu, đường hầm).
underdark

Chỉ bởi vì Michaël đã thực hiện một thử nghiệm nhanh với các công cụ đồ thị hiện có mà anh ta đã viết cho OpenJUMP và họ không hỗ trợ các đồ thị không phẳng vào lúc này. Bỏ qua bước đầu tiên nếu QGIS và GRASS có các công cụ tương tự hỗ trợ các đồ thị không phẳng.
dùng49584

Tôi nghĩ rằng đây là cách tiếp cận phù hợp - tách mạng thành các đồ thị phẳng. Trong mỗi biểu đồ phẳng, vấn đề đơn giản hơn - ví dụ người ta có thể sử dụng cách tiếp cận ở trên, hoặc chỉ đơn giản là tam giác và làm cỏ TIN của các cạnh đường ngắn. Sau đó trích xuất các cạnh đường một lần nữa và hợp nhất các lớp lại với nhau.
AnserGIS
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.