APIが微妙なときでもなんとかする
Web屋のネタ帳に書かれている「ホットペッパーAPIの仕様が微妙におしい件」という記事に関して。
いまのホットペッパーAPIには、取得できる情報には位置情報(緯度、経度)が含まれておらず、また逆に位置情報で検索する機能もない。正確な位置情報(緯度/経度)のデータがないと、Google Maps API とかYahoo地図情報Webサービスなんかとの連携が非常にやりづらいのだ。
確かにマッシュアップしづらいなと感じました。しかし、そこはプログラミングやAPIでごり押しすればなんとかなります。むしろ、プログラマーにはその「なんとかする能力」が求められるはずです。
たとえば次のように。
緯度/経度から住所を求めるinvgeocoderを利用する
これはいわゆる逆ジオコーディングを提供してくれているAPIです。これを利用すると、地図の中心地点や地図をクリックした地点から住所を求めることができます。
ジオコーディングのために住所を正規化する
住所情報の書式には、「番地で終わる場合とビル名で終わる場合」や「番地に丁目が含まれる場合と含まれない場合」などが考えられます。ホットペッパーAPIで提供される住所の丁目・番地部分は運良く「xx-yy-zz」の形式に正規化できるので、例えばJavaScriptなら次のようにしてジオコーディングのための住所を得ることができます。
if (address.match(/^(.+)([0-9]+)\-([0-9]+)$/)) { return RegExp.$1 + RegExp.$2 + '丁目' + RegExp.$3; } if (address.match(/^(.+)([0-9]+)\-([0-9]+\-[0-9]+)(.+)$/)) { return RegExp.$1 + RegExp.$2 + '丁目' + RegExp.$3; } if (address.match(/^(.+)([0-9]+)\-([0-9]+)(.+)$/)) { return RegExp.$1 + RegExp.$2 + '丁目' + RegExp.$3; }
これらを利用すると、次のような手順で地図で表示した地域付近の店舗を地図にマッピングすることができます。
- 地図の中心地点の住所をinvgeocoderで取得
- 取得した住所の町名(town)までを使ってホットペッパーAPIで店舗情報を取得
- 取得した店舗情報の住所を正規化
- 正規化した住所でジオコーディング
ジオコーディングができれば「地図の中心地点から近い順にソート」といったこともできなくはないです。
もちろんAPIを提供する会社は使いやすいインタフェースのAPIを提供すべきです。そうしなければマッシュアップサイトの質が低下してしまうばかりか、いずれ人々の頭から忘れ去られ、APIを提供する意味がなくなってしまいます。
しかし、微妙な仕様が提供された場合でもなんとか解決策を模索するのがプログラミングの面白さではないでしょうか。
コメントを残す