OSGeo4w kabuk komut dosyasını çalıştırırken qgis.core için içe aktarma hatası


17

Bu yazı ile birlikte , QGIS dışında OSGeo4w Shell'de bir komut dosyası çalıştırmaya çalışıyorum . Ancak aşağıdaki hatayı alıyorum:

ImportError: qgis.core adlı modül yok

Ayrıca aşağıdaki mesajları okudum ve çeşitli modülleri almaya çalıştım ama boşuna:

Burada, bir ızgara oluşturan ve bir çokgen şekil dosyasını klipsleyen basit bir komut dosyası bulunmaktadır.

Not: Bu komut dosyası test edilmiştir ve QGIS'te çalışırken başarıyla çalışır.

##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

@Gcarrillo tarafından gönderilen cevabı ve senaryoyu takiben, qgis.core.modülleri başarıyla içe aktarabilirim . @Gcarrillo tarafından sağlanan komut dosyası çalışır ancak bir geri izleme hatası alıyorum:

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
PYTHONPATH ayarını doğru yaptınız mı? Komut dosyasını, qgis simgesinin işaret ettiği qgis.bat içinde ayarlanan ENV değişkenleriyle çalıştırmanızı öneririm.
Luigi Pirelli

Teşekkürler @ LuigiPirelli, bunu bir deneyeceğim ve geri rapor vereceğim.
Joseph

@LuigiPirelli öneriniz için teşekkür ederiz, ancak sorun devam ediyor (çevresel değişkenleri yanlış eklemediysem!)
Joseph

1
Bana göre bir Windows PATH şu şekilde "set" ile ayarlanmalıdır: set path =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ grass \ grass-6.4.3 \ lib;% PATH%
Stefan

Yanıtlar:


17

Son olarak, PyQGIS bağımsız komut dosyalarında işleme algoritmalarını çalıştırmanın uygun yolunu buldu.

Bu cevap yanıtları dayanmaktadır tek başına PyQGIS senaryo yazıyor ithalat qgis.core ile Problem ve Hata: Algoritma bulunamadı sırayla bir dayanmaktadır hangi QGIS-dev e-posta liste tartışması .

OSGeo4W Kabuğunuzda QGIS kitaplıklarınızı etkinleştirmek için tek başına bir PyQGIS betiği yazarken import qgis.core ile ilgili Sorun bölümünde verilen iş akışını izlemenizi öneririm . QGIS kitaplıklarınızı düzgün bir şekilde çalıştırdıktan sonra, sorunuzun 2. bölümüne geçebiliriz: bağımsız bir PyQGIS komut dosyasında işleme algoritmaları çalıştırma.

Orijinal betiğinizi biraz değiştirdim ve Windows 7 ve GNU / Linux üzerinde test ettim. İşlem 2.2.0-2'yi kullanıyorum ve cevabı yazarken geçerli olan bu sürümü kullanmanızı öneririm.

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

Her klibi gerçekleştirmek için gerçekten yeni bir ızgaraya ihtiyacınız olmadığından, ızgara oluşturmayı for döngüsünden çıkardığımı unutmayın.

Bu hile yapmalı!


Güzel! Bence bu cevabı çok daha okunabilir ve kompakt, en azından kabul edecek. Çok teşekkür ederim dostum!
Joseph

Bu komut dosyasının ProcessingMasaüstünde klasörde bulunana benzer bir klasör oluşturduğunu fark ettim /qgis.2. Bu olmalı mı?
Joseph

Ayrıca, şekil dosyalarını okuduğu aynı klasörü oluşturur ve boş bir 'qgis' Veri Tabanı Dosyası ekler. Değiştirdiğim komut dosyası birkaç klasörden şekil dosyaları aldığından oldukça sinir bozucu, bu da bu yeni dosyaların / klasörlerin de patladığı anlamına geliyor. Hala bu cevabı diğerine tercih ediyorum.
Joseph

