Tìm đa giác qua đường bằng OGR?


8

Tôi đang cố gắng tìm tất cả các đa giác được vượt qua bởi một dòng duy nhất (theo dõi GPS). Tôi đang sử dụng thư viện OGR (từ python) để tính toán cái này, nhưng hiện tại nó hơi "brute-force" (và chậm). Đối với mỗi điểm theo dõi của tôi, tôi gọi phương thức giao nhau với tất cả các đa giác. Tối ưu hóa rõ ràng là chỉ kiểm tra với các đa giác liền kề. Nhưng tôi đoán đây là một vấn đề cổ điển, với một giải pháp đã được biết đến (mà tôi không thể tìm thấy ...).

Tôi muốn tránh sử dụng một cơ sở dữ liệu chuyên dụng vì tôi đang cố gắng viết một phần mềm độc lập (spatialite là một tùy chọn nếu DB là con đường để đi).

(FYI, mã nguồn hiện tại có sẵn tại đây: https://github.com/dkm/airspace-checker )

Câu trả lời:


7

Đối với giải pháp Python, bạn có thể muốn xem Shapely http://gispython.org/shapely/docs/1.2/ và RTree http://pypi.python.org/pypi/Rtree/

Rtree sẽ giúp bạn tạo các chỉ mục không gian.


Tôi đã nhìn thấy hình dạng, nhưng không biết về rtree! Cảm ơn!
Marc

Ok, tôi đã có thể (cuối cùng) kiểm tra rtree. Nó hoạt động tốt vì tôi có thể giảm bộ kiểm tra từ 1096 xuống 19 :). Tôi đang nghĩ đến việc sử dụng một cách dễ dàng, nhưng tôi phải hiểu rõ nhất về ý nghĩa của nó (hoàn toàn không xử lý các dự đoán, tôi không muốn mất bất cứ điều gì trong quá trình này).
Marc

5

Thay vì giao cắt mở rộng , bạn có thể thực hiện lựa chọn trước các đa giác dựa trên so sánh các hộp giới hạn. Nói cách khác, tìm tất cả các đa giác chồng chéo / liền kề với MBR của các phân đoạn theo dõi của bạn. Sau đó thực hiện kiểm tra chi tiết về tập hợp con của đa giác.


3

Các đề xuất của mloskot và Nicklas để so sánh các hộp giới hạn là thực sự chính xác.

Nếu bạn đang sử dụng shapefiles, bạn cũng có thể xem xét việc gọi mô-đun saga này: http://www.saga-gis.org/saga_modules_doc/shapes_transect/index.html


Tôi nghĩ rằng tôi sẽ kiểm tra các giải pháp với BBoxes. Dữ liệu của tôi không phải là ngẫu nhiên: các bản nhạc là các chuyến bay dù lượn / hangglider và đa giác là không gian. Tôi sẽ xem thử liệu tôi có thể đưa ra một bộ lọc đơn giản trên hộp không. Tôi không trực tiếp sử dụng shapefiles nhưng tôi đã viết một đoạn script đọc định dạng OpenAIR (mô tả không phận "tiêu chuẩn") sang OGR (từ đó tôi có thể xuất trực tiếp sang shp)
Marc

2

Những gì một cơ sở dữ liệu như PostGIS làm để tăng tốc độ này là trước tiên thực hiện một chỉ mục, so sánh hộp giới hạn. Đầu tiên, nó tìm thấy tất cả các đa giác có các hộp giới hạn xen kẽ với hộp giới hạn của dòng. Vấn đề trong trường hợp của bạn có thể là dòng dõi dài và sẽ có một hộp giới hạn rất lớn giao với nhiều đa giác không đáng quan tâm.

Nếu các dòng quá dài, có lẽ bạn cũng sẽ phải làm việc với các chức năng trắc địa phức tạp và chậm hơn nhiều so với các hàm phẳng.

Nó có thể khá phức tạp để làm cho mọi thứ chạy trơn tru.

Tại sao bạn không muốn dựa vào cơ sở dữ liệu? Điều đó sẽ không giải quyết được tất cả các vấn đề của bạn, nhưng có rất nhiều tối ưu hóa được xây dựng trong PostGIS chẳng hạn. Ở đó bạn cũng có các tính toán trắc địa của giao lộ nếu bạn cần nó.

Cập nhật: Tôi đọc lại câu hỏi của bạn và nhận ra rằng bạn không sử dụng các biểu mẫu theo dõi mà là từng đỉnh.

Tôi nghĩ rằng bạn đang trên trac sai;)
Cả hai vì bạn đang thiếu để kiểm tra xem các cạnh giữa vertexpoints cắt đa giác và bởi vì bạn đang di chuyển lặp giữa các điểm đỉnh để python thay vì thực hiện một số C mà tôi nghĩ là nhanh hơn nhiều . Sau đó, bạn có vấn đề với các chỉ mục. Để làm cho mọi thứ nhanh hơn, bạn sẽ phải xây dựng và xử lý một số loại chỉ số không gian.

Mặt khác, nếu bạn đang thực hiện phần lớn công việc này trong mã của riêng bạn, tại sao bạn không thực hiện bài kiểm tra giao lộ. Bài kiểm tra đó chỉ là một điểm trong bài kiểm tra đa giác nếu bạn đang xử lý các điểm đỉnh. Google cho "điểm trong đa giác" và bạn sẽ tìm thấy một số thuật toán.

Nhưng, tôi sẽ đi cho một cách tiếp cận hướng cơ sở dữ liệu. Điều đó sẽ cung cấp cho bạn khả năng sử dụng các chỉ mục không gian.

/ Nicklas


Tôi đã suy nghĩ điều tương tự trên linestring. Tôi không quen thuộc với GIS & python, nhưng nên có một cách để xây dựng các chỉ mục không gian trong bộ nhớ (tôi biết có nhiều tùy chọn .net khác nhau để thực hiện việc này). Đây có thể là một câu hỏi hay cho gis.se.
Jay Cummins

Cảm ơn câu trả lời. Tôi không sử dụng DB để thiết lập đơn giản. Nhưng nếu tránh DB hàm ý quá nhiều mã phức tạp, thì tôi sẽ thay đổi quyết định :). Đối với "chỉ số không gian", tôi sẽ phải google một chút để hiểu chính xác nó là gì.
Marc

Đối với "Tôi đã đọc câu hỏi của bạn một lần nữa và nhận ra rằng bạn không sử dụng linestring các hình thức trac mà là mỗi đỉnh." Tôi đoán tôi cũng có thể kiểm tra giao lộ từ đối tượng linestring, nhưng sau đó tôi sẽ cần trích xuất phần giao nhau. Nhưng điều đó có thể nhanh hơn, bạn hoàn toàn đúng!
Marc

Về các chỉ mục không gian, bạn nên google các chỉ mục chính và đa chiều. Ý tưởng là xây dựng một chỉ số đa chiều của các hộp giới hạn. Trong db-evironment, trình lập kế hoạch sau đó quyết định xem có đáng nỗ lực tìm kiếm chỉ mục trước để tìm các hộp giới hạn giao nhau trước khi thực hiện kiểm tra giao cắt thực sự hay không.
Nicklas Avén
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.