Kesalahan impor untuk qgis.core saat menjalankan skrip shell OSGeo4w

17

Saya sudah mencoba, bersama dengan posting ini , untuk menjalankan skrip di OSGeo4w Shell , di luar QGIS. Tapi saya mendapatkan kesalahan berikut:

ImportError: Tidak ada modul bernama qgis.core

Saya juga membaca posting berikut dan mencoba mengimpor berbagai modul tetapi tidak berhasil:

Berikut ini adalah skrip sederhana yang membuat kisi dan klip shapefile poligon ke atasnya.

Catatan: Skrip ini telah diuji dan berhasil ketika dijalankan di 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

Mengikuti jawaban dan skrip yang diposting oleh @ gcarrillo, saya akhirnya dapat mengimpor qgis.core.modul dengan sukses. Skrip yang disediakan oleh @gcarrillo berjalan tetapi saya menerima kesalahan 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'
Yusuf
sumber
1
Apakah Anda mengatur PYTHONPATH dengan benar? Saya menyarankan untuk menjalankan skrip dengan variabel ENV yang sama seperti yang diatur dalam qgis.bat yang ditunjukkan oleh ikon qgis.
Luigi Pirelli
Terima kasih @LuigiPirelli, saya akan mencobanya dan melaporkannya kembali.
Joseph
Terima kasih atas saran Anda @LuigiPirelli tetapi masalahnya masih berlanjut (kecuali saya menambahkan variabel lingkungan secara tidak benar!)
Joseph
1
Bagi saya PATH windows harus diset dengan "set" seperti ini: set path =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ grass \ grass-6.4.3 \ lib;% PATH%
Stefan

Jawaban:

17

Akhirnya menemukan cara yang tepat untuk menjalankan algoritma pemrosesan dalam skrip mandiri PyQGIS.

Jawaban ini didasarkan pada jawaban untuk Masalah dengan impor qgis.core saat menulis skrip PyQGIS yang berdiri sendiri dan untuk Kesalahan: Algoritma tidak ditemukan , yang pada gilirannya didasarkan pada diskusi milis Qgis-dev .

Saya menyarankan Anda untuk mengikuti alur kerja yang diberikan dalam Masalah dengan impor qgis.core saat menulis skrip PyQGIS yang berdiri sendiri untuk mengaktifkan pustaka QGIS Anda di OSGeo4W Shell Anda. Setelah pustaka QGIS Anda berfungsi dengan baik, kami dapat melanjutkan ke bagian ke-2 dari pertanyaan Anda: menjalankan algoritma pemrosesan dalam skrip PyQGIS mandiri.

Saya telah sedikit memodifikasi skrip asli Anda dan mengujinya pada Windows 7 dan GNU / Linux. Saya menggunakan pemrosesan versi 2.2.0-2 dan menyarankan Anda untuk menggunakan versi ini, yang merupakan versi saat ini pada saat menulis jawabannya.

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

Perhatikan bahwa saya telah mengeluarkan kreasi grid dari for for, karena Anda tidak benar-benar membutuhkan kisi baru untuk melakukan setiap klip.

Ini harus melakukan trik!

Germán Carrillo
sumber
Cantik! Akan menerima jawaban ini karena jauh lebih mudah dibaca dan kompak, setidaknya menurut saya. Sekali lagi terima kasih sobat!
Joseph
Hanya perhatikan bahwa skrip ini membuat Processingfolder di Desktop, mirip dengan yang ada di /qgis.2folder. Haruskah ini terjadi?
Joseph
Itu juga membuat folder yang sama dari mana ia membaca shapefile dari dan menambahkan File Basis Data 'qgis' kosong. Yang cukup menjengkelkan karena skrip yang saya modifikasi mengambil shapefile dari beberapa folder, yang berarti file / folder baru ini juga muncul. Saya masih lebih suka jawaban ini dari yang lain.
Joseph
Benar @ Joseph, tidak tahu tentang pembuatan folder-folder itu, kerangka kerja pemrosesan membuatnya karena alasan apa pun yang saya tidak mengerti. Saya setuju dengan Anda, ini adalah jawaban yang tepat, itu menghindari Anda langkah-langkah tambahan dan benar-benar memanfaatkan kerangka kerja. Terima kasih untuk hadiahnya!
Germán Carrillo
2
Ini sangat membantu. Kelemahan besar QGIS adalah memungkinkan pemula untuk menulis skrip sederhana. Ini seperti mencabut gigi.
Damien
7

