Pokretanje i zakazivanje QGIS zadataka obrade¶
Možete automatizovati mnogo zadataka u QGIS-u koristeći Python skriptovanje (PyQGIS) i Processing Framework. Većinu vremena biste ove skripte pokretali ručno dok je QGIS otvoren. Iako je to korisno, mnogo puta vam je potreban način da pokrenete ove zadatke putem komandne linije i bez potrebe za otvaranjem QGIS-a. Srećom, možete napisati samostalne Python skripte koje koriste QGIS biblioteke i mogu se pokrenuti putem komandne linije. U ovom tutorijalu ćemo naučiti kako da napišete i zakažete zadatak koji koristi QGIS Processing framework.
Pregled zadataka¶
Recimo da radimo na nekoj analizi koristeći shapefile-ove regiona. Shapefile-ovi se ažuriraju svakodnevno i uvek nam je potreban najnoviji fajl. Ali pre nego što možemo da koristimo ove fajlove, potrebno je da očistimo podatke. Možemo podesiti QGIS zadatak koji automatizuje ovaj proces i pokreće ga svakodnevno, tako da imate najnovije očišćene shapefile-ove za svoj rad. Napisaćemo samostalni Python skript koji preuzima shapefile i pokreće topološke operacije čišćenja svakodnevno.
Druge veštine koje ćete naučiti¶
reuzimanje i raspakivanje datoteka pomoću Pajtona.
Pokretanje bilo kog algoritma za obradu putem PyQGIS-a.
Ispravljanje topoloških grešaka u vektorskom sloju.
Dobijte podatke¶
Geofabrik pruža dnevno ažurirane shapefile-ove OpenStreetMap skupova podataka.
Za ovu vežbu ćemo koristiti shapefiles za Fidži. Preuzmite fiji-latest.shp.zip i raspakujte ga u fasciklu na vašem disku.
Izvor podataka [GEOFABRIK]
Procedura¶
Prvo ćemo proći kroz proces ručnog čišćenja shapefile-a kako bismo zapamtili komande koje ćemo koristiti u Python skripti. Pokrenite QGIS i idite na
.

Pregledajte fasciklu koja sadrži raspakovane shapefile-ove i izaberite datoteku
roads.shp
i kliknite na Otvori.

Prvo moramo ponovo projektovati sloj puteva na projektovani CRS. Ovo će nam omogućiti da koristimo metre kao jedinice prilikom analize umesto stepeni. Otvorite
.

Potražite alatku Reproject layer. Dvaput kliknite na nju da biste pokrenuli dijalog.

U dijalogu Reproject layer -Ponovo projektuj sloj, izaberite sloj
roads
kao Input layer. KoristićemoEPSG:3460 Fiji 1986 / Fiji Map Grid
CRS kao Target CRS. Kliknite na Run -Pokreni.

Kada se proces završi, videćete reprojektovani sloj učitan u QGIS-u. Idite na
.

U dijalogu Istorija i dnevnik, proširite fasciklu Algoritam i izaberite najnoviji unos. Videćete kompletnu komandu za obradu prikazanu u donjem panelu. Zabeležite ovu komandu za upotrebu u našem skriptu.

Nazad u glavnom QGIS prozoru, kliknite na dugme CRS u donjem desnom uglu.

U dijalogu Project Properties | CRS, označite Enable on-the-flight CRS transformation i izaberite
EPSG:3460 Fiji 1986 / Fiji Map Grid
kao CRS. Ovo će osigurati da se naši originalni i reprojektovani slojevi pravilno poravnaju.

Sada ćemo pokrenuti operaciju čišćenja. GRASS ima veoma moćan skup topoloških alata za čišćenje. Oni su dostupni u QGIS-u preko algoritma
v.clean
. Potražite ovaj algoritam u Processing Toolbox i dvaput kliknite na njega da biste pokrenuli dijalog.

Više o različitim alatima i opcijama možete pročitati na kartici Pomoć. Za ovaj tutorijal, koristićemo alatku
snap
da bismo uklonili duplikate čvorova koji su udaljeni jedan od drugog unutar 1 metra. IzaberiteReprojected layer
kao Layer to clean. Izaberitesnap
kao Cleaning tool. Unesite1.00
kao Threshold. Ostala polja ostavite prazna i kliknite na Run.

Kada se obrada završi, videćete 2 nova sloja dodata u QGIS. „Očišćeni vektorski sloj“ je sloj sa ispravljenim topološkim greškama. Takođe ćete imati „sloj grešaka“ koji će istaći karakteristike koje su ispravljene. Možete koristiti sloj grešaka kao vodič i zumirati da biste videli uklonjene čvorove.

