こんにちは
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 コマンドの
実行の方が楽のような気がします。