Saturday, 28 February 2015

qgis - how to get first and last point of MultiLineString-objects in qgis3


i would like to identify the start- and endpoints within a set of polylines and return the coordinates of both points finally.


so far i have been able to iterate the features and found out that ArcGIS's export created a MulitLineString with a number of vertices (where the number corresponds to the length of the line). using feature.geometry().vertexAt(0) (where feature is the current feature within a for loop) returns the first point of every feature and the print-result looks like that but i didn't find a way to set up a "for vertex in vertices"-style iteration to get the last point of every line. the python2.x-style from Can vector layer get start point and end point of line using PyQGIS with


geom = feature.geometry().asPolyline()

start_point = QgsPoint(geom[0])*

end_point = QgsPoint(geom[-1])*


doesn't work anymore.asPolyline() seems to return an empty list.


I've tried to iterate the vertices with vertices(self) → QgsVertexIterator but cant get any results. since i am pretty new to pyqgis the QGIS Python API seems really confusing to me.



Answer



If you're input is a multilinestring, then you'll need to handle that by either iterating through all the parts or (blindly!) just taking the first part alone.


For QGIS <= 3.4:


To take the first part:


multilinestring = feature.geometry().get()
first_part = multilinestring.geometryN(0)
# first_part will be a QgsLineString object


To get the first/last vertices:


first_vertex = first_part.pointN(0)
last_vertex = first_part.pointN(first_part.numPoints()-1)

For QGIS > 3.4:


The API is much easier here. You can use code like this and it'll work for BOTH linestring and multilinestring inputs:


for part in feature.geometry().get():
first_vertex = part[0]
last_vertex = part[-1]

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...