OSDN Git Service

DB更新スクリプト更新。
[magic3/magic3.git] / widgets / m / googlemaps / include / container / m_googlemapsWidgetContainer.php
1 <?php
2 /**
3  * index.php用コンテナクラス
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
9  * @package    Magic3 Framework
10  * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11  * @copyright  Copyright 2006-2012 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: m_googlemapsWidgetContainer.php 4770 2012-03-19 12:15:19Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getContainerPath() . '/baseWidgetContainer.php');
17
18 class m_googlemapsWidgetContainer extends BaseWidgetContainer
19 {
20         private $langId;                // 現在の言語
21         const DEFAULT_CONFIG_ID = 0;
22         const DEFAULT_TITLE = 'Googleマップ';                        // デフォルトのウィジェットタイトル
23         const MIN_ZOOM_LEVEL = 1;                       // ズーム値最小
24         const MAX_ZOOM_LEVEL = 21;                      // ズーム値最大
25         const MOVE_RATIO = 0.4;                 // 地図を移動する場合の移動比率
26         
27         /**
28          * コンストラクタ
29          */
30         function __construct()
31         {
32                 // 親クラスを呼び出す
33                 parent::__construct();
34         }
35         /**
36          * テンプレートファイルを設定
37          *
38          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
39          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
40          *
41          * @param RequestManager $request               HTTPリクエスト処理クラス
42          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
43          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
44          */
45         function _setTemplate($request, &$param)
46         {
47                 return 'index.tmpl.html';
48         }
49         /**
50          * テンプレートにデータ埋め込む
51          *
52          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
53          *
54          * @param RequestManager $request               HTTPリクエスト処理クラス
55          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
56          * @return                                                              なし
57          */
58         function _assign($request, &$param)
59         {
60                 $this->langId = $this->gEnv->getCurrentLanguage();
61                 
62                 // 定義ID取得
63                 $configId = $this->gEnv->getCurrentWidgetConfigId();
64                 if (empty($configId)) $configId = self::DEFAULT_CONFIG_ID;
65                 
66                 // パラメータオブジェクトを取得
67                 $targetObj = $this->getWidgetParamObjByConfigId($configId);
68                 if (empty($targetObj)){                 // 定義データが取得できないとき
69                         $this->cancelParse();// 出力しない
70                         return;
71                 }
72                 
73                 // 初期値取得
74                 $name = $targetObj->name;// 定義名
75                 $width  = $targetObj->width;            // 幅
76                 $height = $targetObj->height;           // 高さ
77                 $lat    = $targetObj->lat;              // 緯度
78                 $lng    = $targetObj->lng;              // 経度
79                 $markerLat      = $targetObj->markerLat;                // マーカー緯度
80                 $markerLng      = $targetObj->markerLng;                // マーカー経度
81                 $zoom   = intval($targetObj->zoom);             // ズームレベル
82                 $showMarker = $targetObj->showMarker;           // マーカーを表示するかどうか
83                 $alt    = $targetObj->alt;              // 代替テキスト
84                 $pixelX = 0;            // 経度移動ピクセル値
85                 $pixelY = 0;            // 緯度移動ピクセル値
86                 
87                 // URLからパラメータを取得
88                 $value  = $request->trimValueOf('center');              // 中心点
89                 if (!empty($value)){
90                         list($lat, $lng) = explode(',', $value, 2);
91                         $lat = floatval(trim($lat));
92                         $lng = floatval(trim($lng));
93                 }
94                 $value  = $request->trimValueOf('zoom');                // ズームレベル
95                 if (!empty($value)) $zoom = intval($value);
96                 $value  = $request->trimValueOf('move');                // 地図移動方向
97                 if (!empty($value)){
98                         switch ($value){
99                                 case 'left':
100                                         $pixelX = $width * self::MOVE_RATIO * (-1);
101                                         break;
102                                 case 'right':
103                                         $pixelX = $width * self::MOVE_RATIO;
104                                         break;
105                                 case 'up':
106                                         $pixelY = $height * self::MOVE_RATIO * (-1);
107                                         break;
108                                 case 'down':
109                                         $pixelY = $height * self::MOVE_RATIO;
110                                         break;
111                         }
112                 }
113                 
114                 // 値の修正
115                 if ($zoom < self::MIN_ZOOM_LEVEL) $zoom = self::MIN_ZOOM_LEVEL;
116                 if ($zoom > self::MAX_ZOOM_LEVEL) $zoom = self::MAX_ZOOM_LEVEL;
117                 
118                 // 中心点の移動
119                 if ($pixelX != 0 || $pixelY != 0) list($lng, $lat) = $this->moveByPixel($lng, $lat, $pixelX, $pixelY, $zoom);
120
121                 // 画像URL作成
122 //              $url = 'http://maps.google.com/maps/api/staticmap?center=' . $lat . ',' . $lng . '&zoom=' . $zoom . '&size=' . $width . 'x' . $height . '&format=gif&mobile=true&sensor=true';  // docomo携帯では「format」が必須
123                 $url = 'http://maps.googleapis.com/maps/api/staticmap?center=' . $lat . ',' . $lng . '&zoom=' . $zoom . '&size=' . $width . 'x' . $height . '&format=gif&mobile=true';  // docomo携帯では「format」が必須              // 2016/9/19更新
124                 if ($showMarker){// マーカー表示
125                         $url .= '&markers=' . $markerLat . ',' . $markerLng;
126                 }
127                 $option = 'width="' . $width . '" height="' . $height . '" ';
128                 if (!empty($alt)) $option .= 'alt="' . $this->convertToDispString($alt) . '" ';
129                 
130                 // 地図操作用URL作成
131                 $paramBase = 'center=' . $lat . ',' . $lng;
132                 $zoomSmall = $zoom -1;
133                 if ($zoomSmall < self::MIN_ZOOM_LEVEL) $zoomSmall = self::MIN_ZOOM_LEVEL;
134                 $param = $paramBase . '&zoom=' . $zoomSmall;
135                 $smallUrlLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile($param)));
136                 $zoomLarge = $zoom +1;
137                 if ($zoomLarge > self::MAX_ZOOM_LEVEL) $zoomLarge = self::MAX_ZOOM_LEVEL;
138                 $param = $paramBase . '&zoom=' . $zoomLarge;
139                 $largeUrlLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile($param)));
140                 $param = $paramBase . '&zoom=' . $zoom . '&move=left';
141                 $leftUrlLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile($param)));
142                 $param = $paramBase . '&zoom=' . $zoom . '&move=right';
143                 $rightUrlLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile($param)));
144                 $param = $paramBase . '&zoom=' . $zoom . '&move=up';
145                 $upUrlLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile($param)));
146                 $param = $paramBase . '&zoom=' . $zoom . '&move=down';
147                 $downUrlLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile($param)));
148
149                 // 表示データ埋め込み
150                 $this->tmpl->addVar("_widget", "url",           $this->getUrl($url));
151                 $this->tmpl->addVar("_widget", "option",        $option);
152                 $this->tmpl->addVar("_widget", "url_small",     $smallUrlLink);
153                 $this->tmpl->addVar("_widget", "url_large",     $largeUrlLink);
154                 $this->tmpl->addVar("_widget", "url_left",      $leftUrlLink);
155                 $this->tmpl->addVar("_widget", "url_right",     $rightUrlLink);
156                 $this->tmpl->addVar("_widget", "url_up",        $upUrlLink);
157                 $this->tmpl->addVar("_widget", "url_down",      $downUrlLink);
158         }
159         /**
160          * ウィジェットのタイトルを設定
161          *
162          * @param RequestManager $request               HTTPリクエスト処理クラス
163          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
164          * @return string                                               ウィジェットのタイトル名
165          */
166         function _setTitle($request, &$param)
167         {
168                 return self::DEFAULT_TITLE;
169         }
170         /**
171          * Googleマップの中心点をピクセル値で移動
172          *
173          * @param float $x              中心点経度
174          * @param float $y              中心点緯度
175          * @param int $pixelX   移動ピクセル値経度
176          * @param int $pixelY   移動ピクセル値緯度
177          * @param int $zoom             ズームレベル
178          * @return array                x,yの配列で新規の中心点の緯度経度が返る
179          */
180         function moveByPixel($x, $y, $pixelX, $pixelY, $zoom)
181         {
182                 $offset = 268435456;
183                 $radius = $offset / pi();
184                 $newX = ((round(round($offset + $radius * $x * pi() / 180) + ($pixelX << (21 - $zoom))) - $offset) / $radius) * 180 / pi();
185                 $newY = (pi() / 2 - 2 * atan(exp((round(round($offset - $radius * log((1 + sin($y * pi() / 180)) / (1 - sin($y * pi() / 180))) / 2) + ($pixelY << (21 - $zoom))) - $offset) / $radius))) * 180 / pi();
186                 return array($newX, $newY);
187         }
188 }
189 ?>