SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

GPS携帯を使った口コミサイト構築 - Google Map上に投稿データを展開する -

目的に応じて適材適所で使うPHPライブラリ(4)


  • X ポスト
  • このエントリーをはてなブックマークに追加

逆ジオコーディングによる地名の取得

 緯度、経度から住所を取得することを「逆ジオコーディング」と言います。Net_UserAgent_Mobile_GPSにて取得した緯度、経度から住所を取得する際にはGoogle Maps APIの1つである「逆ジオコーディング」を使用します。

 このAPIはGoogle Mapsドキュメントの英語版では「Reverse Geocoding (Address Lookup)」と呼ばれており、緯度、経度をAPIのURLに引数で渡すと住所情報をxml、kml、csv、jsonの形式で返却するというサービスです。

 Google Maps APIの逆ジオコーディングの公式ドキュメントはこちらのURLになります。

 APIの呼び出しは以下の形式で行います。

[リスト7]Google Maps逆ジオコーディングAPI呼び出しの例
http://maps.google.com/maps/geo?ll=[経度],[緯度]&output=[出力形式]&key=[Google Map API key]&hl=[言語指定]&oe=UTF8";

 APIから返却されるXMLについては以下の図のようになっています。

Google map APIから返却されるXML
Google map APIから返却されるXML

 AddressDetail要素のattributesの1つであるAccuracyの値により返却される住所のレベルが指定されています。Accuracyの値と大まかな住所レベルは次のようになっています。

Accuracyの値と住所レベル
Accuracyの値 住所レベル
1 国名まで
2 国名、都道府県まで
3 国名、都道府県市まで
4 国名、都道府県市区町村まで
5 国名、郵便番号まで
6 国名、都道府県市区町村丁目まで
7 国名、都道府県市区町村丁目番地まで
8 国名、都道府県市区町村丁目番地号まで

 さまざまな場所で逆ジオコーディングAPIを呼び出した結果、Accuracyの値が4~7では返却される住所詳細があいまいになることもありましたので、本記事ではAccuracyの値が8の住所情報を取得します。

 サンプルでは取得したMaps API キーをconfig.phpに記述しています。

[リスト8]config.php(抜粋)
$google_map_key = "取得したMaps API キー";

 住所取得部分ではGoogle Maps API Reverse Geocodingを呼び出してfile_get_contentsでXMLを取得した後、simplexml_load_string関数でXMLを解析してAccuracyの値が8の部分で住所情報を取得します。

[リスト9]Util.class.php(抜粋)
function getGoogleMapAddress($lat,$lon){
    // 返却する配列
    $_return = array();
    // 逆ジオコーディングAPI
    $url = "http://maps.google.com/maps/geo?ll={$lat},{$lon}&output=xml&key=". $this->google_map_key . "&hl=ja&oe=UTF8";
    
    $contents = file_get_contents($url); 
    
    $xml = simplexml_load_string($contents); 
    
    foreach($xml->Response->Placemark as $k=>$v){
        // <AddressDetails Accuracy="8"> の部分より住所情報を取得
        if($v->AddressDetails->attributes()->Accuracy == 8){
            // 住所全文
            $_return['address'] = strval($v->address);
            // 都道府県
            $_return['pref'] = strval($v->AddressDetails->Country->AdministrativeArea->AdministrativeAreaName);
            // 市・群
            $_return['city'] = strval($v->AddressDetails->Country->AdministrativeArea->Locality->LocalityName);
            // 町村
            $_return['town'] = strval($v->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->DependentLocalityName);
            // 丁目・番地・号
            $_return['detail'] = strval($v->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->Thoroughfare->ThoroughfareName);
            break;
        }
    }
    return $_return;
}

 simplexml_load_string関数で解析した値はSimpleXMLElementオブジェクトなのでstrval関数で文字列オブジェクトに変換しています。

 Google Maps API では緯度、経度は世界測地系(10進法)で扱います。Net_UserAgent_Mobile_GPSで取得できる緯度、経度は60進法での表示となっているので、これを10進法へ変換するメソッドを作成します。

[リスト10]Util.class.php(抜粋)
function convert($val){
    $s = preg_split("/\./",$val);
    return $s[0] + ($s[1] / 60) + ($s[2] / 60 / 60) + ($s[3] / 60 / 60 / 1000);
}

 Net_UserAgent_Mobile_GPSで取得した値は時、分、秒は60進法、秒より下の数値は10進法となっているので、分を60、秒を60x60、秒より下は1000で割って秒に直して60x60で割った値を加算して10進法にします。

次のページ
投稿確認フォームの実装

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4833 2010/03/03 11:53

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング