Próbowałem wraz z tym postem uruchomić skrypt w OSGeo4w Shell , poza QGIS. Ale pojawia się następujący błąd:
ImportError: Brak modułu o nazwie qgis.core
Przeczytałem również następujące posty i próbowałem zaimportować różne moduły, ale bezskutecznie:
- Jak uruchomić algorytmy sextante poza konsolą python QGIS?
- Jak uruchomić prosty skrypt Pythona dla QGIS z zewnątrz (np. Sublime Text)?
- Pisz samodzielne skrypty Pythona za pomocą PyQGIS?
Oto prosty skrypt, który tworzy siatkę i przypina do niej plik kształtu wielokąta.
Uwaga: ten skrypt został przetestowany i działa z powodzeniem podczas uruchamiania w 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
Po odpowiedzi i skrypcie opublikowanym przez @gcarrillo mogę wreszcie qgis.core.
pomyślnie zaimportować moduły. Skrypt dostarczony przez @gcarrillo działa, ale pojawia się błąd 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'
pyqgis
qgis-processing
Joseph
źródło
źródło
Odpowiedzi:
Wreszcie znalazł właściwy sposób uruchamiania algorytmów przetwarzania w samodzielnych skryptach PyQGIS.
Ta odpowiedź jest oparta na odpowiedziach na problem z importem qgis.core podczas pisania samodzielnego skryptu PyQGIS oraz na błąd: Nie znaleziono algorytmu , który z kolei jest oparty na dyskusji na liście dyskusyjnej Qgis-dev .
Sugeruję, abyś postępował zgodnie z obiegiem pracy podanym w Problem z importem qgis.core podczas pisania samodzielnego skryptu PyQGIS, aby włączyć biblioteki QGIS w powłoce OSGeo4W. Po poprawnym działaniu bibliotek QGIS możemy przejść do drugiej części pytania: uruchomienie algorytmów przetwarzania w samodzielnym skrypcie PyQGIS.
Zmodyfikowałem nieco twój oryginalny skrypt i przetestowałem go w systemie Windows 7 i GNU / Linux. Korzystam z wersji do przetwarzania 2.2.0-2 i sugeruję, abyś użył tej wersji, która jest aktualna w momencie pisania odpowiedzi.
Zauważ, że wyjąłem tworzenie siatki z pętli for, ponieważ tak naprawdę nie potrzebujesz nowej siatki do wykonania każdego klipu.
To powinno wystarczyć!
źródło
Processing
folder na pulpicie, podobny do/qgis.2
folderu zawartego w folderze. Czy to się powinno stać?Ta odpowiedź jest oparta na odpowiedziach na Problem z importem qgis.core podczas pisania samodzielnego skryptu PyQGIS oraz Jak uzyskać dostęp do `przetwarzania` za pomocą Pythona? .
Sugeruję, abyś postępował zgodnie z obiegiem pracy podanym w Problem z importem qgis.core podczas pisania samodzielnego skryptu PyQGIS, aby włączyć biblioteki QGIS w powłoce OSGeo4W. Po poprawnym działaniu bibliotek QGIS możemy przejść do drugiej części pytania: uruchomienie algorytmów przetwarzania w samodzielnym skrypcie PyQGIS.
Jak w Jak mogę uzyskać dostęp do „przetwarzania” za pomocą Pythona? , Dam ci obejście, dopóki nie będę w stanie uruchomić algorytmów według nazwy (np
processing.runalg('provider:algorithm_name')
.). Korzystam z przetwarzania w wersji 2.2.0-2 i sugeruję korzystanie z tej wersji.Możemy użyć konsoli QGIS Python, aby dowiedzieć się, gdzie znajduje się skrypt algorytmu w przetwarzaniu folderów wtyczek. Na przykład, aby wiedzieć, skąd importować
qgis:creategrid
, napisz w konsoli QGIS Python:Powinieneś uzyskać:
co wystarczy nam zauważyć zarówno ścieżkę modułu (
processing.algs.qgis.mmqgisx.MMQGISXAlgorithms
), jak i klasę algorytmów (mmqgisx_grid_algorithm
). Użyjesz tych informacji w skrypcie poniżej.Zmodyfikowałem trochę skrypt i przetestowałem go w systemie Windows 7. Może być konieczne dostosowanie ścieżek w celu uruchomienia skryptu we własnym środowisku.
To powinno wystarczyć!
Jak widać, utworzyłem folder Test / Grids, abyś przechowywał jeden plik Shapefile z siatki zamiast tworzyć plik tymczasowy w każdej pętli for, co nie wydaje się konieczne.
źródło
Test/Grids/
przed uruchomieniem skryptu./Grids/
folder i plik grid.shp jest tworzony. To działa idealnie! Problem stanowi coś innego.path_dir + "Grids\grid.shp"
, co byłobyC:\Users\your_username\Desktop\Test\Grids\grid.shp
Musiałem wprowadzić niewielkie zmiany w skrypcie udostępnionym przez @gcarrillo, aby uwzględnić ścieżkę OSGEO4W64 (musiałem ponownie zainstalować QGIS za pomocą instalatora OSGEO4W64, ponieważ początkowo korzystałem z samodzielnego instalatora) i uwzględnić podwójne ukośniki. Oto ostatni skrypt i wielkie podziękowania dla wszystkich za ich pomoc:
źródło