Tôi hiện đang làm việc trong một dự án mà tôi cần xây dựng một mạng lưới tôpô từ các tính năng hình học mà tôi tìm thấy trong các shapefiles. Cho đến nay, bằng cách sử dụng dự án nguồn mở của Ben Reilly, tôi đã quản lý để chuyển đổi các linestrings thành các cạnh mạng, cũng như phát hiện các tính năng gần gũi (các linestrings khác nói) và thêm chúng vào điểm gần nhất để tôi có thể chạy các thuật toán đường đi ngắn nhất.
Nhưng điều đó tốt cho một shapefile. Tuy nhiên, bây giờ tôi cần kết nối các tính năng từ các shapefile khác nhau thành một biểu đồ mạng lớn. Vì vậy, ví dụ, nếu một điểm nằm trong đa giác, tôi sẽ kết nối nó (bằng cách kết nối với nó, ý tôi là thêm cạnh mạngx - add_edge (g.GetPoint (1), g.GetPoint (2)) với điểm trong shapefile tiếp theo cũng nằm trong một đa giác có chung một thuộc tính tương tự (giả sử ID). Lưu ý rằng các đa giác trong các shps khác nhau chỉ chia sẻ cùng một ID chứ không phải tọa độ. Các điểm nằm trong đa giác cũng không chia sẻ cùng tọa độ.
Giải pháp của tôi cho vấn đề này là xác định điểm nằm trong đa giác, lưu trữ nó, tìm điểm trong shapefile tiếp theo nằm trong đa giác có cùng id và sau đó thêm cạnh mạngx giữa chúng.
Làm thế nào để tìm nếu một điểm nằm trong một đa giác? Chà, có một thuật toán nổi tiếng: Thuật toán RayCasting thực hiện điều đó. Đây là nơi tôi thực sự gặp khó khăn, vì để thực hiện thuật toán, tôi cần tọa độ của đa giác và không biết làm thế nào để truy cập chúng ngay bây giờ, ngay cả sau khi lướt qua tài liệu của Hình học OGR. Vì vậy, câu hỏi mà tôi đang hỏi là làm thế nào để truy cập các điểm đa giác hoặc tọa độ HOẶC có cách nào dễ dàng hơn để phát hiện xem một điểm có nằm trong đa giác không? Sử dụng python với thư viện osgeo.ogr tôi đã mã hóa như sau:
if g.GetGeometryType() == 3: #polygon
c = g.GetDimension()
x = g.GetPointCount()
y = g.GetY()
z = g.GetZ()
xem hình ảnh để hiểu rõ hơn về vấn đề của tôi
[EDIT] Cho đến nay tôi đã cố gắng lưu trữ tất cả các đối tượng đa giác trong một danh sách mà tôi sau đó sẽ so sánh các chuỗi đường điểm đầu tiên và cuối cùng. Nhưng ví dụ của Paolo liên quan đến việc sử dụng tham chiếu Đối tượng điểm và tham chiếu Đối tượng đa giác, sẽ không hoạt động với tham chiếu đối tượng đường vì không phải toàn bộ dòng nằm trong đa giác mà là điểm đầu tiên hoặc điểm cuối cùng của dòng.
[EDIT3] Tạo một đối tượng điểm Hình học mới từ tọa độ của điểm đầu tiên và điểm cuối của dòng và sau đó sử dụng đối tượng đó để so sánh với các đối tượng hình học đa giác được lưu trong danh sách có vẻ hoạt động tốt:
for findex in xrange(lyr.GetFeatureCount()):
f = lyr.GetFeature(findex)
flddata = getfieldinfo(lyr,f,fields)
g = f.geometry()
if g.GetGeometryType() == 2:
for j in xrange(g.GetPointCount()):
if j == 0 or j == g.GetPointCount():
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(g.Getx(j),g.GetY(j))
if point.Within(Network.polygons[x][0].GetGeometryRef()):
print g.GetPoint(j)