====== 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