Suite

Générer des cartes PNG/JPG à partir de plusieurs ASCI/GeoTIFF en Python/GDAL

Générer des cartes PNG/JPG à partir de plusieurs ASCI/GeoTIFF en Python/GDAL


J'ai besoin de générer des cartes (enregistrées au format PNG, JPG ou PDF) à partir de fichiers raster (pour chaque fichier - une carte) qui répondent aux critères suivants ; * chaque carte a exactement la même palette de couleurs, de sorte qu'il sera facile de les comparer, * je souhaite ajouter n'importe quelle étiquette (par exemple le nom du fichier source) en haut de chaque carte, * (en option) je souhaite inclure la légende (palette de couleurs) * (je serai au paradis) s'il y aura des coordonnées dans la carte incluses.

Il est assez facile d'enregistrer GeoTIFF au format PNG (gdal_translate -of PNG), mais je ne trouve pas de solution pour définir les options mentionnées. Est-il possible de générer de telles cartes à partir de Python/GDAL ? Comment? Dois-je appeler depuis le compositeur de carte Python QGIS ou existe-t-il une autre solution ?


Éditer

J'ai commencé à écrire mon script Python pour résoudre mon problème. Je suppose que:

  • J'ai ouvert une vue Composer où j'ai déjà ajouté tous les éléments
  • Pour chaque fichier raster, je dois :
    • supprimer l'ancien fichier raster
    • ajouter un nouveau fichier raster
    • (si nécessaire) actualisez la carte dans la vue du compositeur. La légende et tous les autres éléments devraient probablement rester les mêmes
    • exporter au format PDF/PNG/tout autre format graphique.

de PyQt4.QtGui importer QImage, QPainter de PyQt4.Qt importer QSize de PyQt4.QtCore importer QRectF

def StringToRaster(raster): # Cette fonction charge le raster à partir du chemin fourni http://gis.stackexchange.com/questions/144058/how-to-load-a-raster-layer-using-pyqgis if isinstance(raster,basestring) : fileInfo = QFileInfo(raster) baseName = fileInfo.baseName() chemin = fileInfo.filePath() si (baseName et chemin): raster = QgsRasterLayer(chemin, baseName) sinon raster.isValid(): print "La couche n'a pas pu se charger !" return else: print "Impossible de lire le nom de base et le chemin du fichier - Votre chaîne est probablement invalide" return return raster def GenerateRasterMaps(rasterList,rasterStyle): # Je souhaite utiliser exactement la même vue de compositeur - seul le fichier raster doit être modifié myComposer=iface .activeComposers()[0] pour rasterFile dans rasterList : if (newRaster) : QgsMapLayerRegistry.instance().removeMapLayer(newRaster.id()) newRaster=StringToRaster(rasterFile) newRaster.loadNamedStyle(rasterStyle) QgsMapLayerRegistry.instance() (newRaster) # Maintenant, je ne dois actualiser que la vue actuelle du compositeur et exporter la carte au format PDF. Malheureusement, après quelques heures de lecture (et de test) : http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/composer.html et QGIS API, je n'ai toujours aucun effet. Pourquoi est-il si difficile d'exporter la vue Composer actuelle au format PDF/PNG. Pourquoi ce n'est pas simplement une commande ?)

Puisque vous utilisez QGIS, le moyen le plus simple que je puisse imaginer pour réaliser ce dont vous avez besoin est d'utiliser Atlas Generation dans Print Composer et vous n'aurez besoin d'aucune programmation. Jetez un œil à ce tutoriel.

Essentiellement, votre processus sera le suivant :

  1. Créez un fichier de polygones vectoriels où chaque polygone est l'étendue de chaque raster. Pour ce faire, placez tous vos rasters dans un seul dossier. Utilisez ensuite leRaster->Divers->Index de tuileoutil. Cela créera un ensemble de polygones avec un attribut appelé « Emplacement ». Cet attribut est le nom du fichier et nous l'utiliserons plus tard comme titre.
  2. Créez un catalogue de raster virtuel. Cela vous permettra de traiter tous vos rasters comme s'il s'agissait d'un seul raster fusionné, tout en gardant les fichiers séparés. AllerRaster->Divers->Créer un raster virtuel (Catalogue). Chargez et stylisez le VRT pour vous donner une palette de couleurs uniforme sur tous les rasters (ou bien, chargez chaque raster, créez un style dans un, puis copiez-collez le style dans chaque raster en cliquant avec le bouton droit sur les calques).
  3. Créez un nouveau compositeur de carte. Configurez votre grille, vos coordonnées, votre légende, d'autres meubles de carte, etc. Assurez-vous de sélectionner l'option Atlas et choisissez votre index de tuiles (créé à l'étape 1) comme AtlasCouche de couverture. Atlas utilise les polygones comme étendues de carte et parcourt le fichier vectoriel et crée une carte pour chaque polygone.
  4. Ajoutez votre titre en ajoutant une simple zone de texte et utilisez le format [%location%]. Cela indique à Atlas d'utiliser l'attribut du fichier vectoriel sur lequel il itère comme titre de la carte. Dans notre processus sera le nom de fichier du raster (ce que je pense que vous voulez), sinon vous voudrez peut-être créer un autre attribut à l'étape 1 ci-dessus, peut-être en analysant les chemins de fichiers qui sont définis comme attribut d'emplacement pour chaque polygone par défaut, ou si vous n'en avez pas trop, vous pouvez le faire à la main.
  5. Enfin, sortez les cartes en une seule fois en allantCompositeur-> Exporter en tant qu'image.

Alors maintenant, vous devriez avoir un ensemble de fichiers (ou vous pouvez exporter en un seul PDF de plusieurs pages) qui sont des cartes formatées avec des coordonnées, une grille, des flèches nord et des logos (si vous les avez inclus), des noms de fichiers comme titres etc… et vous devriez maintenant être au paradis :)


Vous pourrez peut-être le faire avec mapnik (http://mapnik.org/), qui possède une API Python. Vous pouvez créer un script pour parcourir les fichiers TIFF, appliquer un style avec mapnik et générer une sortie en PNG.


Voir la vidéo: GDAL Tutorial #1: Introduction + Installation