PyQGIS speichert das Raster als gerendertes Bild und verwendet dann GDAL-Werkzeuge

12

Ich habe versucht, den Code von QGis Save Raster als gerendertes Bild zu verwenden . iist eine Rasterebene:

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)

Es funktioniert nicht, stattdessen gebe ich das nicht gestaltete Raster als endgültige Ausgabe. Ich verstehe das Problem wirklich nicht, da die Ausgabe von writeRaster(der Datei pipedFile) so gestaltet ist, dass der Prozess aus der oben verlinkten Antwort funktioniert. Es ist nur so, dass, wenn ich versuche, das Ausgabebild zum Durchlaufen von GDALs warpreprojectund zu verwenden translate, es irgendwie zum nicht gestalteten Raster zurückkehrt.

Was habe ich falsch gemacht?

UPDATE : Die Ausgabe von QgsRasterFileWriter wird formatiert. Die Ausgabe von warpreprojectwird nicht formatiert, sondern .tifvon einer .aux.xmlDatei begleitet, die anscheinend Farbinformationen enthält:

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

Die Ausgabe von translatewird nicht formatiert und enthält keine zusätzliche Datei. Da es sich jedoch um ein PNG und nicht um ein GeoTIFF handelt, ist dies möglicherweise die Erklärung.

Ich habe versucht, die expandOption von zu prüfen translate, aber das gibt mir Bilddateien, die nicht in einem Webbrowser angezeigt werden - ich habe nicht untersucht, warum.

UPDATE 2 : Nein, bei Verwendung von expandErgebnissen wird überhaupt keine Ausgabedatei erstellt. Ich frage mich, ob ich es versuchen soll pct2rgb.

UPDATE 3 : Ich frage mich, ob die Dateisperrung die Probleme verursacht. Könnte es sein?

Tom Chadwin
quelle
Die Verarbeitungsaufrufe sind geerbter Code. Hat warpreproject völlig falsche Argumente? Wenn ja, weiß ich überhaupt nicht, wie es funktioniert.
Tom Chadwin
1
Nur eine Vermutung , aber für gdalogr:translate, versuchen Sie ersetzen prov_rastermit prov_raster['OUTPUT'].
Joseph
Nein, es prov_rasterist nur ein String mit dem Pfad zu dieser Datei, also bekomme ichTypeError: string indices must be integers
Tom Chadwin

Antworten:

2

Das sollten Sie verstehen, wenn Sie die Datei aus dem QgsRenderer wie in Ihrem Code speichern:

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

Sie speichern nicht das Rasterformat, sondern die eigentliche RGB-Datei, die diese Visualisierung darstellt. Sie ist also weder klassifiziert noch formatiert, es ist jedoch so, als hätten Sie einen Druckbildschirm des gerenderten Bildes erstellt.

GDALWARP und TRANSLATE können dies also nicht ändern, da es in den Bildbändern fest codiert ist. Es muss passieren, dass sie von einem einzelnen Band beschnitten werden, oder so, ich muss es gründlich überprüfen.

BEARBEITEN

Ich kann in der von Ihnen bereitgestellten XML-Datei sehen, dass das Raster jetzt nur ein Band hat

<PAMRasterBand band="1">

Es sollten die Tags sein:

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

Das Problem liegt also in gdalogr:warpreproject. Ich habe den gleichen Code verwendet, den Sie in einem Raster angegeben haben, aber die Ausgabe ist RGB. Ich weiß nicht, was los ist. Vielleicht sollten Sie ein Beispiel für Ihre Rasterdatei geben.

HINWEIS

Die XML-Datei enthält keine Stildaten, da das von Ihnen zuerst gespeicherte Raster keine gestaltete Ebene ist, sondern ein tatsächliches RGB-Bild, das das gestaltete Raster darstellt.

caiohamamura
quelle