#はじめに
Google提供の地名からその緯度経度を返してくれるサービス、Geocordingはとても優秀でまず期待に裏切ることのない結果を返してくれます。ところが、便利さの裏返しか、高価なのも事実。5ドル/1000回つまり1回あたり0.55円くらい徴収されます。1ヶ月あたり200ドルまでは無料とありますが、Geocordingだけ利用しているということはまず無く、Google MapsやDirectionを兼用しているとあっという間に無料枠は使い切り、知らない間にカードから利用料がバンバン落とされるという自体にもなりかねません。Google Cloud Platformというところで、各サービス毎に日ごとの使用上限を事前に設定できるので、それによって貧乏になることは防げますが、上限を超えるとエラーが返ってくるので、せっかく使ってくれた人に不快な思いをさせてしまうことになってしまいます。
そこでYOLP(Yahoo! Open Local Platform)のAPIを使ってGeocordingの代わりをさせようと考えるのは当然です。だって、YOLPは無料なのです。(ただし1日50,000回まで。そこまでは使いません)
#Yahoo!ジオコーダAPIを使ってみる
ご他聞にもれず、YOLPでも登録によるアプリケーションIDの取得は必須です。
さて、GoogleのGeocordingに似ているサービスというと、Yahoo!ジオコーダAPIになります。
名前が似ているので、まさにぴったりと言いたいところですが、本サービスには欠点があって、例えば
東京都新宿区新宿1-1
とか
渋谷区原宿1
みたいに町名+丁目くらいまでの指定をしてあげればその近くの緯度経度を返してくれるのですが、
東京タワー
とか
大阪城
は受け付けてくれません(泣)
(ちなみにGoogleのGeocordingは正しく返してくれます)
つまり住所からの検索サービスなので、実は使い勝手が悪いのです・・・。
#ではということで、Yahoo!ローカルサーチAPIを使ってみる
これは逆に住所からというのではなく、地域・拠点情報の名称からその拠点の情報(緯度経度も)を返してくれるサービスです。
例えば、
東京タワー
で検索すると、東京タワーや東京タワーの名称を使った店(例えば●●商事東京タワー支店とか)が出てきます。東京タワーならまだしも、東京駅とか大阪城とかですと、希望の東京「駅」や大阪「城」でなく、その近くのお店とかがまずヒットするので、うまくいくと希望通り出ますが、うーん近いけどここじゃないなぁーというデメリットも生じます。
検索結果は複数(指定可)なので、何個か検索してその中から、文字数の一番少ないものを選ぶとかいろいろ頭を使えば上手く絞り込めるかもしれませんが・・・(どなたか私のコードにそれを付け加えていただくこと希望w)
#結局、どうすればいいのか
つまり、コストを度外視すれば、正確性等から言うと
①Google Geocording
②Yahoo!ジオコーダAPI
③Yahoo!ローカルサーチAPI
の順番になります。
そこで、予めGoogle Cloud Platformで、Geocordingの日ごとの使用上限を事前に設定した上で、それを超えてエラーが出たら、②Yahoo!ジオコーダAPIを使って検索、それでもエラーが出たら③Yahoo!ローカルサーチAPIで検索したら、出費もコントロールできるし、検索結果がゼロという最悪の事態も回避できるのではないかと考えたわけです。
#作ったコード
function showAddress(address) {
var geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
} else {
var geocoder = new Y.GeoCoder();
geocoder.execute({query:address}, function(result){
if (result.features.length > 0){
map.setCenter(new google.maps.LatLng(result.features[0].latlng.lat(), result.features[0].latlng.lng() ));
}else{
var local = new Y.LocalSearch();
var cid = '個々のヤフーIDを入れてください';
local.search(address, cid, {}, function (ydf) {
if (ydf.features.length > 0) {
map.setCenter(new google.maps.LatLng(ydf.features[0].latlng.lat(), ydf.features[0].latlng.lng() ));
} else {
alert('Not Found');
}
});
}
});
}
});
}
}
addressに検索ワードを入れてfunction showAddress(address)を呼び出せばそこを中心とした場所にGoogleMapが移動します。
(利用にはGoogleのID等は別途取る必要があります)
#結び
地図を使ったサービスを提供していると、意外にもGeocordingのサービスを使う人が多いことを、奇しくもGoogleのサービスが有料化されてよく分かりました。今回はGeocording系の移管でしたが、標高API等は簡単に移行できるので、Google貧乏で悩んでいる方は他社のサービスを検討されるといいと思います。