7

In my standalone python 3 script, QgsVectorLayer() is loading an invalid layer. When I use the exact same function and inputs in the QGIS GUI python console, the layer loads fine. I am not sure what is missing in my standalone script. I have double checked the paths and made sure they are correct. I used

QgsApplication.prefixPath()

to check the correct path for input in the

QgsApplication.setPrefixPath()

function within my standalone script. The path and inputs I use in the

QgsVectorLayer()

function in my standalone script are the same as those used in the GUI python console. I'm not sure why loading a vector layer in my standalone script it failing. The vector object is created, but .isValid() returns False.

Here is my standalone script:

import sys, os, time
sys.path.extend([r'C:\OSGeo4W\apps\qgis\python',r'C:\OSGeo4W\apps\Python37\Lib\site-packages'])
#modify environment variables to find qgis and qt plugins during qgis.core import
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = r'C:\OSGeo4W\apps\Qt5\plugins'
os.environ['QT_PLUGIN_PATH'] = r'%QT_PLUGIN_PATH%;C:\OSGeo4W\apps\Qt5\plugins;C:\OSGeo4W\apps\qgis\qtplugins;C:\OSGeo4W\apps\qgis\plugins'
os.environ['PATH'] += r';C:\OSGeo4W\apps\qgis\bin;C:\OSGeo4W\apps\Qt5\bin;C:\OSGeo4W\\bin'
from qgis.core import *
from qgis.gui import *
# supply path to qgis install location
QgsApplication.setPrefixPath(r'C:\OSGeo4W\apps\qgis', True)
#QgsApplication.setPluginPath('C:\\OSGeo4W\\apps\Qt5\\plugins\\platforms')
#print(QgsApplication.systemEnvVars())
# create a reference to the QgsApplication
# setting the second argument to True enables the GUI, which we need to do
# since this is a custom application
qgs = QgsApplication([], True)
# load providers
qgs.initQgis()
##########################
# Write your code here to load some layers, use processing algorithms, etc.
canvas = QgsMapCanvas()
canvas.show()
layer = QgsVectorLayer(r'C:\Users\Matt\OneDrive\FarmProject\Kankakee_Parcels\K3_TaxParcels.shp', 'Kankakee', 'ogr')
if not layer.isValid():
 print('Failed to open the layer')
# add layer to the registry
add_layers = QgsProject.instance().addMapLayer(layer)
# set extent to the extent of our layer
canvas.setExtent(layer.extent())
# set the map canvas layer set
canvas.setLayers([add_layers])
canvas.refresh()
time.sleep(30)
########################
# When your script is complete, call exitQgis() to remove the provider and
# layer registries from memory
qgs.exitQgis()
PolyGeo
65.5k29 gold badges115 silver badges349 bronze badges
asked Jan 11, 2019 at 20:17
1

2 Answers 2

3

Per the solution found at this link: https://github.com/OSGeo/homebrew-osgeo4mac/issues/197

The QgsApplication.setPrefixPath() is not correctly setting the prefix. Therefore, the vector layer cannot load properly.

A workaround is to set the QGIS prefix environment variable directly using the os module in Python:

os.environ['QGIS_PREFIX_PATH'] = r'prefix\path'

Once the prefix path is correctly set, the vector layer should load properly and .isValid() should yield 'True'

answered Jan 11, 2019 at 22:08
3

I had the same problem, but I solved it with:

 os.environ ['QGIS_PREFIX_PATH'] = 'C: \\ OSGeo4W64 \\ apps \\ qgis'

os.environ ['QGIS_PREFIX_PATH'] = 'C: \ OSGeo4W64 \ apps \ qgis'

Look at the example:


import sys
import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:\\OSGeo4W64\\apps\\Qt5\\plugins'
os.environ['PATH'] += ';C:\\OSGeo4W64\\apps\\qgis\\bin;C:\\OSGeo4W64\\apps\\Qt5\\bin'
from qgis.core import QgsApplication, QgsProcessingFeedback,QgsVectorLayer
from qgis.analysis import QgsNativeAlgorithms
QgsApplication.setPrefixPath('C:\\OSGeo4W64\\apps\\qgis', True)
os.environ['QGIS_PREFIX_PATH'] = 'C:\\OSGeo4W64\\apps\\qgis'
qgs = QgsApplication([], False)
qgs.initQgis()
# Add the path to processing so we can import it next
sys.path.append('C:\\OSGeo4W64\\apps\\qgis\\python\\plugins')
import processing
from processing.core.Processing import Processing
Processing.initialize()
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
feedback = QgsProcessingFeedback()
 ########################################################################################
ruta = 'C:\\Users\\' + os.getlogin() +'\\Desktop\\ProyectoAgrupaciones\\Distrito\\UGM_30101_region.shp'
capa = QgsVectorLayer(ruta, 'UGM_30101_region', 'ogr')
for x in capa.getFeatures():
 print(x["ID"])
for field in capa.fields():
 print(field.name(), field.type())
if capa.isValid():
 print("CAPA CARGADA")
else:
 print("ERROR CAPA NO CARGADA")
#CALCULA LOS CENTROIDES DE TODOS LOS POLIGONOS, GENERA UN .shp ('rutaCapaCentroides').
centroides = processing.run("native:centroids", {
 'INPUT': "C:\\Users\\Arturo Guillen\\Desktop\\ProyectoAgrupaciones\\Distrito\\UGM_30101_region.shp",
 'ALL_PARTS': False,
 'OUTPUT':"C:\\Users\\Arturo Guillen\\Desktop\\ProyectoAgrupaciones\\Centroides\\UGM_30101_region_centroides.shp"
 })
print("Se ha generado la capa de CENTROIDES:",centroides)
########################################################################################
qgs.exitQgis()
answered Aug 27, 2019 at 1:14

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.