Jawaban ini didasarkan pada jawaban untuk Masalah dengan impor qgis.core saat menulis skrip PyQGIS yang berdiri sendiri dan untuk Bagaimana saya dapat mengakses `pemrosesan` dengan Python? .

Saya menyarankan Anda untuk mengikuti alur kerja yang diberikan dalam Masalah dengan impor qgis.core saat menulis skrip PyQGIS yang berdiri sendiri untuk mengaktifkan pustaka QGIS Anda di OSGeo4W Shell Anda. Setelah pustaka QGIS Anda berfungsi dengan baik, kami dapat melanjutkan ke bagian ke-2 dari pertanyaan Anda: menjalankan algoritma pemrosesan dalam skrip PyQGIS mandiri.

Seperti pada Bagaimana saya bisa mengakses `pemrosesan` dengan Python? , Saya akan memberi Anda solusi sampai saya dapat menjalankan algoritma berdasarkan nama (mis., processing.runalg('provider:algorithm_name')). Saya menggunakan pemrosesan versi 2.2.0-2 dan menyarankan Anda untuk menggunakan versi ini.

Kita dapat menggunakan konsol Python QGIS untuk mencari tahu di mana skrip algoritme berada dalam pemrosesan folder plugin. Misalnya, untuk mengetahui dari mana mengimpor qgis:creategrid, tulis di konsol Python QGIS:

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

Anda harus mendapatkan:

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

yang cukup bagi kita untuk memperhatikan jalur modul ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms) dan kelas algoritma ( mmqgisx_grid_algorithm). Anda akan menggunakan informasi ini dalam skrip di bawah ini.

Saya telah sedikit memodifikasi skrip Anda dan mengujinya pada Windows 7. Anda mungkin perlu menyesuaikan jalur untuk menjalankan skrip di lingkungan Anda sendiri.

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()

Ini harus melakukan trik!

Seperti yang Anda lihat, saya telah membuat folder Test / Grids sehingga Anda menyimpan satu kotak Shapefile alih-alih membuat file temporal di setiap for loop, yang sepertinya tidak diperlukan.

Germán Carrillo
sumber
Banyak terima kasih @ gcarrillo, saya akan menguji ini dan melaporkan kembali.
Joseph
Sekali lagi terima kasih atas bantuan Anda! Saya berhasil mengimpor modul! Tetapi ketika saya menjalankan skrip Anda, saya menerima kesalahan Traceback. Saya telah mengedit pertanyaan untuk memasukkan ini.
Joseph
Anda lupa membuat folder Test/Grids/sebelum menjalankan skrip.
Germán Carrillo
Maaf, saya lupa menyebutkan itu. Saya memang membuat /Grids/folder dan file grid.shp dibuat. Itu bekerja dengan sempurna! Sesuatu yang lain adalah masalahnya.
Joseph
Apakah Anda membuat perubahan / penyesuaian pada skrip? Saya baru saja mengujinya di GNU / Linux tanpa masalah. Kesalahan yang Anda dapatkan adalah karena algoritma Klip tidak dapat mengakses ke jalan path_dir + "Grids\grid.shp", yang akan menjadiC:\Users\your_username\Desktop\Test\Grids\grid.shp
Germán Carrillo
4

Saya harus membuat perubahan kecil pada skrip yang disediakan oleh @ gcarrillo untuk memasukkan jalur OSGEO4W64 (saya harus menginstal ulang QGIS melalui installer OSGEO4W64 karena saya menggunakan installer mandiri pada awalnya) dan untuk memasukkan double-slash. Ini skrip terakhir dan terima kasih banyak untuk semua orang atas bantuan mereka:

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
Yusuf
sumber