PyQGIS将栅格另存为渲染图像,然后在其上使用GDAL工具


12

我尝试使用QGis的“将栅格保存为渲染图像”中的代码。i是栅格图层:

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)

它不起作用,而是给我未样式化的栅格作为最终输出。我真的不明白这个问题,因为writeRaster(file pipedFile)的输出已设置样式,因此从上面链接到答案的过程正在工作。只是当我尝试使用输出图像通过GDAL warpreproject和运行时translate,它会以某种方式恢复为未样式化的栅格。

我做错了什么?

UPDATE:的输出QgsRasterFileWriter 风格。的输出warpreproject不是风格,而是.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>

的输出translate不是病急乱投医,并且没有额外的文件。但是,由于它是PNG而不是GeoTIFF,因此可能就是原因。

我尝试查看的expand选项translate,但这给了我无法在网络浏览器中显示的图像文件-我尚未调查原因。

更新2:否,使用expand结果根本没有输出文件。想知道尝试pct2rgb

更新3:我想知道文件锁定是否引起了问题。可以吗


处理调用是继承的代码。warpreproject是否有完全错误的论点?如果是这样,我根本不知道它是如何工作的。
汤姆·查德温

1
只是一个猜测,但是gdalogr:translate,尝试替换prov_rasterprov_raster['OUTPUT']
约瑟夫

不,prov_raster只是带有该文件路径的字符串,所以我得到了TypeError: string indices must be integers
Tom Chadwin

Answers:


2

您应该理解,如在代码中那样从QgsRenderer保存文件时:

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

您不是要保存样式化的栅格,而是要保存表示该可视化效果的实际RGB文件,因此不会对其进行分类或样式化,但这就像您已获取渲染图像的打印屏幕一样。

所以gdalwarp和translation不能改变它,因为它是在图像的波段中硬编码的,所以必须发生的是它们被单个波段削波,所以我必须进行彻底检查。

编辑

我可以在您提供的xml文件中看到,栅格现在只有一个波段

<PAMRasterBand band="1">

应该有标签:

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

所以问题出在了gdalogr:warpreproject。我使用了您在栅格中提供的相同代码,但是输出为RGB,我不知道发生了什么,也许您应该提供栅格文件的样本。

注意

xml没有样式数据,正如我所说的,您首先保存的栅格不是样式图层,而是代表样式栅格的实际RGB图像。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.