====== API QGIS ====== **Objectif : se familiariser avec l'API au travers de la console Python de QGIS** * Python documentation tutorial 3.6 https://docs.python.org/3.6/tutorial * QGIS Python API documentation https://qgis.org/pyqgis/master/index.html ===== Travail dirigé ===== **Objectif : découvrir les instructions pour extraire la représentation WKT des géométries d'une couche** * Well-known text (WKT) text markup language for representing vector geometry https://en.wikipedia.org/wiki/Well-known_text Voir aussi le dossier https://drive.switch.ch/index.php/s/jHcUvhFSRwEneES * avec le **tutoriel** de nos collègues de l'institut INSIT et utilisé lors de la HES d'été du département EC+G * avec la couche de points **tutopoi.shp** dont certaines insctructions ci-dessous sont spécifiques ==== Découverte de la console ==== * La console Python : après création d'un projet vide, la console s'active par le menu Plugins * elle permet d'exécuter une par une des commandes et d'en voir le résultat, par exemple : print('QGIS speaking!') import sys print(sys.version) print('Projet pathname: ' + QgsProject.instance().fileName()) # pour un projet ouvert et sauvegardé * L'éditeur de la console : s'ouvre avec l'icône qui va bien dans la toolbar de la console (petit crayon) * elle permet en un tout d'écrire, ouvrir, enregistrer, exécuter, commenter un script complet, par exemple # pour une couche chargée et sélectionnée dans la table des couches layer = iface.activeLayer() print('Layer name: ' + layer.name()) print('Feature count: ' + str(layer.featureCount())) * la méthode [[https://qgis.org/pyqgis/master/gui/other/QgisInterface.html?highlight=activelayer#qgis.gui.QgisInterface.activeLayer|activeLayer]] renvoie une référence sur l'objet [[https://qgis.org/pyqgis/master/core/Vector/QgsVectorLayer.html|QgsVectorLayer]] sélectionné dans la table des couches * on peut alors en afficher des caractéristiques (son nom, le nombre d'entités géographiques, etc) ==== Représentation WKT ==== * la méthode [[https://qgis.org/pyqgis/master/core/Vector/QgsVectorLayer.html?highlight=qgsvectorlayer#qgis.core.QgsVectorLayer.getFeatures|getFeatures]] renvoie un itérateur d'entités * on peut alors les parcourir et afficher des caratéristiques d'entités/[[https://qgis.org/pyqgis/master/core/Feature/QgsFeature.html#|QGSFeature]] layer = iface.activeLayer(); for feature in layer.getFeatures(): print(feature.id()) * une entité porte des attributs layer = iface.activeLayer() ft0 = layer.getFeature(0) # renvoie l'entité d'ID 0 print(ft0.fields().names()) # affiche les noms de attributs de l'entité print(ft0.attribute('NAME')) # affiche la valeur de l'attribut NAME de l'entité * une entité porte une géométrie layer = iface.activeLayer() ft0 = layer.getFeature(0) print(ft0.geometry().asWkt(7)) # 7 pour la précision décimale * la méthode [[https://qgis.org/pyqgis/master/core/Geometry/QgsGeometry.html#qgis.core.QgsGeometry.asWkt|asWkt]] permet d'extraire une représentation au format WKT de la géométrie (ex. Point (6.6114256 46.796648)) * Well-known text (WKT) text markup language for representing vector geometry https://en.wikipedia.org/wiki/Well-known_text ==== Ecriture dans un fichier ==== Documentation : https://docs.python.org/3.6/tutorial/inputoutput.html#reading-and-writing-files * Pour ouvrir un fichier en écriture : output = open('/home/olivier/tmp/wkt.txt','w') * Pour écrire dans le fichier : output.write('Here is one WKT formatted feature geometry:') output.write('\n') layer = iface.activeLayer() ft0 = layer.getFeature(0) output.write(ft0.geometry().asWkt(7)) * Pour fermer le fichier et vider le buffer d'écriture output.close() ===== A vous de jouer ! ===== Assemblez les diverses étapes précédentes pour **obtenir un fichier qui liste au format WKT toutes les géométries de la couche sélectionnée** dans la table des couches. On propose deux phases * afficher d'abord cette liste dans la console * écrire les éléments de la liste dans le fichier output = open('/home/olivier/tmp/wkt.txt','w') layer = iface.activeLayer() for feature in layer.getFeatures(): output.write(feature.geometry().asWkt(7)) output.write('\n') output.close() ==== Pour finir ... ==== Ce format WKT est simple, pratique et utilisé un peu partout. Par exemple : https://arthur-e.github.io/Wicket