「国交省の不動産情報ライブラリAPI のバイナリベクトルタイルを、Mapbox / MapLibre GL JS で直接使えるようにするプロキシAPI」 を作りました。 これを使えば、下記のようなコードだけで不動産価格データを地図に重ねて表示できます:
// 不動産価格(取引価格・成約価格)ポイントのベクトルタイルソースを追加
map.addSource("real-estate-price", {
type: "vector",
tiles: [
"https://du6jhqfvlioa4.cloudfront.net/ex-api/external/XPT001/{z}/{x}/{y}.pbf?from=20234&to=20243"
],
minzoom: 13,
attribution: '<a href="https://www.reinfolib.mlit.go.jp/">不動産情報ライブラリ(国土交通省)</a>'
});
// 表示レイヤを追加
map.addLayer({
id: "real-estate-points",
type: "circle",
source: "real-estate-price",
"source-layer": "hits", // ソースレイヤー名は hits を指定して下さい
paint: {
"circle-radius": 10,
"circle-color": "#ff0000",
"circle-stroke-width": 1,
"circle-stroke-color": "#ffffff"
}
});
実際の動作デモはこちら:
CodePenデモ
https://codepen.io/geolonia/pen/MYYgwEJ
国交省が提供する「不動産情報ライブラリ」は、日本全国の不動産取引価格や都市計画、防災、人口、公共施設などの情報を z/x/y
形式の バイナリベクトルタイル(PBF)で提供しています。
まさに「地図で使ってください」と言わんばかりのデータです。
しかし……実際に地図で使ってみようとすると、以下のような壁にぶつかりました:
不動産ライブラリAPIを使うには、APIキーを取得して、HTTPヘッダーに追加する必要があります。
Ocp-Apim-Subscription-Key: xxxxxxxx
サーバーサイドでリクエストする分には問題ないのですが、MapLibre GL JS や Mapbox GL JS で、ヘッダーにAPIキーをセットしようとすると、
フロントエンドにAPIキーを埋め込むしかなく、APIキーが公開されてしまいNG。
MapLibreから直接タイルを読み込もうとすると、Access-Control-Allow-Origin
ヘッダーが返ってこないため、CORSエラーでブロックされます。
APIのPBFエンドポイントは、以下のように query string でパラメータを渡します:
https://www.reinfolib.mlit.go.jp/ex-api/external/XPT001?response_format=pbf&z=13&x=7312&y=3008&from=20223&to=20234
でも MapLibre の tiles プロパティは、以下のような「パス形式」のURLであることが一般的:
https://your-api.example.com/tiles/landprice/{z}/{x}/{y}.pbf
※ MapBox の TileJSON 仕様によると、{z}
、{x}
、{y}
のプレースホルダーがあればパス形式でなくても良いとあるのですが、今回は一般的なパス形式に揃えています。
これらの課題を解決するために、AWS上にプロキシAPIを構築しました。主な構成は以下です:
今回のプロキシAPIでは、AWSの CloudFront + Lambda@Edge を使って、 APIキーの付与とCORSヘッダーの付加という2つの処理をCDNレイヤーで実現しています。
具体的には以下のような流れです:
例:https://example.com/{z}/{x}/{y}.pbf
){z}/{x}/{y}.pbf
のパスを response_format=pbf&z={z}&x={x}&y={y}
というクエリパラメータに置換これにより、MapLibreなどのクライアントライブラリで直接PBFタイルを読み込むことが可能になります。
https://du6jhqfvlioa4.cloudfront.net/<不動産ライブラリAPIの任意のパス>/{z}/{x}/{y}.pbf?<任意のクエリパラメータ>
Mapbox / MapLibre GL JS からはそのまま読み込めます!
hits
を指定して下さい。response_format,
z,
x,
y` のクエリパラメータは指定しないで下さい)map.addSource("landprice", {
type: "vector",
tiles: [
"https://du6jhqfvlioa4.cloudfront.net/ex-api/external/XPT001/{z}/{x}/{y}.pbf?from=20223&to=20234"
],
minzoom: 13,
attribution: '<a href="https://www.reinfolib.mlit.go.jp/">不動産情報ライブラリ(国土交通省)</a>'
});
// 表示レイヤを追加
map.addLayer({
id: "landprice-points",
type: "circle",
source: "landprice",
"source-layer": "hits", // ソースレイヤー名は hits を指定して下さい
paint: {
"circle-radius": 10,
"circle-color": "#ff0000",
"circle-stroke-width": 1,
"circle-stroke-color": "#ffffff"
}
});
※ もちろん QGIS でも読み込めます!
このプロキシAPIが出力する z/x/y
形式のベクトルタイルは、
などの各種地理空間プラットフォームと形式的に互換性があります。 つまり、同じ座標系・タイル形式を前提としたデータ基盤と重ね合わせがしやすい構造になっており、将来的な「データの連携」や「マッシュアップ」にも向いています。
CDKコードは以下のGitHub リポジトリで公開しています。 興味ある方はぜひチェックしてください!
https://github.com/geolonia/mlit-estate-library-proxy-api
不動産情報ライブラリAPIで、データがベクトルタイル形式で配信されたことは素晴らしい事だと思います!ただ「惜しい!」部分が多かったので、こうしたラッパーを通じてもっと使いやすくなれば、位置情報のデータ連携が加速するはず。
「このAPIをこんな風に活用したい」などあれば、ぜひ教えてください!