ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/branches/work/toraneko/enhancement_map/public_html/mobilemap_api.php @ 10913

Last change on this file since 10913 was 10913, checked in by toraneko, 11 years ago

Docomo GPS対応

File size: 5.3 KB
Line 
1<?php
2/*
3 * mobilemapAPI
4 * 携帯端末の位置情報を受信して記録
5 * 位置情報のIDを指定アクションに転送
6 */
7
8require_once './config.inc.php';
9require_once OPENPNE_WEBAPP_DIR . '/init.inc';
10
11// 初期設定と認証
12// 携帯モジュールの設定を用いる
13$module = 'ktai';
14if (!$module = _check_module($module)) {
15    openpne_display_error('モジュールが見つかりません', true);
16}
17
18// disable modules
19if (in_array($module, (array)$GLOBALS['_OPENPNE_DISABLE_MODULES'])) {
20    openpne_display_error('モジュールが無効になっています', true);
21}
22// maintenace mode
23if (OPENPNE_UNDER_MAINTENANCE &&
24    !in_array($module, (array)$GLOBALS['_OPENPNE_MAINTENANCE_MODULES'])) {
25    openpne_display_error();
26}
27// init
28if ($init = openpne_ext_search("{$module}/init.inc")) {
29    require_once $init;
30}
31
32// URLをリクエストパラメタに変換
33// path = "/m/ktai/a/page_fh_map/target_c_map_id/1/" etc
34error_log($_SERVER['PATH_INFO']);
35$params = explode('/', $_SERVER['PATH_INFO']);
36$openpne_params = array();
37for ($i = 1; $i < count($params); $i+=2) {
38    $key = $params[$i];
39    $value = $params[$i+1];
40    if ($key == 'm') {
41        $m = $value;
42    } elseif ($key == 'a') {
43        $a = $value;
44    } elseif ($key == 'ksid') {
45        $_REQUEST['ksid'] = $value;
46    } else {
47        $openpne_params[$key] = $value;
48    }
49}
50
51//auth
52if ($auth = openpne_ext_search("{$module}/auth.inc")) {
53    require_once $auth;
54} else {
55    ktai_display_error('認証できません');
56}
57$u  = $GLOBALS['KTAI_C_MEMBER_ID'];
58
59// 位置情報をURLから取得
60// c_map_locationに保存
61// c_map_location_idをパラメタに付与して、指定アクションに遷移
62
63// 位置情報の変換
64error_log(serialize($_REQUEST));
65error_log($GLOBALS['__Framework']['carrier']);
66list($lat, $lon) = getLocation($_REQUEST);
67error_log("latitude=$lat");
68error_log("longitude=$lon");
69if (is_null($lat) || is_null($lon)) { 
70    ktai_display_error('位置情報の取得に失敗しました。BACKで前の画面に戻ってください');
71}
72
73// 位置情報を暗号化してDBに保管
74if (!$c_map_location_id = db_map_insert_location($u, strval($lat), strval($lon))) {
75    ktai_display_error('位置情報の保存に失敗しました');
76}
77$openpne_params['c_map_location_id'] = $c_map_location_id;
78// 指定アクションに遷移
79openpne_redirect($m, $a, $openpne_params);
80exit;
81
82
83/********/
84/* 関数 */
85/********/
86
87/* 位置情報を取得 */
88function getLocation($requests) {
89    // AU
90    if ($GLOBALS['__Framework']['carrier'] == 'e') {
91        $lat = convertLocation($requests['lat']);
92        $lon = convertLocation($requests['lon']);
93        return array($lat, $lon);
94    }
95    // Docomo
96    if ($GLOBALS['__Framework']['carrier'] == 'i') {
97        if (!is_null($requests['LAT']) || !is_null($requests['LON'])) {
98            // DoCoMoオープンiエリア
99            $lat = convertLocation($requests['LAT']);
100            $lon = convertLocation($requests['LON']);
101            return array($lat, $lon);
102        } else {
103            $lat = convertLocation($requests['lat']);
104            $lon = convertLocation($requests['lon']);
105            return array($lat, $lon);
106        }
107    }
108    // Softbank
109    if ($GLOBALS['__Framework']['carrier'] == 's') {
110        if ($_SERVER['HTTP_X_JPHONE_GEOCODE']) {
111            $lat = convertLocation($_SERVER['HTTP_X_JPHONE_GEOCODE']['latitude']);
112            $lon = convertLocation($_SERVER['HTTP_X_JPHONE_GEOCODE']['longitude']);
113            return array($lat, $lon);
114        }
115    }
116    // Softbank
117    // Docomo,Softbank(3GC),Willcom
118    if (!is_null($requests['pos'])) {
119        $pattern = '/^([NS][0-9.]+)([EW][0-9.]+)$/';
120        preg_match($pattern, $requests['pos'], $matches);
121        $lat = convertLocation($matches[1]);
122        $lon = convertLocation($matches[2]);
123        return array($lat, $lon);
124    }
125    // 位置情報取得失敗
126    ktai_display_error('位置情報が取得できませんでした。BACKで前の画面に戻ってください');
127}
128
129/* 取得した位置情報文字列を
130 * 百分率表記(googleMapで使える形式)に変換
131 */
132function convertLocation($string)
133{
134    if (!$string) return false;
135    $param = explode('.', $string);
136    $rtn = ( $param[0]*3600000 + $param[1]*60000 + $param[2]*1000 + $param[3] ) / 3600000;
137    return $rtn;
138}
139
140function convert_old()
141{
142    // 東西南北判断
143    list($lat, $lat_code) = convertNSWE($lat);
144    list($lon, $lon_code) = convertNSWE($lon);
145
146    // ミリ秒形式に変換
147    $lat = convertDeg($lat);
148    $lon = convertDeg($lon);
149
150    // 世界測地系に変換
151    $lat = $lat - $lat * 0.000046038 - $lon * 0.000083043 + 0.010040;
152    $lon = $lon - $lat * 0.00010695 + $lat * 0.000017464 + 0.0046017;
153
154    return array($lat * $lat_code, $lon * $lon_code);
155
156}
157
158/* 東西南北の判断(符号)と緯度経度の数値のみを返す */
159function convertNSWE($value) {
160    $pattern = '/^((%2B)|[+-NSEW])([0-9.]+)$/';
161    preg_match($pattern, $value, $matches);
162
163    if ($matches[1] == '-' || $matches[1] == 'S' || $matches[1] == 'W') {
164        $code = -1;
165    } else {
166        $code = 1;
167    }
168
169    return array($matches[3], $code);
170}
171
172/* ミリ秒形式に変換 */
173function convertDeg($value) {
174    $arr = explode('.', $value);
175    return trim($arr[0]) + trim($arr[1]) / 60 + (trim($arr[2]) + trim($arr[3]) / 1000) / 3600;
176}
177
178?>
Note: See TracBrowser for help on using the repository browser.