概要
登記所備付地図の「法務省地図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を使った
