Automated creation of perpendicular lines between a point layer and a line layer
Next script automated creation of perpendicular lines between a point layer and a line layer. The perpendicular segments (features of a memory layer) created run from the points to the nearest feature of line layer.
mapcanvas = iface.mapCanvas()
layers = mapcanvas.layers()
p_lyr = layers[0]
l_lyr = layers[1]
epsg = p_lyr.crs().postgisSrid()
uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"
dist = QgsVectorLayer(uri,
'dist',
'memory')
QgsMapLayerRegistry.instance().addMapLayer(dist)
prov = dist.dataProvider()
lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ]
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]
feats = []
for p in points_features:
minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPolyline([p.geometry().asPoint(), minDistPoint]))
feat.setAttributes([points_features.index(p),feat.geometry().length()])
feats.append(feat)
prov.addFeatures(feats)
I tried it out with a situation very similar to presented in the question:
After running the code at the Python Console of QGIS it was obtained:
Here is the same code as in accepted answer only adjusted to work with Python 3.x (or QGIS v3.x):
from qgis.core import QgsProject
mapcanvas = iface.mapCanvas()
layers = mapcanvas.layers()
p_lyr = layers[0]
l_lyr = layers[1]
epsg = p_lyr.crs().postgisSrid()
uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"
dist = QgsVectorLayer(uri,
'dist',
'memory')
QgsProject.instance().addMapLayer(dist)
prov = dist.dataProvider()
lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ]
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]
feats = []
for p in points_features:
minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPolylineXY([p.geometry().asPoint(), minDistPoint]))
feat.setAttributes([points_features.index(p),feat.geometry().length()])
feats.append(feat)
prov.addFeatures(feats)