def createMemLayer(line, breaksList): ''' create memory layer storing all reaches :return: ''' # create layer vl = QgsVectorLayer("LineString", "sinuosity_river", "memory") pr = vl.dataProvider() # add fields pr.addAttributes([ QgsField("reach", QVariant.Int), QgsField("sinuosity", QVariant.Double), QgsField("Length", QVariant.Double) ]) vl.updateFields() # create breaks with initial and final bk = sorted(breaksList) bk.insert(0, 0) bk.append(line.length()) for breack in range(1, len(bk)): ptInt = line.interpolate(bk[breack - 1]) ptFin = line.interpolate(bk[breack]) reach = splitLine(line, ptInt, ptFin) # sinuosity calc dist = qgisdist(ptInt, ptFin) lenReach = bk[breack] - bk[breack - 1] # add a feature fet = QgsFeature() fet.setGeometry(QgsGeometry.fromPolylineXY(reach)) fet.setAttributes([breack, lenReach / dist, str(lenReach)]) pr.addFeatures([fet]) #vl.updateExtents() vl.commitChanges() return vl
def run(self): QgsMessageLog.logMessage(f'Started task {self.description()}', 'TracingCAJ', Qgis.Info) epsg = self.__hidrometers.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() points_features = [ point_feature for point_feature in self.__hidrometers.getFeatures() ] feats = [] if len(points_features) > 0: for p in points_features: nearest_pipe = self.find_nearest_pipelines(p.geometry()) try: minDistPoint = nearest_pipe.closestSegmentWithContext( p.geometry().asPoint())[1] feat = QgsFeature() feat.setGeometry( QgsGeometry.fromPolylineXY( [p.geometry().asPoint(), minDistPoint])) feat.setAttributes( [points_features.index(p), feat.geometry().length()]) feats.append(feat) except Exception as e: print(p.id()) prov.addFeatures(feats)