PyQGIS guarda el ráster como imagen renderizada, luego usa herramientas GDAL en él

12

Intenté usar el código de QGis Save Raster como imagen renderizada . ies una capa de trama:

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)

No funciona, en cambio, me da el ráster sin estilo como salida final. Realmente no entiendo el problema, porque la salida de writeRaster(el archivo pipedFile) tiene estilo, por lo que el proceso de la respuesta vinculada a lo anterior está funcionando. Es solo que cuando intento usar la imagen de salida para ejecutar GDAL warpreprojecty translate, de alguna manera, vuelve al ráster sin estilo.

¿Qué he hecho mal?

ACTUALIZACIÓN : La salida de QgsRasterFileWriter tiene estilo. La salida warpreprojectestá sin estilo, pero la .tifva acompañado de un .aux.xmlarchivo que parece tener la información de color en ella:

<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 salida translateestá no labrado, y no tiene un archivo adicional. Sin embargo, dado que es un PNG no un GeoTIFF, esa es quizás la explicación.

He intentado buscar la expandopción de translate, pero eso me da archivos de imagen que no se muestran en un navegador web; no he investigado por qué.

ACTUALIZACIÓN 2 : No, utilizando expandresultados en ningún archivo de salida. Preguntándome por intentarlo pct2rgb.

ACTUALIZACIÓN 3 : Me pregunto si el bloqueo de archivos está causando los problemas. ¿Podría ser?

Tom Chadwin
fuente
Las llamadas de procesamiento son código heredado. ¿Warpreproject tiene argumentos completamente equivocados? Si es así, no sé cómo funciona en absoluto.
Tom Chadwin el
1
Solo una suposición pero para gdalogr:translate, intente reemplazar prov_rastercon prov_raster['OUTPUT'].
Joseph
No, prov_rasteres solo una cadena con la ruta de acceso a ese archivo, así que obtengoTypeError: string indices must be integers
Tom Chadwin

Respuestas:

2

Debe comprender que cuando guarde el archivo de QgsRenderer como en su código:

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

No está guardando el estilo ráster, sino que está guardando el archivo RGB real que representa esa visualización, por lo que no está clasificado ni tiene estilo, pero es como si hubiera tomado una pantalla de impresión de la imagen renderizada.

Así que gdalwarp and translate no puede cambiar esto, ya que está codificado en las bandas de la imagen, lo que debe estar sucediendo es que están recortándose por una sola banda más o menos, tengo que verificarlo a fondo.

EDITAR

Puedo ver en el archivo xml que proporcionó que el ráster ahora solo tiene una banda

<PAMRasterBand band="1">

Debería haber las etiquetas:

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

Entonces el problema está adentro gdalogr:warpreproject. Utilicé el mismo código que proporcionó en un ráster que tengo pero el resultado es RGB, no sé qué está pasando, tal vez debería dar una muestra de su archivo ráster.

NOTA

El xml no tiene datos de estilo, ya que dije que el ráster que primero guardó no es una capa con estilo, sino una imagen RGB real que representa el ráster con estilo.

caiohamamura
fuente