একটি বিন্দু সংলগ্ন সমস্ত লাইন পান


12

আমি কিউজিআইএস ব্যবহার করি এবং আমার একটি পয়েন্ট এবং রোড নেটওয়ার্ক রয়েছে। আমাকে নির্দিষ্ট পয়েন্টটি সংযুক্ত করে রাস্তার নামগুলি স্বয়ংক্রিয়ভাবে বের করতে হবে। এখানে চিত্র বর্ণনা লিখুন নিকটতম প্রতিবেশী বিশ্লেষণ এবং বাফার অঞ্চলগুলি কাজটি করতে পারে না, কারণ অনেক ক্ষেত্রে পয়েন্টটি পরিমাপ করা দূরত্বের বিষয় হিসাবে প্রতিবেশী রাস্তাগুলির সাথে এবং ঘেরগুলিকে নয় is কীভাবে কেবল ঘেরযুক্ত রাস্তাগুলি উত্তোলন করা যায় সে সম্পর্কে কোনও ধারণা আছে?


6
হতে পারে, রাস্তাটি বহুভুজ দেয়ালগুলি কীভাবে তৈরি করে তার বৈশিষ্ট্য সহ ঘেরের ক্ষেত্রটি (বহু লাইন সমন্বিত) একটি বহুভুতে রূপান্তর করুন - তারপরে আপনি অবস্থানটি ওভারল্যাপ করে একটি সাধারণ নির্বাচন করতে পারেন। এই উদাহরণে, বিন্দু "145699" বহুভুজের মধ্যে পড়ে "রোডা_রোড_রোড_রোড।"
মানচিত্র ম্যান

উত্তর:


3

আমার পরীক্ষার ডেটা সম্পর্কে:

  1. ওএসএম রোড ডেটার মতো প্রতিটি রাস্তার জ্যামিতি ক্রসরোডে শেষ হয়।
  2. প্রতিটি রাস্তার একটি অনন্য আইডি থাকে।

সমাধান I

যদি দুটি অনুমান হয়:

  1. রাস্তাগুলি কোয়ার্টারে বিল্ডিং করছে।

  2. আপনি একটি মেট্রিক সিস্টেমে কাজ করছেন।

ধারণাটি হ'ল বিন্দুর 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.