Niveau | Débutant |
Logiciels utilisés |
QGIS |
Plateforme | Windows | Mac | Linux | FreeBSD |
Je suppose que vous connaissez tous les formats WKT ou Well-Known-Text et son équivalent en binaire, le WKB ou Well-Known Binary, définis par l’Open Geospatial Consortium (OGC), sinon un petit rappel sur Wikipedia: Well-known text.
L'intérêt de ces formats est qu'ils sont reconnus par:
- tous les logiciels SIG;
- toutes les bases de données géospatiales;
- toutes les librairies géospatiales, quelque soit le langage de programmation.
Ces formats constituent donc un formidable outil d'échange entre tous les éléments cités mais ils sont rarement utilisés pour entrer ou modifier les géométries dans des logiciels SIG.
C'est le but de ces deux plugins:
- QuickWKT permet d'entrer les géométries aux formats WKT et WKB et de les visualiser dans QGIS;
- Plain Geometry Editor permet d'éditer les géométries existantes au format WKT.
Mais avant de les analyser, une petite présentation de ce qu'il est possible de faire dans QGIS avec ces formats s'impose, car leurs possibilités sont sous-estimées dans la création des couches.
Utilisation du format WKT pour créer des couches dans QGIS
Il est déjà possible d'importer des géométries au format WKT avec le menu « Ajouter une couche de texte délimité » et l'option Champ WKT mais il y a moyen d'aller beaucoup plus loin dans la Console Python avec un simple script qui crée une couche mémoire (memory layer) à partir de n'importe quelle chaîne au format WKT, ici sans attributs et sans projection (CRS). Pour traiter un ensemble de couches ou une couche MULTIxxx, ils suffit de créer une boucle.
# fonction de création d'une couche temporaire QGIS
def couche_wkt(wkt,nom):
geom = QgsGeometry.fromWkt(wkt)
type = typeMap[geom.type()]
# puisque le type de géométrie est déjà signale dans le format
couche = QgsVectorLayer(type, nom,"memory")
pr = couche.dataProvider()
elem= QgsFeature()
elem.setGeometry(geom)
pr.addFeatures( [ elem ] )
couche.updateExtents()
QgsMapLayerRegistry.instance().addMapLayers([couche])
# type de couche
typeMap = {0: "Point", 1: "LineString", 2: "Polygon"}
# polygone au format WKT
test = 'POLYGON((30 10,30 40,50 40,50 10,30 10))'
# création de la couche temporaire
couche_wkt(test,'polygone')
et le résultat est est une belle couche avec le polygone.:
Comme souligné, le format WKT est un formidable outil d'échange et je vais l'illustrer avec l'utilisation du module Python Shapely qui permet, dans sa dernière version, d'effectuer les rotations, les translations ou les cisaillements en 2D et en 3D. Il permet aussi d'utiliser le format binaire WKB, plus rapide.
from shapely import affinity
from shapely.wkt import loads
# transformation en polygone shapely
test90 = loads(test)
# rotation du polygone de 90°
rot = affinity.rotate(test90, 90)
couche_wkt(rot.wkt,'polygone90')
résultat:
En conclusion, tout peut être fait avec cette méthode, même les devoirs de mes fils ... (avec l'exemple de traitement mathématique de Pascal Leroux dans: points intersection courbes et présenté dans Python: le module Shapely, géométries, prédicats spatiaux, analyse spatiale, matrices de Clementini (DE-9IM), traitements de shapefiles ou autres, et représentation avec matplotlib.
QuickWKT
Ce plugin permet d'effectuer cette démarche sans programmation et de manière plus complète que ce que j'ai présenté dans mon script. Il gère aussi bien les formats WKT, que les formats (E)WKT (avec projection) et WKB. Une fois installé il se trouve dans le menu Extension.
Une fois lancé, il propose d'insérer quelques types de géométries à titre d'exemple (la dernière version accepte aussi les géométries de type MULTIxxx, et GEOMETRYCOLLECTION.)
Et il suffit de coller notre polygone dans le cadre pour obtenir le résultat:
Il y a moyen d'entrer plusieurs types de géométries à la suite l'une de l'autre dans le cadre:
- une couche mémoire différente sera créée par géométrie (n géométries = n couches)
- ou une seule couche par type de géométrie en cochant le bouton Create new layer for every geometry type. (n types de géométries = n couches)
Plain Geometry Editor
Ce plugin effectue la démarche inverse, c'est-à-dire le traitement de toutes les géométries existantes au format WKT. Une fois installé il se trouve aussi dans le menu Extension.
- la couche doit être en mode Édition
- une fois le plugin activé, il se manifeste par une croix qu'il suffit de placer sur l'objet édité;
- une fenêtre s'ouvre alors avec la géométrie de l'objet au format WKT:
Ce qui fait la force du plugin est qu'il permet de modifier la géométrie en direct en changeant les valeurs dans le cadre:
Conclusions
À vous de jouer car une fois maîtrisés, ces plugins qui, apparemment ne paient pas de mine, se révèlent redoutables, si vous ne voulez pas programmer, et très amusants à utiliser.
Pour moi qui programme en Python, QuickWKT est aussi devenu indispensable car il me permet de vérifier très rapidement les résultats obtenus (un simple copier-coller au lieu d'utiliser le module Python matplotlib, par exemple)
- QuickWKT fonctionne sur les versions 1.8 et master de QGIS, utilisée ici;
- Plain Geometry Editor n'a pas encore été adapté au nouvel API Python de la version master et ne fonctionne que sur la version 1.8, utilisée ici.
Tous les traitements ont été effectués sur Mac OS X.
Site officiel : Python: le module Shapely, géométries, prédicats spatiaux, analyse spatiale, matrices de Clementini (DE-9IM), traitements de shapefiles ou autres, et représentation avec matplotlib
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique Commerciale 2.0 France
Commentaires
Bonjour, Article de qualité
Bonjour,
Article de qualité et bien utile!
Poster un nouveau commentaire