PyQGIS menyimpan raster sebagai gambar yang diberikan, lalu gunakan alat GDAL di atasnya

12

Saya telah mencoba menggunakan kode dari QGis Save Raster sebagai Rendered Image . iadalah layer 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)

Itu tidak berhasil, sebaliknya memberi saya raster tanpa gaya sebagai hasil akhir. Aku benar-benar tidak mengerti masalah, karena output dari writeRaster(file pipedFile) yang ditata, sehingga proses dari jawaban terkait dengan di atas bekerja. Hanya saja ketika saya mencoba menggunakan gambar output untuk dijalankan melalui GDAL warpreprojectdan translate, entah bagaimana kembali ke raster tanpa gaya.

Apa yang telah saya lakukan salah?

UPDATE : Output dari QgsRasterFileWriter yang bergaya. Output dari warpreprojectini tidak ditata, tetapi .tifdisertai dengan .aux.xmlberkas yang tampaknya memiliki informasi warna di dalamnya:

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

Output dari translateini tidak ditata, dan tidak memiliki file tambahan. Namun, karena ini PNG bukan GeoTIFF, mungkin itulah penjelasannya.

Saya sudah mencoba melihat expandopsi translate, tetapi itu memberi saya file gambar yang tidak ditampilkan di browser web - Saya belum menyelidiki alasannya.

UPDATE 2 : Tidak, menggunakan expandhasil tanpa file output sama sekali. Ingin tahu tentang mencoba pct2rgb.

UPDATE 3 : Saya ingin tahu apakah penguncian file menyebabkan masalah. Mungkinkah?

Tom Chadwin
sumber
Pemrosesan panggilan adalah kode yang diwarisi. Apakah proyek warpr benar memiliki argumen yang salah? Jika demikian, saya tidak tahu cara kerjanya sama sekali.
Tom Chadwin
1
Hanya menebak tetapi untuk gdalogr:translate, coba ganti prov_rasterdengan prov_raster['OUTPUT'].
Joseph
Tidak, prov_rasterhanya string dengan jalur ke file itu, jadi saya mengertiTypeError: string indices must be integers
Tom Chadwin

Jawaban:

2

Anda harus memahami bahwa ketika Anda menyimpan file dari QgsRenderer seperti dalam kode Anda:

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

Anda tidak menyimpan gaya raster, sebaliknya Anda menyimpan file RGB sebenarnya yang mewakili visualisasi itu, sehingga tidak diklasifikasikan atau ditata, tetapi sepertinya Anda telah mengambil layar cetak dari gambar yang diberikan.

Jadi gdalwarp dan translate tidak dapat mengubah ini, karena hardcoded dalam band-band gambar, apa yang harus terjadi adalah bahwa mereka terpotong oleh satu band atau lebih, saya harus memeriksanya dengan baik.

EDIT

Saya dapat melihat di file xml Anda berikan bahwa raster sekarang hanya memiliki satu band

<PAMRasterBand band="1">

Seharusnya ada tag:

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

Jadi masalahnya ada di gdalogr:warpreproject. Saya menggunakan kode yang sama yang Anda berikan dalam raster yang saya miliki tetapi hasilnya RGB, saya tidak tahu apa yang terjadi, mungkin Anda harus memberikan sampel file raster Anda.

CATATAN

Xml tidak memiliki data gaya, seperti yang saya katakan raster yang pertama kali Anda simpan bukan lapisan gaya, tetapi gambar RGB aktual yang mewakili raster gaya.

caiohamamura
sumber