Skip to content

Latest commit

 

History

History
44 lines (34 loc) · 2.49 KB

intro.md

File metadata and controls

44 lines (34 loc) · 2.49 KB

TP de remise en jambes en Python

L'idée de ce TP est de se mettre en jambes en Python autour d'un sujet venu du monde réel.

Compétences : mise en places de requêtes HTTP, parsing de GetCapabilities, lecture/écriture de fichiers

Filtrage des couches d'un GetCapabilities

Le GetCapabilities du service WMTS de la Géoplateforme https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetCapabilities contient 573 couches. Pour un usage SIG comme QGIS, cela rend la navigation difficile lorsqu'il faut choisir une couche particulière. Le fichier layers.csv contient une liste de couches qui m'intéressent (correspondant à l'attribut ows:Identifier dans le GetCapabilities).

Le but du TP est de créer un script qui génère un GetCapabilities allégé, lisible par QGIS, qui ne contienne que les couches voulues.

Étapes de développement :
  • Chercher les librairies Python permettant de répondre aux problèmes suivants : requêtes HTTP, parsing et écriture de fichier XML, lecture de CSV
  • Structurer le code en fonctions réalisant des tâches minimalistes.
  • Enchaîner les fonctions dans un bloc de code commençant pas if __name__ == "__main__" pour pouvoir exécuter le script.

Pour aller plus loin :

  • Se baser sur le nouveau CSV suivant : resources_by_key.csv
  • Créer 1 fichier xml GetCapabilites WMTS par key différente (filtrer le CSV pour ne garder que les lignes ayant wmts comme service)

Pour aller encore plus loin

Soucis rencontrés et solutions :

Dans le fichier de sortie, ns0 au lieu de ows

Ajouter au début du code :

ET.register_namespace('ows', "http://www.opengis.net/ows/1.1")

Pour le faire de manière générique (ajouter tous les namespaces d'un fichier donné) :

def register_all_namespaces(filename):
  for _, node in ET.iterparse(filename, events=['start-ns']):
    if node[0] == 'wfs':
      continue
    namespaces[node[0]] = node[1]
  for ns in namespaces:
      ET.register_namespace(ns, namespaces[ns])