मेरे परीक्षण डेटा के बारे में:
- OSM रोड डेटा की तरह हर एक रोड ज्यामिति एक चौराहे पर समाप्त होती है।
- हर सड़क की एक यूनिक आईडी होती है।
समाधान मैं
यदि दो धारणाएं हैं:
सड़कें क्वार्टर बन रही हैं।
आप एक मीट्रिक प्रणाली में काम कर रहे हैं।
बिंदु के X और Y निर्देशांक को बढ़ाने / घटाने का विचार है। यदि आप एक मीट्रिक प्रणाली के भीतर काम करते हैं तो आप अपने बिंदु के पूर्व में 1 मी जा सकते हैं, एक नया बिंदु बना सकते हैं और मूल बिंदु के साथ एक रेखा बना सकते हैं। जब तक लाइन एक सड़क को काट रही है, तब तक आप पूर्व की ओर जा रहे हैं। पश्चिम में एक चौराहे की तलाश करने के लिए आप मूल एक्स समन्वय से 1 मीटर घटाते हैं। Y समन्वय के लिए समान है। यदि उत्तर / पूर्व / दक्षिण / पश्चिम में कोई सड़क नहीं है, तो काउंटर 1000 (मीटर) पर बंद हो जाता है। जब आप जानते हैं कि अधिक दूरी के भीतर एक सड़क हो सकती है तो 1000 मी आपको इस मूल्य को बदलना होगा।
आप निम्न कोड के साथ कार्य को हल कर सकते हैं:
संपादित
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)
यह दिखाने के लिए कि पूर्व में सड़क ई को बिंदु के पास की सड़क के रूप में मान्यता नहीं दी गई है।
फ़ंक्शन और आउटपुट को कैसे कॉल करें:
>>>>reached('N', 1000)
road a
>>>>reached('E', 1000)
road b
>>>>reached('S', 1000)
road c
>>>>reached('W', 1000)
road d
यदि 4 से अधिक सड़कें हैं, तो आपको अधिक दिशाओं में देखना होगा (एक्स और वाई दोनों को बदलें)। या आप अपनी रेखा के अज़ीमुथ को बदल सकते हैं, इसका मतलब है कि आप इसे 0-360 डिग्री के भीतर एक डिग्री तक घुमा सकते हैं।
समाधान II
टिप्पणी से प्रेरित होकर आप Polygonize
पहले अपनी सड़कें भी बना सकते हैं । वजह आप QGIS से एक उपकरण का उपयोग कर सकते हैं: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize
। अस्थायी परत का नाम बदलें polygon
। यह मानते हुए कि आप केवल उस बिंदु के लिए सड़क का नाम रखना चाहते हैं जो पूरी तरह से सड़कों से घिरा हुआ है। अन्यथा आपको SOLUTION I का उपयोग करना होगा । यह केवल तभी काम करता है जब सभी सड़कें जुड़ी हुई हों (तड़क)!
पहले बिंदु को बहुभुज के साथ प्रतिच्छेदन करना पड़ता है। विचार अब यह है कि दोनों, AND
एक एन्कोडिंग लाइन के प्रारंभ बिंदु को बहुभुज के साथ काटना है।
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']
उत्पादन:
road c
road b
road e
road f