市や区の境界線の座標情報をJavaScriptで取得したいと思ったのでそのメモ。
今回はOpenStreetMap(OSM)を使ってやる。
OSMにはNominatimというものがあり、これが住所によるOSMのデータ検索やその逆を提供してくれます。詳細はこちら。
JA:Nominatim - OpenStreetMap Wiki
このサイトで実際に試すこともできます。
提供されているAPIのリファレンスはこちら。
Overview - Nominatim Documentation
普通にブラウザからでもリクエストすることができます。例えば神奈川県の横浜市の境界線を取りたければこんな感じでリクエストします。普通に住所を指定するだけですね。日本語でも通るかは試していないのでわかりません。
curl "https://nominatim.openstreetmap.org/search?q=Yokohama+Kanagawa+Japan&format=geojson&polygon_geojson=1&limit=1"
レスポンスはこちら。今回はGeoJSON形式を指定しています。なお、最後のpolygon_geojson
がないと境界線の情報はレスポンスされないっぽいです。あとlimit
を指定しないと関連する駅とかの情報も返ってきてしまいます。
実際のレスポンスの一部。
{ "type": "FeatureCollection", "licence": "Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright", "features": [ { "type": "Feature", "properties": { "place_id": 298463542, "osm_type": "relation", "osm_id": 2689482, "display_name": "横浜市, 神奈川県, 231-0017, 日本", "place_rank": 14, "category": "boundary", "type": "administrative", "importance": 0.6481543247107393, "icon": "https://nominatim.openstreetmap.org/ui/mapicons/poi_boundary_administrative.p.20.png" }, "bbox": [ 139.464781, 35.312501, 139.7769348, 35.5927382 ], "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 139.464781, 35.497437 ], [ 139.464784, 35.497418 ], [ 139.464817, 35.497217 ], [ 139.464862, 35.496971 ], (省略) ] ] ] } } ] }
レスポンスに含まれるcategory
がboundary
でtype
がadministrative
なfeature
のpolygon
がいわゆる行政区における境界線です。ルー語みたいになってしまった。
こんな感じなので実はライブラリとかなくても簡単に取得できます。JavaScriptだとaxios
を使ってこんな感じ。
import axios from 'axios'; const main = async () => { const baseUrl = 'https://nominatim.openstreetmap.org'; const placeString = 'Yokohama+Kanagawa+Japan'; const params = `search?q=${placeString}&format=geojson&polygon_geojson=1&limit=1`; try { const result = await axios.get(`${baseUrl}/${params}`); const coordinates = result.data.features[0].geometry.coordinates; console.log(JSON.stringify(coordinates)); } catch (e) { console.error(e); } }; main();
Webで簡単にGeocodingやりたいよねってなったら、JavaScriptのMapライブラリであるLeafletとそのプラグインであるperliedman/leaflet-control-geocoder
というのを使って簡単に実装できます。OSM以外にもGoogle Geocoding APIやMapbox Geocodingなどの複数のプロバイダをサポートしているとのこと。詳細は公式サイトで。
サーバーサイドでNode.jsでってなったらnode-geocoder
っていうライブラリがあります。こちらも複数のプロバイダをサポートしているようです。