この記事は FOSS4G Advent Calendar 2019 の25日目の記事です
はじめに
Carmenと国土数値情報の行政区域データを使ってジオコーダーを作りました。
Carmenとは
ベクタータイル(MVT)ベースのジオコーダーです。MapboxのGeocoding APIはこれを使って実装されています。
サンプル
Forward Geocoding
22時〜9時の間は停止します、また、時期をみて予告なく閉じます、ご了承ください
パラメータ
- access_token
- 認証用。ここでは無視して構いません
- q
- Forwad Geocodingしたい地名
出力結果(GeoJSON)
{
"type": "FeatureCollection",
"query": [
"大",
"磯",
"町"
],
"features": [
{
"id": "data.771",
"type": "Feature",
"place_type": [
"data"
],
"relevance": 1,
"properties": {
"code": "14341"
},
"text": "神奈川県中郡大磯町",
"place_name": "神奈川県中郡大磯町",
"matching_text": "大磯町",
"matching_place_name": "大磯町",
"bbox": [
139.25085050564633,
35.29728800863472,
139.33406953288272,
35.33443858597201
],
"center": [
139.29246001926452,
35.315863297303366
],
"geometry": {
"type": "Point",
"coordinates": [
139.29246001926452,
35.315863297303366
]
}
}
]
}
Reverse Geocoding
22時〜9時の間は停止します、また、時期をみて予告なく閉じます、ご了承ください
パラメータ
- access_token
- 認証用。ここでは無視して構いません
- q
- Reverse Geocodingしたい経度,緯度
出力結果(GeoJSON)
{
"type": "FeatureCollection",
"query": [
141.353611,
43.0625
],
"features": [
{
"id": "data.143",
"type": "Feature",
"place_type": [
"data"
],
"relevance": 1,
"properties": {
"code": "01101"
},
"text": "北海道石狩振興局札幌市中央区",
"place_name": "北海道石狩振興局札幌市中央区",
"bbox": [
141.20187360558248,
42.997474721281435,
141.3896355507402,
43.0861158375759
],
"center": [
141.29575457816134,
43.04179527942867
],
"geometry": {
"type": "Point",
"coordinates": [
141.29575457816134,
43.04179527942867
]
}
}
]
}
当該都道府県が「北海道」の場合、該当する支庁・振興局の名称が入ります
図
手順
- 国土数値情報の行政区域データ(GeoJSON)を最適化
- tippecanoeでベクタータイル化
- carmen-index.jsでインデックス化
- これでジオコーダに必要なデータが作成される
- ***.fuzzy
- ***.grid.rocksdb
- ***.mbtiles
- 後はCarmenにクエリーを投げるだけ
手順4までが事前に準備しておくものですが、今回の場合、数分で完了しました。
また、ベクタータイル, インデックス共にz12までとしています。
補足
Carmenでgeocodingした結果をそのまま出力する仕様です。詳細はここを参照してください(ソースコードへのリンク切れてますが...)。
余談
Rustで作り直すプロジェクトが進んでいるようです。Mapboxのリポジトリを見渡してみるとRustを使ったものがちょっとずつ増えてきている気がします。GolangではないのはGoogle製だからでしょうか。