Beginnen met programmeren in Python (QGIS3)¶
QGIS heeft een krachtige interface voor programmeren die u in staat stelt de bron-functionaliteit van de software uit te breiden en ook om scripts te schrijven om uw taken te automatiseren. QGIS ondersteunt de populaire programmeertaal voor scripten Python. Zelfs als u een beginner bent, leer een klein beetje Python en de interface voor programmeren van QGIS zal u in staat stellen veel productiever te werk te gaan. Deze handleiding gaat er van uit dat u geen eerdere kennis van programmeren heeft en is bedoeld als introductie voor het scripten met Python in QGIS (PyQGIS).
Overzicht van de taak¶
We zullen een vectorpuntenlaag laden die alle belangrijke vliegvelden weergeeft en scripts in Python gebruiken om een tekstbestand te maken met de naam van het vliegveld, de code van het vliegveld en latitude en longitude voor elk vliegveld op de laag.
De gegevens ophalen¶
We zullen de gegevensset Airports van Natural Earth gebruiken.
Download het Airports shapefile.
Procedure¶
Zoek in de QGIS Browser naar het bestand
ne_10m_airports.zip
en vergroot het. Selecteer het bestandne_10m_airports.shp
en sleep het naar het kaartvenster.
U zult de laag
ne_10m_airports
zien geladen in QGIS.
Selecteer het gereedschap Objecten identificeren en klik op één van de punten om daarvan de beschikbare attributen te bekijken. U zult zien dat de naam van het vliegveld en de 3-cijferige code ervan zijn opgenomen in de respectievelijke attributen
name
eniata_code
. U kunt het venster Identificatieresultaten sluiten.
QGIS verschaft een ingebouwde console waar u opdrachten voor Python kunt typen en de resultaten verkrijgt. Deze console is een fantastische manier om te leren scripten en ook om snel gegevens te verwerken. Open de Python Console door te gaan naar
.
U zult zien dat een nieuw paneel wordt geopend aan de onderzijde van het kaartvenster van QGIS. U zult een prompt als
>>>
zien aan de onderzijde waar u opdrachten kunt typen. Voor de interactie met de omgeving van QGIS, moeten we de variabeleiface
gebruiken. U kunt het volgende typen en op Enter drukken om toegang te krijgen tot de huidige actieve laag in QGIS. Deze opdracht haalt de verwijzing naar de huidige geladen laag op en slaat die op in de variabelelayer
.
layer = iface.activeLayer()
Er bestaat een handige functie, genaamd
dir()
, in Python die u alle beschikbare methoden voor een object laat zien. Dat is handig als u niet precies weet welke functies beschikbaar zijn voor het object. Voer de volgende opdracht uit om te zien welke bewerkingen we kunnen doen met de variabelelayer
.
dir(layer)
U zult een lange lijst met beschikbare functies zien. Voor nu zullen we de functie, genaamd
getFeatures()
, gebruiken wat u een verwijzing zal geven naar alle objecten van een laag. In ons geval zal elk object een punt zijn dat een vliegveld weergeeft. U kunt de volgende opdracht typen om door elk van de objecten op de huidige laag te gaan.
Notitie
Inspringen (of een aantal spaties vóór elke argument) is heel belangrijk in Python. Als u een fout krijgt in deze stap, zorg er dan voor dat u 2 spaties hebt toegevoegd vóórdat u de tweede regel begon te typen.
Als het argument print(f) in een For-loop staat, dient u tweemaal op Enter te drukken na dat argument - eenmaal om de loop te verlaten - en nog ene keer om de opdracht uit te voeren.
for f in layer.getFeatures():
print(f)
Zoals u in de uitvoer zult zien, bevat elke regel een verwijzing naar een object op de laag. De verwijzing naar het object wordt opgeslagen in de variabele
f
. We kunnen de variabelef
gebruiken om toegang te krijgen tot de attributen van elk object. Typ het volgende om dename
eniata_code
voor elk object vliegveld af te drukken.
for f in layer.getFeatures():
print(f['name'], f['iata_code'])
U weet dus nu hoe u programmatisch toegang kunt krijgen tot de attributen van elk object op een laag. Laten we eens zien hoe we toegang krijgen tot de coördinaten van het object. Toegang tot de coördinaten van het vectorobject kan worden verkregen door de functie
geometry()
aan te roepen. Deze functie geeft een object geometrie terug die we kunnen opslaan in de variabelegeom
. U kunt de functieasPoint()
op de object geometrie uitvoeren om de X- en Y-coördinaten van het punt te verkrijgen. Als uw object een lijn of polygoon is, kunt u de functiesasPolyline()
ofasPolygon()
gebruiken. Typ de volgende code bij de prompt en druk op Enter om de X- en Y-coördinaten van elk object te bekijken.
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint())
Wat als we alleen het
X
-coördinaat van het object wilden? U kunt de functiex()
aanroepen voor het object punt en daarvan het X-coördinaat verkrijgen.
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint().x())
Nu hebben we alle stukjes die we aan elkaar kunnen naaien om de door ons gewenste uitvoer te verkrijgen. Typ de volgende code om de naam, iata_code, latitude en longitude van alle objecten vliegveld af te drukken. Hier gebruiken we de methode
.format()
die meer controle geeft voor het afdrukken van meerdere variabelen. De notatie.2f
is om de coördinaten te beperken tot 2 decimalen.
for f in layer.getFeatures():
geom = f.geometry()
print('{},{},{:.2f},{:.2f}'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x()))
U kunt de uitvoer zien worden afgedrukt op de console. Een meer handige manier om de uitvoer op te slaan zou een bestand zijn. U kunt de volgende code typen om een bestand te maken en de uitvoer daar naartoe weg te schrijven. vervang het bestandspad door een bestandspad op uw eigen systeem. Onthoud dat we
\n
toevoegen aan het einde van de opmaak van onze regel. Dat is om een nieuwe regel toe te voegen na de gegevens voor elk object.
Notitie
Er staan 2 niveaus codeblokken hieronder. Zorg er voor dat er 4 spaties zijn toegevoegd voor de code die begint op regel 3.
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)
U kunt naar de locatie van het uitvoerbestand gaan dat u heeft gespecificeerd en het tekstbestand openen. U zult de gegevens uit het shapefile Airports zien die we hebben uitgenomen met scripten met Python.
If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)