How can I locate the coordinates of the middle point (midpoint) of a line feature in QGIS?
Since this question was asked, an interpolate function has been added to PyQGIS on the QgsGeometry object.
Here is a quick example of how to use this in the Python console inside of QGIS (Plugins -> Python Console).
layer = iface.activeLayer() #layer selected in your layers panel feature = layer.selectedFeatures() #the first feature of selected features geom = feature.geometry() #QgsGeometry representing your line length = geom.length() #length of geometry in the layer CRS. If EPSG:4326 this will be degrees point = geom.interpolate(length/2.0) #QgsGeometry representing the mid point x = point.geometry().x() #X coordinate in layer CRS y = point.geometry().y() #Y coordinate in layer CRS
An even easier option...
In the processing toolbox there is a QGIS function under
Vector Geometry that is called
Interpolate point on line that is most likely using the interpolate function described above.
For your input layer select the line layer you want to find the midpoints
Warning! Make sure you are using a projected coordinate system appropriate for the area where you are finding midpoints. Geographic coordinate systems like EPSG 4326 (WGS 84) are not accurate for measuring distances, and a world wide projected coordinate system like EPSG 3857 (WGS 84 / Pseudo-Mercator) will not be as accurate as a projected coordinate system for a specific region.
For distance, this is the distance to be interpolated along the line by the given units. If you give a distance of 10 and meters is selected, then a point will be created 10 meters along the line for every line in your layer. What we want here is a calculated value, not a static value like 10. To calculate a value for distance, click on the drop down to the far right (shown circled in red below) and select
In the expression box, put in the expression
$length / 2.0 This will calculate half the length of the given line feature in the coordinate reference system for that layer (hence the warning above). Select OK.
Interpolate Point on Line function, and it will then create a point layer with a point at the midpoint of every line feature in the selected layer, and each midpoint will have the attributes of the original line feature copied over to it.
It is a pure geometry problem that can be solved in the Python console
Find the midpoint of a segment x1,y1,x2,y2 is easy
x = (x1 + x2)/2 y = (y1 + y2)/2
so in the Python console
def mid(pt1, pt2): x = (pt1.x() + pt2.x())/2 y = (pt1.y() + pt2.y())/2 return QgsPoint(x,y) def pair(list): '''Iterate over pairs in a list ''' for i in range(1, len(list)): yield list[i-1], list[i] def create_geometry(point, pr): # create geometry record seg = QgsFeature() seg.setGeometry(QgsGeometry.fromPoint(point)) pr.addFeatures( [seg] ) # memory layer pt_layer = QgsVectorLayer("Point", "midpoint", "memory") pr = pt_layer.dataProvider() for elem in mylayer.selectedFeatures(): line = elem.geometry() for seg_start, seg_end in pair(line.asPolyline()): line_start = QgsPoint(seg_start) line_end = QgsPoint(seg_end) # midpoint midpt = mid(line_start, line_end) # add midpoint point to layer create_geometry(midpt,pr) pt_layer.updateExtents() QgsMapLayerRegistry.instance().addMapLayers([pt_layer])
One way I would address this is to use a 2 step approach with the MMQGIS plugin. The first is to install and use the MMQGIS to find the middle point or center of each line.
Then by creating new columns, I can use the longitude and latitude functions from the field calculator to get the coordinates accordingly.
In QGIS 3.12 I found the Vector->Geometry Tools->Centroids function to be the quickest/easiest way to do this. You can create a temporary or permanent feature of a single line selection or an entire line feature in just a couple of clicks. I do wish that a Snap-To-Midpoint button is added to QGIS Snapping Toolbar soon though!
To get midpoints close to half the length of line objects, the Centroids function in QGIS 3.10.10 doesn't for sure create the midpoint on the line if the line object is not strait. So instead I buffered the road centre lines 5 meter, used Centroids on the polygons created from the buffered lines and got points at very good positions.