Errore di importazione per qgis.core durante l'esecuzione dello script della shell OSGeo4w


17

Ho cercato, insieme a questo post , di eseguire uno script in OSGeo4w Shell , al di fuori di QGIS. Ma ottengo il seguente errore:

ImportError: nessun modulo chiamato qgis.core

Ho anche letto i seguenti post e ho provato a importare vari moduli ma senza risultati:

Ecco un semplice script che crea una griglia e ritaglia un file di forma poligonale su di esso.

Nota: questo script è stato testato e funziona correttamente durante l'esecuzione in QGIS.

##Test=name

import os
import glob
import sys

sys.path.append("C:\Program Files\QGIS Brighton\lib;%OSGEO4W_ROOT:\=/%/apps/qgis;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\grass\grass-6.4.3\lib;%PATH%")

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

def run():
#   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):
            outputs_1=processing.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
            outputs_2=processing.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

Seguendo la risposta e lo script pubblicato da @gcarrillo, posso finalmente importare i qgis.core.moduli con successo. Lo script fornito da @gcarrillo viene eseguito ma viene visualizzato un errore Traceback:

Traceback (most recent call last):
  File "Test.py", line 55, in <module>
    run()
  File "Test.py", line 53, in run
    algClip.processAlgorithm(progress)
  File "C:\Users\username\.qgis2\python\plugins\processing\algs\qgis\ftools\Clip.py", line 59, in processAlgorithm
    layerA.pendingFields(),
AttributeError: 'NoneType' object has no attribute 'pendingFields'

1
Hai impostato PYTHONPATH correttamente? Suggerisco di eseguire lo script con le stesse variabili ENV impostate in qgis.bat puntate dall'icona qgis.
Luigi Pirelli,

Grazie @LuigiPirelli, ci proverò e riporterò indietro.
Joseph,

Grazie per il tuo suggerimento @LuigiPirelli ma il problema persiste (a meno che non abbia aggiunto erroneamente le variabili ambientali!)
Joseph

1
Per me un PATH di Windows dovrebbe essere impostato con "set" in questo modo: set path =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ grass \ grass-6.4.3 \ lib;% PATH%
Stefan

Risposte:


17

Finalmente ho trovato il modo corretto di eseguire algoritmi di elaborazione negli script autonomi di PyQGIS.

Questa risposta si basa sulle risposte a Problema con import qgis.core durante la scrittura di uno script PyQGIS autonomo e su Errore: algoritmo non trovato , che a sua volta si basa su una discussione sulla mailing list di Qgis-dev .

Ti suggerisco di seguire il flusso di lavoro indicato in Problema con import qgis.core quando scrivi uno script PyQGIS autonomo per abilitare le tue librerie QGIS nella tua shell OSGeo4W. Una volta che le librerie QGIS funzionano correttamente, possiamo procedere alla seconda parte della domanda: eseguire algoritmi di elaborazione in uno script PyQGIS autonomo.

Ho modificato un po 'il tuo script originale e l'ho testato su Windows 7 e GNU / Linux. Uso l'elaborazione versione 2.2.0-2 e ti suggerisco di utilizzare questa versione, che è quella attuale al momento di scrivere la risposta.

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)

run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

Nota che ho eliminato la creazione della griglia dal ciclo for, poiché non hai davvero bisogno di una nuova griglia per eseguire ogni clip.

Questo dovrebbe fare il trucco!


Bellissimo! Accetterò questa risposta come molto più leggibile e compatta, almeno secondo me. Grazie ancora amico!
Joseph,

Ho appena notato che questo script crea una Processingcartella sul desktop, simile a quella contenuta nella /qgis.2cartella. Questo dovrebbe succedere?
Joseph,

Crea inoltre la stessa cartella da cui legge i file di forma e aggiunge un file di base di dati 'qgis' vuoto. Il che è abbastanza fastidioso poiché lo script che sto modificando prende gli shapefile da diverse cartelle, il che significa che stanno spuntando anche questi nuovi file / cartelle. Preferisco ancora questa risposta alla tua altra.
Joseph,

Giusto @Joseph, non so della creazione di quelle cartelle, il framework di elaborazione le crea per qualsiasi motivo che non capisco. Sono d'accordo con te, questa è la risposta corretta, ti evita ulteriori passaggi e sfrutta effettivamente il framework. Grazie per la generosità!
Germán Carrillo,

2
Questo è molto utile La grande debolezza di QGIS sta permettendo ai principianti di scrivere semplici script. È come tirare i denti.
Damien,

7

Questa risposta si basa sulle risposte a Problema con import qgis.core durante la scrittura di uno script PyQGIS autonomo e su Come posso accedere a `processing` con Python? .