Doğru @ Joseph, bu klasörlerin oluşturulmasını bilmiyorum, işleme çerçevesi onları anlamadığım herhangi bir nedenden dolayı yaratıyor. Size katılıyorum, bu doğru cevap, ek adımlardan kaçınıyor ve aslında çerçeveden yararlanıyor. Ödül için teşekkürler!
Germán Carrillo

2
Bu çok yardımcı. QGIS'in büyük zayıflığı, yeni başlayanların basit komut dosyaları yazmasına izin veriyor. Diş çekmek gibi.
Damien

7

Bu yanıt, bağımsız bir PyQGIS betiği yazarken import qgis.core ile ilgili Sorun ve Python ile 'işleme' nasıl erişebilirim? .

OSGeo4W Kabuğunuzda QGIS kitaplıklarınızı etkinleştirmek için tek başına bir PyQGIS betiği yazarken import qgis.core ile ilgili Sorun bölümünde verilen iş akışını izlemenizi öneririm . QGIS kitaplıklarınızı düzgün bir şekilde çalıştırdıktan sonra, sorunuzun 2. bölümüne geçebiliriz: bağımsız bir PyQGIS komut dosyasında işleme algoritmaları çalıştırma.

Olduğu gibi nasıl Python ile `processing` erişebilir? , Algoritmaları ada göre çalıştırabilene kadar (ör processing.runalg('provider:algorithm_name').) Size bir geçici çözüm sunacağım . 2.2.0-2 işleme sürümünü kullanıyorum ve bu sürümü kullanmanızı öneririm.

Eklenti klasörlerini işlemede bir algoritma komut dosyasının nerede bulunduğunu bulmak için QGIS Python konsolunu kullanabiliriz. Örneğin, nereden içe aktarılacağını bilmek için qgis:creategridQGIS Python konsoluna yazın:

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

Şunları elde etmelisiniz:

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

bu da hem modül yolunu ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms) hem de algoritma sınıfını ( mmqgisx_grid_algorithm) fark etmemiz için yeterlidir . Bu bilgiyi aşağıdaki komut dosyasında kullanacaksınız.

Betiğinizi biraz değiştirdim ve Windows 7'de test ettim. Betiği kendi ortamınızda çalıştırmak için yolları ayarlamanız gerekebilir.

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

Bu hile yapmalı!

Gördüğünüz gibi, her döngü için geçici bir dosya oluşturmak yerine tek bir ızgara Shapefile depolamak için bir Test / Grids klasörü oluşturdum, bu gerekli görünmüyor.


Çok teşekkürler @gcarrillo, bunu test edip geri rapor edeceğim.
Joseph

Tekrardan yardımın için teşekkürler! Modülleri başarıyla içe aktarabilirim! Ama senaryonuzu çalıştırdığımda bir Traceback hatası alıyorum. Soruyu, bunu içerecek şekilde düzenledim.
Joseph

Test/Grids/Komut dosyasını çalıştırmadan önce klasörü oluşturmayı unuttunuz .
Germán Carrillo

Üzgünüm, bundan bahsetmeyi unuttum. Ben yarattı /Grids/klasör ve grid.shp dosya oluşturulur. Mükemmel çalışıyor! Sorun başka bir şey.
Joseph

Senaryoda herhangi bir değişiklik / düzenleme yaptınız mı? Sadece GNU / Linux üzerinde sorunsuz bir şekilde test ettim. Alacağınız hata olduğu için Klip algoritması can yoluna değil erişim path_dir + "Grids\grid.shp"olurduC:\Users\your_username\Desktop\Test\Grids\grid.shp
Germán Carrillo

4

@Gcarrillo tarafından sağlanan OSGEO4W64 yolunu (başlangıçta tek başına yükleyiciyi kullandığımda QGIS'i OSGEO4W64 yükleyicisi aracılığıyla yeniden yüklemem gerekiyordu) ve çift eğik çizgiler içerecek şekilde küçük değişiklikler yapmak zorunda kaldım. İşte son senaryo ve herkese yardımları için çok teşekkürler:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.