Idite na dijalog
i zabeležite celu komandu za obradu za kasniju upotrebu.

Spremni smo da počnemo sa kodiranjem. Pogledajte odeljak Uređivač teksta ili Python IDE u Izrada dodatka za Pajton tutorijalu za uputstva o podešavanju vašeg uređivača teksta ili IDE-a. Za pokretanje samostalnih Python skripti koje koriste QGIS, moramo podesiti različite opcije konfiguracije. Dobar način za pokretanje samostalnih skripti je da ih pokrenete putem
.bat
datoteke. Ova datoteka će prvo podesiti ispravne opcije konfiguracije, a zatim pozvati Python skriptu. Napravite novu datoteku pod nazivomlaunch.bat
i unesite sledeći tekst. Promenite vrednosti u skladu sa vašom QGIS konfiguracijom. Ne zaboravite da zamenite korisničko ime svojim korisničkim imenom u putanji do Python skripte. Putanje u ovoj datoteci biće iste na vašem sistemu ako ste instalirali QGIS putemOSGeo4W instalera
. Sačuvajte datoteku na radnoj površini.
Белешка
Korisnici Linuksa i Meka će morati da kreiraju šel skriptu da bi podesili putanje i promenljive okruženja.
REM Change OSGEO4W_ROOT to point to the base install folder
SET OSGEO4W_ROOT=C:\OSGeo4W64
SET QGISNAME=qgis
SET QGIS=%OSGEO4W_ROOT%\apps\%QGISNAME%
set QGIS_PREFIX_PATH=%QGIS%
REM Gdal Setup
set GDAL_DATA=%OSGEO4W_ROOT%\share\gdal\
REM Python Setup
set PATH=%OSGEO4W_ROOT%\bin;%QGIS%\bin;%PATH%
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
set PYTHONPATH=%QGIS%\python;%PYTHONPATH%
REM Launch python job
python c:\Users\Ujaval\Desktop\download_and_clean.py
pause

Napravite novu datoteku u Pajtonu i unesite sledeći kod. Nazovite datoteku kao
download_and_clean.py
i sačuvajte je na radnoj površini.
from qgis.core import *
print 'Hello QGIS!'

Prebacite se na radnu površinu i pronađite ikonu
launch.bat
. Dvaput kliknite na nju da biste pokrenuli novi komandni prozor i pokrenuli skriptu. Ako viditeHello QGIS!
odštampano u komandnom prozoru, vaša konfiguracija i podešavanje su funkcionisali ispravno. Ako vidite greške ili ne vidite tekst, proverite datotekulaunch.bat
i uverite se da se sve putanje podudaraju sa lokacijama na vašem sistemu.

Nazad u vašem uređivaču teksta, izmenite skriptu
download_and_clean.py
da biste dodali sledeći kod. Ovo je bootstrap kod za inicijalizaciju QGIS-a. Ovo nije potrebno ako pokrećete skriptu unutar QGIS-a. Ali pošto je pokrećemo van QGIS-a, moramo ih dodati na početku. Obavezno zamenite korisničko ime svojim korisničkim imenom. Nakon što napravite ove izmene, sačuvajte datoteku i ponovo pokrenitelaunch.bat
. Ako vidite otisnutoHello QGIS!
, spremni ste da dodate logiku obrade u skriptu.
import sys
from qgis.core import *
# Initialize QGIS Application
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True)
app = QgsApplication([], True)
QgsApplication.initQgis()
# Add the path to Processing framework
sys.path.append('c:\\Users\\Ujaval\\.qgis2\\python\\plugins')
# Import and initialize Processing framework
from processing.core.Processing import Processing
Processing.initialize()
import processing
print 'Hello QGIS!'

Setite se prve komande za obradu koju smo sačuvali iz dnevnika. To je bila komanda za ponovno projektovanje sloja. Nalepite komandu u vaš skript i dodajte okolni kod na sledeći način. Imajte na umu da komande za obradu vraćaju putanju do izlaznih slojeva kao rečnik. Čuvamo ovo kao vrednost „ret“ i ispisujemo putanju do reprojektovanog sloja.
roads_shp_path = "C:\\Users\\Ujaval\\Downloads\\fiji-latest.shp\\roads.shp"
ret = processing.runalg('qgis:reprojectlayer', roads_shp_path, 'EPSG:3460',
None)
output = ret['OUTPUT']
print output

Pokrenite skriptu preko
launch.bat
i videćete putanju do novokreiranog, reprojektovanog sloja.

