Početak programiranja u Pajtonu (QGIS3)¶
QGIS ima moćan programski interfejs koji vam omogućava da proširite osnovnu funkcionalnost softvera, kao i da pišete skripte za automatizaciju vaših zadataka. QGIS podržava popularni skriptni jezik Python. Čak i ako ste početnik, učenje malo Python-a i QGIS programskog interfejsa će vam omogućiti da budete mnogo produktivniji u svom radu. Ovaj tutorijal ne pretpostavlja prethodno znanje programiranja i namenjen je da pruži uvod u Python skriptovanje u QGIS-u (PyQGIS).
Pregled zadataka¶
Učitaćemo vektorski sloj tačaka koji predstavlja sve glavne aerodrome i koristiti Pajton skriptovanje da bismo kreirali tekstualnu datoteku sa imenom aerodroma, kodom aerodroma, geografskom širinom i dužinom za svaki aerodrom u sloju.
Dobijte podatke¶
Koristićemo skup podataka Airports iz Natural Earth-a.
Preuzmite datoteku Airports shapefile.
Procedura¶
Pronađite datoteku
ne_10m_airports.zip
u QGIS pregledaču i proširite je. Izaberite datotekune_10m_airports.shp
i prevucite je na platno.

Videćete sloj „ne_10m_airports“ učitan u QGIS-u.

Izaberite alatku Identify i kliknite na bilo koju od tačaka da biste pregledali dostupne atribute. Videćete da su naziv aerodroma i njegov 3 - trocifreni kod sadržani u atributima
name
iiata_code
respektivno. Možete zatvoriti prozor Identify.

QGIS pruža ugrađenu konzolu gde možete da kucate komande u Python-u i dobijete rezultat. Ova konzola je odličan način za učenje skriptovanja, a takođe i za brzu obradu podataka. Otvorite Python konzolu tako što ćete otići na
.

Videćete novi panel otvoren na dnu QGIS platna. Videćete prompt poput
>>>
na dnu gde možete da kucate komande. Za interakciju sa QGIS okruženjem, moramo da koristimo promenljivuiface
. Da biste pristupili trenutno aktivnom sloju u QGIS-u, možete da kucate sledeće i pritisnete Enter. Ova komanda preuzima referencu na trenutno učitani sloj i čuva je u promenljivojlayer
.
layer = iface.activeLayer()

Postoji praktična funkcija pod nazivom „dir()“ u Pajtonu koja vam prikazuje sve dostupne metode za bilo koji objekat. Ovo je korisno kada niste sigurni koje su funkcije dostupne za objekat. Pokrenite sledeću komandu da biste videli koje operacije možemo da izvršimo nad promenljivom „layer“.
dir(layer)

Videćete dugačak spisak dostupnih funkcija. Za sada ćemo koristiti funkciju pod nazivom „getFeatures()“ koja će vam dati referencu na sve karakteristike sloja. U našem slučaju, svaka karakteristika će biti tačka koja predstavlja aerodrom. Možete otkucati sledeću komandu da biste iterativno prošli kroz svaku od karakteristika u trenutnom sloju.
Белешка
Uvlačenje (ili broj razmaka pre svake izjave) je veoma važno u Pajtonu. Ako dobijete grešku u ovom koraku, uverite se da ste dodali 2 razmaka pre nego što ukucate drugi red.
Pošto se naredba print(f) nalazi unutar for-petlje, moraćete da pritisnete Enter dva puta nakon te naredbe - jednom za izlazak iz petlje - i još jednom za izvršavanje komande.
for f in layer.getFeatures():
print(f)

Kao što ćete videti na izlazu, svaki red sadrži referencu na objekat unutar sloja. Referenca na objekat je sačuvana u promenljivoj
f
. Možemo koristiti promenljivuf
da bismo pristupili atributima svakog objekta. Ukucajte sledeće da biste ispisaliname
iiata_code
za svaki objekat aerodroma.
for f in layer.getFeatures():
print(f['name'], f['iata_code'])

Dakle, sada znate kako programski pristupiti atributu svakog objekta u sloju. Da vidimo kako možemo pristupiti koordinatama objekta. Koordinatama vektorskog objekta može se pristupiti pozivanjem funkcije
geometry()
. Ova funkcija vraća geometrijski objekat koji možemo sačuvati u promenljivojgeom
. Možete pokrenuti funkcijuasPoint()
na geometrijskom objektu da biste dobili x i y koordinate tačke. Ako je vaš objekat linija ili poligon, možete koristiti funkcijeasPolyline()
iliasPolygon()
. Unesite sledeći kod na promptu i pritisnite Enter da biste videli x i y koordinate svakog objekta.
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint())

Šta ako želimo da dobijemo samo „x“ koordinatu karakteristike? Možete pozvati funkciju „x()“ na objektu tačke i dobiti njegovu x koordinatu.
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint().x())

Sada imamo sve delove koje možemo spojiti da bismo generisali željeni rezultat. Unesite sledeći kod da biste ispisali naziv, iata_code, geografsku širinu i dužinu svakog od objekata aerodroma. Ovde koristimo metodu
.format()
koja daje veću kontrolu pri ispisivanju više promenljivih. Notacija.2f
služi za ograničavanje koordinata na 2 decimale.
for f in layer.getFeatures():
geom = f.geometry()
print('{},{},{:.2f},{:.2f}'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x()))

Možete videti izlaz ispisan na konzoli. Korisniji način za čuvanje izlaza bi bio u datoteci. Možete otkucati sledeći kod da biste kreirali datoteku i tamo zapisali izlaz. Zamenite putanju datoteke putanjom na vašem sistemu. Imajte na umu da dodajemo
\n
na kraj formatiranja našeg reda. Ovo služi da bismo dodali novi red nakon što dodamo podatke za svaku funkciju.
Белешка
Ispod se nalaze 2 nivoa blokova koda. Obavezno dodajte 4 razmaka na početak 3-trećeg reda koda.
with open('/Users/ujaval/Desktop/airports.txt', 'w') as file:
for f in layer.getFeatures():
geom = f.geometry()
line = '{},{},{:.2f},{:.2f}\n'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x())
file.write(line)

Možete otići na lokaciju izlazne datoteke koju ste naveli i otvoriti tekstualnu datoteku. Videćete podatke iz shapefile-a aerodroma koje smo izvukli koristeći Python skriptovanje.

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)