আমার পরীক্ষার ডেটা সম্পর্কে:
- ওএসএম রোড ডেটার মতো প্রতিটি রাস্তার জ্যামিতি ক্রসরোডে শেষ হয়।
- প্রতিটি রাস্তার একটি অনন্য আইডি থাকে।
সমাধান I
যদি দুটি অনুমান হয়:
রাস্তাগুলি কোয়ার্টারে বিল্ডিং করছে।
আপনি একটি মেট্রিক সিস্টেমে কাজ করছেন।
ধারণাটি হ'ল বিন্দুর X এবং Y স্থানাঙ্ক বাড়ানো / হ্রাস করা। আপনি যদি কোনও মেট্রিক সিস্টেমের মধ্যে কাজ করেন তবে আপনি আপনার পয়েন্টের পূর্ব দিকে 1 মি যেতে পারেন, একটি নতুন পয়েন্ট তৈরি করতে এবং মূল পয়েন্ট সহ একটি লাইন তৈরি করতে পারেন। লাইনটি কোনও রাস্তা ছেদ না করা পর্যন্ত আপনি আরও পূর্ব দিকে যাচ্ছেন। পশ্চিমে কোনও ছেদটি সন্ধান করতে আপনার কাছে মূল এক্স স্থানাঙ্ক থেকে 1 মি বিয়োগ করতে হবে। ওয়াই স্থানাঙ্কের জন্য একই। উত্তর / পূর্ব / দক্ষিণ / পশ্চিমে কোনও রাস্তা না থাকলে কাউন্টারটি 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 range এর মধ্যে এক ডিগ্রি করে এটি ঘোরতে পারেন °
সমাধান II
মন্তব্যটি থেকে অনুপ্রাণিত হয়ে আপনি Polygonize
প্রথমে আপনার রাস্তাগুলিও করতে পারেন । অতএব আপনি QGIS থেকে একটি টুল ব্যবহার করতে পারেন: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize
। অস্থায়ী স্তরটির নাম পরিবর্তন করুন polygon
। ধরে নিচ্ছি যে আপনি কেবলমাত্র পয়েন্টের জন্য রাস্তার নাম রাখতে চান যা পুরোপুরি রাস্তা দ্বারা আবদ্ধ। অন্যথায় আপনাকে সলিউশন আই ব্যবহার করতে হবে । এটি কেবল তখনই কাজ করে যদি সমস্ত রাস্তা সংযুক্ত থাকে (ছড়িয়ে পড়ে)!
প্রথম বিন্দুটি বহুভুজের সাথে ছেদ করতে হবে। এখন ধারণাটি উভয়ই, 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