À partir d’une couche vecteur de points représentants les principaux aéroports, créer un script python permettant d’exporter un fichier CSV contenant, pour chaque aéroport majeur son nom, son code, sa latitude et sa longitude.
Les données proviennent de Natural Earth [1] :
ne_10m_airports.shp
(Points - Localisation des aéroports) ➜ Téléchargementne_10m_admin_0_countries.shp
(Polygones - Pays du monde) ➜ TéléchargementCharger la couche vecteur ne_10m_airports.shp
:
soit en faisant un glissé-déposé de ce fichier vers l’interface de QGIS,
soit en en utilisant le menu Couche > Ajouter une couche > Ajouter une couche vecteur...
De manière similaire, charger la couche ne_10m_admin_0_countries.shp
.
Modifier le style des couches pour obtenir le résultat suivant :
Utilisation d’un pictogramme d’avion pour les aéroports
Utilisation d’un fond de couleur beige/jaune pour les pays du monde.
Rappel: Le style de chacune des couches peut-être modifié depuis le gestionnaire de couches, en sélectionannt une couche puis en faisant
clic droit > Propriétés
puis sélection de l’onglet « Symbologie ». QGIS offre de nombreux modes de rendu des couches (catégorisé, gradué, etc.) en fonction du type de couche et du type d’information à représenter.
Utiliser l’outil « Identifier » pour visualiser les attributs de chacune des entités. Cet outil s’applique uniquement à la couche active.
Pour voir l’ensemble de la table de données relative à cette couche on peut ouvrir sa « table attributaire ».
Ouvrir la console python.
S’assurer que la couche des aéroports est bien celle qui est active.
Parcourir les différentes entités de la couche :
layer = iface.activeLayer()
# Pour chaque entité dans la couche ...
for ft in layer.getFeatures():
# afficher son nom par exemple ...
print(ft['name'])
Accéder aux attributs de chaque enregistrement :
layer = iface.activeLayer()
for ft in layer.getFeatures():
# Avec la notation entre crochet et le nom du champ à utiliser
print(ft['name'], ft['iata_code'], ft['type'])
Accéder à la géométrie de chaque enregistrement :
layer = iface.activeLayer()
# Pour chaque entité dans la couche active ..
for ft in layer.getFeatures():
# On demande la géométrie de l'entité
geom = ft.geometry()
# On sait que chaque géométrie de la couche
# est de type "Point"
geom_point = geom.asPoint()
# L'objet `QgsPointXY` a notamment une méthode `x` et une méthode `y`
print(geom_point, geom_point.x(), geom_point.y())
Obtenir les différentes modalités du champ type
en parcourant les
différentes entités dans une liste de compréhension :
categories = list(set([ft['type'] for ft in layer.getFeatures()]))
# print(categories)
# ['military', 'spaceport', 'military mid', 'small', 'mid and military',
# 'major and military', 'military major', 'mid', 'major']
Nous savons donc comment accéder aux différentes informations nécessaires pour réaliser l’export souhaité.
L’export au format CSV va nécessiter de structurer les valeurs relatives à
chaque enregistrement (ici à chaque aéroport) sous forme d’une liste.
Le module csv
de la bibliothèque standard [2] se chargera d’écrire
correctement les valeurs de chaque enregistrement selon le type de fichier CSV souhaité.
Étudiez l’exemple suivant qui créé un fichier CSV de tous les aéroports présents dans la couche :
import csv
output_file = open('/home/mthh/airports.csv', 'w', newline='')
csv_writer = csv.writer(output_file)
header_line = ["Nom", "Code_IATA", "Latitude", "Longitude"]
csv_writer.writerow(header_line)
for ft in layer.getFeatures():
# Ici les résultats ne sont pas encore filtés selon le type d'aéroport
geom_point = ft.geometry().asPoint()
# Une liste contenant les 4 valeurs, dans le même ordre
# que l'entête (header_line)
row = [ft['name'], ft['iata_code'], geom_point.x(), geom_point.y()]
csv_writer.writerow(row)
output_file.close()
export_airports.py
.Footnotes