কিউজিআইএস দিয়ে পাইথন ব্যবহার করে ক্রসিং পেতে লাইনগুলি ছেদ করা হচ্ছে?


10

আমার কাছে লাইনের একটি সেট রয়েছে যা বাস লাইনের প্রতিনিধিত্ব করে। কিছু লাইন ওভারল্যাপ হয়ে একই রাস্তায় নেমেছে।

এখানে চিত্র বর্ণনা লিখুন

আমি নোডগুলি বের করতে সক্ষম। এখানে চিত্র বর্ণনা লিখুন

তবে আমি কেবল এই জাতীয় ক্রসগুলি উত্তোলনে আগ্রহী: এখানে চিত্র বর্ণনা লিখুন

কিভাবে আমি এটি করতে পারব? আমি কিউজিআইএস বা পাইথনের সাথে উপায়গুলি খুঁজছি।

আমি জিডিএল পাইথন থেকে ছেদ করার পদ্ধতিটি চেষ্টা করেছিলাম তবে এটি মূলত আমাকে কেবল শীর্ষবিন্দুগুলি প্রদান করে।

লাইন চৌমাথা পদ্ধতি QGIS থেকে আমাকে পারাপারের ফেরৎ যদি দুই লাইন ক্রস। তবে একই রাস্তায় দুটি বাসের লাইন তাদের রুটের অনেকাংশে যায়, তবে তারা কোথায় মিশে যায় সেদিকেও এটি দেয় না।


আপনি কি কিউজিআইএস-তে লাইন ছেদ করার সরঞ্জামটি ব্যবহার করে দেখেছেন: ভেক্টর বিশ্লেষণ সরঞ্জাম> লাইন ছেদগুলি ... এটি আপনাকে কোনও লাইনের শেষ এবং প্রারম্ভিক নোড দেয় না, তবে সমস্ত ছেদগুলি।
জাকব

হ্যাঁ আমি এই প্রশ্নে লিখেছি।
ustroetz

আপনি যা জিজ্ঞাসা করছেন সে সম্পর্কে আমি অস্পষ্ট, কারণ সমস্ত রেখাগুলি আপনার চিত্রগুলিতে একইভাবে প্রতীকী - আপনি কোন নোডগুলি দেখছেন বা কেন সেখানে অনেকগুলি রয়েছে তা বোঝার জন্য আমি বিভিন্ন রুট ছাড়া আলাদাভাবে বলতে পারি না the দ্বিতীয় চিত্র রাস্তাগুলি কি রাস্তায় কাকতালীয়? এগুলি কি সমস্ত দ্বি-পয়েন্টের লাইন বিভাগ, বা অবিচ্ছিন্ন পলিনগুলি? আমি লক্ষ্য করেছি যে আপনি বর্ণিত আচরণটি আর্কজিআইএসের ছেদ সরঞ্জাম হিসাবে একই - লাইনের আউটপুট সহ লাইন / লাইন আপনাকে ওভারল্যাপ দেয় তবে পয়েন্ট আউটপুট সহ লাইন / লাইন কেবল ক্রসিং দেয়।
ক্রিস ডাব্লু

তার উপর ভিত্তি করে, আমি আপনাকে যা চাই তা পেতে, আপনাকে উভয় পদ্ধতি ব্যবহার করতে হতে পারে। ক্রসিংগুলি (লাইন / লাইন = পয়েন্ট) পান এবং তারপরে ওভারল্যাপগুলি (লাইন / লাইন = লাইন) পান এবং সেই ওভারল্যাপ লাইনের জন্য শুরু / শেষ নোডগুলি বের করুন। সেগুলি আপনার অনুসন্ধান করা সমস্ত পয়েন্ট / নোডের হওয়া উচিত।
ক্রিস ডাব্লু

উত্তর:


21

নোডগুলি:

আপনি দুটি জিনিস চান, পলিলাইনগুলির শেষ পয়েন্টগুলি (মধ্যবর্তী নোড ছাড়াই) এবং ছেদ পয়েন্টগুলি। একটি অতিরিক্ত সমস্যা আছে, কিছু পাইলাইন সমাপ্তি পয়েন্টগুলিও ছেদ পয়েন্টগুলি:

এখানে চিত্র বর্ণনা লিখুন

একটি সমাধান হল পাইথন এবং মডিউলগুলি শেপলি এবং ফিয়ানা ব্যবহার করা

1) শেফফাইলটি পড়ুন:

