• twitter
  • Facebook
  • はてなブックマーク
2012年05月30日(水)

[GoogleGEO] PHPを使って住所から経度と緯度を取得する方法

GoogleMapsAPIを使ってGoogleMapを埋め込む際、経度と緯度の情報が必要になります。わざわざ1つ1つ手動で取得するのは大変なので、住所文字列からGEO情報を取得します。後でGoogleMapにバイアスをかけて情報を得たり、マーカー(ポイントフラグ)を地図上に配置したり、ストリートビューと組み合わせて使うなど色々便利です。この記事は、PHPでGEOの情報を取得した時の覚書きです。

Google Geocoding API公式ドキュメント

GEOを使用する際のルール

Googleの規約で、GEOを使う際は1日1,500回までという上限が定められています。同ipから1500回までのアクセスが許可されている、という事です。Google Maps API Premierに登録(アクセス数に応じて課金方式)すると、1日あたりの上限が10万回になります。また、GEOを使ったデータ取得を行った際は必ずGoogleマップと組み合わせて使用する事というルールがあり、一般利用でGoogleMapsの表示回数は25,000回までとなっています。

JSONを使ってデータを取得

[googleGEO] http://maps.googleapis.com/maps/api/geocode/json

[googleGEO SSL] https://maps.googleapis.com/maps/api/geocode/json

SSLまたは普通のURLにGETパラメータを渡してリクエストを行います。GETに指定するパラメータは、sensoraddressが必須です。個人情報が含まれるページからのアクセスの場合、SSLで通信します。

GETのパラメータ

  • address

    都道府県~番地までの住所(日本語可)

  • latlng

    経度と緯度が事前にわかっていて、GEOの詳細データを取得したい場合はaddressの代わりに指定

  • bounds

    地図の矩形ポイント(北東と南西)を指定して、大きいバイアスをかけた情報を得たい場合。

  • region

    地域コード。日本ならjp。おおよその判定基準になります。

  • language

    結果を返す言語。指定がなければリクエスト元のドメインによって自動判定。日本語ならja。指定しなくても問題ありません。

  • sensor

    必須です。GPS搭載のデバイスなどから現在の位置などを元にリクエストする時はtrue、そうでなければfalse

PHPでデータを取得

  1. <?PHP
  2. // GET用のパラメータ作成
  3. $parametar = "?sensor=false&region=jp&address=".urlencode(mb_convert_encoding('住所の文字', 'UTF8', 'auto'));
  4. $datas = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json'.$parametar);
  5. // JSONデータをPHPの値に変換する
  6. $geo = json_decode($datas);
  7. $results = $geo->results[0];
  8. $status = $geo->status;
  9. ?>

レスポンスデータの解析

住所(address)から判定された結果($geo)には、resultsstatusが含まれています。ステータスエラーが発生した場合、statusは"OK"以外の文字列になります。PHPにデコードすると、オブジェクト形式で操作する事ができるようになり、結果$resultsには次のような値が格納されています。

($resultsの内容)

  • address_components (オブジェクトを格納したインデックス配列)

    住所を構成する部品についての情報が格納されています。(国、都道府県、市町村、番地など) 各オブジェクトには、それぞれの部品にあたる long_name(文字列)、short_name(文字列)、types(インデックス配列)をキーとした値が格納されています。typesには住所を分割した際どこの区分に当たるのか?を参照できる情報が格納されています。(countryやlocality)

  • formatted_address (文字列)

    address_componentsの値を組み合わせて、カンマ区切りにした文字列。国,都道府県,市町村,番地の順)

  • geometry (オブジェクト形式)

    GEOに関する重要な情報が含まれます。バイアス矩形を表すbounds(オブジェクト形式)、経度と緯度の情報を含むlocation(オブジェクト形式)、GEOの正確さがどのレベルなのかを表すlocation_type(定数文字列)、ビューポートの開始位置として適しているおおよその矩形を表すviewport(オブジェクト形式)をキーとして構成されています。矩形の場合、さらにnortheast(北東)とsouthwest(南西)をキーとするオブジェクトが含まれています。

今回は、経度と緯度が知りたいので、$resultsをベースに次のように記述します。$latと$lngはそれぞれfloat形式(7桁の少数)です。

  1. <?PHP
  2. // GET用のパラメータ作成
  3. $parametar = "?sensor=false&region=jp&address=".urlencode(mb_convert_encoding('住所の文字', 'UTF8', 'auto'));
  4. $datas = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json'.$parametar);
  5. // JSONデータをPHPの値に変換する
  6. $geo = json_decode($datas);
  7. $status = $geo->status;
  8. // エラー判定をして値を取得する
  9. if($status == "OK"){
  10. $results = $geo->results[0];
  11. $geometry = $results->geometry;
  12. $location = $geometry->location;
  13. $lat = $location->lat; // 緯度を取得
  14. $lng = $location->lng; // 経度を取得
  15. }
  16. ?>

後は取得した経度と緯度の値を使ってGoogleMapを作成し、ページ上に掲載します。保存できるなら保存しておいて、後から取り出して再利用します。(毎回GEOアクセスせずに済みます)

関連投稿記事

Comment:


[GoogleGEO] PHPを使って住所から経度と緯度を取得する方法 への3件のフィードバック

  • 返信

    lunarian 2012年9月11日 11:38 PM
    通りすがりのものです。 とってもわかりやすい説明でありがたかったです。 ただ、ちょっと誤字を見つけてしまい、わかりやすいコンテンツなのに もったいないと思いましたので、お伝えしておきます。 ragion 地域コード。日本ならjp。おおよその判定基準になります。 ↓ region 地域コード。日本ならjp。おおよその判定基準になります。 $lat = $location->lat; // 経度を取得 $lng = $location->lng; // 緯度を取得 ↓ $lat = $location->lat; // 緯度を取得 $lng = $location->lng; // 経度を取得 php jquery に詳しくて、なおかつ、ビジュアルに強いってすごいですね。 素直に、うらやましい・・・。
    • diimo 2012年9月12日 9:49 PM
      初めまして!コメントありがとうございます(*^^*) 誤字のご指摘ありがとうございました。修正しておきます。わかりやすいと言っていただけて嬉しいです。PHPやjQueryは好きだけど、かなり自己流なので合っているか不安だったりします 笑。 ブログ最近ちっとも更新できていませんが、頑張ろうと思います。ありがとうございました^^