概要
登記所備付地図の「法務省地図XMLアダプトプロジェクト」をコンテナにする試みです。
-
amx-project/aで公開されている
pmtiles
ファイル(a.pmtiles
)が便利だなぁと思っていたら、地物のIDが無くて困ったため、pmtiles
づくりに初挑戦しました - 自前で
pmtiles
を作ろうとして、『G空間情報の変換済みGeoJSONで行けるのでは?』と思い大量のファイルをかき集めたがdaihyo
レイヤーを作れないことが判明した(『地図XML』ならOK) - コンテナ化もしたくなったので、forkしてとりあえずコンテナで動くようにした
前段
3月末ということで、次年度の登記所備付地図の更新に向けた準備を始めている方、お疲れ様です。もう1年近く前のことでほぼ記憶がないので、いつものMIERUNEさんの投稿を参考に、どういった方法が良いのか検討します。
すると、おぼろげながら浮かんできたんです。『MapLibre GL JS + pmtiles』という文字が...💭
🗺️コンテナ着手まで(amx-project/a
の利用)
法務省地図XMLアダプトプロジェクトのamx-project/aでは、地図XMLを(※下記参照)pmtiles
形式に変換して配布しており、気軽に利用することができます。【中級編】MapLibre GL JSを使ったWebGIS作成を参考にお手軽に試すことができます。
トラブル発生
無事に表示されると、今度は地物(地番のポリゴン)を選択したくなったのです。
下記の記事を参考に地物(地番のポリゴン)を選択しようとすると、IDがないために選択できません。どうやらa.pmtiles
では、特定の属性を除外しているようです。
-
Leaflet
だとclickした地物(feature)にそのまま色付けできますが、MapLibre GL JS
ではsetFeatureState
に対して、地物(feature)のIDを渡すという方法のようです -
⚠️
MapLibre GL JS
公式のexampleでもこのような方法を取っています
自分で作るpmtiles
📄ファイルの入手
amx-project/aは、『地図XML』を変換してデータ提供しています。
そのため、G空間情報で公開されている変換済みGeoJSONではなく、『地図XML』が必要です。
自分でかき集めるのは辛すぎるので、amx-project/kuwanauchiを利用しましょう。北海道などは、2024年度データに対応しているようです。
amx-project/a
で作るmbtiles
は、daihyo
レイヤー(地番をPoint
で表現)、fude
レイヤー(地番をPolygon
で表現)の2種類のレイヤーを持つ構造で、地図のzoomレベルに応じて切り替わります。このdaihyo
レイヤーを生成するときに、「代表点経度」や「代表点緯度」という属性情報を利用するのです。
しかし、G空間情報の『変換済みGeoJSON』には「代表点経度」や「代表点緯度」は含まれていません(え、マジ...🥲)。daihyo
レイヤーが必要なら「代表点経度」や「代表点緯度」を含んだデータが必要です。
「代表点経度」や「代表点緯度」というのは、内部で使われているデジ庁のmojxml2geojsonが作ってくれる属性なので、amx-project/a
のRakefile
をそのまま利用したい場合は、変換済みGeoJSONではなく、地図XMLを使いましょう。
もちろん、変換済みGeoJSON等他のファイルでも、ジオメトリから代表点を求めれば対応できます。
また、変換済みGeoJSONなら【法務省登記所備付地図(通称:地図XML)】WindowsPowershellでG空間情報センターから一括ダウンロードを参考に自動ダウンロードできたのですが...必要なのは『地図XML』です。
備忘的内容ですが、ファイルの入手については、GeoJSONではスクリプトで一括ダウンロードする方法などが紹介されています。世間様にご迷惑をかけないよう、一括ダウンロードするときは、API Keyを入れたり、sleepを入れる等の注意をしましょう。
ℹ️amx-project/aの仕様を確認
amx-project/a-specにまとめられていますが、
もう少し細かいことを調べたので下記にまとめます。
amx-project/aでは、Rakefileに5つのタスクが定義されています。
私のamx-aでは、プロジェクト直下ではなくoutput
ディレクトリに全出力ファイルを出すようにしました。
タスク:mbtiles
都道府県毎にsrc
ディレクトリに置かれた地図XMLを処理。
- データをストリームとして入力し、
tippecanoe
に渡して、都道府県毎のmbtiles
を生成 -
to_geojson.rb
では、デジ庁のmojxml2geojson
を利用して、src
配下のディレクトリに置かれた各zipファイル(地図XML)を一時ディレクトリに解凍しつつ、GeoJSON
に変換して標準出力に出す -
{都道府県コード}-daihyo.mbtiles
,{都道府県コード}-fude.mbtiles
を生成し、最後にそれらをまとめた{都道府県コード}.mbtiles
を生成
タスク:pmtiles
rubyスクリプト呼び出しは無し。tippecanoe
で処理。
- zoomレベル用に、2〜13 用にデコード&再生成して
a-daihyo.mbtiles
を出力 - zoomレベル用に、14〜16のタイルをそのまま結合して、
a-fude.mbtiles
を出力 - いずれも入力ファイルは同じ(
mbtiles
タスクで出力した{都道府県コード}.mbtiles
) -
a-daihyo.mbtiles
とa-fude.mbtiles
を結合して統合版mbtiles
(a.mbtiles
)を作成- ※私のamx-aではファイル名を変更
- 最後に、統合版
mbtiles
から、統合版pmtiles
に変換
タスク:style
charites
を使用してstyle.yml
からstyle.json
をビルド&デプロイします。ruby
スクリプト呼び出しは無し。
-
layers
というディレクトリを探しにいくが、シンボリックリンクがコミットされているため、自分でシンボリックリンクかディレクトリを作成する必要があります - 何を指しているのか不明でしたが、optgeo/optbv-intl.gitぽいなと予想
タスク:host
budo を使ってローカルサーバーをホストする。rubyスクリプト呼び出しは無し。
タスク:rebuild
echo コマンドで files を表示。rubyスクリプト呼び出しは無し。
👉主なものは、mbtiles
, pmtiles
だと思います。地図のstyleを変更する場合はstyle
タスクを実行します。私の環境では、北海道(都道府県コード=01)を対象に、これら3つを実行したところ1時間程度かかりました。
🐋コンテナ化
勢いだけで作ったので、いろいろ直していかないといけません。
-
image
の作成は、podman compose build
- 実行は、
podman compose up
なるべく構成を変えないよう、気を付けたことをまとめます。
-
Rakefile
のタスクにはなるべく手を入れないが、都道府県(のコード)を環境引数で渡すようにした - rubyファイルは直下のものをそのまま利用。
-
src
はコピーしない(volume
でマウント) - コピーさせたくないものは.dockerignoreで指定しておく
- layersはシンボリックリンクなのでコピーしない
-
-
podman
やらdocker
コマンドでbuild
やrun
するのはオプションを忘れてしまうため、compose
を使った