一覧に戻る

ラスタータイルのつくりかた(2022年版)

#GDAL#GIS#foss4g#QGIS

:::note info PMTiles全盛の昨今ですので、新しい記事を投稿しました。 ディレクトリ形式で作成したい場合は引き続きこのページをご覧ください。 :::

https://qiita.com/Kanahiro/items/09abaa4ed80429b3ef28

TL;DR

  • GDAL v3.1でgdal2tiles.pyに--xyzオプションが追加されたので、これを使えば簡単。以下コマンド例。
# source.tif -> target_dir の変換コマンド
# ズームレベル3-18で、XYZタイル形式で、4スレッドで並行処理するという意味
gdal2tiles.py source.tif target_dir -z3-18 --xyz --processes=4
  • 元データは予め投影法をEPSG:3857にしておきましょう
  • そうしなくても処理は出来ますが、事前に再投影しておいた方が圧倒的にタイル生成が速いです
  • WindowsではQGISを使えば環境構築も簡単です

詳細

冒頭が結論です。以下には色々調べた結果のつらみが色々書いてあります

つらみ①:gdal2tiles.pyは、--xyzオプションを付与しないとTMS形式のタイルが生成される

これが最大の罠で、現状、ネットを色々調べてもなかなかこれがわかりにくかった。TMS形式は、いわゆるXYZタイルとは南北が逆なので、日本国内のタイル作ってるのにオーストラリアにタイルが生成されてたりした。何やっても変な位置にタイルが作られるので半泣きだったが、ちゃんとドキュメントを読めば、デフォルトはTMSと書いてある。

https://gdal.org/programs/gdal2tiles.html

つらみ②:--xyzオプションはGDAL3.1以降にしか存在しない

GDAL3.1は2020/1リリースです。比較的最近のリリースであり、つまりこれまではXYZタイル形式での変換はGDALでは出来なかったという事…(でもラスタータイル 生成みたいに調べるとgdal2tiles.pyの情報が多数出てくる罠)。

https://github.com/gsi-cyberjapan/gdal2xyztiles.py ちなみに過去に国土地理院さんがgdal2tiles.pyを拡張したスクリプトを公開していたよう

つらみ③:QGISのプロセッシングツールのgdal2tilesではXYZタイルをつくれない

2020-03-03: ①macOSのQGIS3.16でバージョン情報みたら3.1.2となっていました②Windows 64bitのQGIS3.18でバージョン情報見たら3.1.4になっていましたので、QGIS内蔵のGDAL自体のバージョンは問題なさそうです

QGISのプロセッシングツール経由のgdal2tilesではXYZタイルを作る事はできません。XYZタイルをつくるXYZタイルの生成というプロセッシングツールはありますが、こちらはQGISのキャンバスのレンダリング結果を用いるため、処理が非常に遅いです(QGISキャンバスを用いるゆえの便利さもあります)。

つらみ④:GDALの環境構築

Windows

QGISにはGDALが内蔵されているので、それを利用するのが簡単です。QGISのPythonコンソールではGDALへのパスが通っているためsubprocessで動かせます。下記が例(QGIS3.16 LTRで検証)。

import subprocess
subprocess.run("gdal2tiles.bat src.tif output_folder -z0-16 --xyz --processes=4 -w none", shell=True)

Ubuntu

apt-get gdal-binで入りますが、これはバージョンが2.4.2になってNG。 https://qiita.com/ozo360/items/f78c95795827d7732dff にてUbuntuで最新のGDALをインストールする方法が紹介されています。

macOS

# GDALをbrewで最新にしてpython-bindingsも最新にすればよい
brew install gdal
pip install --upgrade gdal

Docker

これが一番簡単でしょう。-vと-wはホストマシンのカレントディレクトリをコンテナのカレントディレクトリとするイディオムです。

docker run -it -v $PWD:/usr/src/app -w /usr/src/app osgeo/gdal gdal2tiles.py src.tif output_folder -z0-16 --xyz --processes=4 -w none