Thuật toán để tính phạm vi bao phủ + chồng lấp từ một tập hợp các cung


10

Tôi có một shapefile chứa các vòng cung đại diện cho con đường di chuyển bằng một chiếc xe tải rải phân bón vào một trang trại.

Giả sử tôi biết chiều rộng trải rộng là 30m, tức là xe tải có thể rải phân bón 15m ở hai bên xe.

Tôi muốn tạo ra một tập hợp đa giác, cho thấy:
1) Tổng diện tích nhận phân bón
2) Các khu vực chồng chéo, tức là hai đường chuyền riêng biệt quá gần nhau, do đó một số phần của trang trại nhận được gấp đôi "liều" chính xác "Phân bón.

Một cách tiếp cận ngây thơ là chỉ tạo các đa giác bao phủ như bộ đệm xung quanh các cung. Điều này hoạt động trong trường hợp đặc biệt trong đó các đường lây lan là khác biệt với nhau. Tuy nhiên, chiếc xe tải có thể hình dung đi vòng quanh trang trại theo hình xoắn ốc ngày càng giảm và một bộ đệm đơn giản sẽ không thể hiện sự chồng chéo trong đó hai đường xoắn ốc quá gần nhau (nếu hình xoắn ốc là một vòng cung, tôi sẽ kết thúc bằng một đa giác đơn không có phần chồng chéo).

Nếu nó có liên quan, tôi đang sử dụng TatukGIS VCL DK, nhưng tôi thực sự đang tìm kiếm một thuật toán hơn là một giải pháp cụ thể.

Một số làm rõ để đáp ứng với các cuộc thảo luận cho đến nay:

1) Tôi không thể dựa vào dữ liệu vectơ có bất kỳ siêu dữ liệu cụ thể nào (ví dụ: nhật ký GPS hoặc tốc độ lan truyền). Tôi cho phép người dùng chọn một lớp và chỉ định độ rộng trải, sau đó báo cáo sẽ chạy.

2) Mục đích của báo cáo là thực sự cho người dùng thấy người điều khiển phương tiện "lành nghề" như thế nào, trong đó "lành nghề" có nghĩa là "đạt được phạm vi bảo hiểm cao nhất với độ chồng chéo thấp nhất".

3) Tôi cảm thấy thoải mái hơn ở vùng đất vector hơn vùng đất raster, vì vậy sẽ thích các giải pháp dựa trên vector hơn.

Cảm ơn,

Em yêu


1
Tôi tự hỏi nếu điều này sẽ tương tự như các phương pháp dự đoán lượng mưa tích lũy dựa trên các đường bão dự báo.
Kirk Kuykendall

Câu trả lời:


3

Có lẽ giải pháp đơn giản nhất là chia hình học đơn thành các phân đoạn và đệm các phân đoạn riêng lẻ đó: trong trường hợp xoắn ốc của bạn, bạn đệm từng cung, sau đó cắt các cung riêng lẻ để đưa ra số đếm. Cẩn thận để tránh chồng chéo sai bằng cách không đệm phần cuối của các phân đoạn, chỉ ở bên trái và bên phải của chính các phân đoạn.

Một cách tiếp cận khác là phủ một lưới đa giác trên dữ liệu, và sau đó trong mỗi ô lưới, đệm riêng từng đoạn đường giao nhau. Để chính xác trong điều này, bạn muốn lấy ô lưới được phân tích, đệm nó, sau đó thu thập các phân đoạn giao nhau và đệm chúng, thực hiện phân tích của bạn trong cửa sổ ô ban đầu.

Một trong hai tùy chọn này sẽ cung cấp cho bạn ước tính trùng lặp hợp lý, tôi có thể nghĩ ra một vài cách tiếp cận chính xác hơn nhưng chúng đòi hỏi phải biết điều gì đó về dữ liệu.


Cảm ơn. Tôi đã suy nghĩ theo dòng gợi ý đầu tiên của bạn - chia hình học thành các phân đoạn và đệm chúng. Tôi nghĩ rằng tôi cũng cần phải đệm phần cuối của các phân đoạn, để tôi có được các cạnh tròn ở các góc. Nghĩ về trường hợp tôi bắt đầu bằng một đường thẳng góc - nếu tôi không đệm các đầu, tôi sẽ kết thúc bằng hai hình chữ nhật chồng chéo với một hình vuông bị thiếu ở bên ngoài góc (khó diễn tả dưới dạng văn bản!)
dbruning

