Test verilerim hakkında:
- OSM Yol Verileri gibi, her bir yol geometrisi bir kavşakta sona erer.
- Her yolun kendine özgü bir kimliği vardır.
ÇÖZÜM I
İki varsayım varsa:
Yollar mahalleler inşa ediyor.
Bir metrik sistemde çalışıyorsunuz.
Fikir, noktanın X ve Y koordinatlarını arttırmak / azaltmaktır. Bir metrik sistem içinde çalışıyorsanız, noktanızın 1 m doğusunda yer alabilir, yeni bir nokta oluşturabilir ve orijinal nokta ile bir çizgi oluşturabilirsiniz. Hat bir yol kesişene kadar Doğu'ya doğru ilerliyorsunuz. Batı'da bir kavşak aramak için orijinal X koordinatından 1 m çıkarmalısınız. Aynı şey Y koordinatı için de geçerlidir. Kuzey / Doğu / Güney / Batı'da yol yoksa, sayaç 1000 (m) 'de durur. 1000 m'den daha uzun bir mesafede bir yol olabileceğini bildiğinizde bu değeri değiştirmeniz gerekir.
Görevi aşağıdaki kodla çözebilirsiniz:
Düzenlenen
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "point":
startpoint = lyr
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "roads":
roads = lyr
startpoint_iter = startpoint.getFeatures()
for feature in startpoint_iter:
geom = feature.geometry()
if geom.type() == QGis.Point:
xy = geom.asPoint()
x,y = xy[0], xy[1]
line_start = QgsPoint(x,y)
def reached(direction, count_m):
road_reached = None
road = None
count=1
while road_reached < 1 and count <=count_m:
count += 1
if direction == 'N':
line_end = QgsPoint(x, y+count)
if direction == 'E':
line_end = QgsPoint(x+count,y)
if direction == 'S':
line_end = QgsPoint(x,y-count)
if direction == 'W':
line_end = QgsPoint(x-count,y)
line = QgsGeometry.fromPolyline([line_start,line_end])
for f in roads.getFeatures():
if line.intersects(f.geometry()):
road_reached = 1
road = f['name']
print road
reached('N', 1000)
reached('E', 1000)
reached('S', 1000)
reached('W', 1000)
Doğudaki e yolunun noktanın yakın bir yolu olarak kabul edilmediğini gösteren başka bir örnek.
İşlev ve çıkış nasıl çağırılır:
>>>>reached('N', 1000)
road a
>>>>reached('E', 1000)
road b
>>>>reached('S', 1000)
road c
>>>>reached('W', 1000)
road d
Noktayı çevreleyen 4'ten fazla yol varsa, daha fazla yöne bakmanız gerekir (hem X hem de Y'yi değiştirin). Veya çizginizin azimutunu değiştirebilirsiniz, yani 0-360 ° aralığında bir derece döndürebilirsiniz.
ÇÖZÜM II
Yorumdan esinlenerek Polygonize
önce yollarınızı da yapabilirsiniz . Bu nedenle adı QGIS bir aracı kullanabilirsiniz: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize
. Geçici katmanı yeniden adlandırın polygon
. Tamamen yollarla çevrili nokta için yol adlarına sahip olmak istediğinizi varsayarsak. Aksi takdirde ÇÖZÜM I kullanmanız gerekir . Bu sadece tüm yollar bağlıysa (koparılmışsa)!
İlk önce nokta çokgenle kesişmelidir. Şimdi fikir, her ikisinin de, AND
kapalı bir çizginin başlangıç bitiş noktasının çokgenle kesişmesi gerektiğidir.
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "point":
startpoint = lyr
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "polygon":
poly = lyr
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "roads":
roads = lyr
for h in startpoint.getFeatures():
for g in poly.getFeatures():
if h.geometry().intersects(g.geometry()):
poly_geom = g.geometry()
for f in roads.getFeatures():
geom = f.geometry().asPolyline()
start_point = QgsGeometry.fromPoint(QgsPoint(geom[0]))
end_point = QgsGeometry.fromPoint(QgsPoint(geom[-1]))
if poly_geom.intersects(start_point) and poly_geom.intersects(end_point):
print f['name']
Çıktı:
road c
road b
road e
road f