Intenté usar el código de QGis Save Raster como imagen renderizada . i
es 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 warpreproject
y translate
, de alguna manera, vuelve al ráster sin estilo.
¿Qué he hecho mal?
ACTUALIZACIÓN : La salida de QgsRasterFileWriter
tiene estilo. La salida warpreproject
está sin estilo, pero la .tif
va acompañado de un .aux.xml
archivo 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 translate
está 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 expand
opció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 expand
resultados 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?
gdalogr:translate
, intente reemplazarprov_raster
conprov_raster['OUTPUT']
.prov_raster
es solo una cadena con la ruta de acceso a ese archivo, así que obtengoTypeError: string indices must be integers
Respuestas:
Debe comprender que cuando guarde el archivo de QgsRenderer como en su código:
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
Debería haber las etiquetas:
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.
fuente