PyQGIS zapisz raster jako renderowany obraz, a następnie użyj na nim narzędzi GDAL


12

Próbowałem użyć kodu z QGis Save Raster jako renderowanego obrazu . ijest warstwą rastrową:

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)

To nie działa, zamiast tego daje mi niestylowany raster jako wynik końcowy. Naprawdę nie rozumiem problemu, ponieważ dane wyjściowe writeRaster(pliku pipedFile) stylizowane, więc proces odpowiedzi na powyższą odpowiedź działa. Po prostu próbuję użyć obrazu wyjściowego do uruchomienia przez GDAL warpreprojecti translatejakoś powraca do niestylowanego rastra.

Co zrobiłem źle?

AKTUALIZACJA : Wyjście QgsRasterFileWriter jest stylizowane. Wyjście niewarpreproject jest stylizowane, ale towarzyszy mu plik, który wydaje się zawierać informacje o kolorze:.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>

Wyjście nietranslate jest stylizowane i nie ma dodatkowego pliku. Ponieważ jednak jest to PNG, a nie GeoTIFF, być może jest to wyjaśnienie.

Próbowałem spojrzeć na expandopcję translate, ale daje mi to pliki graficzne, które nie wyświetlają się w przeglądarce internetowej - nie badałem, dlaczego.

AKTUALIZACJA 2 : Nie, użycie nie expandpowoduje wcale pliku wyjściowego. Zastanawiasz się, jak spróbować pct2rgb.

AKTUALIZACJA 3 : Zastanawiam się, czy blokowanie plików powoduje problemy. Mogłoby to być?


Przetwarzanie wywołań jest dziedziczonym kodem. Czy warpreproject ma całkowicie błędne argumenty? Jeśli tak, to nie wiem, jak to działa.
Tom Chadwin

1
Tylko przypuszczenie, ale dla gdalogr:translate, spróbuj wymienić prov_rasterz prov_raster['OUTPUT'].
Joseph

Nie, prov_rasterto tylko ciąg ze ścieżką do tego pliku, więc rozumiemTypeError: string indices must be integers
Tom Chadwin

Odpowiedzi:


2

Powinieneś zrozumieć, że kiedy zapisujesz plik z QgsRenderer jak w kodzie:

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

Nie zapisujesz stylu rastrowego, zamiast tego zapisujesz rzeczywisty plik RGB reprezentujący tę wizualizację, więc nie jest on klasyfikowany ani stylizowany, ale jest tak, jakbyś zrobił zrzut ekranu renderowanego obrazu.

Tak więc gdalwarp i translator nie mogą tego zmienić, ponieważ jest zakodowane na stałe w pasmach obrazu, musi się zdarzyć, że są przycinane przez jeden pasek, muszę to dokładnie sprawdzić.

EDYTOWAĆ

Widzę w pliku xml, który podałeś, że raster ma teraz tylko jeden zespół

<PAMRasterBand band="1">

Powinny być tagi:

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

Więc problem tkwi w gdalogr:warpreproject. Użyłem tego samego kodu, który podałeś w rastrze, który mam, ale wynik to RGB, nie wiem co się dzieje, być może powinieneś podać próbkę pliku rastrowego.

UWAGA

Plik xml nie ma danych o stylu, ponieważ powiedziałem, że raster, który najpierw zapisałeś, nie jest warstwą stylu, ale rzeczywistym obrazem RGB reprezentującym styl rastra.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.