PyQGIS는 래스터를 렌더링 된 이미지로 저장 한 다음 GDAL 도구를 사용합니다.


12

QGis Save Raster 의 코드를 렌더링 된 이미지로 사용하려고했습니다 . 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의를 통해 실행하는 출력 이미지를 사용하려고하면 단지의 warpreprojecttranslate, 그것을 어떻게 든 스타일이 적용되지 않은 래스터로 되돌아갑니다.

내가 뭘 잘못 했니?

업데이트 : 출력의 스타일 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이 지정 되지 않았 으며 추가 파일이 없습니다. 그러나 GeoTIFF가 아닌 PNG이므로 설명 일 수 있습니다.

expand옵션을 살펴 보았지만 translate웹 브라우저에 표시되지 않는 이미지 파일이 표시됩니다. 이유를 조사하지 않았습니다.

업데이트 2 : 아니요, expand결과 파일을 전혀 사용 하지 않습니다 . 시도가 궁금합니다 pct2rgb.

업데이트 3 : 파일 잠금으로 인해 문제가 발생하는지 궁금합니다. 그럴 수 있습니까?


처리 호출은 상속 된 코드입니다. warpreproject는 완전히 잘못된 주장을 가지고 있습니까? 그렇다면 어떻게 작동하는지 전혀 모르겠습니다.
Tom Chadwin

1
그냥 추측하지만, 위해 gdalogr:translate, 교체 시도 prov_raster와 함께 prov_raster['OUTPUT'].
Joseph

아니, prov_raster내가 얻을, 해당 파일의 경로와 단지 문자열입니다TypeError: string indices must be integers
톰 Chadwin

답변:


2

코드에서와 같이 QgsRenderer에서 파일을 저장할 때 다음을 이해해야합니다.

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

래스터 스타일을 저장하지 않고 해당 시각화를 나타내는 실제 RGB 파일을 저장하므로 분류되거나 스타일이 지정되지 않지만 렌더링 된 이미지의 인쇄 화면을 찍은 것과 같습니다.

따라서 gdalwarp 및 translate는 이미지 밴드에 하드 코딩되어 있기 때문에이를 변경할 수 없습니다. 단일 밴드로 클리핑되고 있기 때문에 철저하게 확인해야합니다.

편집하다

xml 파일에서 래스터에 현재 하나의 밴드 만 있음을 알 수 있습니다.

<PAMRasterBand band="1">

태그가 있어야합니다 :

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

따라서 문제는입니다 gdalogr:warpreproject. 내가 가지고있는 래스터에 제공 한 것과 동일한 코드를 사용했지만 출력은 RGB입니다. 무슨 일이 일어나고 있는지 모르겠습니다. 어쩌면 래스터 파일 샘플을 제공해야합니다.

노트

내가 처음 저장 한 래스터는 스타일 레이어가 아니라 스타일 래스터를 나타내는 실제 RGB 이미지라고 말했듯이 xml에는 스타일 데이터가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.