Équivalent Python de gdalbuildvrt

12

Existe-t-il un moyen d'effectuer la même tâche que l'utilitaire gdalbuildvrt à l'aide des liaisons GDAL Python? Jusqu'à présent, je n'ai trouvé aucun autre moyen de le faire que de créer un vrt d'un seul ensemble de données et de modifier manuellement le xml. Je voudrais créer un vrt à partir de plusieurs rasters (essentiellement effectuer une mosaïque). Est-ce possible en utilisant du Python pur? Mon autre option consiste à utiliser un sous-processus pour simplement appeler gdalbuildvrt.

Brian
la source

Réponses:

10

Honnêtement, il est plus facile de le faire en utilisant gdalbuildvrt dans un subprocessou os.system.

Si vous souhaitez le faire via Python, cela peut être fait. En utilisant les méthodes de création de jeux de données standard dans GDAL Python, nous pouvons facilement créer le jeu de données de base VRT .

from osgeo import gdal

drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)

Notez que nous créons initialement l'ensemble de données sans bandes. De la documentation sur VRTS que les ensembles de données sont calorMATIC l' un des rares types de jeux de données qui peuvent accepter des AddBandarguments.

vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)

Maintenant, pour chaque bande, nous devons définir les éléments de métadonnées manuellement:

simple_source = '<SourceFilename relativeToVRT="1">%s</SourceFilename>' % source_path + \
    '<SourceBand>%i</SourceBand>' % source_band + \
    '<SourceProperties RasterXSize="%i" RasterYSize="%i" DataType="Real" BlockXSize="%i" BlockYSize="%i"/>' % (x_size, y_size, x_block, y_block) + \
    '<SrcRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (x_offset, y_offset, x_source_size, y_source_size) + \
    '<DstRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (dest_x_offset, dest_y_offset, x_dest_size, y_dest_size)
band.SetMetadataItem("SimpleSource", simple_source)
band.SetMetadataItem("NoDataValue", -9999)

SetMetadatItemprend deux arguments, le premier une chaîne de l'élément de métadonnées, le second l'élément lui-même. Cela signifie que vous ne pouvez pas sous-définir un élément de métadonnées, donc pour les sources de données, vous devez définir l'intégralité du contenu sous forme de chaîne.

Notez que nous pouvons utiliser cette méthode pour créer des sources complexes ( ComplexSource) qui contiennent des tables de recherche de valeurs, des sources de filtre noyau ( KernelFilteredSource) de tailles et de formes arbitraires et des bandes de masque ( MaskBand).

om_henners
la source
Merci @om_henners - J'ai fini par utiliser un sous-processus pour appeler gdalbuildvrt. Je suis plus expérimenté avec Python plutôt qu'avec la ligne de commande, j'espérais donc pouvoir le faire directement en Python, mais cela ne vaut pas la peine de jouer avec la création de chaînes XML comme vous l'avez décrit. C'est certainement bon de savoir que je peux le faire si besoin à l'avenir.
Brian
Je viens de trouver un cas d'utilisation pour avoir un équivalent python: ajouter des fonctionnalités non prises en charge. Par exemple, le format de fichier vrt prend en charge un overviewsélément, mais gdalbuildvrt ne l'utilise pas. Merci d'avoir fourni un stub sur la façon dont cela pourrait être ajouté en python.
matt wilkie
@om_henners existe-t-il un moyen de drv.CreateCopy ('chemin / vers / fichier.vrt', input_ds) avec un chemin absolu vers le fichier input_ds en python? il existe une option relativeToVRT = "1", mais comment la modifier ou la définir lors de la création de VRT?
Dmitriy Litvinov
8

Depuis GDAL 2.1, les outils CLI sont disponibles en tant que fonctions de bibliothèque, et c'est en fait ce que les outils CLI appellent désormais en interne.

Par exemple:

gdalbuildvrt -r cubic -addalpha my.vrt one.tif two.tif

Est l'équivalent de:

from osgeo import gdal

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)

Les options CLI disponibles correspondent directement aux paramètres de BuildVRTOptions , plus il y a quelques extras comme les rappels de progression disponibles.

rcoup
la source
Cela semble être uniquement pour certains outils CLI. Par exemple, j'essaie de faire fonctionner gdaladdo mais cela n'apparaît pas. Même chose avec gdalwarp. Savez-vous s'ils prévoient également de les soutenir? Serait très utile.
fpolig01
@ fpolig01 la plupart d'entre eux sont là - voir RegenerateOverviews()et Warp()dans la référence API . Les arguments correspondent généralement aux commandes CLI.
rcoup
@rccoup Merci pour la réponse. RegenerateOverviews () est-il le même que gdaladdo? En avez-vous un exemple? J'essaie de faire quelque chose de similaire à gdaladdo -r moyen "D: \ image.tif"
fpolig01
@ fpolig01 ce post suggèreBuildOverviews() (qui est en fait ce que je cherchais quand j'ai trouvé RegenerateOverviews) - peut-être essayer?
rcoup
8

La réponse de @rcoup n'a fonctionné que pour moi, si vous la modifiez comme suit:

from osgeo import gdal 

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
my_vrt = gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)
my_vrt = None

Sinon, le fichier n'est pas écrit sur le disque.

JensL
la source
Merci JensL! pouvez-vous expliquer l'intuition de my_vrt = None pour écrire sur le disque?
Cela
3
@ mmann1123 : Sinon, cela n'a pas fonctionné et j'avais à l'esprit que le didacticiel de l'API GDAL a déclaré: "Notez que la méthode CreateCopy () renvoie un ensemble de données accessible en écriture et qu'elle doit être fermée correctement pour terminer l'écriture et vider l'ensemble de données sur le disque . Dans le cas Python, cela se produit automatiquement lorsque "dst_ds" sort du domaine d'application. " Puisqu'il n'y a pas closingde python, vous devez sortir votre vrtchamp d'application en l'attribuant à None.
JensL
En fait, ils ont juste résolu ce problème (voir osgeo-org.1560.x6.nabble.com/… )
umbe1987