Obecnie pracuję nad projektem, w którym muszę zbudować sieć topologiczną z elementów geometrii znajdujących się w plikach kształtów. Do tej pory, korzystając z projektu open source Bena Reilly, udało mi się przekształcić znaczniki linii w krawędzie networkx, a także wykryć bliskie cechy (mówią inne linie) i dodać je do najbliższego punktu, aby móc uruchomić algorytmy najkrótszej ścieżki.
Ale to dobrze dla jednego pliku kształtu. Jednak teraz muszę połączyć funkcje z różnych plików kształtów w duży wykres Networkx. Na przykład, jeśli punkt znajduje się w obrębie wielokąta, podłączę go (przez połączenie to znaczy dodaj krawędź networkx - add_edge (g.GetPoint (1), g.GetPoint (2)) z punktem w następnym pliku kształtu, który również znajduje się w wielokącie, który ma podobny atrybut (powiedzmy, ID). Zauważ, że wielokąty w różnych shps mają tylko te same identyfikatory, a nie współrzędne. Punkty, które mieszczą się w wielokątach, również nie mają tych samych współrzędnych.
Moim rozwiązaniem tego problemu było zidentyfikowanie punktu znajdującego się w wielokącie, przechowanie go, znalezienie punktu w następnym pliku kształtu znajdującym się w wielokącie o tym samym identyfikatorze, a następnie dodanie krawędzi networkx między nimi.
Jak sprawdzić, czy punkt znajduje się w wielokącie? Istnieje dobrze znany algorytm: algorytm RayCasting , który to robi. W tym momencie jednak utknąłem, ponieważ do implementacji algorytmu potrzebuję współrzędnych wielokąta i nie wiem, jak uzyskać do nich dostęp teraz, nawet po przejrzeniu dokumentacji Geometrii OGR. Pytanie, które zadaję, brzmi: jak uzyskać dostęp do punktów wielokąta lub współrzędnych LUB czy istnieje łatwiejszy sposób wykrycia, czy punkt mieści się w wielokącie? Używając Pythona z biblioteką osgeo.ogr kodowałem:
if g.GetGeometryType() == 3: #polygon
c = g.GetDimension()
x = g.GetPointCount()
y = g.GetY()
z = g.GetZ()
zobacz obraz, aby lepiej zrozumieć mój problem.
[EDYCJA] Do tej pory próbowałem przechowywać wszystkie obiekty wielokątów na liście, z którymi porównywałbym najpierw i na końcu linijkę . Ale przykład Paolo dotyczy używania odniesienia do obiektu punktu i odniesienia do obiektu wielokąta, który nie działałby z odniesieniem do obiektu linii, ponieważ nie cała linia znajduje się w obrębie wielokąta, a raczej pierwszy lub ostatni punkt jego linii.
[EDIT3] Utworzenie nowego obiektu punktu geometrii ze współrzędnych pierwszego i ostatniego punktu linii, a następnie użycie go do porównania z obiektami geometrii wielokąta zapisanymi na liście wydaje się działać dobrze:
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)