Exemples de fichiers XML
OSM
Exemple de lien vers le fichier XML de la base de données OSM, suffixé par l'id OSM (que justement, nous possèdons pour tous nos sommets) :
import requests MyOsmId = '582066938' r = requests.get("https://www.openstreetmap.org/api/0.6/node/"+MyOsmId) print(r.text)
Notez l'importation nécessaire du module en haut de fichier.
Clé-valeur
Nos sommets n'ont pas de donnée attributaire sur leur altitude. Mais il semble que les XML d'OSM la connaissent ! En effet le fichier contient un tableau associatif avec un ensemble de clé-valeur dont ele
(elevation en anglais).
Nous allons parser le fichier XML afin de récupérer l'altitude dans une jolie variable.
Parsing
Grâce à une condition if
, nous allons récupérer l'altitude, à condition que le fichier XLM contienne le tag ele
, sinon nous n'affichons rien.
import requests import xml.etree.ElementTree MyOsmId = '582066938' r = requests.get("https://www.openstreetmap.org/api/0.6/node/"+MyOsmId) root = xml.etree.ElementTree.fromstring(r.content) for child in root.iter('tag'): if child.attrib['k'] == 'ele': print (child.attrib['v']+" mètres")
Nous sommes donc capable de récupérer l'altitude, bien, maintenant utilisons-là dans le titre de nos cartes générées :
import datetime import requests import xml.etree.ElementTree mylayer = QgsProject.instance().mapLayersByName("peaks")[0] ... for feat in mylayer.getFeatures(): ... # Récupérer altitude sur API OSM r = requests.get("https://www.openstreetmap.org/api/0.6/node/"+id_peak) root = xml.etree.ElementTree.fromstring(r.content) for child in root.iter('tag'): if child.attrib['k'] == 'ele': altitude = ", "+child.attrib['v']+" mètres" # Titre title = QgsLayoutItemLabel(layout) title.setText(layoutName+altitude) title.setFont(QFont("Verdana", 28)) title.adjustSizeToText() layout.addLayoutItem(title) title.attemptMove(QgsLayoutPoint(5, 4, QgsUnitTypes.LayoutMillimeters)) ...
Précédé d'une virgule, notre variable altitude
n'a plus qu'à aller se concaténer à la suite de notre variable layoutName
dans le titre de nos cartes. Ainsi les enregistrements pour lesquels nous ne connaissons pas l'atitude n'afficheront pas de caractère inopportun à la suite du titre.
- Note personnelle : on pourrait aller plus loin en ajoutant dans les sources des cartes le nom du contributeur OSM ayant saisi ou modifié l'entité sommitale cible.
Encodage
Il serait bon d'encoder notre caractère spécial è
dans le mot mètres, car ici il est affiché en tant que pure chaîne, et dans certains cas spéciaux nous pourrions avoir de mauvaises suprises.
import html ... altitude = ", "+child.attrib['v']+html.unescape(" mètres") ...
- Note personnelle : faire aussi l'encodage du fichier lui-même, et parler de l'encodage des fichiers Python.
Wikidata
Certains sommets possèdent un id Wikidata (dans le champ OTHER_TAGS). Exemple de lien vers donnée Wikidata, suffixé par un id Wikidata :
- https://osm.wikidata.link/Q726652
- https://www.wikidata.org/wiki/Q726652
- https://www.wikidata.org/wiki/Special:EntityData/Q1617977.json
Pour tester, allez chercher le contenu d'une page page HTML d'osm.wikidata.link :
import requests r = requests.get("https://osm.wikidata.link/Q726652") print(r.text)
Un peu lent mais bien fourni. Les page wikidata.org se prêtent tout de même mieux au web-scraping (les contenus y sont mieux organisés, à l'intérieur de jolies balises).
Module requests-html
Si besoin, installez requests-html (dans le shell Windows, pas Python) :
pip install requests-html
- Astuce
- Pour une installation à l'université de Cergy (Python 2) :
- py -m pip install requests-html
Récupérer des données Wikidata
Les contenus y sont si bien organisé que nous allons pouvoir récupérer le lien vers la page Wikipédia du sommet, et même cibler celle en français.
Dans la console Python de Windows :
import requests from requests_html import * session = HTMLSession() MyWikiId = 'Q726652' r = session.get("https://www.wikidata.org/wiki/"+MyWikiId) my_content = r.html.find('.wikibase-sitelinkview-link-frwiki a', first=True) #print(my_content) my_link = my_content.xpath('//a/@href') print(my_link)
Nous nettoyons ensuite le lien pour le rendre utilisable par le module requests :
import requests from requests_html import * session = HTMLSession() MyWikiId = 'Q726652' r = session.get("https://www.wikidata.org/wiki/"+MyWikiId) my_content = r.html.find('.wikibase-sitelinkview-link-frwiki a', first=True) #print(my_content) my_link = my_content.xpath('//a/@href') #print(my_link) my_link_string = str(my_link).replace('[', "").replace(']', "").replace("'", "") print(my_link_string) r2 = session.get(my_link_string) print(r2.text)
Mais c'est finalement les pages Wikipédia dont les contenus ne sont plus suffisament bien organisés... Ce serait sans doute tout de même possible en multipliant les conditions, mais pas très efficace.
L'API Wikipedia
Essayons avec la bibliothèque wikipedia de Python, faîte expressément pour ça !
Si besoin de l'installer (dans le shell Windows, et non Python) :
pip install wikipedia
- Astuce
- Pour une installation à l'université de Cergy (Python 2) :
py -m pip install wikipedia
Et maintenant dans la console Python de l'invite de commande Windows :
import wikipedia wikipedia.set_lang("fr") summary_fr = wikipedia.summary("Aiguille Dibona", sentences=10) my_page = wikipedia.page("Aiguille Dibona") print(summary_fr) print (my_page.url)
Héhé, c'est bien plus simple hein ?
- Astuce
- Un exemple complet d'usage de l'API Wikipedia est décrit ici : https://hg-map.fr/8-blog/90
L'API Wikidata
https://pypi.org/project/Wikidata/
from wikidata.client import Client client = Client() entity = client.get('Q1617977', load=True) print(entity) print(entity.description) print(entity.data) url_fr = entity.data['sitelinks']['frwiki']['url'] print(url_fr) image_prop = client.get('P18') image = entity[image_prop] print(image.image_resolution) print(image.image_url) print(entity.__dict__)
Utilisation de modules Python tiers dans QGIS
Mais nous avons un problème. En effet la bibliothèque wikipedia
de Python n'est pas forcément accessible depuis QGIS, même si vous l'avez déjà installé sur Windows.
Testez la seule importation du module wikipedia
depuis la console Python de QGIS pour en avoir le cœur net :
import wikipedia
C'est parce que la version de Python utilisée par QGIS n'est pas la même que celle de votre machine, puisque sous Windows, QGIS embarque sa propre installation de Python.