Làm thế nào để tìm đa giác bên trong mà một điểm nằm?


8

Tôi có một lớp với các tính năng đa giác. Mỗi tính năng có thuộc tính và giá trị. Tôi cũng có một danh sách các tọa độ và tôi muốn biết tính năng (hoặc đa giác) mà tọa độ nằm trong.

Ai đó có thể vui lòng hướng dẫn tôi làm thế nào để đi về điều này? Có một chức năng nào trong API có thể giúp tôi đạt được mục tiêu của mình hay tôi nên sử dụng một số thuật toán hình học tính toán để tự thực hiện? Tôi biết cách thực hiện sau nhưng nó sẽ giúp tôi tiết kiệm thời gian nếu đã có chức năng tích hợp sẵn.

Cảm ơn.

Câu trả lời:


6

Ít tính năng

Những gì bạn có thể muốn làm là:

  1. Tạo một danh sách QssPoint từ tọa độ của bạn
  2. Lặp lại tất cả các tính năng lớp của bạn (đa giác)
  3. Lặp lại danh sách các điểm (trong vòng lặp)
  4. Gọi Feature.geometry (). Chứa (điểm) để kiểm tra xem bạn có khớp không

Tất nhiên bây giờ bạn có thể cải thiện hiệu suất nếu bạn biết, ví dụ, một điểm chỉ có thể được chứa bởi một đa giác, bạn có thể xóa một điểm khỏi danh sách, khi đã tìm thấy đa giác thích hợp.

Rất nhiều tính năng (Sử dụng Spatial Index)

Như đã chỉ ra trong các ý kiến, một chỉ số không gian có thể được sử dụng để tăng tốc quá trình đáng kể.

Các bước ở đây sẽ là

  1. Tạo một danh sách QssPoint từ tọa độ của bạn
  2. Tạo một QSSSpatial Index
  3. Lặp lại tất cả các tính năng lớp của bạn (đa giác)
  4. Thêm các tính năng vào chỉ mục của bạn với insertFeature
  5. Lặp đi lặp lại tất cả các điểm của bạn
  6. Gọi index.intersects (QssR chữ nhật (điểm, điểm)) để kiểm tra xem bạn có khớp không

Ngoài ra còn có một ví dụ mã của NathanW


À, tôi không biết về cuộc gọi Feature.geometry.contains (point). Tôi đã sử dụng mathplotlib. pastebin.com/61LSeMWv Xin vui lòng tha thứ cho sự bất hợp lý của mã của tôi. Tôi đang vội và sẽ làm sạch nó sau.
Shubham Goyalty

Tôi đã không thực hiện giải pháp của bạn và vì vậy không thể nói chắc chắn liệu nó có hiệu quả hay không. Nhưng tôi tin rằng nó nên và vì vậy tôi đánh dấu đây là câu trả lời đúng :)
Shubham Goyalty

2
Điều này có thể được tăng tốc bằng cách sử dụng QssSpatial Index không?
Snorfalorpagus

1
Tôi thực sự khuyên bạn nên sử dụng QssSpatail Index. Có một ví dụ tại nathanw.net/2013/01/04/ Khăn
Nathan W

6

Trước hết bạn phải nhập danh sách tọa độ vào dự án của bạn. Hướng dẫn này giải thích tốt làm thế nào để làm điều đó: http : // qgis.spatial Dùts.com / 2012/01 / nhập khẩu -sản bảng-or-csv-files-to.html

Khi bạn có cả hai lớp (đa giác và điểm) vào dự án của mình, hãy chuyển đến vector> công cụ quản lý dữ liệu> nối các thuộc tính theo vị trí

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

Bạn nhận được một cửa sổ nơi bạn có thể xác định lớp nào bạn muốn kết hợp:

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

  • Đặt lớp điểm của bạn là 'lớp vectơ đích'.
  • Đặt lớp đa giác của bạn là 'lớp vectơ tham gia'.
  • Xác định Shapefile đầu ra của bạn (sẽ có một cái mới được tạo. Vì vậy, nếu bạn bỏ lỡ, dữ liệu gốc sẽ được giữ nguyên).
  • Bạn có thể chọn giữ tất cả dữ liệu trong shapefile mới, ngay cả khi không có kết quả khớp với đa giác: kiểm tra 'giữ tất cả các bản ghi (bao gồm các bản ghi đích không khớp)'

Nhấp vào 'OK'. Shapefile mới được tạo và bạn sẽ được hỏi 'Bạn có muốn thêm lớp mới vào TOC không?' Nhấn một lần nữa OK.

Mở thuộc tính của shapefile mới được thêm vào và bạn sẽ thấy rằng tất cả các tính năng của đa giác tương ứng được thêm vào điểm nằm trong đa giác đó.


2

Một cách đơn giản hơn để làm điều này bằng cách sử dụng PyQGIS. Tôi hình dung rằng bạn có thể xây dựng một QgsRectangleđối tượng với một điểm duy nhất và sử dụng nó QgsFeatureRequestđể lọc các tính năng từ lớp giao nhau với nó.

point = QgsPoint(10, 10)
# Construct a QgsRectange with the same point
rect = QgsRectangle(point, point)
req = QgsFeatureRequest()
req.setFilterRect(rect)
# You get the feature that intersects the point
f = layer.getFeatures(req).next()

0

Trong QuantumGIS, bạn có thể thêm danh sách tọa độ với chức năng 'thêm lớp văn bản được phân tách' (nếu đó là tệp csv). Ngoài ra, thêm các đa giác. Sau đó, bạn có thể thực hiện một 'giao điểm' hoặc 'điểm trong đa giá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.