Tôi nghĩ rằng tôi cũng cần phải đệm phần cuối của các phân đoạn, để tôi có được các cạnh tròn ở các góc. Tôi đã suy nghĩ thêm về việc giao cắt bộ đệm cho từng phân đoạn với bộ đệm cho phân khúc trước đó và sau đó tích lũy chỉ các phần "mới" của mỗi bộ đệm vào bộ đệm chính. Ý tưởng là bỏ qua các phần trùng lặp với phân khúc trước nhưng chọn phần trùng lặp với các phân khúc cũ hơn.
dbruning

2

Không có giải pháp, nhưng một số đầu vào:

Vấn đề này có vẻ tương tự như vấn đề phát hiện hợp nhất dòng trong tổng quát hóa bản đồ . Nó xảy ra khi một kiểu lớn được áp dụng trên một đường hình sin (biểu tượng tự chồng lấp):

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

Tài liệu này trang 176 đến 180 (bằng tiếng Pháp ... xin lỗi) đưa ra một thuật toán để phát hiện các phần tự giao nhau như vậy. Nguyên tắc là, theo đề xuất của scw , để sử dụng bộ đệm một phía của mỗi phân đoạn bao gồm một phân đoạn cộng với 0, 1 hoặc 2 vòng tròn vòng cung. JTS chứa một triển khai bộ đệm một phía này có thể hữu ích.


Tại sao bạn quan tâm đến việc phát hiện giao lộ tự? Và tại sao bạn lại đề xuất bộ đệm "một mặt"? Không có vẻ gì là nguyên nhân của vấn đề.
whuber

Mục đích là để phát hiện nơi xe tải rải phân bón nhiều lần, đó là nơi khu vực lây lan tự giao nhau.
Julien

2

Một giải pháp vectơ sẽ bỏ lỡ một biến có khả năng quan trọng : thời gian và thông qua nó, tốc độ lan truyền. Khi máy kéo di chuyển nhanh hơn, lượng phân bón được phân bổ ít hơn trên một đơn vị diện tích và khi nó di chuyển chậm hơn (giảm tốc vào một ngã rẽ và tăng tốc ra khỏi một) sẽ phân bổ nhiều phân bón hơn trên mỗi đơn vị diện tích. Hơn nữa, nếu máy kéo trải vật liệu trong khi quay, vật liệu sẽ tập trung nhiều hơn vào bên trong vòng quay và ít tập trung về phía bên ngoài.

Dữ liệu thời gian sẽ có sẵn trong bản ghi GPS về tiến trình của máy kéo. Độ dốc (quãng đường di chuyển chia cho thời gian trôi qua) sẽ ước tính tốc độ tại mọi điểm. Ngoài ra, người ta có thể (như một xấp xỉ) giả định tốc độ không đổi trong phần bên trong của trường và tốc độ chậm hơn trong bộ đệm bên trong hợp lý của ranh giới của trường.

Một đại diện raster có thể xử lý các vấn đề này. Rasterize đường dẫn của máy kéo. Điều này đặt tất cả các ô không được vượt qua bởi máy kéo thành các giá trị NoData (hoặc bằng không). Nếu máy kéo di chuyển với tốc độ không đổi tiêu chuẩn, nó sẽ đủ để đặt một giá trị không đổi trong mỗi ô dữ liệu. Bây giờ, ví dụ, nếu máy kéo di chuyển với tốc độ gấp đôi tốc độ này, (có lẽ là) tốc độ ứng dụng của nó sẽ giảm một nửa và điều này có thể được biểu thị bằng cách giảm một nửa giá trị trong các ô.

Nói chung, giá trị để đặt trong bất kỳ ô nào là tỷ lệ ứng dụng trên một đơn vị diện tích . Nếu máy kéo trải đều x Kg phân bón mỗi giây ra 15 m mỗi bên trong khi di chuyển với tốc độ y m / giây, thì nó đang lan truyền x / y Kg / giây / [m / giây] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 phân bón. Do đó, x / (30 y ) là giá trị cần đặt trong mỗi ô. x được cho và y được tính từ dữ liệu GPS.

Tự giao nhau là không có vấn đề về nguyên tắc. Nếu đường dẫn của máy kéo đi qua chính nó, hãy thêm các đóng góp mỗi khi nó lặp lại một ô. Nó có thể yêu cầu một số xử lý đặc biệt để thực hiện việc này, tùy thuộc vào cách tạo lưới và khả năng của phần mềm GIS.

Thực hiện công tác chuẩn bị đó, phần còn lại rất nhanh và dễ dàng: một tiêu điểm của lưới này, sử dụng một vùng lân cận tròn có bán kính 15 m, tìm thấy lượng tích lũy trải trên mỗi đơn vị diện tích trong mỗi ô.


