samedi 15 novembre 2014

Sortie de QGIS 2.6 : échantillon de quelques nouveautés intéressantes


Désormais, une nouvelle version de QGIS sort tous les 4 mois. A chaque sortie, de nouvelles fonctionnalités sont ajoutées et des bugs sont corrigés : il n'y a aucune raison de s'en priver (d'autant plus qu'on peut continuer à conserver en parallèle les anciennes versions).

A la suite, une sélection de quelques nouveautés qui me paraissent intéressantes :
  • Tout d'abord, une évolution majeure en terme de vitesse d'affichage des cartes : la possibilité d'utiliser plusieurs processeurs (le nombre dépendra de votre machine) ; vous constaterez que les affichages de cartes un peu lourdes se font beaucoup plus rapidement.


  •  l'Atlas évolue encore dans le bon sens, puisqu'il permet maintenant d'insérer une image de façon dynamique en fonction de l’élément en cours d'édition. Par exemple, si vous sortez l'Atlas des mares de votre territoire, chaque page de l'Atlas pourra désormais inclure une image de la mare, pour peu que vous ayez au préalable défini un champ de type "lienphoto", dans lequel sera enregistré le chemin vers le fichier "mare_001.jpg".
  •  Lorsque l'on réalise une jointure d'une couche A à une couche B, on peut désormais choisir les champs joints :
  • Il est désormais possible de créer un "champ virtuel" grâce à la calculatrice de champs ; celui-ci sera dynamiquement lié aux actions sur les objets de la carte (nouvel objet, remodelage, etc.) ; dans mon exemple ci-dessous, le champ "surf_ha" renverra la surface en hectare des objets de la couche "communes". Ce champs ne sera pas sauvegardé dans la couche elle-même, mais dans le projet.
  •   L'outil de choix des couleurs est désormais très développé : il permet de construire des couleurs personnalisées de façon très intuitive, de créer ses propres palettes et des les enregistrer, ou bien d'en importer ... en outre, il permet d'afficher les codes html correspondants à chaque couleur, ce qui permet une réutilisation de ces couleurs dans d'autres applications par la suite.

 
Conclusion :

La liste des nouveautés est encore longue, vous les découvrirez peu à peu ... QGIS évolue vite (et bien), et cela vaut vraiment la peine de se tenir à jour au fur et à mesure des nouvelles versions. Parallèlement à l'évolution du cœur du logiciel, de nombreuses extensions existent et de nouvelles apparaissent, grâce à l'activité intense des utilisateurs / programmeurs. Certaines me paraissent très intéressantes, et j'en parlerai dans mes prochains articles.


lundi 15 septembre 2014

Comment gérer un grand nombre d'images de type "fond de carte" (idée de catalogue d'images) ?