Ti suggerisco di seguire il flusso di lavoro indicato in Problema con import qgis.core quando scrivi uno script PyQGIS autonomo per abilitare le tue librerie QGIS nella tua shell OSGeo4W. Una volta che le librerie QGIS funzionano correttamente, possiamo procedere alla seconda parte della domanda: eseguire algoritmi di elaborazione in uno script PyQGIS autonomo.

Come in Come posso accedere a `processing` con Python? , Ti darò una soluzione alternativa fino a quando non sarò in grado di eseguire algoritmi per nome (ad es processing.runalg('provider:algorithm_name').). Uso l'elaborazione versione 2.2.0-2 e ti suggerisco di utilizzare questa versione.

Possiamo usare la console QGIS Python per capire dove si trova uno script dell'algoritmo nelle cartelle dei plugin di elaborazione. Ad esempio, per sapere da dove importare qgis:creategrid, scrivere nella console di QGIS Python:

from processing.core.Processing import Processing
Processing.getAlgorithm('qgis:creategrid')

Dovresti ottenere:

<processing.algs.qgis.mmqgisx.MMQGISXAlgorithms.mmqgisx_grid_algorithm instance at 0xae7382c>

che è sufficiente per notare sia il modulo path ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms) che l'algoritmo class ( mmqgisx_grid_algorithm). Queste informazioni verranno utilizzate nello script seguente.

Ho modificato un po 'il tuo script e l'ho testato su Windows 7. Potrebbe essere necessario modificare i percorsi per eseguire lo script nel tuo ambiente.

import os
import glob
import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Tell Python where you will get processing from
sys.path.append(home + "\.qgis2\python\plugins")

# Reference the algorithms you want to run
from processing.algs.qgis.mmqgisx.MMQGISXAlgorithms import *
from processing.algs.qgis.ftools.Clip import *
algGrid = mmqgisx_grid_algorithm()
algClip = Clip()

from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()

def run():
    # Create a grid 
    grid = path_dir + "Grids\grid.shp"
    algGrid.setParameterValue('HSPACING', 1000)
    algGrid.setParameterValue('VSPACING', 1000)
    algGrid.setParameterValue('WIDTH', 24108)
    algGrid.setParameterValue('HEIGHT', 18351.157175)
    algGrid.setParameterValue('CENTERX', 258293.802316)
    algGrid.setParameterValue('CENTERY', 665638.226408)
    algGrid.setParameterValue('GRIDTYPE', 1)
    algGrid.setParameterValue('CRS', 'EPSG:7405')
    algGrid.setOutputValue('SAVENAME', grid)
    algGrid.processAlgorithm(progress)

    # Set directory, search for all polygon .shp files 
    os.chdir(path_dir + "Shapefiles\\")    
    for fname in glob.glob("*.shp"):
        # Run the Clip algorithm, then output results into Results folder
        algClip.setParameterValue('INPUT', grid)
        algClip.setParameterValue('OVERLAY', fname)
        algClip.setOutputValue('OUTPUT', path_res  + "/"+ fname)
        algClip.processAlgorithm(progress)

run()
QgsApplication.exitQgis()

Questo dovrebbe fare il trucco!

Come puoi vedere, ho creato una cartella Test / Grids in modo da memorizzare un singolo Shapefile della griglia invece di creare un file temporale in ogni ciclo for, il che non sembra essere necessario.


Mille grazie @gcarrillo, lo metterò alla prova e riporterò indietro.
Joseph,

Di nuovo, grazie per il tuo aiuto! Posso importare con successo i moduli! Ma quando eseguo il tuo script, ricevo un errore Traceback. Ho modificato la domanda per includerlo.
Joseph

Hai dimenticato di creare la cartella Test/Grids/prima di eseguire lo script.
Germán Carrillo,

Scusa, ho dimenticato di menzionarlo. Ho creato la /Grids/cartella e viene creato il file grid.shp. Funziona perfettamente! Qualcos'altro è il problema.
Joseph

Hai apportato modifiche / modifiche allo script? L'ho appena testato su GNU / Linux senza problemi. L'errore che ricevi è perché l'algoritmo Clip non può accedere al percorso path_dir + "Grids\grid.shp", il che sarebbeC:\Users\your_username\Desktop\Test\Grids\grid.shp
Germán Carrillo

4

Ho dovuto apportare lievi modifiche allo script fornito da @gcarrillo per includere il percorso OSGEO4W64 (ho dovuto reinstallare QGIS tramite il programma di installazione OSGEO4W64 come ho usato inizialmente il programma di installazione autonomo) e includere doppie barre. Ecco la sceneggiatura finale e molte grazie a tutti per il loro aiuto:

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QgsApplication([]) # instantiation of QgsApplication
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.