1
+1 có vẻ như nếu bạn có một công cụ cho phép hạt nhân (đại diện cho máy kéo) di chuyển dọc theo một đường dẫn (thay vì dọc theo mỗi hàng) thì vấn đề này sẽ dễ kiểm soát hơn.
Kirk Kuykendall

@Kirk Không cần theo đường dẫn hay hàng hay bất cứ thứ gì có kernel. Điều quan trọng là đánh giá cao sự thay đổi quan điểm đi kèm với một tiêu điểm: thay vì xem vấn đề là một trong những nguyên liệu lan truyền từ một điểm của điểm, hãy xem nó như là một trong những tính toán bao nhiêu vật chất tích lũy tại mọi điểm trong lĩnh vực . Rõ ràng đó là cùng một vấn đề với cùng một giải pháp. Cách tiếp cận hạt nhân di chuyển (và phương pháp đệm được đề xuất) đưa ra quan điểm đầu tiên; tổng đầu mối, thứ hai. Nhưng công cụ tổng hợp đầu mối có sẵn; một tính toán hạt nhân di chuyển là không.
whuber

Tôi nghĩ rằng phương pháp raster mà bạn phác thảo sẽ là phương pháp tốt nhất nếu chúng ta biết tốc độ và tốc độ lan truyền. Thật không may trong kịch bản cụ thể này, chúng tôi không biết. Người dùng cuối của chúng tôi có thể chọn bất kỳ lớp nào làm đầu vào cho báo cáo bảo hiểm này và chúng tôi không thể dựa vào hình học có bất kỳ siêu dữ liệu cụ thể nào.
dbruning

@dbruning Cách tiếp cận này dường như không yêu cầu tốc độ / tốc độ lan truyền đã biết; nó chỉ cho phép họ (+ mô hình thực tế chính xác hơn) nếu bạn có chúng. Tuy nhiên, sẽ cần nhiều hơn một số ngưỡng di động + đếm để có được các số liệu bạn muốn (tổng độ bao phủ của khu vực; vùng chồng lấn) ra khỏi hệ thống và cũng có sự đánh đổi chính xác trong đó.
Dan S.

@dbruning Nếu bạn không biết tỷ lệ lây lan, bạn sẽ nhận được tỷ lệ lan truyền tương đối. Nếu bạn không biết tốc độ, bạn vẫn biết (hoặc nên biết) cách mọi người lái máy kéo và có thể rút ra các ước tính hợp lý về tốc độ tương đối. Nếu bạn giả định tốc độ không đổi và tốc độ lây lan không đổi, bạn vẫn sẽ nhận được câu trả lời hợp lý; họ sẽ đồng ý với các câu trả lời dựa trên bộ đệm đối với các phần thẳng của các tuyến máy kéo; và chúng có khả năng thực tế hơn trong các phần cong.
whuber

2

Tôi không chắc chắn 100% về giao thức StackExchange vì vậy tôi sẽ đăng bài này dưới dạng câu trả lời cho câu hỏi của mình. Đó là câu trả lời cuối cùng tôi đã sử dụng.

Thuật toán cơ bản là:
1. Chia bất kỳ hình học nào trên lớp thành các phân đoạn không dài hơn 1/2 chiều rộng.
2. Đối với mỗi phân đoạn:
- Tạo một "bộ đệm lăn" bằng cách nhìn về phía sau dọc theo hình và đệm tất cả các phân đoạn trước đó trong đó độ dài tích lũy của các phân đoạn đó nhỏ hơn chiều rộng trải (bán kính đệm = 1/2 chiều rộng trải)
- Tạo một "bộ đệm phân đoạn tiếp theo" chỉ của phân khúc tiếp theo (bán kính bộ đệm = 1/2 chiều rộng trải rộng)
- Trừ "bộ đệm lăn" khỏi "bộ đệm phân đoạn tiếp theo" để có được "bộ đệm mới"
- tham gia tất cả "bộ đệm mới" đa giác với nhau để có được một đa giác duy nhất trên mỗi hình dạng.

Về cơ bản, điều này cho phép người điều khiển phương tiện phân tán thực hiện các góc rẽ (hoặc rộng hơn) mà không bị phạt chồng chéo, nhưng nếu chúng quay ngược quá mạnh để chúng lan rộng trên "mặt đất cũ", chúng ta bắt đầu bị chồng chéo.

Chồng chéo màu xanh

Hình xoắn ốc trông giống như tôi muốn nó:

xoắn ốc

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.