Şu anda şekil dosyalarında bulduğum geometri özelliklerinden topolojik bir ağ oluşturmam gereken bir proje üzerinde çalışıyorum. Şimdiye kadar Ben Reilly'nin açık kaynak projesini kullanarak , linestringleri networkx kenarlarına dönüştürmeyi ve yakın özellikleri (diğer linestrings söylüyor) tespit etmeyi ve en kısa yol algoritmalarını çalıştırabilmem için onları en yakın noktaya eklemeyi başardım.
Ama bu bir şekil dosyası için iyi. Ancak, şimdi farklı şekil dosyalarından özellikleri büyük bir networkx grafiğine bağlamam gerekiyor. Örneğin, bir nokta bir çokgenin içindeyse, onu bağlarım (bağlanarak bir networkx kenarı - add_edge (g.GetPoint (1), g.GetPoint (2)) ekleyeceğim, bir sonraki şekil dosyasındaki nokta ile Ayrıca benzer bir özniteliği paylaşan bir poligon içindedir (örneğin, ID) Farklı bölümlerdeki çokgenlerin koordinatları değil, aynı kimlikleri paylaştığını ve çokgenlerin içine giren noktaların da aynı koordinatları paylaşmadığını unutmayın.
Bu soruna çözümüm, bir çokgenin içinde bulunan noktayı tanımlamak, depolamak, aynı kimliğe sahip çokgende bulunan bir sonraki şekil dosyasındaki noktayı bulmak ve aralarına networkx kenarını eklemekti.
Bir noktanın bir çokgenin içinde olup olmadığı nasıl bulunur? Bilinen bir algoritma var: Bunu yapan RayCasting algoritması. Gerçi burada sıkışıp kaldım, çünkü algoritmayı uygulamak için çokgenin koordinatlarına ihtiyacım var ve OGR'nin Geometrisinin bir dokümantasyonundan geçtikten sonra bile onlara nasıl erişeceğimi bilmiyorum . Yani, sorduğum soru çokgen noktalarına veya koordinatlarına nasıl erişileceğidir VEYA bir noktanın çokgenin içine düşüp düşmediğini tespit etmenin daha kolay bir yolu var mı? Osgeo.ogr kütüphanesi ile python kullanarak aşağıdakileri kodladım:
if g.GetGeometryType() == 3: #polygon
c = g.GetDimension()
x = g.GetPointCount()
y = g.GetY()
z = g.GetZ()
sorunumu daha iyi anlamak için resme bakın.
[EDIT] Şimdiye kadar çokgen nesnelerini daha sonra linestring'i ilk ve son noktayla karşılaştıracağım bir listede saklamayı denedim . Ancak Paolo'nun örneği, tüm çizgi çokgen içinde değil, linestring'inin ilk veya son noktası olduğu için bir çizgi nesnesi başvurusu ile çalışmayan Nokta Nesnesi başvurusunu ve Çokgen Nesnesi başvurusunu kullanmakla ilgilidir.
[EDIT3] Köprünün ilk ve son noktasının koordinatlarından yeni bir Geometri noktası nesnesi oluşturmak ve daha sonra bunu bir listede kaydedilen çokgen geometri nesnelerine karşı karşılaştırmak için kullanmak gayet iyi görünüyor:
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)