概要
以前、登記所備付地図を扱う「法務省地図XMLアダプトプロジェクト」を改造して、
コンテナ化する取り組みを書きました。
この中で地物のIDをどうするかという問題を抱えており、それに対応した内容をまとめたものになります。
筆IDに代わるIDを生成
もともとの地図XML
には、筆ID
なるものが含まれています。
これは地図XMLファイルの中では、確かにID(重複の無い一意な値)なのですが、複数の地図XMLを結合する場合には被ってしまいます。
例えば、MIERUNEさんのQGISプラグイン qgis-mojxml-pluginでは、fid
というQGISで地物に付与されるIDを利用しているようです。
とはいえQGISを使うわけではないので、地図XMLのファイル名は市区町村コード(5桁)-法務局コード(4桁).zipとなっていることから、{都道府県名}{地図XMLファイル名}{筆ID}で、ID
とすることにしました!
実装
mbtiles
やpmtimes
で利用されるMVTのFeature(地物)では、IDにはuint64
を使うようです(下記参照)。そこで、人間が判読できるようにしたID(属性情報にglobal_id
として追加)、システム内で利用するID(RFC 7946
にあるGeoJSONのID、MVTのFeature ID = uint64
)を追加することにしました。
- まず
global_id
を生成しますが、{都道府県名}_{地図XMLファイル名}_{筆ID}
でIDとします - 次に
id
は、global_id
をSHA256
でハッシュ化したものを整数値にしました。SHA256
は32バイト(256bit)なので、先頭8バイト = 64bitとなり、uint64
に適合できます - もちろんハッシュ衝突する可能性はありますが、その時は別途考えます🤔
MVTでのID
A feature MAY contain an id field. If a feature has an id field, the value of the id SHOULD be unique among the features of the parent layer.
また、MVTで利用される.proto
では、uint64
で明記されているので、今回はこれを採用しました。