PHPで携帯電話用のGoogleマップを作成する

(1/1)
今回は、「PHP で Google を利用して住所から緯度・経度を求める」の応用で、住所を指定して、携帯電話用の Google マップを作成するプログラムをつくってみることにする。

サンプル・プログラム:実行例

PHPで携帯電話用のGoogleマップを作成する
上図はサンプル・プログラムの画面イメージである。
住所(必須)、目的地、目的地 URL を入力し「作成」ボタンをクリックすることで、画面下段のように Google マップ(静止画)と、目的地へのリンクを表示する。そして、これを表示するための HTML を textarea 内に表示する。
また、画面の表示幅、表示高、地図の拡大率を指定できるようになっている。

解説:pahooGeoCode クラス

0024: class pahooGeoCode {
0025:     var $items;      //検索結果格納用
0026:     var $error;      //エラーフラグ
0027:     var $hits;           //検索ヒット件数
0028:     var $webapi;     //直前に呼び出したWebAPI URL
0029: 
0030:     //Google API KEY
0031:     //https://developers.google.com/maps/web/
0032:     var $GOOGLE_API_KEY = '**************************';
0033: 
0034:     //Yahoo! JAPAN Webサービス アプリケーションID
0035:     //https://developers.google.com/maps/documentation/javascript/get-api-key
0036:     var $YAHOO_APPLICATION_ID = '*****************************';
0037: 
0038:     //ジオどすII APIキー
0039:     //http://geodosu.com/user/register
0040:     var $APIKEY_GEODOS = '*****************';

各種WebAPI を使うメソッドは、PHP のクラスを使って定義している。
クラスについては「PHP でクラスを使ってテキストの読みやすさを調べる」で解説している。
クラスファイル "pahooGeoCode.php" は、組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。

2016 年(平成 28 年)6 月頃から、Google Maps API を呼び出すにもキーが必要になった。「Google Maps APIs for Web」にアクセスし、「キーを取得」ボタンをクリックすると無料で取得できる。これをクラス変数 $GOOGLE_API_KEY に代入しておく。また、Google Cloud Console に入り、GoogleMaps JavaScript APIGoogle Maps Geocoding API を有効にする。

WebAPI「ジオどす II」では API キーが必要になる。これは http://geodosu.com/user/register から無料で入手することができる。これをクラス変数 $APIKEY_GEODOS に代入しておく。

Yahoo! JAPAN が提供する Web API を利用する場合は、https://e.developer.yahoo.co.jp/register にアクセスし、無料で Consumer Key を取得できる。これをクラス変数 $YAHOO_APPLICATION_ID に代入しておく。

サンプル・プログラムの流れ

PHPで携帯電話用のGoogleマップを作成する

解説:GoogleMaps staticmap

携帯電話用の画像 URL は、メソッド getStaticMap を使って取得する。

0663: /**
0664:  * GoogleMaps staticmap の画像URLを求める
0665:  * @param array  $items 情報配列
0666:  * @return string 画像URL
0667: */
0668: function getStaticMap($items) {
0669:     $key = $this->GOOGLE_API_KEY;
0670: 
0671:     return "http://maps.googleapis.com/maps/api/staticmap?center={$items['latitude']},{$items['longitude']}&markers=color:red%7Clabel:A%7C{$items['latitude']},{$items['longitude']}&zoom={$items['zoom']}&size={$items['width']}x{$items['height']}&key={$key}";
0672: }

解説:パラメータの取得

受け取った住所を緯度・経度に変換するメソッド searchPoint2 については、「PHP で Google を利用して住所から緯度・経度を求める」で作成したものと同じなので解説を割愛する。
ここでは、パラメータを受け取る際のバリデーション処理について説明する。

本プログラムは、HTML FORM でパラメータを入力し、自分自身(スクリプト)を呼び出すものであるが、悪意のある第三者が悪意のあるパラメータを使ってスクリプトを呼び出すかもしれない。そこで、パラメータがプログラムに悪影響を及ぼさないかどうかチェックする必要がある。
データのバリデーション機能は、PEARのようなフレームワークに用意されているのだが、ここでは、整数をチェックする getParam_validateInt と文字列をチェックする getParam_validateStr という 2 つのユーザー関数を用意することにした。
まず、整数値をチェックするユーザー関数 getParam_validateInt であるが、
  1. パラメータが存在するかどうか
  2. 整数かどうか
  3. 指定した最大値・最小値の範囲にあるかどうか
の 3 点をチェックするものである。これらのチェックをクリアしたものは整数値そのものを、いずれかで異常が発生した場合にはデフォルト値 $def を返す。

「整数かどうか」のチェックでは、組み込み関数  is_int  を使おうと考えたが、HTML FORM からの入力を判定できない(文字列と認識してしまう)ため、 preg_match  により正規表現で判定することにした。

0130: /**
0131:  * 指定したパラメータを取り出す(整数バリデーション付き)
0132:  * @param string $key  パラメータ名(省略不可)
0133:  * @param int    $def  デフォルト値(省略可)
0134:  * @param int    $min  最小値(省略可)
0135:  * @param int    $max  最大値(省略可)
0136:  * @return int 値/FALSE
0137: */
0138: function getParam_validateInt($key$def='', $min=0, $max=9999) {
0139:     //パラメータの存在チェック
0140:     if (isset($_GET[$key]))     $param = $_GET[$key];
0141:     else if (isset($_POST[$key]))   $param = $_POST[$key];
0142:     else                            $param = $def;
0143:     //整数チェック
0144:     if (preg_match('/^[0-9\-]+$/', $param) == 0)   return FALSE;
0145:     //最小値・最大値チェック
0146:     if ($param < $min || $param > $max)             return FALSE;
0147: 
0148:     return $param;
0149: }

次に、文字列をチェックするユーザー関数 getParam_validateStr であるが、
  1. パラメータが存在するかどうか
  2. 指定した最長値・最短値の範囲にあるかどうか
の 2 点をチェックするとともに、文字コードを指定されたコードに変換する処理を加えている。これらのチェックをクリアしたものは、関数  strip_tags  によりタグを取り除き、関数  htmlspecialchars  により特殊文字を変換してリターンする。
チェック工程のいずれかで異常が発生した場合には '' を返す。

0151: /**
0152:  * 指定したパラメータを取り出す(文字列バリデーション付き)
0153:  * @param string $key  パラメータ名(省略不可)
0154:  * @param bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0155:  * @param int    $def  デフォルト値(省略可)
0156:  * @param int    $min  文字列長・最短(省略可)
0157:  * @param int    $max  文字列長・最長(省略可)
0158:  * @return string 文字列/FALSE
0159: */
0160: function getParam_validateStr($key$auto=TRUE$def='', $min=3, $max=80) {
0161:     //パラメータの存在チェック
0162:     if (isset($_GET[$key]))     $param = $_GET[$key];
0163:     else if (isset($_POST[$key]))   $param = $_POST[$key];
0164:     else                            $param = $def;
0165:     if ($auto)  $param = mb_convert_encoding($paramINTERNAL_ENCODING, 'auto');
0166:     $param = htmlspecialchars(strip_tags($param));       //タグを除く
0167:     //文字列長チェック
0168:     $len = mb_strlen($param);
0169:     if ($len < $min || $len > $max)     return FALSE;
0170: 
0171:     return $param;
0172: }

参考サイト

(この項おわり)
header