নোডগুলি:
আপনি দুটি জিনিস চান, পলিলাইনগুলির শেষ পয়েন্টগুলি (মধ্যবর্তী নোড ছাড়াই) এবং ছেদ পয়েন্টগুলি। একটি অতিরিক্ত সমস্যা আছে, কিছু পাইলাইন সমাপ্তি পয়েন্টগুলিও ছেদ পয়েন্টগুলি:
একটি সমাধান হল পাইথন এবং মডিউলগুলি শেপলি এবং ফিয়ানা ব্যবহার করা
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)