• follow us in feedly
scroll_icon
shuffle_button
Google Maps Geocoding APIの使い方[完全版]

サムネイル出典:

殿堂

Google Maps Geocoding APIの使い方[完全版]

Author:
ProgrammerboxProgrammerbox
Posted date:
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の使い方を説明してまいります。

住所から緯度経度に変換する方法

まず変換する方法を説明します。 簡単に言えばGoogle Maps GeocodingのAPIを使用して変換します。いわゆるREST APIというやつです。
// リクエストする基本URL
https://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を取得する方法

Google Maps Geocoding APIのkeyを取得する方法のスクリーンショット

1. をクリックしてもらい、2. にある「キーの取得」というボタンをクリックして下さい。

2. にある「キーの取得」をクリックした時に現れる表示

			

この画面の赤い枠をクリックしてプロジェクト名を入れる

プロジェクト名はなんでも大丈夫です。
あ、つぎにNEXTボタンを押して下さい。

これだけでKeyが生成されました!簡単!!

			
Keyも取得したところでテストでレスポンスが返ってくるかブラウザのタブに下のURLを入力してみましょう!
// 取得したKeyでリクエストURL
https://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日になりました!
安い!!

注意するポイント!プレミアム版じゃないから気をつけて!!

もう本当にこれ、罠でしょ笑 無料版の下にプレミアム版の説明あるから有料はプレミアム版っていうのかなって思ってたら全然違うので注意しましょう!!

有料のKeyを取得するボタンの場所

			
ここから一気に説明を省いてしまいますが・・・
課金の有効化をクリックして

1.プロジェクトを作成または選択する
2.課金プロファイルの設定や選択を行う
3.プロジェクトの課金を有効にする
4.課金を有効にしたプロジェクトでKeyを生成する
5.有料KeyでGoogle Maps Geocoding APIを使用する
簡単になってしまいましたが、これで有料版のGoogle Maps Geocoding APIの説明を終わりたいと思います。

おまけ 緯度・経度100m〜300mの差分と半径内のお店の探す方法

最後に他のプロジェクトで必要だった半径100m〜300mの差分はいくらか?と緯度経度から住所に戻す方法を説明したいと思います。
-- 半径100mの場合 --
緯度の差分
0.00090133729745762
経度の差分
0.010966404715491394
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エントリーほど見たのですが、間違っていたり、そもそも問題が解決できていない記事がありましてモヤモヤが!笑
そのモヤモヤを解消するためにこの記事を書きました。

誰かが検索して、つまずかないようになればいいなと思います!
それではそれでは〜〜

便利な・参考にしたサイト

この記事が気に入ったら

いいね!しよう

Sharetubeの最新記事をお届けします

著者プロフィール
Programmerbox

Sharetube中の人「マツオカソウヤ」がプログラミング・webデザインなどの情報をまとめるチャンネル。