Les fonds de cartes de type photos aériennes sont livrés par jeux de dalles pour couvrir une zone donnée (par exemple, les orthophotos de l'IGN sont livrées par dalles de 5 x 5 km).


 Pour couvrir un secteur de 100 km par 100 km (imaginons par exemple un département de forme carré), il  faudra donc 20 x 20 dalles, soit 400 dalles ... lourd à gérer, et lourd à charger. Il peut donc être intéressant de créer un outil qui permette d'afficher / dés-afficher chaque dalle par simple clic sur la zone choisie.

1ère étape : l'affichage du jeu de dalles
(étape facultative, mais ça permet de vérifier le bon affichage des images) 
L'exemple que je développe ci-dessous s'appuie sur des photos aériennes de la zone de l'agglomération de Brest, mises à disposition sur le site Geo-Pays-De-Brest ("Source : Brest métropole océane - 2010"). Pour les besoins de mon exemple, je me suis permis de redécouper ces images pour en faire un jeu de 35 dalles :


2ème étape : la création d'une grille des emprises de dalles

Il faut tout d'abord avoir installé l'extension "Image Boundary". La création de la grille se fait en 4 étapes :
  1. ouverture du dossier dans lequel sont rangées les dalles (on veillera à ce qu'il ne contiennent que les dalles) ; 
  2. choix du format des images ; dans mon cas c'est de l'ECW. 
  3. on lance la recherche d'images ;
  4. on lance la création d'une nouvelle couche shp, à laquelle on donnera par exemple le nom de "Decoupage.shp" (et comme toujours on proscrit les accents dans les noms de dossiers et de fichiers). 


Par défaut et ce n'est pas modifiable, la couche ainsi créée sera en projection WGS84 ; si votre SIG est calé en Lambert 93, vous devrez donc enregistrer la grille en modifiant sa projection et en la renommant. Dans mon cas, elle devient : "DecoupageL93.shp". (1). Cette nouvelle couche comporte divers champs, dont le champ "Image" avec le nom de la dalle et son extension (2) et le champ "Path" avec le chemin du répertoire où se trouvent les dalles.



3ème étape : création du champ "location" (au sens 'emplacement' en anglais)

Ce champ sera tout simplement la concaténation des champs "Path" et "Image", pour obtenir le chemin complet vers chaque dalle. Rem : le terme "Path" est un terme 'réservé' du langage python, il vaut donc mieux éviter de l'utiliser dans un code python.


Attention à la syntaxe et notamment au doublement des ' \\ 'dans l'expression ...

4ème étape : création d'une "action" en code python pour la couche "DecoupageL93"


Le code est le suivant (où l'on retrouve l'appel au champ "location" précédemment créé) : 

macouche = qgis.utils.iface.activeLayer()
import os
chemin='[% "location" %]'
nomCouche = str(os.path.splitext(os.path.split(chemin)[1])[0])
instRegistry = QgsMapLayerRegistry.instance()
couche = instRegistry.mapLayersByName(nomCouche)
if len(couche) > 0:
instRegistry.removeMapLayer(couche[0].id())
else:
qgis.utils.iface.addRasterLayer(chemin,nomCouche)
qgis.utils.iface.legendInterface().setCurrentLayer(macouche)

C'est une action de type 'Python' et qu'on peut appeler 'OpenCloseRaster' ; (ou bien 'OuvrirFermerImage' pour les francophones susceptibles). N'oubliez pas de définir l'action en cliquant sur "Ajouter l'action à la liste".

5ème étape : on teste

En utilisant le bouton action de la couche DecoupageL93 : si tout a été correctement fait, on aura effectivement un affichage / désaffichage des dalles sur lesquelles on clique.



Commentaires :

Ce petit tutoriel répond à plusieurs demandes d'anciens stagiaires de mes formations. Il est pertinent dans leur cas, puisqu'ils travaillent sur de très grands secteurs (échelle départementale ou régionale, par exemple), et qu'il est trop lent de charger l'ensemble des dalles de leurs fonds de carte (Photos, Scan25, etc.). Pour ceux qui travaillent sur des secteurs plus restreints, je conseillerai plutôt de créer des VRT (couche virtuelle permettant la gestion d'un jeu de dalles comme s'il ne s'agissait que d'une seule).

D'autres pistes sont à explorer : 

- fusion des dalles pour créer un tif unique, qui sera extrêmement lourd mais dont l'affichage pourra être grandement accéléré par la création de "pyramides" ;
- ou bien encore une solution mixte : créer plusieurs VRT (par exemple "departement_NordEst.vrt", etc.) et utilisation de l'action opencloseRaster sur ces quelques VRT ...

Bref, à chacun de voir en fonction de ses usages, de ses images et de son matériel. 

Bon courage. 


mardi 20 mai 2014

Géneration d'Atlas avec QGIS ou "comment automatiser l'édition d'un grand nombre de cartes" ...

C'est une tâche classique, et bien souvent fastidieuse : pour l'édition d'un document (typiquement un rapport de fin d'année, un diagnostic de terrain, un programme de visites et d'entretien, etc.), on doit éditer un grand nombre de cartes (typiquement une carte par commune, par tronçon, par ouvrage, etc.) ... 

Atlas tutoriel QGIS InSitu SIG


Depuis la version 2.0 - Dufour, QGIS dispose d'un Générateur d'Atlas qui permet d'automatiser cette tâche. La version 2.2 - Valmiera apporte encore quelques fonctionnalités supplémentaires. Pas d'hésitation à avoir : l'outil vous fera gagner un temps fou et vaut largement d'y consacrer quelques minutes d'apprentissage.

Avançons par étape ... 

Étape n°1 : on commence par la fin, c'est à dire qu'on se pose la question "que cherchai-je à faire ?" ; dans mon exemple, je veux éditer un inventaire des mares d'un territoire, avec localisation à différentes échelles, identification, données, et même photo de la mare.

Étape n°2 :  

On ouvre dans QGIS l'ensemble des couches nécessaires (par exemple : mares ; communes ; rivière ; zones NATURA2000 ; photos aériennes ; etc.). Puis on soigne la présentation de chaque couche pour rendre la carte lisible et élégante (symbolisations, étiquettes, transparence des couches, couleurs catégorisées, seuils d'affichage, etc ...).

Astuce : dans notre future fenêtre de mise en page, nous aurons un cadre de carte à l'échelle 1/25 000ème (carte principale) et un autre cadre de carte à l'échelle  1/500 000ème (carte de localisation à échelle large). Il y a plusieurs méthodes pour insérer plusieurs cadre de carte dans une même mise en page, mais j'ai une nette préférence pour le plugin "Layer Combination" : je n'explique pas ici son fonctionnement, du reste assez simple, mais vous pourrez toujours me questionner à ce sujet si vous bloquez.

Étape n°3 : 

Enfin, on ouvre une fenêtre de mise en page (Projet => nouveau composeur d'impression).
  • On commence par faire les choix de composition : taille et orientation du papier (A4 paysage dans mon cas), qualité de l'image en sortie (300 dpi par défaut), etc.
  •  Puis on définit les paramètres du générateur d'Atlas dans l'onglet du même nom : on choisit la couche qui servira de trame (dite "couche de couverture") ; dans mon cas, c'est la couche MARES2). J'ai aussi choisi de ne générer l'Atlas que pour les mares pour lesquelles nous disposons d'une photo (et donc le champ "lienphoto" n'est pas vide, c'est le sens du Filtrer avec : length("lienphoto") > 1) ; enfin, chaque fichier généré portera un nom de type "AtlasMare2014_code_mare", en faisant appel à la valeur du champs "code_mare".
  • Titre : on ouvre un cadre de texte, et l'on y place par exemple le texte suivant, qui fera appel au code de la mare en tant que variable qui s'adaptera à chaque page de l'Atlas :
ATLAS 2014 DES MARES DE LA DURDENT
MARE n° : [% "code_mare" %]
  •  Cartouche technique (sources et copyright, date de mise à jour, réalisé par ...). Si on veut que la date de mise à jour s'inscrive automatiquement, on peut utiliser la formule suivante : 
Mise à jour le : [% day( $now ) || '/' || month( $now ) || '/' || year( $now )%]
  •  Photo de la mare : nous allons utiliser la possibilité d'insérer du code html (et donc la possibilité d'insérer une image) en faisant appel à un champ "lienphoto" qu'il faut avoir auparavant créé et renseigné avec le chemin vers les photos correspondant à chaque mare ... le code à copier et à adapter à votre cas est le suivant : 
<img src="file:///[% "lienphoto" %]" style="width: auto; height: 100%; display: block; margin: 0px 0px 0px auto;" />



Étape n°4 : 

Nous y voilà : tout est prêt pour lancer l'Atlas ; avant de lancer le générateur (cela peut être long en fonction du nombre d'images à générer et du poids des couches affichées) on peut pré-visualiser les résultats du traitement avec la barre d'outil suivante :

 
Et c'est parti ...




