PyQGIS enregistre le raster en tant qu'image rendue, puis utilise les outils GDAL dessus

12

J'ai essayé d'utiliser le code de QGis Save Raster as Rendered Image . iest une couche raster:

pipelayer = i
pipeextent = pipelayer.extent()
pipewidth, pipeheight = (pipelayer.width(),
                         pipelayer.height())
piperenderer = pipelayer.renderer()
pipeprovider = pipelayer.dataProvider()
crs = pipelayer.crs().toWkt()
pipe = QgsRasterPipe()
pipe.set(pipeprovider.clone())
pipe.set(piperenderer.clone())
pipedFile = os.path.join(tempfile.gettempdir(),
                         safeLayerName + '_pipe.tif')
print pipedFile
file_writer = QgsRasterFileWriter(pipedFile)
file_writer.writeRaster(pipe,
                        pipewidth,
                        pipeheight,
                        pipeextent,
                        pipelayer.crs())

in_raster = pipedFile
prov_raster = os.path.join(tempfile.gettempdir(),
                           'json_' + safeLayerName +
                           '_prov.tif')
out_raster = dataPath + '.png'
crsSrc = i.crs()
crsDest = QgsCoordinateReferenceSystem(4326)
xform = QgsCoordinateTransform(crsSrc, crsDest)
extentRep = xform.transform(i.extent())
extentRepNew = ','.join([unicode(extentRep.xMinimum()),
                         unicode(extentRep.xMaximum()),
                         unicode(extentRep.yMinimum()),
                         unicode(extentRep.yMaximum())])
processing.runalg("gdalogr:warpreproject", in_raster,
                  i.crs().authid(), "EPSG:4326", "", 0, 1,
                  5, 2, 75, 6, 1, False, 0, False, "",
                  prov_raster)
processing.runalg("gdalogr:translate", prov_raster, 100,
                  True, "", 0, "", extentRepNew, False, 0,
                  0, 75, 6, 1, False, 0, False, "",
                  out_raster)

Cela ne fonctionne pas, me donnant plutôt le raster dépourvu de style comme sortie finale. Je ne comprends vraiment pas le problème, car la sortie de writeRaster(le fichier pipedFile) est stylée, donc le processus de la réponse liée à ci-dessus fonctionne. C'est juste que lorsque j'essaie d'utiliser l'image de sortie pour parcourir GDAL warpreprojectet translate, elle revient en quelque sorte au raster sans style.

Qu'est ce que j'ai mal fait?

MISE À JOUR : La sortie de QgsRasterFileWriter est stylisée. La sortie de warpreprojectn'est pas stylisée, mais .tifest accompagnée d'un .aux.xmlfichier qui semble contenir des informations de couleur:

<PAMDataset>
  <PAMRasterBand band="1">
    <Histograms>
      <HistItem>
        <HistMin>-0.498046875</HistMin>
        <HistMax>255.498046875</HistMax>
        <BucketCount>256</BucketCount>
        <IncludeOutOfRange>0</IncludeOutOfRange>
        <Approximate>1</Approximate>
        <HistCounts>314|4|3|2|3|5|4|4|5|8|10|9|16|16|23|26|37|46|58|62|69|77|77|94|127|94|131|136|133|162|169|172|171|184|200|186|207|196|186|177|179|194|182|182|178|177|181|195|196|196|195|195|179|226|206|215|193|197|202|212|207|206|232|204|229|253|233|240|248|234|234|268|240|238|259|286|268|287|259|264|255|267|268|271|256|321|277|284|317|286|290|277|312|334|319|325|323|310|349|357|347|326|337|338|336|383|374|349|411|382|382|417|406|405|414|427|404|434|447|430|468|424|446|442|450|461|448|458|457|459|412|414|469|466|443|475|464|472|481|519|504|458|473|481|514|523|522|494|542|580|604|623|686|648|707|763|808|799|819|853|932|1046|1062|1118|1145|1215|1293|1393|1335|1392|1390|1317|1232|1247|1215|1088|1032|896|847|731|708|666|608|634|556|500|484|456|433|408|406|401|386|388|414|414|387|382|340|346|382|385|368|348|334|376|359|318|339|326|357|315|319|357|333|328|329|310|344|295|300|351|347|324|358|349|363|361|347|396|386|433|395|434|479|473|523|550|644|655|672|778|882|1014|1183|1400|1681|2075|2531|3529|4851|7235|10793|60773|7297|1999</HistCounts>
      </HistItem>
    </Histograms>
    <Metadata>
      <MDI key="STATISTICS_MAXIMUM">255</MDI>
      <MDI key="STATISTICS_MEAN">203.31482680479</MDI>
      <MDI key="STATISTICS_MINIMUM">0</MDI>
      <MDI key="STATISTICS_STDDEV">63.158702013579</MDI>
    </Metadata>
  </PAMRasterBand>
</PAMDataset>

La sortie de translaten'est pas stylisée et n'a pas de fichier supplémentaire. Cependant, comme il s'agit d'un PNG et non d'un GeoTIFF, c'est peut-être l'explication.

J'ai essayé de regarder l' expandoption de translate, mais cela me donne des fichiers image qui ne s'affichent pas dans un navigateur Web - je n'ai pas cherché pourquoi.

MISE À JOUR 2 : Non, l'utilisation des expandrésultats dans aucun fichier de sortie du tout. Vous vous demandez d'essayer pct2rgb.

MISE À JOUR 3 : Je me demande si le verrouillage des fichiers est à l'origine des problèmes. Est-ce que ça pourrait être?

Tom Chadwin
la source
Les appels de traitement sont du code hérité. Warpreproject a-t-il des arguments complètement erronés? Si oui, je ne sais pas du tout comment cela fonctionne.
Tom Chadwin
1
Juste une supposition mais pour gdalogr:translate, essayez de remplacer prov_rasterpar prov_raster['OUTPUT'].
Joseph
Non, prov_rasterc'est juste une chaîne avec le chemin d'accès à ce fichier, donc je reçoisTypeError: string indices must be integers
Tom Chadwin

Réponses:

2

Vous devez comprendre que lorsque vous enregistrez le fichier à partir de QgsRenderer comme dans votre code:

piperenderer = pipelayer.renderer()
pipe.set(piperenderer.clone())
file_writer.writeRaster(pipe...

Vous n'enregistrez pas le style raster, au lieu de cela, vous enregistrez le fichier RVB réel qui représente cette visualisation, il n'est donc pas classé ou stylisé, mais c'est comme si vous aviez pris un écran d'impression de l'image rendue.

Donc, gdalwarp et translate ne peuvent pas changer cela, car il est codé en dur dans les bandes de l'image, ce qui doit arriver, c'est qu'elles sont écrêtées par une seule bande ou plus, je dois le vérifier attentivement.

ÉDITER

Je peux voir dans le fichier xml que vous avez fourni que le raster n'a plus qu'une seule bande

<PAMRasterBand band="1">

Il devrait y avoir les balises:

<PAMRasterBand band="2">
<PAMRasterBand band="3">

Le problème est donc là gdalogr:warpreproject. J'ai utilisé le même code que vous avez fourni dans un raster que j'ai, mais la sortie est RVB, je ne sais pas ce qui se passe, peut-être devriez-vous donner un échantillon de votre fichier raster.

REMARQUE

Le xml n'a pas de données de style, comme je l'ai dit, le raster que vous avez d'abord enregistré n'est pas un calque stylisé, mais une image RVB réelle représentant le raster stylisé.

caiohamamura
la source