たぶん動く...

多分GIS系の人。あくまで個人的見解であり、所属団体を代表するものではありません。

COGをソースにしてタイルサーバをホストする(3)

前回までは単一ファイルをホストして表示したので、今回は、複数ファイルをホストしてみます。

複数ファイルをホスト

サンプルをもとに作成しました。

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/rio_tiler/mosaic at dev · cogeotiff/rio-tiler · GitHub