Bonus :

Pour faire apparaitre l'objet concerné par la page de l'Atlas en cours de création dans un style différent des autres objets, on peut utiliser la fonction $atlasfeatureid dans la définition du style de la couche MARES : 

Ce qui donne le résultat suivant : 



Conclusion :

L'outil est vraiment utile et bien fait, même s'il nécessite de très bien se concentrer lors des premières utilisations ... pour l'anecdote et pour illustrer la façon dont progresse le logiciel, il s'agissait à la base d'une extension (développée par la société Oslandia), qui a été introduite dans les fonctions intégrées du logiciel au moment du passage à la version 2.0 ; merci à eux, et bon usage à tous.
 

mercredi 26 mars 2014

Quelques astuces pour se simplifier QGIS

QGIS 2.2 "Valmiera"


Pour commencer, saluons la sortie de la dernière version de QGIS ; la version 2.1 vous a échappé ... ? C'est normal : désormais, le cycle de développement de QGIS suivra la logique suivante :

- numéros impairs (2.1 ; 2.3 : etc.) pour les versions en cours de développement. Chacun peut la télécharger pour assouvir sa curiosité, mais il s'agit de versions encore "en travaux", donc potentiellement instables ;
- numéros pairs, avec un nom propre associé (Dufour, Valmiera ...) pour les sorties officielles. A noter qu'il y a toujours quelques bugs à la sortie, rapidement corrigés, il est donc raisonnable d'attendre quelques semaines avant de télécharger la nouvelle version.

La version "Valmeira" propose des nouveautés principalement du côté du composeur d'impression, et notamment du générateur d'Atlas ... j'en parlerai éventuellement dans un futur post. 

Enfin, ne vous privez pas pour tester cette nouvelle version : elle peut être installée en parallèle des autres versions, sans conflit.


Astuce n° 1 : jointure et nommage automatique des champs joints

Lorsque l'on réalise une jointure d'une table ("densite_pop_49" dans mon exemple) avec une couche ("49-Maine-et-Loire" dans mon exemple), les champs joints prennent automatiquement un nom de la forme "nom_de_la_table_jointe_nom_du_champ" ... ce qui n'est ni très élegant ni très pertinent, car si l'on souhaite enregistrer cette jointure en tant que nouvelle couche au format .shp, les noms de champs seront tronqués à 10 caractères. 


L'astuce consiste à modifier le nom attribué à la table utilisée dans la jointure, en utilisant le menu "Général" de la fenêtre "Propriétés de la couche" ; l'idéal est de lui attribuer le nom le plus simple, l'underscore ou tiret-bas : "_" ;


Dès lors on pourra refaire la jointure et les champs porteront des noms plus sobres :


Dans mon exemple, la couche des contours des communes provient d'Open Street Map, et les données sur la densité de population du site de l'INSEE. La jointure m'a permis d'aboutir à la carte suivante :



Astuce n° 2 : affichage des objets en cours d'édition

Par défaut, lorsque vous passez une couche en mode éditable, chaque point apparait sous la forme d'une croix rouge, et pour l'ensemble des objets de la couche ... pas forcément très beau ni très lisible ...

Régions métropolitaines - source : OpenStreetMap.

Ce comportement peut être modifié dans le menu "Préférences" => "Options" => "Numérisation"=> "Symbole de sommet". Personnellement, je préfère le symbole "cercle semi-transparent", de taille 3, et je coche "montrer les symboles uniquement pour les entités sélectionnées". C'est plus léger à l'affichage.






jeudi 6 février 2014

Géocodage en série (batch geocoding) avec QGIS

Avoir un fichier d'adresses, et le transformer en couche de points géolocalisés, de façon semi-automatique ... vous en avez peut être rêvé ; QGIS l'a fait ! 

Ci-dessous la liste puis la carte des organismes que j'ai eus en formation ; et plus bas, les explications pour arriver à ce résultat, en quelques clics.





Étape 1 : Le fichier d'adresses

a) Créez, à partir de votre fichier d'adresses (par exemple un fichier Excel), un fichier de type ".csv". Dans mon cas je l'ai fait à partir du logiciel OpenOffice ;
b) "nettoyez" le fichier original, pour ne garder que les lignes et colonnes nécessaires à la localisation des points : dans mon cas, les colonnes conservées sont "ORGANISME" ; "ADRESSE" ; "CP_VILLE" ; "PAYS". Préciser le pays évite de se retrouver avec des points en Louisiane ou au Québec, puisque nombre de ville françaises ont leurs homonymes là-bas !
c) "enregistrez sous"  au format .csv (impérativement en UTF-8) ; pour cette raison, il faut proscrire les caractères spéciaux et les accents.


Etape 2 :  Extension "MMQGIS"

- Installez et activez l'extension "MMQGIS", qui permet le "géocodage en série" (l'extension interroge en fait les bases d'adresses de Google Map ou de Open Street Map). Il propose d'autres outils intéressants mais ce n'est pas le sujet ici.
- ouvrez l'outil "Geocode" dans le menu déroulant MMQGIS et inspirez vous de la fenêtre ci-dessous pour renseigner les différents champs :

- les adresses correctement localisées seront enregistrées sous forme d'une couche shp, dans le système de coordonnées de référence 4326 (c'est le WGS84, qu'utilisent notamment les GPS). 
- les adresses non localisées seront stockées dans un fichier notfound.csv

Étape 3 : utilisez la couche créée par géocodage dans votre propre SIG

-Il faudra penser à enregistrer cette nouvelle couche dans votre SCR habituel (le Lambert93, normalement).
- dans mon exemple, le fond utilisé est celui d'OpenStreetMap, auquel on accède très simplement à l'aide de l'extension "OpenLayerPlugin". 

Conclusions 

- l'outil exige quelques tâtonnements, mais une fois bien compris les principes généraux, quelle magie !
- il faut bien entendu que les adresses dont on dispose soient les plus complètes et précises possible, et il faut qu'il s'agisse d'adresses physiques (pas de BP 132 ...) ; 
- j'ai fait l'essai avec Google et avec OSM : résultat, 51 adresses sur 52 trouvées par Google, alors que OSM n'en trouve que 14 ... avantage pour Google, à la date de rédaction de ce tuto, mais OSM progresse très vite ... 
- et puis conclusion plus personnelle : cap au Sud !