Thuật toán: di chuyển một đa tuyến nguồn sang một đa tuyến tham chiếu (hoàn toàn hoặc có thể một phần)


10

Trong hệ thống của chúng tôi, có những yêu cầu mà chúng tôi muốn chuyển một số dòng nguồn (với độ chính xác thấp) sang các dòng tham chiếu (với độ chính xác cao). Hình ảnh sau đây cho các trường hợp sử dụng bình thường. Màu đỏ là dòng nguồn và màu xanh là dòng tham chiếu.

Màu đỏ là dòng nguồn và màu xanh là dòng tham chiếu

Trong trường hợp này, dòng nguồn sẽ được di chuyển một phần và kết quả sẽ như dòng màu xanh lá cây hiển thị:

Di chuyển kết quả 1

Có những tình huống mà dòng nguồn cần phải được di chuyển hoàn toàn.

Ví dụ 2

Kết quả:

Di chuyển kết quả 2

Hiện tại giải pháp của chúng tôi là chiếu điểm đầu / điểm cuối của đường nguồn vào đường tham chiếu và ngược lại, sau đó tìm các điểm được chiếu trên đường nguồn và đường tham chiếu. Với các điểm được chiếu này, chúng ta có thể trích xuất phần cần thiết của nguồn và tham chiếu và sau đó kết hợp chúng thành một điểm mới.

Điều này hoạt động cho hầu hết các trường hợp, nhưng có những trường hợp phương pháp này không hoạt động. Cụ thể, khi một trong hai dòng có hình dạng "C" hoặc điểm đầu rất gần với điểm cuối. Hai hình ảnh tiếp theo đưa ra kịch bản.

C giống như đường hình

Áp dụng thuật toán của tôi, chúng tôi nhận được kết quả:

Các kết quả

Theo một cách dễ hiểu bởi vì thuật toán hiện tại chỉ tìm thấy các điểm được chiếu và trích xuất các dòng.

Những gì chúng tôi mong đợi là một cái gì đó như thế này:

Kết quả dự kiến

Vì vậy, những gì tôi cần thuật toán mạnh mẽ hơn để làm điều này để nó cũng có thể xử lý các trường hợp đặc biệt như trường hợp trước. Tôi đã cố gắng chiếu mọi điểm từ đường này sang đường khác và để tìm hai điểm được chiếu gần điểm đầu / điểm cuối của đường được chiếu, nhưng không có may mắn. Tôi vẫn có thể tìm thấy trường hợp cho kết quả bất ngờ.

Có ai gặp phải vấn đề tương tự trước đây? Sẽ thật tuyệt nếu có một phần mềm hoặc thư viện có thể làm công việc tương tự. Bất kỳ câu trả lời sẽ được đánh giá cao.


1
Có lẽ nó sẽ giúp bạn khi bạn xem cách cấu trúc liên kết trong ArcGIS kiểm tra xem các đối tượng có trùng nhau hay không: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#// đoạn "Xử lý cụm".
Jens

Cảm ơn câu trả lời của bạn, @Jens. Nhưng tôi sợ đó không phải là điều tôi muốn.
mfdev

Những dòng này đại diện cho một mạng? Có mối quan hệ topo giữa chúng?
Julien

Nó không phải là một mạng và có thể không có quan hệ cấu trúc liên kết.
mfdev

Câu trả lời:


4

Ước tính của tôi là các trường hợp kết thúc thường sẽ là trường hợp ngoại lệ không được lập trình bằng máy. Tôi đã làm việc với các vấn đề tương tự và họ luôn yêu cầu một số lượng chỉnh sửa thủ công nhất định. Những gì bạn cần điều chỉnh là các trường hợp ngoại lệ đang được tạo ra bởi vụ án và phục vụ chúng trong một hệ thống quản lý công việc cho người dùng cuối.


Một ví dụ tương tự về điều này có thể được nhìn thấy ở đây: vividsolutions.com/jcs JCS đi một chặng đường dài để tự động hóa sự kết hợp hình học, nhưng cũng bao gồm QA thủ công cho hình học mà nó không thể hợp nhất hoàn toàn. vividsolutions.com/ Kiếm Được xây dựng từ nó và cho phép QA và thêm theo dõi vấn đề cho hình học khó khăn.
DPierce

1
Tất cả các giải pháp tô pô không thể được tự động hóa bằng lập trình và trong các doanh nghiệp lớn, các giải pháp đó được phát triển tương tự như ví dụ vì sự sụp đổ có thể lớn và theo chu kỳ với hình học vận chuyển phức tạp với tốc độ thay đổi cao.
lewis

2

Bạn sẽ cần một dung sai snap và dung sai lần lượt cho thuật toán này (tôi giả sử bạn đã có dung sai snap).

Chiếu điểm đầu từ đường nguồn đến đường tham chiếu. Phá vỡ đường tham chiếu tại điểm chiếu này.

Đi qua đường nguồn từ điểm đầu đến đỉnh đầu tiên để có hướng di chuyển dọc theo đường nguồn. Di chuyển từng đường trong hai đường tham chiếu của bạn từ điểm nguồn được chiếu tới đỉnh tiếp theo. Nếu hướng di chuyển nằm trong dung sai rẽ của hướng di chuyển từ điểm đầu trên đường nguồn của bạn, thì hãy áp dụng thuật toán của bạn một cách bình thường, nhưng chỉ sử dụng phần đó của đường tham chiếu. Nếu thuật toán đến cuối dòng nguồn, bạn đã hoàn thành. Nếu không, ngắt dòng nguồn giữa phần được chuyển đổi và phần chưa được dịch (sẽ bao gồm điểm kết thúc).

Bây giờ lấy phần chưa được dịch và chiếu điểm cuối lên đường tham chiếu ban đầu. Làm thủ tục tương tự như trước ... đi qua nguồn từ điểm cuối đến đỉnh đầu tiên để tìm hướng di chuyển. Phá vỡ đường tham chiếu tại điểm cuối dự án và đi qua từng điểm để tìm xem hướng di chuyển từ điểm cuối dự kiến ​​có nằm trong dung sai rẽ không. Nếu vậy, sử dụng đoạn đó của dòng tham chiếu để áp dụng thuật toán bình thường.

Hãy nhớ rằng, tại thời điểm này, bạn chỉ sử dụng phần chưa được dịch, do đó bạn sẽ không trùng lặp với chuyển đổi điểm đầu.

Cuối cùng, hợp nhất hai đoạn đường kết quả nếu cần thiết: đoạn biến đổi điểm đầu từ điểm đầu chiếu sang điểm ngắt chưa được dịch và sau đó trên điểm kết thúc biến đổi từ điểm ngắt không được chuyển sang điểm cuối được chiếu.

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.