Exercice 2 : Manipulation des attributs d’une couche

Objectif

À 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.

Données

Les données proviennent de Natural Earth [1] :

ne_10m_airports.shp (Points - Localisation des aéroports) ➜ Téléchargement
ne_10m_admin_0_countries.shp (Polygones - Pays du monde) ➜ Téléchargement

Procédure

  • Charger 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...

_images/0_qgis_interface.png
  • 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.

_images/1_qgis_ouverture_style.png
_images/2_qgis_apres_style.png
  • Utiliser l’outil « Identifier » pour visualiser les attributs de chacune des entités. Cet outil s’applique uniquement à la couche active.

_images/3_qgis_identifier.png
  • Pour voir l’ensemble de la table de données relative à cette couche on peut ouvrir sa « table attributaire ».

_images/4_qgis_table_attributaire.png
  • 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()
      
  • À vous de jouer !
    Vous devez reprendre le script précédent afin de n’exporter que les aéroports de type major et major and military.
    Vous devez également ajouter une nouvelle colonne appellée « type » et contenant le type d’aéroport (major ou major and military) pour chacun d’entre eux.
    Enregistrer ce script sous le nom export_airports.py.
    Exécuter le script pour vérifier son bon fonctionnement.
    Le fichier CSV exporté doit être reconnu correctement par l’OS et s’ouvrir dans le tableur habituel (LibreOffice Calc, Microsoft Excel, etc.).
    Combien de lignes contient ce nouveau fichier CSV ?
    Connaissez-vous une autre méthode pour filtrer les aéroports selon leur type ?

💡 Solution de l'exercice 2


Footnotes