Comment utiliser gdal2tiles sur une image tiff personnalisée reçue des fournisseurs pour générer des tuiles

10

J'ai du mal à générer des tuiles pour une image haute résolution que nous avons. L'image actuelle que nous avons est une très grande image (+ 20 Go), enregistrée en tant que fichier GeoTiff.Grande image GTiff

Je voudrais générer les tuiles à l'aide de l'utilitaire de ligne de commande gdal2tiles, puis l'ouvrir et l'afficher dans Césium, en utilisant le fournisseur d'images TMS pour fournir les tuiles. En utilisant gdalinfo, voici quelques détails de l'image:

Driver: GTiff/GeoTIFF
Files: image.tif
Size is 52250, 56119
Coordinate System is:
PROJCS["WGS 84 / UTM zone 35S",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",27],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",10000000],
    UNIT["meters",1],
    AUTHORITY["EPSG","32735"]]
Origin = (606276.000000000000000,7197873.000000000000000)
Pixel Size = (0.500000000000000,-0.500000000000000)
Metadata:
  AREA_OR_POINT=Area
  TIFFTAG_MAXSAMPLEVALUE=13165
  TIFFTAG_MINSAMPLEVALUE=1
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_SOFTWARE=ERDAS IMAGINE
  TIFFTAG_XRESOLUTION=1
  TIFFTAG_YRESOLUTION=1
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  606276.000, 7197873.000) ( 28d 3'21.59"E, 25d19'55.12"S)
Lower Left  (  606276.000, 7169813.500) ( 28d 3'29.55"E, 25d35' 7.17"S)
Upper Right (  632401.000, 7197873.000) ( 28d18'55.92"E, 25d19'47.60"S)
Lower Right (  632401.000, 7169813.500) ( 28d19' 5.85"E, 25d34'59.57"S)
Center      (  619338.500, 7183843.250) ( 28d11'13.23"E, 25d27'27.58"S)
Band 1 Block=512x512 Type=UInt16, ColorInterp=Gray
Band 2 Block=512x512 Type=UInt16, ColorInterp=Undefined
Band 3 Block=512x512 Type=UInt16, ColorInterp=Undefined
Band 4 Block=512x512 Type=UInt16, ColorInterp=Undefined

Ma première tentative a été d'utiliser gdal_translate pour géoréférencer l'image, puis d'utiliser gdalwarp pour changer la projection en EPSG: 3857, comme requis par Césium (voir la référence API)

gdal_translate -of VRT -a_srs EPSG:4326 -gcp 606275 7197875 28.055987 -25.331974 -gcp 606275 7169814 28.058200 -25.585326 -gcp 632400.5 7197875 28.31553 -25.329876 -gcp 632400.5 7169814 28.318286 -25.583209 image.tif newImage1.vrt
gdalwarp -of VRT -t_srs EPSG:3857 newImage1.vrt newImage2.vrt

Cependant, je reçois un grand nombre des erreurs suivantes:

ERREUR 1: la latitude ou la longitude a dépassé les limites

Une autre méthode que j'ai essayée était d'utiliser directement gdal2tiles et de générer les tuiles:

gdal2tiles.py image.tif

Cela a créé un dossier avec un sous-dossier (étiqueté 18) étant le seul niveau de zoom auquel les tuiles ont été créées. Cependant, les images que je reçois ici sont complètement "fausses" et "floues".

Un exemple d'une des tuiles:

entrez la description de l'image ici

Des suggestions pour générer des tuiles pour cette image grande image d'une zone spécifique en utilisant gdal2tiles afin que je puisse la charger et la visualiser dans Césium?

Mise à jour

Donc, après avoir essayé la suggestion de @ iant, j'ai utilisé les commandes suivantes:

gdalwarp -co TILED=YES -co COMPRESS=DEFLATE -co BIGTIFF=YES -t_srs EPSG:3857 image.tif newImage.tif

Cette commande a parfaitement fonctionné jusqu'à la fin où j'ai eu l'erreur suivante:

ERREUR 1: TIFFFillTile: erreur de lecture à la ligne 43520, col 47104; obtenu 35788250 octets, attendu 37421449

Je ne sais pas ce que cette erreur signifiait, je l'ai laissée pour le moment et j'ai quand même obtenu une image finale "newImage.tif", produite par l'étape gdalwarp. En utilisant cela, j'ai appelé gdal2tiles.py

gdal2tiles.py newImage.tif

Cela a produit un dossier avec les sous-dossiers 10-18 (et pas seulement un niveau de zoom 18 comme je l'ai précédemment). Il se lit également parfaitement dans Césium, sans aucune erreur de console, mais l'image semble toujours "fausse":

Image chargée dans le césium

Je considère que mon problème peut être dû au fait que @ user30184 a suggéré "... les données source ne conviennent pas bien à gdal2tiles." Cependant, jusqu'à ce que notre fournisseur soit en mesure de nous fournir quelque chose à utiliser avec gdal, c'est tout ce que j'ai.

J'envisageais peut-être de supprimer l'une des bandes pour éviter que gdal n'interpère la dernière bande comme canal alpha. Aucune suggestion?

effort
la source
Pourquoi voulez-vous géoréférencer l'image? Il contient déjà toutes les informations CRS.
AndreJ

Réponses:

7

Je pense que tout ce que vous avez à faire est de le reprojeter en utilisant:

gdalwarp -co TILED=YES -co COMPRESS=DEFLATE -t_srs EPSG:3857 newImage.tif image.tif

puis tuile le:

gdal2tiles.py newImage.tif

Si votre fichier est très volumineux, cela peut prendre un certain temps.

Ian Turton
la source
Vous pouvez contrôler les niveaux de zoom avec le paramètre -z, l'avez-vous déjà essayé? Et notez que votre image comporte 4 bandes, ce qui peut conduire à des résultats inattendus, notamment parce que vous traitez des données 16 bits. Un certain prétraitement peut être nécessaire en premier
user30184
Merci pour votre réponse @iant. Je vais essayer cela et voir ce qui se passe. Pourriez-vous peut-être expliquer un peu plus dans votre réponse ce que signifient les options que vous avez sélectionnées? Selon la documentation, l'option -co "transmet une option de création au pilote de format de sortie". Donc, ajoutez-vous en fait plus de propriétés au fichier tiff?
effort
@ user30184 Je n'ai pas encore essayé ça non. Comment puis-je savoir quels devraient être les niveaux de zoom? Ou puis-je les spécifier comme je le souhaite? Je pensais qu'en omettant cette option, je laisserais le script déterminer le niveau de zoom en fonction de la zone sélectionnée.
effort
@ user30184 vous avez également mentionné que je pourrais obtenir des résultats inattendus avec une image à 4 bandes et des données 16 bits. Pourquoi exactement? N'est-il pas au format correct pour le traitement des tuiles gdal? Si c'est le cas, l'image a été obtenue directement du fournisseur, quelles seraient les étapes pour obtenir le fichier au format correct? À savoir un fichier tiff GDAL? (Si je peux dire quelque chose comme ça)
effort
J'ai rencontré les problèmes suivants lors de l'exécution de gdalwarp comme vous l'avez suggéré @iant: >>>>>>>>>>>>> ERREUR 1: TIFFFillTile: erreur de lecture à la ligne 43520, col 47104; obtenu 35788250 octets, 37421449 attendu. ERREUR 1: TIFFReadEncodedTile () a échoué. ERREUR 1: pleiades_merge05m_2015-06-19.tif, bande 1: IReadBlock a échoué au décalage X 86, décalage Y 109 ERREUR 1: GetBlockRef a échoué au décalage de bloc X 86, décalage de bloc Y 109 >>>>>>>>>>>> > Des suggestions pour résoudre ce problème?
effort
2

Je suppose que votre image fait partie des produits 4 bandes d'Airbus DS:

http://www.intelligence-airbusds.com/en/4951-which-spectral-mode-do-i-choose

Gdal2tiles est conçu pour diviser des images visuelles courantes en tuiles png. Ces images utilisent 8 bits par bande et elles ont une bande (niveaux de gris), 3 bandes (rouge-vert-bleu) de 4 bandes (reg-vert-bleu + alpha).

Je dirais que votre question est en grande partie hors de propos car vos données source ne conviennent pas bien pour gdal2tiles. Vous pouvez contourner les problèmes immédiats que vous rencontrez actuellement, mais le résultat final ne sera toujours pas bon si vous ne retraitez pas vos données.

La raison pour laquelle la tuile n'est pas belle que vous avez attachée à votre question peut être que la quatrième bande de données est interprétée comme un canal alpha.

user30184
la source
Merci @ user30184, j'ai lu certaines ressources et suis arrivé à une pensée similaire. Je pense qu'il serait préférable de demander à nos fournisseurs de nous fournir des fichiers tiff «compatibles GDAL», mais jusqu'à ce qu'ils nous reviennent, c'est tout ce que nous avons. J'envisageais peut-être de supprimer l'une des bandes pour éviter que gdal n'interpère la dernière bande comme canal alpha. Aucune suggestion?
effort
Utilisez gdal_translate pour couper un petit sous-ensemble de l'image gdal_translate -srcwin 20000 20000 1000 1000 original.tif sample.tifdevrait le faire (grands décalages pour éviter les zones nodata). Ouvrez cette petite image avec QGIS et vous devriez pouvoir jouer avec les paramètres de visualisation rapidement. Ma supposition sur le canal alpha est probablement fausse, sinon le résultat devrait être coloré, pas gris.
user30184
Merci @ user30184, j'ai fait comme vous l'avez suggéré et réussi à l'ouvrir dans QGIS. Voir ce lien: drive.google.com/open?id=0B97NtaPJrVz-anRYQmxjZFludk0 Comment puis-je maintenant "déboguer" mon problème? Utiliser QGIS pour faire les gdalwarp et gdal2tiles?
effort