# Finding middle point (midpoint) of line in QGIS?

How can I locate the coordinates of the middle point (midpoint) of a line feature in QGIS?

If you bring your line feature into spatialite, you can use the Line_Interpolate_Point() function to find the mid point.

``````SELECT AsText(Line_Interpolate_Point(your_line.geomemtry, 0.5))
``````

The second parameter 0.5 indicates the fraction of the line length where the point will be located.

It is a pure geometry problem that can be solved in the Python console

The problem: 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))

# 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()

``````

Result • Just a note that this approach finds the mid point of each line segment, not the line itself. – Tim Sutton May 14 '14 at 20:49
• @gene I think the following line is missing in your code: mylayer = qgis.utils.iface.activeLayer() – ahmadhanb Apr 6 '17 at 7:48

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 `edit...` 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.

Run the `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.

• Rokefellar - Does QGIS 3.8 handle the feature = layer line differently? I get index out of range. – GeorgeC Jul 1 '19 at 13:30
• @GeorgeC for layer.selectedFeatures() to work, you literally have to have features selected in QGIS. Get the selection tool and select something. The code above is just a very quick and dirty proof of concept. – TJ Rockefeller Jul 1 '19 at 19:09
• I tried this -what would I need to do to get it to run on the whole dataset? – GeorgeC Jul 1 '19 at 22:40
• @GeorgeC This is just a proof of concept. What you are asking does not have a trivial answer that can be explained in a comment. You will need to research writing Python scripts in QGIS and possibly ask a more detailed question on this site. You will need to automate looping through all features and figure out what you want your output to be, I'm assuming a point layer? – TJ Rockefeller Jul 2 '19 at 13:31
• @GeorgeC it had been awhile since I had looked at this question, and looking into it again I found `Interpolate Point on Line` that I have described above, that I think will do what you are looking for. – TJ Rockefeller Jul 8 '19 at 15:20

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! 