PyQGIS salva l'immagine raster come immagine renderizzata, quindi usa gli strumenti GDAL su di essa


12

Ho provato ad usare il codice di QGis Save Raster come immagine di rendering . iè un livello 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)

Non funziona, invece mi dà il raster non modificato come output finale. Non capisco davvero il problema, perché l'output di writeRaster(il file pipedFile) è in stile, quindi il processo dalla risposta collegata sopra funziona. È solo che quando provo a utilizzare l'immagine di output per eseguire GDAL warpreprojecte translate, in qualche modo, ritorna al raster non modificato.

Cosa ho fatto di sbagliato?

AGGIORNAMENTO : l'output di QgsRasterFileWriter è in stile. L'output di nonwarpreproject è in stile, ma è accompagnato da un file che sembra contenere informazioni sul colore:.tif.aux.xml

<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>

L'output di nontranslate è in stile e non ha file aggiuntivi. Tuttavia, dal momento che è un PNG non un GeoTIFF, questa è forse la spiegazione.

Ho provato a esaminare l' expandopzione di translate, ma questo mi dà file di immagini che non vengono visualizzati in un browser Web - non ho studiato il perché.

AGGIORNAMENTO 2 : No, utilizzando i expandrisultati non si ottiene alcun file di output. Mi chiedo di provare pct2rgb.

AGGIORNAMENTO 3 : Mi chiedo se il blocco dei file stia causando i problemi. Potrebbe essere?


Le chiamate di elaborazione sono codice ereditato. Warpreproject ha argomenti completamente sbagliati? Se è così, non so affatto come funzioni.
Tom Chadwin,

1
Solo un'ipotesi ma per gdalogr:translate, prova a sostituirlo prov_rastercon prov_raster['OUTPUT'].
Joseph,

No, prov_rasterè solo una stringa con il percorso di quel file, quindi ottengoTypeError: string indices must be integers
Tom Chadwin l'

Risposte:


2

Dovresti capire che quando salvi il file da QgsRenderer come nel tuo codice:

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

Non stai salvando lo stile raster, ma stai salvando il file RGB effettivo che rappresenta quella visualizzazione, quindi non è classificato o disegnato, ma è come se avessi preso una schermata di stampa dell'immagine renderizzata.

Quindi gdalwarp e translate non possono cambiarlo, dato che è codificato nelle bande dell'immagine, ciò che deve accadere è che stanno tagliando da una singola banda o giù di lì, devo controllarlo accuratamente.

MODIFICARE

Posso vedere nel file XML che hai fornito che il raster ha ora solo una banda

<PAMRasterBand band="1">

Dovrebbero esserci i tag:

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

Quindi il problema è dentro gdalogr:warpreproject. Ho usato lo stesso codice che hai fornito in un raster che ho ma l'output è RGB, non so cosa stia succedendo, forse dovresti dare un campione del tuo file raster.

NOTA

L'xml non ha dati di stile, come ho detto che il raster che hai inizialmente salvato non è un livello con stile, ma un'immagine RGB reale che rappresenta il raster con stile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.