🌏
ラスターデータからPMTilesを生成する方法
はじめに
GIS界隈ではCloud Optimizedが重要なキーワードになっています。Cloud Optimizedとは、特別なサーバ実装を必要とせず、大きな位置情報データの一部分を配信することを可能とするファイル形式の総称です。本記事は、Cloud Optimized形式のうち、PMTiles(ラスタータイル)の生成方法に焦点を当てた記事になります。具体には、静岡県(VIRTUAL SHIZUOKA)がG空間情報センターを通じてオープンデータとして公開している、オルソ画像データ(GeoTIFF)からPMTilesを生成する方法について説明します。
PMTilesの特徴
- 単一ファイル形式のタイルデータ
- ラスタータイル、ベクトルタイルともに対応
- 地球規模のタイルマップの保存
- S3 のようなストレージとHTTP Range Requestsのみを使用
PC環境
OS:Windows 10 Pro
CPU:Intel Core i7-9700
メモリ:32GB
前提条件
- OSGeo4W(GDAL)がインストール済みであること。
- GDALのバージョンは、GDAL 3.6.3(released 2023/03/07)です。
- rio-mbtilesがインストール済みであること。
(GeoTIFFからMBTilesを生成するツールです。)
- pipでインストールできます。
pip install rio-mbtiles
- go-pmtilesをダウンロード済みであること。
- go-pmtiles_1.8.0_Windows_x86_64.zip
(MBTilesからPMTilesを生成するツールです。)
- G空間情報センターからオルソ画像データを取得済みであること。
- 本記事では、LPデータ オルソ画像データを使用します。
GeoTIFFのマージ
- GeoTIFFのマージには、OSGeo4Wのgdal_merge.pyを使用します。
- GeoTIFFは、下記のとおり、lp_orthophotoフォルダ内に格納されているとします。
lp_orthophoto
│ 08NF2268.tif
│ 08NF2269.tif
│ 08NF2278.tif
│ 08NF2279.tif
│ 08NF2288.tif
│ 08NF2289.tif
│ 08NF2298.tif
│ 08NF2299.tif
(省略)
- 下記のbatファイルにGeoTIFFが存在するディレクトリや出力するGeoTIFFのファイルパスを設定します。
- OSGeo4W Shellを開いて、その中でバッチファイル(gdal_merge.bat)を実行します。
gdal_merge.bat
@echo off
setlocal enabledelayedexpansion
REM gdal_merge.pyへのパスを指定します。
set GDAL_MERGE_PATH="C:\OSGeo4W\apps\Python39\Scripts\gdal_merge.py"
REM 出力するGeoTIFFの名前を設定します。
set OUTPUT_FILE=D:\GIS\geospatial\VIRTUAL_SHIZUOKA\lp_orthophoto.tif
REM 処理するファイルの拡張子を設定します。
set EXTENSION=*.tif
REM GeoTIFFファイルが存在するディレクトリを設定します。
set DIRECTORY=D:\GIS\geospatial\VIRTUAL_SHIZUOKA\lp_orthophoto
REM 指定したディレクトリ内の全ての.tifファイルを一覧表示します。
dir %DIRECTORY%\%EXTENSION%
REM 指定したディレクトリ内の全ての.tifファイルを集めます。
for /R %DIRECTORY% %%f in (%EXTENSION%) do (
set "files=!files! %%f"
)
REM gdal_merge.pyを使用して、全ての.tifファイルを一つの.tifファイルにマージします。
python %GDAL_MERGE_PATH% -o %OUTPUT_FILE% !files!
座標参照系の付与
- G空間情報センターから取得した、オルソ画像データには座標参照系が設定されていないため、GDALのgdalwarpを使用して、座標参照系を付与します。
- なお、付与する座標参照系は、日本測地系2011/平面直角座標系第8系(EPSG:6676)になります。
- OSGeo4W Shellを起動して、下記のコマンドを実行して座標参照系を付与します。
gdalwarp -t_srs EPSG:6676 lp_orthophoto.tif lp_orthophoto_add_srs.tif
- また、下記のコマンドを実行して、座標参照系を付与されているかGeoTIFFのメタ情報を確認します。
gdalinfo lp_orthophoto_add_srs.tif
- メタ情報の出力結果は下記のとおりになります。
Driver: GTiff/GeoTIFF
Files: lp_orthophoto_add_srs.tif
Size is 14000, 19500
Coordinate System is:
PROJCRS["JGD2011 / Japan Plane Rectangular CS VIII",
BASEGEOGCRS["JGD2011",
DATUM["Japanese Geodetic Datum 2011",
ELLIPSOID["GRS 1980",6378137,298.257222101,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",6668]],
CONVERSION["Japan Plane Rectangular CS zone VIII",
METHOD["Transverse Mercator",
ID["EPSG",9807]],
PARAMETER["Latitude of natural origin",36,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8801]],
PARAMETER["Longitude of natural origin",138.5,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8802]],
PARAMETER["Scale factor at natural origin",0.9999,
SCALEUNIT["unity",1],
ID["EPSG",8805]],
PARAMETER["False easting",0,
LENGTHUNIT["metre",1],
ID["EPSG",8806]],
PARAMETER["False northing",0,
LENGTHUNIT["metre",1],
ID["EPSG",8807]]],
CS[Cartesian,2],
AXIS["northing (X)",north,
ORDER[1],
LENGTHUNIT["metre",1]],
AXIS["easting (Y)",east,
ORDER[2],
LENGTHUNIT["metre",1]],
USAGE[
SCOPE["Cadastre, engineering survey, topographic mapping (large and medium scale)."],
AREA["Japan - onshore - Honshu between approximately 137ツー45'E and 139ツーE - Niigata-ken; Nagano-ken; Yamanashi-ken; Shizuoka-ken."],
BBOX[34.54,137.32,38.58,139.91]],
ID["EPSG",6676]]
Data axis to CRS axis mapping: 2,1
Origin = (51200.000000000000000,-97800.000000000000000)
Pixel Size = (0.200000000000000,-0.200000000000000)
Metadata:
AREA_OR_POINT=Area
Image Structure Metadata:
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left ( 51200.000, -97800.000) (139d 3'42.18"E, 35d 7' 1.70"N)
Lower Left ( 51200.000, -101700.000) (139d 3'41.31"E, 35d 4'55.14"N)
Upper Right ( 54000.000, -97800.000) (139d 5'32.76"E, 35d 7' 1.17"N)
Lower Right ( 54000.000, -101700.000) (139d 5'31.84"E, 35d 4'54.62"N)
Center ( 52600.000, -99750.000) (139d 4'37.02"E, 35d 5'58.16"N)
Band 1 Block=14000x1 Type=Byte, ColorInterp=Red
Band 2 Block=14000x1 Type=Byte, ColorInterp=Green
Band 3 Block=14000x1 Type=Byte, ColorInterp=Blue
MBTilesの生成
- GeoTIFFからMBTilesの生成にはrio-mbtilesを使用します。
- コマンドプロンプトを起動して、以下のコマンドを実行します。
- 出力されるタイルのフォーマットは、PNG形式を指定しています。
- 地図のズームレベル0から18までの地図タイルを作成します。
- タイルサイズは、512x512ピクセルのタイルを指定しています。
rio mbtiles lp_orthophoto_add_srs.tif lp_orthophoto_add_srs.mbtiles --format PNG --zoom-levels 0..18 --tile-size 512 --resampling bilinear
PMTilesの生成
- MBTilesからPMTilesの生成にはgo-pmtilesを使用します。
- ダウンロード済みのgo-pmtiles_1.8.0_Windows_x86_64.zipの中からpmtiles.exeをコピーして、MBTilesと同じフォルダに格納します。
- コマンドプロンプトを起動して、以下のコマンドを実行します。
pmtiles convert lp_orthophoto_add_srs.mbtiles lp_orthophoto_add_srs.pmtiles
生成したPMTilesの確認
- 生成したPMTilesの確認には、PMTiles Viewerが便利です。
- PMTilesをドラッグ&ドロップすると、画像が地図上に表示されます。
おまけ
- 上記の方法で生成したPMTilesとMapLibre GL JSで作成したデモサイトを下記のGitHubにて公開しています。
Discussion