Sada dodajte kod za čišćenje topologije. Pošto je ovo naš konačni izlaz, dodaćemo putanje izlaznih datoteka kao poslednja 2 argumenta za algoritam „grass.v.clean“. Ako ih ostavite prazne, izlaz će biti kreiran u privremenom direktorijumu.
processing.runalg("grass:v.clean",
output,
1,
1,
None,
-1,
0.0001,
'C:\\Users\\Ujaval\\Desktop\\clean.shp',
'C:\Users\\Ujaval\\Desktop\\errors.shp')

Pokrenite skriptu i videćete 2 nova shapefile-a kreirana na vašoj radnoj površini. Ovim je završen deo obrade skripte. Dodajmo kod za preuzimanje podataka sa originalne veb stranice i njihovo automatsko raspakivanje. Takođe ćemo sačuvati putanju do raspakovane datoteke u promenljivoj koju kasnije možemo proslediti algoritmu za obradu. Moraćemo da uvezemo neke dodatne module za ovo. (Pogledajte kraj tutorijala za kompletan skript sa svim promenama)
import os
import urllib
import zipfile
import tempfile
temp_dir = tempfile.mkdtemp()
download_url = 'http://download.geofabrik.de/australia-oceania/fiji-latest.shp.zip'
print 'Downloading file'
zip, headers = urllib.urlretrieve(download_url)
with zipfile.ZipFile(zip) as zf:
files = zf.namelist()
for filename in files:
if 'roads' in filename:
file_path = os.path.join(temp_dir, filename)
f = open(file_path, 'wb')
f.write(zf.read(filename))
f.close()
if filename == 'roads.shp':
roads_shp_path = file_path

Pokrenite završenu skriptu. Svaki put kada pokrenete skriptu, biće preuzeta i obrađena nova kopija podataka.

Da bismo automatizovali pokretanje ove skripte na dnevnoj bazi, možemo koristiti „Planer zadataka“ u operativnom sistemu Windows. Pokrenite Planer zadataka i kliknite na :guilabel:„Kreiraj osnovni zadatak“.
Белешка
Korisnici Linuksa i Maka mogu da koriste cron zadatke za zakazivanje.

Nazovite zadatak kao „Dnevno preuzimanje i čišćenje“ i kliknite na :guilabel:„Dalje“.

Izaberite „Dnevno“ kao Okidač i kliknite Sledeće

Izaberite vreme koje vam odgovara i kliknite na Sledeće.

Izaberite „Pokreni program“ kao Radnju i kliknite Dalje.

Kliknite na Pregledaj i pronađite skriptu
launch.bat
. Kliknite na Dalje.

Kliknite na Završi na poslednjem ekranu da biste zakazali zadatak. Sada će se skripta automatski pokrenuti u određeno vreme kako bi vam svakodnevno davala svežu kopiju očišćenih podataka.

Ispod je kompletna skripta „download_and_clean.py“ za vašu referencu.
import sys
from qgis.core import *
import os
import urllib
import zipfile
import tempfile
# Initialize QGIS Application
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True)
app = QgsApplication([], True)
QgsApplication.initQgis()
# Add the path to Processing framework
sys.path.append('c:\\Users\\Ujaval\\.qgis2\\python\\plugins')
# Import and initialize Processing framework
from processing.core.Processing import Processing
Processing.initialize()
import processing
# Download and unzip the latest shapefile
temp_dir = tempfile.mkdtemp()
download_url = 'http://download.geofabrik.de/australia-oceania/fiji-latest.shp.zip'
print 'Downloading file'
zip, headers = urllib.urlretrieve(download_url)
with zipfile.ZipFile(zip) as zf:
files = zf.namelist()
for filename in files:
if 'roads' in filename:
file_path = os.path.join(temp_dir, filename)
f = open(file_path, 'wb')
f.write(zf.read(filename))
f.close()
if filename == 'roads.shp':
roads_shp_path = file_path
print 'Downloaded file to %s' % roads_shp_path
# Reproject the Roads layer
print 'Reprojecting the roads layer'
ret = processing.runalg('qgis:reprojectlayer', roads_shp_path, 'EPSG:3460', None)
output = ret['OUTPUT']
# Clean the Roads layer
print 'Cleaning the roads layer'
processing.runalg("grass:v.clean",
output,
1,
1,
None,
-1,
0.0001,
'C:\\Users\\Ujaval\\Desktop\\clean.shp',
'C:\Users\\Ujaval\\Desktop\\errors.shp')
print 'Success'