burada başlamak için bir sözde kod var. Umarım bu yardımcı olur ve birisi tam kod sağlamak için zaman olacak (şu anda yok)
Yapılacak ilk şey nokta üzerinde döngü yapmak ve her noktaya eşik mesafesi içinde bulunan çizgileri seçmektir. Thi QgsSpatialIndex ile yapılabilir
İlk döngü içinde yapılacak ikinci şey, seçilen çizgiler üzerinde döngü yapmak ve çizgi üzerindeki en yakın noktayı bulmaktır. Bu doğrudan QgsGeometry :: closestSegmentWithContext'e göre yapılabilir
çift QgsGeometry :: closestSegmentWithContext (const QgsPoint & point, QgsPoint & minDistPoint, int & afterVertex, çift * leftOf = 0, çift epsilon = DEFAULT_SEGMENT_EPSILON)
Verilen noktaya en yakın geometri segmentini arar.
Parametreler noktası Arama noktasını belirtir
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 leftOf Out: Nokta, segmentin sağ tarafının solundaysa (<0 sola,> 0 sağa demektir) segment yaslama için epsilon epsilon (1.8'e eklenir)
üçüncü adım (ilk döngü içinde), noktanın geometrisini minDistPoint'in geometrisiyle en küçük mesafeyle güncellemekten ibarettir.
bazı kodlarla güncelleme (QGIS3'te)
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)