Articles marqués ‘ogr’
[GDAL-OGR] Mode ajout dans une base de données PostGreSQL
Il y a quelques temps je devais importer des données au format EDIGEO dans une base PostGreSQL/PostGIS existante. J’avais plusieurs fichiers THF à importer par conséquent je devais créer la table puis importer les fichiers les nus après les autres. Après lecture attentive de la documentation puis poser quelques questions sur la liste gdal, voici la méthode ainsi que les petites astuces qui font la différence.
Visualisation du problème
Puisque la table n’existe pas au premier fichier THF, il faut que la commande ogr2ogr s’en occupe puis, dans un deuxième temps, il faut que cette même commande ajoute les données. La doc est assez clair là dessus : il faut lancer deux commandes l’une après l’autre (en fait seules quelques options sont différentes) :
ogr2ogr -gt 65536 -f "PostgreSQL" "PG:dbname=test host='localhost'" -lco "GEOMETRY_NAME=the_geom" -lco "SCHEMA=test" -lco "OVERWRITE=YES" -nln EDIGEO_parcelle E0001.THF PARCELLE_id
Cette commande s’exécute sans problème. Les options utilisées ici sont les suivantes :
- -gt 65536 : permet de grouper les géométries par groupe de 65 536 géométries avant de les commiter. Cela évite de commiter les géométries les unes après les autres. La valeur utilisée est celle préconiser par la documentation.
- -lco « SCHEMA=test » : importer les données dans un schéma particulier.
- -lco « GEOMETRY_NAME=the_geom » : totalement inutile mais j’aime bien avoir une cohérence dans mes noms de colonnes géométriques.
- -lco « OVERWRITE=YES » : obligatoire quand on fait plusieurs essaie ou quand la table existe déjà pour cause d’import déjà réalisé. Cette option indique que la table sera écrasée (détruite puis recrée).
- -nln EDIGEO_parcelle : donner un nom différent à la table que l’on va créer. Notez le mélange de majuscules et de minuscule, nous en reparlerons plus tard.
La deuxième commande que j’ai testé pour ajouter les données à une table existante esty celle-ci :
ogr2ogr -append -update -gt 65536 -f "PostgreSQL" "PG:dbname=test host='localhost'" -lco "GEOMETRY_NAME=the_geom" -lco "SCHEMA=test" -nln EDIGEO_parcelle E0002.THF PARCELLE_id
Et là, ca marche beaucoup moins bien car je reçois ce message :
ERROR 1: Layer test.edigeo_parcelle already exists, CreateLayer failed. Use the layer creation option OVERWRITE=YES to replace it. ERROR 1: Terminating translation prematurely after failed translation of layer PARCELLE_id (use -skipfailures to skip errors)
Et les logs de PostgreSQL montrent que cela ne provient pas de la base de données :
Postgresql log file shows: 2013-03-06 15:35:44 CET LOG: could not receive data from client: Connection reset by peer 2013-03-06 15:35:44 CET LOG: unexpected EOF on client connection
Compréhension du problème et solution
En regardant les logs d’un peu plus près, voici ce que l’on y trouve :
- le nom de la table créée est test.edigeo_parcelle, ce qui est incorrecte en regard de la commande que j’ai lancé (le nom de la table aurait dû être EDIGEO_parcelle.
- une commande est réalisée lors du mode ajout et celle-ci ne cherche pas la table dans le schéma test mais dans le schéma public.
Ces deux problèmes peuvent être réglés de plusieurs manières différentes.
La solution « fainéant »
Résumons la par « Ah ben ca marche pas avec des majuscules et dans un schéma autre que le schéma public, tant pis ». La solution ici est de mettre le nom de la table en minuscule (bonne pratique) et celle-ci dans le schéma public (pas bien !).
La solution dite de « contournement »
Elle s’approche de la première car elle n’utilise pas les options nécessaires (et ajoutées pour) ce cas de figure et elle ne sert qu’au deuxième problème (celui du schéma) :
ogr2ogr -append -update -gt 65536 -f "PostgreSQL" "PG:dbname=test host='localhost'" -nln test.edigeo_parcelle E0002.THF PARCELLE_id
Notez ces modifications :
- -lco « SCHEMA=test » et -lco « GEOMETRY_NAME=the_geom » ont été supprimés car inutile. Les options -lco ne sont pas utilisées en mode append ou update (ben oui le c de lco est pour « création », logique !).
- le nom de la table dans l’option -nln a été modifié en test.edigeo_parcele : tout en minuscule et ajout du schéma
La solution qui utilise les bonnes options
Comprenons bien les problèmes. Un premier problème vient du fait que le nom de la table que nous souhaitons créer contient des majuscules qui sont transformés en minuscule. Le deuxième problème vient du fait que nous utilisons une option de création pour définir le schéma dans lequel insérer des données alors que nous somme en mode append/update.
Nettoyage des noms de couches/table, colonne
Le pilote PostgreSQL dans GDAL/OGR contient un système de nettoyage des valeurs données lors de la création d’une couche. Cette option se nomme « LAUNDER » et est définie dans la page du pilote : http://gdal.gloobe.org/ogr/formats/pg.html (en français) :
Elle peut être définie à *YES* pour forcer les nouveaux champs créés sur cette couche à avoir les noms de champs « nettoyés » dans une forme compatible avec PostgreSQL. Cela convertie la valeur en minuscule ainsi que certains caractères spéciaux comme « – » et « # » en « _ ». Si la valeur *NO* est utilisée les noms exacts seront préservés. La valeur par défaut est *YES*. Si activé le nom de la table (couche) sera également nettoyé.
Si l’on souhaite garder nos majuscules il faut définir cette option à « NO ».
Définition du schéma en mode append/update
Lorsque nous somme en mode append ou update, nous ne somme pas en mode de création. C’est peu de le dire, c’est évident, mais au final on n’en saisit pas toujours les conséquences : les options de création ne nous serons d’aucune utilité ! Heureusement il y a une possibilité : le paramètre « active_schema » dans la chaîne de connexion. Notre commande devient alors :
ogr2ogr -append -update -gt 65536 -f "PostgreSQL" "PG:dbname=test host='localhost' active_schema=test" -nln edigeo_parcelle E0002.THF PARCELLE_id
Merci à Even Rouault pour son aide sur la liste.
Google Fusion Table, OGR et QGIS
Google Fusion Table, OGR et QGIS : trois projets a priori indépendant, même si nous savons que derrière QGIS se cache la bibliothèque GDAL/OGR. Mais celle-ci est généralement sous estimée, notamment ses possibilités de virtualisation de données (raster ou vecteur). Entre autre chose cela permet à QGIS de pouvoir lire tous les formats de données gérés par GDAL/OGR même si elles ne sont pas listés dans les formats gérés ou qu’elles demandent des étapes intermédiaires (comme pour le format NetCDF).
Google Fusion Table (GFT) est une application Google lié plus ou moins à leur Google Doc, le tableur en particulier. En effet Google propose une feuille calc dans laquelle nous pouvons définir plusieurs colonnes, donc une spéciale, appelée Location qui contient une adresse ou une géométrie (KML par exemple).
GDAL/OGR gère le format GFT depuis sa version 1.9 (toute récente). Cet article a pour but de présenter quelques fonctionnalités et comment utiliser, simplement, un GFT au sein de QGIS (ou de MapServer bien sur).
Il y a quelques temps j’ai créé une feuille test_shapefile composée de quelques colonnes : nom, prénom, location (une adresse), et quelques informations diverses. Je peux me connecter à cette feuille via ogr comme cela :
[sourcecode language= »bash »]
yves@poseidon-vb:~$ ogrinfo -ro "GFT:email=yjacolin@gmail.com password=XXXXXX"
INFO: Open of `GFT:email=yjacolin@gmail.com password=XXXXXX’
using driver `GFT’ successful.
1: test_shapefile
[/sourcecode]
Mais entrer un mot de passe en clair n’est pas très sécurisé, Google proprose de récupérer une clé d’authentification, que l’on peut modifier enfin je suppose) :
[sourcecode language= »bash »] $ ogrinfo –config CPL_DEBUG ON "GFT:email=yjacolin@gmail.com password=XXXXXX" HTTP: Fetch(https://www.google.com/accounts/ClientLogin) HTTP: These HTTP headers were set: Content-Type: application/x-www-form-urlencoded GFT: Auth key : MACLéICI-LONGUE_DE_PLUSIEURS_CARACTèRES GFT: Run SHOW TABLES [..] [/sourcecode]
Puis, sous linux, nous utilisons une variable d’environnement pour définir la clé (d’autres possibilités existent en plus du mot de passe en clair et de la clé d’authentification, référez vous à la documentation du pilote GFT de GDAL/OGR (voir bibliographie plus bas) :
[sourcecode language= »bash »]</code> export GFT_AUTH=MACLéICI-LONGUE_DE_PLUSIEURS_CARACTèRES[/sourcecode]
On teste la prise en compte de la clé d’authentification :
[sourcecode language= »bash »]</code>ogrinfo -ro "GFT:"[/sourcecode]
J’exporte ma table en shapefile :
[sourcecode language= »bash »]ogr2ogr -f "Esri Shapefile" test_shapefile "GFT:tables=1jfYFX051Gbq5JU7Fd-Yxd_Q4aPDslDwDypsm3VU"[/sourcecode]
Puis j’importe une couche – différente – au format shapefile :
[sourcecode language= »bash »]</code>ogr2ogr -f GFT "GFT:" point_etude.shp[/sourcecode]
Pour visualiser ces données dans QGIS ou MapServer j’ai besoin de virtualiser ma couche GFT au moyen du format VRT vecteur.
Création du fichier vrt :
[sourcecode language= »xml »]
<OGRVRTDataSource>
<OGRVRTLayer name="point_etude">
<SrcDataSource>GFT:</SrcDataSource>
<SrcLayer>1SWEVgpny8Ojh-dzJEURhhEJVVa44Vnitey3DRhk&pli=1</SrcLayer>
<LayerSRS>WGS84</LayerSRS>
</OGRVRTLayer>
</OGRVRTDataSource>
[/sourcecode]
puis j’utilise ce fichier vrt pour vérifier que je me connecter correctement à ma couche GFT :
[sourcecode language= »bash »]
ogrinfo -so point_etude.vrt point_etude
INFO: Open of `point_etude.vrt’
using driver `VRT’ successful.
Layer name: point_etude
Geometry: Unknown (any)
Feature Count: 1500
Extent: (-5.974657, 40.712886) – (9.572308, 52.068039)
Layer SRS WKT:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
TOWGS84[0,0,0,0,0,0,0],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9108"]],
AUTHORITY["EPSG","4326"]]
ID: Real (0.0)
geometry: String (0.0)
[/sourcecode]
Les géométries sont affichées comme celles-ci :
[sourcecode language= »bash »]
OGRFeature(point_etude):1425
ID (Real) = 1423
geometry (String) = <Point><coordinates>-3.443027539873455,47.169053485738431</coordinates></Point>
POINT (-3.443027539873455 47.169053485738431)
OGRFeature(point_etude):1426
ID (Real) = 1424
geometry (String) = <Point><coordinates>8.270853712116637,45.104331014323307</coordinates></Point>
POINT (8.270853712116637 45.104331014323307)
OGRFeature(point_etude):1427
ID (Real) = 1425
geometry (String) = <Point><coordinates>3.631323682505393,46.460888984293931</coordinates></Point>
POINT (3.631323682505393 46.460888984293931)
[/sourcecode]
Enfin l’export fonctionne :
[sourcecode language= »bash »]ogr2ogr -f "Esri Shapefile" test.shp point_etude.vrt point_etude[/sourcecode]
La visualisation au sein de QGIS se fait simplement en ouvrant le fichier vrt comme tout format de données vecteur.
Conclusion
Le format Google Fusion Table est un format intéressant, l’interface avec un format vrt permet de s’y connecter avec toute application s’appuyant avec GDAL/OGR comme QGIs ou MapServer mais le principale intérêt aurait été de pouvoir géocoder ses adresses au moyen de GFT et de pouvoir s’en service comme source de données. Malheureusement GFT ne permet que de géocoder ses adresses et de les visualiser dans une carte Google Map ou Google Earth. Il est impossible de sauver le géocodage dans une colonne dans un format WKT par exemple.
Si cette limitation ne vous pose pas de problème, vous pouvez stocker vos couches sur les serveurs de Google au format GFT et les lire dans QGIS/MapServer.
Bibliographie
- Le pilote GFT dans OGR : version anglaise ou la version française
- Le pilote VRT dans OGR : version anglaise ou version française
- Guide du développeur de Google Fusion Table
Mise à jour de la documentation de GDAL en français
L’annonce a déjà transpiré sur Twitter mais il faut l’officialiser : la doc de GDAL en français a été mise à jour. Celle-ci contient non seulement la traduction de la doc de GDAL mais également de nouveaux chapitres originaux : Python, FAQ, et d’autres traductions de commandes utiles et complémentaire à celles de GDAL-OGR.
La doc a été passée en restructured text permettant une export en HTMl et PDF à partir de la version Softlibre (et non celle du wiki de GeoRezo.net) afin de faire évoluer la licence vers une licence proche de celle de GDAL : Licence Creative Common BY.
La version HTML est disponible à cette adresse : http://gdal.gloobe.org/index.html
[QGIS] Sauver un fichier dans un autre format
Ce cours article fait suite à une question posée sur le forum Geolibre de GeoRezo.net. L’utilisateur souhaitait sauvegarder ses données au format MapInfo à partir de données au format d’ESRI en utilisant le pluging OGR. Ce plugin très utile n’était plus maintenu ce qui posait certain problème (notamment celui présenté dans ce thread). D’autre part depuis la version 1.7 de QGIS ce plugin a été supprimé.
L’alternative est d’utiliser la fonctionnalité « sauver sous … » de QGIS. Jusqu’ici rien de bien compliqué et cette fonctionnalité peut paraitre bien trop simple pour l’ensemble des cas d’utilisation possible. Cependant, comme souvent au sein du projet QGIS, la fonctionnalité intégrée dans QGIS apporte plus de fonctionnalité que l’ancien plugin. L’exemple est venu de ce même thread où un autre utilisateur désirait transformer sa couche au format GPX. Malheureusement le format GPX présente quelques contraintes et l’export par défaut échoué car la table attributaire ne correspondait pas à la structure du fichier GPX. OGR propose une option qui permet de récupérer ces champs attributaires et de les placer dans une balise « <extension> ». Cette option doit être placée dans la commande sous forme de flag « option de création ».
Voici la méthode pour réaliser cet export. Cette méthode est généralisable à toutes les options de tous les formats :
- aller sur le site d’OGR pour connaitre les options et les limites du pilote du formatou sur le wiki de GeoRezo.net pour la version française
- trouver l’option « qui va va bien », dans notre cas c’est l’option GPX_USE_EXTENSIONS=YES
- cliquer-droit sur la couche dans QGIS, sous-menu « sauvegarder sous … »
- dans la fenêtre qui s’ouvre, renseigner les infos : couche d’export, projections et l’option de création. voir la capture d’écran ci-dessous :
Présentation des nouveautés de MapServer 6.0
UMN MapServer est un serveur cartographique prenant en charge un grand nombre de formats de fichier. Il est possible de l’utiliser en mode CGI ou à travers des langages de script tels que PHP, Ruby, Java, C#, etc à l’aide de MapScript. MapServer constitue donc un environnement de développement d’outils plus qu’un outil en lui même prêt à être installé et à être utilisé directement.
Au niveau des nouveautés de cette version majeure, nous trouvons au niveau du coeur de MapServer : une API d’interface de rendu, le refactoring de l’interpréteur des Expressions dans MapServer (MS RFC 64) et les requêtes en une seule passe (MS RFC 65), au niveau des améliorations : la sortie KML, amélioration de la gestion des étiquettes, amélioration de la gestion des styles des features, de nouveaux formats pour la requête GetFeature du service WFS, un visualiseur OpenLayers interne, une meilleure gestion des fichiers temporaires, la possibilité d’activer ou pas les services OGC, la fusion et le cluster des features.
Note : un document détaillant ces nouveautés est disponible sur le site du PortailSIG. Je reprend ici que l’introduction de chaque nouveautés.
Nouveautés
API de rendu d’interface (MS RFC 54)
L’objet de ce développement est de créer une API pour brancher des moteurs de rendues différents en fonction du format de sortie voulu, pour l’anecdote cette API fonctionne d’une manière similaire à la lecture des données.
Révision du parseur d’expression de MapServer (MS RFC 64)
L’objet de cette RFC est de revoir le parseur d’expression (i.e. le code qui interprète les expressions utilisées dans le mapfile, par exemple [name] = “Yves”) et en particulier les endriots où celui-ci est utilisé. Les modifications pouvant avoir un impact sur les expressions des requêtes et particulièrement aux bases de données. Un objectif de ces modifications est l’implémentation des expressions de filtres de l’OGC en seule passe et indépendamment du pilote.
Modification de la requête en seule passe (MS RFC 65)
Ces modifications consistent à une simplification du travail qui a été effectué lors de la release précédente (la 5.6). À ce moment un premier travail a été effectué mais il s’avère insuffisant même s’il a amélioré les choses. Avant la 5.6, une première requête permettait de récupérer les géométries potentielles, puis n requêtes plus petites pour récupérer les résultats, cela été lent particulièrement pour les serveurs de bases de données. À partir de la 5.6, seulement deux requêtes sont effectuées.
Gestion du rendu OpenGL (MS RFC 50)
Cette nouvelle fonctionnalité apporte l’utilisation du module Opengl pour le rendu à MapServer pour un rendu plus rapide des images.
Kml Output (MS RFC 58)
Le travail initial a été réalisé par David Kana lors du Google Summer of Code de 2009. Le code pour le rendu KML est basé sur la nouvelle API du moteur de rendu décrit dans la RFC 54. La première intention était d’utiliser la bibliothèque KML originale fournie par Google mais celle-ci était trop complexe et la bibliothèque libxml2, déjà incluses dans MapServer, a été utilisée.
Amélioration des étiquetages : possibilité d’annuler les étiquettes ANGLE FOLLOW si trop de caractères se superposent (MS RFC 60)
Lorsque des étiquettes étaient placées sur une ligne à forte courbure et que ces étiquettes devaient suivre la ligne (ANGLE FOLLOW) il arrivait que des caractères se chevauchent rendant illisible le texte. L’amélioration ici consiste à détecter ce genre de problème et à sauter l’emplacement qui pose problème. Le prochain emplacement qui ne présente pas ce problème affichera l’étiquette. La stratégie est la suivante et permettra de comprendre le nouveau mot-clé : l’angle des deux caractères consécutifs sont comparé et s’il est supérieur à 22.5° l’étiquette ne sera pas affichée.
Amélioration de la gestion des styles dans MapServer (MS RFC 61)
L’idée ici est de pouvoir utiliser des styles stockés avec la géométrie. Seul le pilote OGR gère le rendu avec le style lié à la géométrie de plus théoriquement seuls quelques formats gèrent le stockage des styles avec la géométrie (comme MapInfo, AutoCAD DXF, Microstation DGN), cependant ces styles peuvent facilement être transférés sous forme d’attributs en utilisant l’option SQL d’ogr2ogr.
Gestion de formats de sortie supplémentaire pour le GetFeature du WFS (MS RFC 62)
L’amélioration ici consiste à définir différent format de sortie pour la requête GetFeature du service WFS.
Visualiseur OpenLayers interne (MS RFC 63)
Les utilisateurs ont souvent demandée un moyen simple de tester les mapfiles. Cette amélioration permet un moyen simple de visualiser, tester et naviguer dans un mapfile en utilisant un visualiser interne basé sur OpenLayers. Il ne doit servir que pour tester et développer et non pas en production !
Meilleur prise en charge des fichiers temporaires (MS RFC 66)
Jusqu’à maintenant, MapServer écrit les fichiers temporaires dans un répertoire IMAGEPATH accessible par le web, ce qui n’est pas optimale mais pouvait être suffisant mais au fur et à mesure que les fichiers temporaires étaient de plus en plus utilisés, il fallait mettre en place une meilleure prise en charge.
Activer/Désactiver des couches dans les services web OGC (MS RFC 67)
Jusqu’à maintenant il n’était pas possible de cacher/désactiver une couche de service web OGC, cela est maintenant possible. Vous pouvez trouver une discussion sur ce sujet dans le wiki : http://trac.osgeo.org/mapserver/wiki/HidingLayersInOGCWebServices
Gestion de la combinaison de features à partir de différentes couches (MS RFC 68)
Aujourd’hui, vous pouvez combiner plusieurs fichiers en utilisant la fonction TILEINDEX, mais seulement si ces données ont les mêmes attributs et description. Il peut être intéressant d’être en mesure d’avoir des couches sources multiples qui ont des attributs semblables et d’être en mesure de les combiner en une seule couche (appelé couche “union”) en utilisant un sous-ensemble compatible des colonnes attributaires sources de sorte que la couche combinée peut être considérée comme une seule couche. On pourrait alors utiliser cette seule couche de la même manière que toute autre couche lors de la création des styles, classes et étiquettes.
Gestion des clusters de géométries dans les couches ponctuelles (MS RFC 69)
Afin de rendre les cartes pertinente pour une vue donnée, nous pouvons avoir besoin de limiter le nombre d’éléments affichés qui normalement se chevauchent les uns sur les autres. Nous pouvons maintenant réaliser un rendu des symboles sous forme de cluster à une échelle particulière. Selon l’exemple à http://trac.osgeo.org/mapserver/attachment/ticket/3700/cluster.png le nombre de traits formant les groupes sont affichés dans les étiquettes pour chaque feature dans le cluster.
Even Rouault : développeur de GDAL-OGR
1. Peux tu faire une présentation de ton parcours professionnel et ce qui t’a amené à travailler dans la géomatique open source ?
Je ne travaille pas, à proprement parler, dans la géomatique Open Source. Je suis actuellement employé par une grande entreprise française dans le secteur de la défense où nous développons des systèmes d’information opérationnels.
GDAL-OGR : documentation en français pour la version 1.6.0
La documentation en français pour la version 1.6.0 de GDAL-OGR a été mise à jour. Vous trouverez la documentation pour tous les nouveaux formats et commandes de cette nouvelle version sortie en décembre 2008.
Retrouvez la documentation sur le site Softlibre.
Des interfaces et des hommes
Cet article a pour objectif de présenter deux applications qui permettent de modifier des données dans différents formats ou de les reprojeter (voir un peu plus). Ces deux applications sont ogr2gui et AlterSIG. Comparer ces deux applications n’a aucun intérêt car celles-ci ont des objectifs différents ce qui ne serait pas pertinent.