Czas na GIS

QGIS bez GUI

Dziś wyjaśnię jak uruchomić QGIS z poziomu Pythona bez włączania GUI (Graphical User Interface) QGIS. Brzmi to dziwnie, ale jest przydatne gdy robimy coś co ma działać w tle, być uruchamiane regularnie jako task, wykonywać złożone analizy nie wymagające gui QGIS.

Zacznijmy od konfiguracji Pythona w Visual Studio, w końcu na czymś pisać musimy.

Najpierw tworzymy klasyczną aplikacją Pythona, nazwałem to qgisnogui.

Utworzyło nam pusty projekt, musimy teraz dodać naszą instalację Pythona, tj Python Environment z zainstalowanego QGIS-a. Klikamy prawym klawiszem myszy na Python Environments, Add Environment…

Potem wybieramy Existing Environment i wybieramy <Custom>

Rozwinie się dialog, musimy tylko wskazać lokalizację PYTHONA (Prefix path) w folderze QGIS, reszta powinna się sama wypełnić…

Klikamy Add. Nasze nowo utworzona konfiguracja środowiska się automatycznie zmieni w projekcie.

Teraz tylko musimy jeszcze dodać do Search Paths folder z bibliotekami QGIS pythona. Prawy klawisz na Search Paths. Add Folder to Search Path i u mnie to był : C:\qgis3421\apps\qgis\python.

No i teraz już można uruchomić QGIS-a z poziomu pythona (i tutaj cenna uwaga, nie do wszystkiego qgisapp jest potrzebna, część bibliotek pracuje zupełnie niezależnie, np jak chcemy tylko „obrobić” geometrię to wystarczy sam Python i api qgis, ale jak już chcemy skorzystać z providera, załadować warstwę, wydrukować pdf, a może nawet napisać własną nakładkę gui bazującą na api QGIS to już musimy zainicjować aplikację qgis)

Dla przykładu prosty kod :

# zacznijmy od czegoś prostego czyli zdefiniowania geometrii

from qgis.core import QgsGeometry
geom1 = QgsGeometry.fromWkt("POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))")

print(geom1.area())

po kliknięciu uruchom oblicza nam powierzchnię poligonu.

Teraz uruchommy QGIS i załadujmy warstwę:

# uruchamiamy qgisapp bez gui, ale z możliwością korzystania z jego funkcji
import sys
from qgis.core import QgsApplication
# Inicjalizacja aplikacji QGIS bez GUI
qgs = QgsApplication([], False)
qgs.initQgis()
# Teraz możemy korzystać z funkcji QGIS, np. wczytać warstwę
from qgis.core import QgsVectorLayer
layer = QgsVectorLayer(r"D:\dane\dzialki_krakow_2180.shp", "dzialki", "ogr")
if not layer.isValid():
    print("Layer failed to load!")

print(f"Ilość obiektów : {layer.featureCount()}")

i = 0
for feature in layer.getFeatures():
    i+=1
    print(f"Obiekt {feature.id()}, ID_DZIALKI = {feature['ID_DZIALKI']}")
    if i > 10:
        break

No i wynik :

Tutaj jeszcze cenna uwaga dla początkujących, jak używamy polskich znaków w Pythonie to pamiętajmy o tym aby przed uruchomieniem kodu zrobić Save As…, potem Save with Encoding… i wybrać UTF-8 (65001) 🙂

Na tym zakończymy dzisiejszy wywód, pozdrawiam, przepraszając równocześnie za długą nieobecność. Praca praca i praca, ale będzie o czym pisać w przyszłości 🙂

Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *