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. 


Aucun commentaire:

Enregistrer un commentaire