from shapely.geometry import Point, shape
import fiona
lines = [shape(line['geometry']) for line in fiona.open("your_shapefile.shp")]

২) রেখাগুলির শেষ পয়েন্টগুলি সন্ধান করুন ( কীভাবে পললাইন শেষের পয়েন্ট পাবেন? ):

endpts = [(Point(list(line.coords)[0]), Point(list(line.coords)[-1])) for line  in lines]
# flatten the resulting list to a simple list of points
endpts= [pt for sublist in endpts  for pt in sublist] 

এখানে চিত্র বর্ণনা লিখুন

3) ছেদগুলি গণনা করুন ( ইটারটুলস মডিউলটির সাথে স্তরটিতে জ্যামিতির জোড়ায় পুনরাবৃত্তি )। কিছু ছেদগুলির ফলাফলটি মাল্টিপয়েন্টস এবং আমরা পয়েন্টগুলির একটি তালিকা চাই:

import itertools
inters = []
for line1,line2 in  itertools.combinations(lines, 2):
  if  line1.intersects(line2):
    inter = line1.intersection(line2)
    if "Point" == inter.type:
        inters.append(inter)
    elif "MultiPoint" == inter.type:
        inters.extend([pt for pt in inter])
    elif "MultiLineString" == inter.type:
        multiLine = [line for line in inter]
        first_coords = multiLine[0].coords[0]
        last_coords = multiLine[len(multiLine)-1].coords[1]
        inters.append(Point(first_coords[0], first_coords[1]))
        inters.append(Point(last_coords[0], last_coords[1]))
    elif "GeometryCollection" == inter.type:
        for geom in inter:
            if "Point" == geom.type:
                inters.append(geom)
            elif "MultiPoint" == geom.type:
                inters.extend([pt for pt in geom])
            elif "MultiLineString" == geom.type:
                multiLine = [line for line in geom]
                first_coords = multiLine[0].coords[0]
                last_coords = multiLine[len(multiLine)-1].coords[1]
                inters.append(Point(first_coords[0], first_coords[1]))
                inters.append(Point(last_coords[0], last_coords[1]))

এখানে চিত্র বর্ণনা লিখুন

৪) শেষ পয়েন্ট এবং ছেদ পয়েন্টগুলির মধ্যে নকলগুলি সরান (আপনি চিত্রগুলিতে দেখতে পাচ্ছেন)

result = endpts.extend([pt for pt in inters  if pt not in endpts])

5) ফলাফল শেফফিল সংরক্ষণ করুন

from shapely.geometry import mapping
# schema of the shapefile
schema = {'geometry': 'Point','properties': {'test': 'int'}}
# creation of the shapefile
with fiona.open('result.shp','w','ESRI Shapefile', schema) as output:
    for i, pt in enumerate(result):
        output.write({'geometry':mapping(pt), 'properties':{'test':i}})

সর্বশেষ ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

রেখাংশগুলি

আপনি যদি নোডগুলির মধ্যে বিভাগগুলিও চান তবে আপনার শেফফাইলটি আপনার "প্ল্যানারাইজ" ( প্ল্যানার গ্রাফ , কোনও প্রান্ত একে অপরকে অতিক্রম করবে না) দরকার। এটি শেপলির unary_union ফাংশন দ্বারা করা যেতে পারে

from shapely.ops import unary_union
graph = unary_union(lines)

এখানে চিত্র বর্ণনা লিখুন


বিস্তারিত উত্তরের জন্য @ জিনকে ধন্যবাদ। আমি সেই অংশটি সম্পাদনা করেছি যেখানে এটি বিভিন্ন জ্যামিতির ধরণের উপরে যায়। আমার ক্ষেত্রে ছেদটি লাইন, জ্যামিতিকরণগুলি ইত্যাদিও ফেরত দেয় তবে এটি ইনপুট ডেটার উপর নির্ভর করে। আমি আমার প্রশ্নের যথেষ্ট পরিষ্কার ছিল না।
ustroetz

দুর্দান্ত উত্তর। আমি যুক্ত করতে পারি যে নিম্নলিখিতগুলি করা প্রয়োজন হয় না: result = endpts.extend([pt for pt in inters if pt not in endpts])যেহেতু এটি প্রদর্শিত হয় যে .extendপদ্ধতিটি পরিবর্তিত হয় endptresult = Noneঅপারেশন পরে আমার ক্ষেত্রে । এটি endptsযা ফলাফল সমাপ্ত করে শেষ করে
ব্যবহারকারীর 32882
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.