এখানে একটি সিউডো কোড দিয়ে শুরু করুন। আমি আশা করি এটি সাহায্য করে এবং কারও কাছে পুরো কোড সরবরাহ করার জন্য সময় থাকবে (এই মুহূর্তে আমার নেই)
প্রথম কাজটি হ'ল পয়েন্টটিতে লুপ করা এবং প্রতিটি পয়েন্টের প্রান্তিক দূরত্বে অবস্থিত লাইনগুলি নির্বাচন করা। থি কিউএসস্প্যাটিয়াল ইন্ডেক্সের সাহায্যে করা যায়
প্রথম লুপের মধ্যে, দ্বিতীয় কাজটি হ'ল নির্বাচিত লাইনে লুপ করা এবং লাইনের নিকটতম বিন্দুটি সন্ধান করা। এটি সরাসরি QgsGeometry :: নিকটতমগ্রহের উইথকনটেক্সট উপর ভিত্তি করে করা যেতে পারে
ডাবল কিউজজিট্রি :: নিকটতম বিভাগ বিভাগ উইথকনটেক্সট (কনস্ট্রেট কিউসপয়েন্ট এবং পয়েন্ট, কিউএসপয়েন্ট এবং মিনিস্টিস্টপয়েন্ট, ইনট এবং আফটার ভার্টেক্স, ডাবল * বামফুল = 0, ডাবল ইপসিলন = ডিএফএল এসএসএমএমইপিএসিলন)
জ্যামিতির নিকটতম অংশটি প্রদত্ত বিন্দুতে অনুসন্ধান করে।
পরামিতি বিন্দু অনুসন্ধানের জন্য পয়েন্ট নির্দিষ্ট করে
minDistPoint Receives the nearest point on the segment
afterVertex Receives index of the vertex after the closest segment. The vertex before the closest segment is always afterVertex -
1 বাম আউট আউট: সেগমেন্টের স্ন্যাপিংয়ের জন্য বিন্দুটি বিভাগের ডানদিকে (<0 অর্থ বাম,> 0 এর অর্থ ডান) এপিসিলন অ্যাপসিলন ফিরে আসে (1.8-এ যুক্ত হয়েছে)
তৃতীয় ধাপটি (প্রথম লুপের মধ্যে) বিন্দুটির জ্যামিতিটি সর্বনিম্ন দূরত্বের সাথে মিনিস্টিস্টপয়েন্টের জ্যামিতির সাথে আপডেট করে থাকে
কিছু কোডের সাথে আপডেট করুন (কিউজিআইএস 3 এ)
pointlayer = QgsProject.instance().mapLayersByName('point')[0] #iface.mapCanvas().layer(0)
lineLayer = QgsProject.instance().mapLayersByName('lines')[0] # iface.mapCanvas().layer(1)
epsg = pointlayer.crs().postgisSrid()
uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer&field=distance:double(20,2)&field=left:integer&index=yes"
snapped = QgsVectorLayer(uri,'snapped', 'memory')
prov = snapped.dataProvider()
testIndex = QgsSpatialIndex(lineLayer)
i=0
feats=[]
for p in pointlayer.getFeatures():
i+=1
mindist = 10000.
near_ids = testIndex.nearestNeighbor(p.geometry().asPoint(),4) #nearest neighbor works with bounding boxes, so I need to take more than one closest results and further check all of them.
features = lineLayer.getFeatures(QgsFeatureRequest().setFilterFids(near_ids))
for tline in features:
closeSegResult = tline.geometry().closestSegmentWithContext(p.geometry().asPoint())
if mindist > closeSegResult[0]:
closePoint = closeSegResult[1]
mindist = closeSegResult[0]
side = closeSegResult[3]
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(closePoint[0],closePoint[1])))
feat.setAttributes([i,mindist,side])
feats.append(feat)
prov.addFeatures(feats)
QgsProject.instance().addMapLayer(snapped)