Google Maps Geocoding APIの使い方[完全版]
Sharetube以外の他の仕事で「Google Maps Geocoding API」を利用して住所を緯度経度に変換してDBを更新するという事をしましたので、その内容を記事化したいと思います。なお、東京と大阪だけで15万件の住所を緯度経度にする事が必要でしたので有料のAPIに関しましても触れていきます。
緯度経度のルール
まずそもそも緯度経度のルールを知らなかったので少しだけ勉強してみました。例えば・・・
東京都渋谷区代々木1丁目42−12
という住所を緯度経度に直すとこうなります。
緯度:35.6828413
経度:139.6993308
で、何が知りたいかというと
ここから移動するとどの数値が動くかを知りたかったのでちょっとだけポイントを動かして何が変わったかを確認した結果・・・
[緯度経度のルール]・北に行くと緯度が上がる
・南に行くと緯度が下がる
・右に行くと経度が上がる
・左に行くと経度が下がる
まず座標からの移動した時のルールはこれで理解できました。
Google Maps Geocoding APIの使い方
まず足早にGoogle Maps Geocoding APIの使い方を説明してまいります。
// リクエストする基本URLhttps://maps.googleapis.com/maps/api/geocode/json?address=住所&key=key
このリクエストする基本URLに必須な情報を載せていきます。
[必須な情報]・住所
・key
住所に関しましてはそのまんまです。例:東京都渋谷区代々木1丁目42−12
keyに関しましてはGoogle Maps Geocoding APIのサイトで取得していく必要がありますので説明いたします。
Google Maps Geocoding APIのkeyを取得する方法
Keyも取得したところでテストでレスポンスが返ってくるかブラウザのタブに下のURLを入力してみましょう!
// 取得したKeyでリクエストURLhttps://maps.googleapis.com/maps/api/geocode/json?address=東京都渋谷区代々木1丁目42−12&key=取得したkey
JSON 形式のジオコーディングのレスポンス例
{ "results" : [
{
"address_components" : [
{
"long_name" : "12",
"short_name" : "12",
"types" : [ "political", "sublocality", "sublocality_level_4" ]
},
{
"long_name" : "42",
"short_name" : "42",
"types" : [ "political", "sublocality", "sublocality_level_3" ]
},
{
"long_name" : "1丁目",
"short_name" : "1丁目",
"types" : [ "political", "sublocality", "sublocality_level_2" ]
},
{
"long_name" : "代々木",
"short_name" : "代々木",
"types" : [ "political", "sublocality", "sublocality_level_1" ]
},
{
"long_name" : "渋谷区",
"short_name" : "渋谷区",
"types" : [ "locality", "political" ]
},
{
"long_name" : "東京都",
"short_name" : "東京都",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "日本",
"short_name" : "JP",
"types" : [ "country", "political" ]
},
{
"long_name" : "151-0053",
"short_name" : "151-0053",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "日本、〒151-0053 東京都渋谷区代々木1丁目42−12",
"geometry" : {
"location" : {
"lat" : 35.6828413,
"lng" : 139.6993308
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 35.6841902802915,
"lng" : 139.7006797802915
},
"southwest" : {
"lat" : 35.6814923197085,
"lng" : 139.6979818197085
}
}
},
"place_id" : "ChIJWe4bJc-MGGARxVowb4cXeQY",
"types" : [ "political", "sublocality", "sublocality_level_4" ]
}
],
"status" : "OK"
}
おそらく成功していると思いますが実は・・!!!
Google Maps Geocoding APIを使用するという事は
ほぼほぼプログラミングの中に入れ込むと思います。
ですが、そこでハマるポイントも何個かありますので説明したいと思います。
新米プログラマーがハマってしまうエンコード問題!
先ほどのGoogle Maps Geocoding APIへリクエストするURLは普通に日本語の住所を入れてレスポンスが返ってきたと思いますが・・・実はこれってブラウザの裏で日本語がエンコードされています。もう一回言います。
実はこれってブラウザの裏で日本語がエンコードされています。だからエラーにならずにレスポンスが返ってきます。
ですが、プログラミング言語を使用して
リクエストするとエラーになってしまいます。
そこでエラーにならずにする方法を記述いたします。
住所をエンコードしてエラーにならないソースコード
// PHPの場合
$key = "取得したKey";
$google_leapis_url = "https://maps.googleapis.com/maps/api/geocode/json";
$address = "東京都渋谷区代々木1丁目42−12";
// エンコードして半角空白をgeometry用に変換する
$url_encode = urlencode($address);
$pattern = "/+/";
$url_encode = preg_replace($pattern, "%20", $url_encode); // ここも超重要
$googleMapsApiData = json_decode(file_get_contents($google_leapis_url."?address=".$url_encode."&key=".$key, false, $contect), true);
// 緯度経度を取得
$lat = $googleMapsApiData["results"][0]["geometry"]["location"]["lat"];
$lng = $googleMapsApiData["results"][0]["geometry"]["location"]["lng"];
$status = $googleMapsApiData["status"];
細かい説明は省きますが、これでエラーになる事はないでしょう。以上でGoogle Maps Geocoding APIの基本的な使い方の説明を終わります。
有料
Google Maps Geocoding API
無料ですと1日に2,500回しかリクエスト出来ません。序文で説明した15万件をこなすには60日かかってしまって仕事になりません。
標準の使用制限標準 API のユーザー1 日に 2,500 回の無料のリクエスト。1 秒に 50 回のリクエスト。
有料の場合
1,000 回の追加リクエストごとに $0.50 USD、最大で 1 日あたり 100,000 回まで。
そこで有料版のKeyでリクエストをすることにしました。リクエスト回数:15万件
追加リクエスト:150回
課金:75ドル
現在のドルと円のレートが113.122172円ですので
8,484円となります。
60日が2〜3日になりました!
安い!!
注意するポイント!プレミアム版じゃないから気をつけて!!
もう本当にこれ、罠でしょ笑無料版の下にプレミアム版の説明あるから有料はプレミアム版っていうのかなって思ってたら全然違うので注意しましょう!!
Google Maps Geocoding API Usage Limits
1.プロジェクトを作成または選択する
2.課金プロファイルの設定や選択を行う
3.プロジェクトの課金を有効にする
4.課金を有効にしたプロジェクトでKeyを生成する
5.有料KeyでGoogle Maps Geocoding APIを使用する
簡単になってしまいましたが、これで有料版のGoogle Maps Geocoding APIの説明を終わりたいと思います。
おまけ 緯度・経度100m〜300mの差分と半径内のお店の探す方法
最後に他のプロジェクトで必要だった半径100m〜300mの差分はいくらか?と緯度経度から住所に戻す方法を説明したいと思います。
-- 半径100mの場合 --緯度の差分
0.00090133729745762
経度の差分
0.010966404715491394
距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
100mの差分を知りたかった理由は特定のお店から半径100m〜300mの間に飲食店はあるかを調べたかったのです。
そこでバカな僕は[八点方式]という方法を編み出しました。
上
上右
右
右下
下
下左
左
真ん中
真ん中が1000であれば
真ん中:1000
上 :1100
上右 :1050,1050
右 :1100
右下 :1050,950
下 :900
下左 :950,950
左 :900
の座標を計算して得られる事に気付きました。
難しい計算式を使わずともこの方法で半径100m〜300mにある飲食店を導き出す事に成功いたしました。
おまけのおまけ 緯度経度から住所
緯度経度から住所
https://maps.googleapis.com/maps/api/geocode/json?latlng=緯度,経度&key=Key
さいごに
いやー最初は「え〜15万件もの住所を緯度経度に変換しなきゃいけないの?まず緯度経度がなんなのかも知らんし・・・。」って思っていたのですが、やってみたら意外と楽しくて3日間で実装してcronを回せるまでになりました!いろんなテックブログを30エントリーほど見たのですが、間違っていたり、そもそも問題が解決できていない記事がありましてモヤモヤが!笑
そのモヤモヤを解消するためにこの記事を書きました。
誰かが検索して、つまずかないようになればいいなと思います!
それではそれでは〜〜