PyQGISで,ラスターレイヤーをGeoTIFFで出力するには

406 views
Skip to first unread message

イユ

unread,
Jan 19, 2021, 5:41:49 AM1/19/21
to QGIS初心者質問グループ
こんにちは.
QGIS Python APIでのコーディングについて教えてください.

使用環境
Windows10
QGIS 3.16.2
QGIS Pythonコンソールからプログラミング

今,日本白地図の上に 気象庁WebサイトからXYZタイル形式のpng画像を読み込んで,そのpng画像上の色をもとに等高線を引くスクリプトを作成しています.(降水量・積雪量等の色分けされた画像です.)

XYZタイルのラスターレイヤーをGDALに入力するために一度.tifファイルにエクスポートしてから再度読み込む必要があるのですが,これはPyQGISでどう書けばいいのでしょうか?またこのとき,他レイヤーの領域を指定してエクスポートしたいです.

GUIでは,次のように行う作業です.
・エクスポートしたいレイヤーのエクスポート > 名前を付けて保存
・「ラスタレイヤの保存」
  ▼領域
   レイヤから計算 > 領域を適用したい他レイヤー

いくつかのサイトを閲覧して試してみたのですがどれもうまく行きません.
よろしくお願いします.

ありた

unread,
Jan 30, 2021, 8:48:24 AM1/30/21
to QGIS初心者質問グループ
こんにちは

QGIS で XYZ Tiles レイヤは QgsRasterLayer として扱われますが、下地としての
レイヤであり、読み込まれるタイル画像の画素値をラスタ値として直接取得することは
できないようです。(ドレープ処理も意図通り機能しない)

ですので、たとえば

1. XYZ Tiles の URL 、ズームレベルを指定する
 ・URL を既存レイヤから取得する場合は QgsMapLayer.source() など

2. 指定領域からダウンロードすべきタイルの URL 一覧を生成する
 ・プロセシング用のスクリプトなら QgsProcessingParameterExtent
  領域(読み込み済みレイヤから、マップキャンバスから等)指定が可能
 ・また上記手法だと QgsProcessingAlgorithm.parameterAsExtent() の
  オプションで目的の CRS を指定することができるので EPSG:3857 を指定
 ・プロセシング用のスクリプトでない場合、領域参照用レイヤに対し
  QgsMapLayer.extent() で領域取得可能。ただしレイヤの CRS 座標なので
  QgsMapLayer.crs() から EPSG:3857 へ再投影が必要
 ・EPSG:3857 の座標からタイル座標への変換は、タイル座標の定義参照。

3. ダウンロードした各タイル画像に対し、ワールドファイルを作成する
 ・タイル座標から EPSG:3857 に変換し、ワールドファイルをつくる

4. gdalbuildvrt で各タイル画像を1枚の仮想ファイルにする
 ・GDAL のコマンドを直接叩くほか、 QGIS 内では
  processing.run("gdal:buildvirtualraster", options) で実行可能。
 ・オプションについては、一回プロセシングツール内で「仮想ラスタの構築」を
  実行し、プロセシングの履歴より確認してください。

5. 仮想 vrt ファイルを、目的の処理の入力データとする

などでしょうか。
個人的には QGIS 上ではなく、通常の Python スクリプトと GDAL コマンドの
実行の方が楽のような気がします。

イユ

unread,
Feb 3, 2021, 2:39:35 AM2/3/21
to QGIS初心者質問グループ
詳しい回答ありがとうございました.

python gdalだけの方法も考えつつ,さっそくやってみたいと思います.

2021年1月30日土曜日 22:48:24 UTC+9 ありた:
Reply all
Reply to author
Forward
0 new messages