I get the error: AttributeError: 'NoneType' object has no attribute 'selectByExpression'
The first run through the loop is fine but at the second run the error occurs.
How do I fix this?
import processing
import os
import shutil
import time
t_begin = time.localtime()
print(time.strftime('%H:%M:%S', t_begin))
input = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/PDots.shp'
N=0
while(N<10):
print("N="+str(N))
outFile = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/temp_buffer'+str(N)+'.shp'
layer = iface.addVectorLayer(input,'','ogr')
# geselecteerd1 = layer.selectByExpression("kleur = 'blue'")
geselecteerd1= layer.selectByExpression("kleur = 'blue'")
#puntlaag voor buffer maken########################################################
BufferFile = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/buffer'+str(N)+'.shp'
#print(BufferFile)
writer = QgsVectorFileWriter.writeAsVectorFormat(layer,BufferFile,'utf-8',
driverName = 'ESRI Shapefile', onlySelected= True)
#selected_layer1 = iface.addVectorLayer(BufferFile,'','ogr')
del(writer)
#buffer maken met puntlaag "BufferFile"###########################################
processing.run("native:buffer", {'INPUT':'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/buffer'+str(N)+'.shp',
'DISTANCE':30,'SEGMENTS':5,'END_CAP_STYLE':0,'JOIN_STYLE':0,
'MITER_LIMIT':2,'DISSOLVE':False,
'OUTPUT':outFile})
#iface.addVectorLayer(outFile,'','ogr') #voeg bufferlaag toe aan kaart
layer.removeSelection()
geselecteerd2 = layer.selectByExpression("kleur = 'red'")
#puntlaag maken van rode punten####################################################
RedDots = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/RedDots'+str(N)+'.shp'
writer = QgsVectorFileWriter.writeAsVectorFormat(layer,RedDots,'utf-8',
driverName = 'ESRI Shapefile', onlySelected= True)
#selected_layer2 = iface.addVectorLayer(RedDots,'','ogr')
del(writer)
#layer.removeSelection()
#rode punten in buffer tellen#######################################################
CountFile = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/temp_count"+str(N)+".shp"
if (N==2):
processing.run("native:createspatialindex", {'INPUT':RedDots})
else:
processing.run("native:createspatialindex", {'INPUT':RedDots})
processing.run("native:countpointsinpolygon",{
'POLYGONS':outFile,
'POINTS':RedDots,
'WEIGHT':'','CLASSFIELD':'','FIELD':'NUMPOINTS2',
'OUTPUT':CountFile})
#iface.addVectorLayer(CountFile,'','ogr')
#punten maken van polygoon punten tellen################################################
NewDots = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/NewDots"+str(N)+".shp"
processing.run("native:centroids",
{'INPUT': CountFile,'ALL_PARTS':True,'OUTPUT':NewDots})
iface.addVectorLayer(NewDots,'','ogr')
# blauw naar rood maken###############################################################
layer = iface.activeLayer()
layer.startEditing()
for feature in layer.getFeatures():
if feature ['NUMPOINTS2'] ==0:
layer.changeAttributeValue(feature.id(), layer.fields().indexFromName('kleur'),'blue')
else:
layer.changeAttributeValue(feature.id(), layer.fields().indexFromName('kleur'),'red')
layer.commitChanges()
# rood en blauw samenvoegen##################################################################
CombineDots = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/CombineDots"+str(N)+".shp"
processing.run("native:mergevectorlayers",
{'LAYERS': [NewDots,RedDots],'CRS':None,'OUTPUT':CombineDots})
iface.addVectorLayer(CombineDots,'','ogr')
#kleur aanpassen##################################################################3
layer = iface.activeLayer()
# define some rules: label, expression, color name, (min scale, max scale)
road_rules = (
('rood', "kleur ='red'", 'red', None),
('blauw', "kleur ='blue'",'blue', None)
)
# create a new rule-based renderer
symbol = QgsSymbol.defaultSymbol(layer.geometryType())
renderer = QgsRuleBasedRenderer(symbol)
# get the "root" rule
root_rule = renderer.rootRule()
for label, expression, color_name, scale in road_rules:
# create a clone (i.e. a copy) of the default rule
rule = root_rule.children()[0].clone()
# set the label, expression and color
rule.setLabel(label)
rule.setFilterExpression(expression)
rule.symbol().setColor(QColor(color_name))
# set the scale limits if they have been specified
if scale is not None:
rule.setScaleMinDenom(scale[0])
rule.setScaleMaxDenom(scale[1])
# append the rule to the list of rules
root_rule.appendChild(rule)
# delete the default rule
root_rule.removeChildAt(0)
# apply the renderer to the layer
layer.setRenderer(renderer)
#laag verwijderen#########################################################################
TempLayer1 = QgsProject.instance().mapLayersByName('NewDots'+str(N))[0].id()
if (N==0):
TempLayer2 = QgsProject.instance().mapLayersByName('PDots')[0].id()
else:
None
### vorige verwijderen############
#Templayer3=QgsProject.instance().mapLayersByName('CombineDots'+str(N))[0].id()
#QgsProject.instance().removeMapLayers([TempLayer3])
QgsProject.instance().removeMapLayers( [TempLayer1] )
#QgsProject.instance().removeMapLayers( [TempLayer2] )
#############################################################################################
N =N+ 1
input = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/CombineDots"+str(N)+".shp"
else:
print(str(N)+"x doorlopen")
i=0
while (i<(N-1)):
TempLayerX = QgsProject.instance().mapLayersByName('CombineDots'+str(i))[0].id()
QgsProject.instance().removeMapLayers( [TempLayerX] )
TempLayerX = QgsProject.instance().mapLayersByName('CombineDots'+str(i))[0].id()
QgsProject.instance().removeMapLayers( [TempLayerX] )
i = i+1
else:
t_eind = time.localtime()
print(time.strftime('%H:%M:%S', t_eind))
import processing
import os
import shutil
import time
t_begin = time.localtime()
print(time.strftime('%H:%M:%S', t_begin))
input = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/PDots.shp'
N=0
while(N<10):
print("N="+str(N))
outFile = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/temp_buffer'+str(N)+'.shp'
layer = iface.addVectorLayer(input,'','ogr')
# geselecteerd1 = layer.selectByExpression("kleur = 'blue'")
geselecteerd1= layer.selectByExpression("kleur = 'blue'")
#puntlaag voor buffer maken########################################################
BufferFile = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/buffer'+str(N)+'.shp'
#print(BufferFile)
writer = QgsVectorFileWriter.writeAsVectorFormat(layer,BufferFile,'utf-8',
driverName = 'ESRI Shapefile', onlySelected= True)
#selected_layer1 = iface.addVectorLayer(BufferFile,'','ogr')
del(writer)
#buffer maken met puntlaag "BufferFile"###########################################
processing.run("native:buffer", {'INPUT':'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/buffer'+str(N)+'.shp',
'DISTANCE':30,'SEGMENTS':5,'END_CAP_STYLE':0,'JOIN_STYLE':0,
'MITER_LIMIT':2,'DISSOLVE':False,
'OUTPUT':outFile})
#iface.addVectorLayer(outFile,'','ogr') #voeg bufferlaag toe aan kaart
layer.removeSelection()
geselecteerd2 = layer.selectByExpression("kleur = 'red'")
#puntlaag maken van rode punten####################################################
RedDots = 'C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/RedDots'+str(N)+'.shp'
writer = QgsVectorFileWriter.writeAsVectorFormat(layer,RedDots,'utf-8',
driverName = 'ESRI Shapefile', onlySelected= True)
#selected_layer2 = iface.addVectorLayer(RedDots,'','ogr')
del(writer)
#layer.removeSelection()
#rode punten in buffer tellen#######################################################
CountFile = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/temp_count"+str(N)+".shp"
if (N==2):
processing.run("native:createspatialindex", {'INPUT':RedDots})
else:
processing.run("native:createspatialindex", {'INPUT':RedDots})
processing.run("native:countpointsinpolygon",{
'POLYGONS':outFile,
'POINTS':RedDots,
'WEIGHT':'','CLASSFIELD':'','FIELD':'NUMPOINTS2',
'OUTPUT':CountFile})
#iface.addVectorLayer(CountFile,'','ogr')
#punten maken van polygoon punten tellen################################################
NewDots = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/NewDots"+str(N)+".shp"
processing.run("native:centroids",
{'INPUT': CountFile,'ALL_PARTS':True,'OUTPUT':NewDots})
iface.addVectorLayer(NewDots,'','ogr')
# blauw naar rood maken###############################################################
layer = iface.activeLayer()
layer.startEditing()
for feature in layer.getFeatures():
if feature ['NUMPOINTS2'] ==0:
layer.changeAttributeValue(feature.id(), layer.fields().indexFromName('kleur'),'blue')
else:
layer.changeAttributeValue(feature.id(), layer.fields().indexFromName('kleur'),'red')
layer.commitChanges()
# rood en blauw samenvoegen##################################################################
CombineDots = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/CombineDots"+str(N)+".shp"
processing.run("native:mergevectorlayers",
{'LAYERS': [NewDots,RedDots],'CRS':None,'OUTPUT':CombineDots})
iface.addVectorLayer(CombineDots,'','ogr')
#kleur aanpassen##################################################################3
layer = iface.activeLayer()
# define some rules: label, expression, color name, (min scale, max scale)
road_rules = (
('rood', "kleur ='red'", 'red', None),
('blauw', "kleur ='blue'",'blue', None)
)
# create a new rule-based renderer
symbol = QgsSymbol.defaultSymbol(layer.geometryType())
renderer = QgsRuleBasedRenderer(symbol)
# get the "root" rule
root_rule = renderer.rootRule()
for label, expression, color_name, scale in road_rules:
# create a clone (i.e. a copy) of the default rule
rule = root_rule.children()[0].clone()
# set the label, expression and color
rule.setLabel(label)
rule.setFilterExpression(expression)
rule.symbol().setColor(QColor(color_name))
# set the scale limits if they have been specified
if scale is not None:
rule.setScaleMinDenom(scale[0])
rule.setScaleMaxDenom(scale[1])
# append the rule to the list of rules
root_rule.appendChild(rule)
# delete the default rule
root_rule.removeChildAt(0)
# apply the renderer to the layer
layer.setRenderer(renderer)
#laag verwijderen#########################################################################
TempLayer1 = QgsProject.instance().mapLayersByName('NewDots'+str(N))[0].id()
if (N==0):
TempLayer2 = QgsProject.instance().mapLayersByName('PDots')[0].id()
else:
None
### vorige verwijderen############
#Templayer3=QgsProject.instance().mapLayersByName('CombineDots'+str(N))[0].id()
#QgsProject.instance().removeMapLayers([TempLayer3])
QgsProject.instance().removeMapLayers( [TempLayer1] )
#QgsProject.instance().removeMapLayers( [TempLayer2] )
#############################################################################################
N =N+ 1
input = "C:/Users/laptop Innoforte 1/Innoforte/Innoforte Druten - Documenten/1. projecten/2. status uitvoering/GOV duurzame energiesystemen/3. rekenmodellen/QGIS/QGIS template/CombineDots"+str(N)+".shp"
else:
print(str(N)+"x doorlopen")
i=0
while (i<(N-1)):
TempLayerX = QgsProject.instance().mapLayersByName('CombineDots'+str(i))[0].id()
QgsProject.instance().removeMapLayers( [TempLayerX] )
TempLayerX = QgsProject.instance().mapLayersByName('CombineDots'+str(i))[0].id()
QgsProject.instance().removeMapLayers( [TempLayerX] )
i = i+1
else:
t_eind = time.localtime()
print(time.strftime('%H:%M:%S', t_eind))