I try to use the build-in Python-console of QGIS to create voronoi skeleton lines from a set of polygons. Therefore I iterate over the features of my input layer (the polygons) and then I use the runalg command for v.voronoi. However, I reckon I mess things up by defining the output-file, because I keep getting the same error-message:
>>> mapLines(layer, coord_ext)
Layer failed to load!
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "c:/users/.../tmp1qh0ii.py", line 43, in mapLines
cent_feat = centroid_layer_obj.getFeatures()
AttributeError: 'NoneType' object has no attribute 'getFeatures'
I use the following code:
import sys
from PyQt4.QtCore import *
import processing
#Retrieve a layer
layer = processing.getObject("voetpaden_test_gebied")
#Retrieve layer extent
ext = layer.extent()
coord_ext = "%s, %s, %s, %s" %(ext.xMinimum(), ext.xMaximum(), ext.yMinimum(), ext.yMaximum())
#output folder
output_folder = r"F:\My Documents\test"
#create layer for centroid lines
line_layer = QgsVectorLayer('LineString?crs=epsg:28992', 'line', 'memory')
line_prov = line_layer.dataProvider()
#This function should create a centroid line per feature of layer
def mapLines(one_layer, coord_ext):
for f in one_layer.getFeatures():
#create a temporary polygon layer for each feature
poly_layer = QgsVectorLayer('Polygon?crs=epsg:28992', 'polygon', 'memory')
poly_prov = poly_layer.dataProvider()
poly_prov.addFeatures([f])
poly_layer.updateExtents()
#place temporary layer on map canvas
QgsMapLayerRegistry.instance().addMapLayers([poly_layer])
#create a centroid line for the temporary layer
centroid_line = processing.runalg('grass7:v.voronoi.skeleton', poly_layer, -1.0, coord_ext, -1.0, 0.0, 2, output_folder + "/temp.shp")
#open the centroid line layer
centroid_layer = iface.addVectorLayer('temp.shp', 'centroid_temp', 'ogr')
if not centroid_layer:
print("Layer failed to load!")
#get the centroid layer
centroid_layer_obj = processing.getObject("centroid_temp")
#get the feature of the centroid layer
cent_feat = centroid_layer_obj.getFeatures()
line_prov.addFeatures([cent_feat])
line_layer.updateExtents()
#remove the temporary layer
QgsProject.instance().removeMapLayer(poly_layer)
#Add the new layer with centroid lines to the map canvas
QgsMapLayerRegistry.instance().addMapLayers([line_layer])
Unfortunately, I do not see any saved object in the folder I specified (F:\My Documents\test). I figured that is why I get the NoneType AttributeError.