前回までは単一ファイルをホストして表示したので、今回は、複数ファイルをホストしてみます。
複数ファイルをホスト
サンプルをもとに作成しました。
import os import numpy as np from fastapi import FastAPI, Query from starlette.requests import Request from starlette.responses import Response from rio_tiler.profiles import img_profiles from rio_tiler.io import Reader from rio_tiler.mosaic import mosaic_reader app = FastAPI( title="rio-tiler", description="A lightweight Cloud Optimized GeoTIFF tile server", ) ) assets=[ 'COG FILE (1)' 'COG FILE (2)', 'COG FILE (3)', 'COG FILE (4)', ] def tiler(asset, *args, **kwargs): with Reader(asset) as src: return src.tile(*args, **kwargs) @app.get( r"/{z}/{x}/{y}.png", responses={ 200: { "content": {"image/png": {}}, "description": "Return an image.", } }, response_class=Response, description="Read COG and return a tile", ) def tile( z: int, x: int, y: int, ): """Handle tile requests.""" mosaic_img, assets_used = mosaic_reader(assets, tiler,x,y,z, threads=1,) mosaic_img.data=np.where(mosaic_img.data>0.255,0.255,mosaic_img.data)*1000 mosaic_img.data=mosaic_img.data.astype('uint8') content = mosaic_img.render(img_format="PNG", **img_profiles.get("png")) return Response(content, media_type="image/png")
アプリを実行してQGISで表示してみました。
表示できましたが、 黒い箇所が目立ちます。広範囲を表示する際に低解像度画像を出力していると思われるのですが、そのリサンプリングにnodataピクセルが強く影響していると考えられます。COGを作る際にgdaladdoでピラミッド画像を作成したほうが良さそうです。また、HDF5ファイルからGeoTIFFファイルを出力するのも時間と手間がかかりました。Lambdaとかでできるとよさそうです。
参考文献
gdal ツールで GeoTiff のピラミッド画像を作ってみる。 - Qiita
rio-tiler/rio_tiler/mosaic at dev · cogeotiff/rio-tiler · GitHub