Website made with rich jQuery,Ajax & Perl,PHP
ジオステーション
Sponsor
携帯位置情報の取得(その他)
[最終更新日:2011/01/29]

現在の携帯大手3社の比較的新しい機種のほとんどは現在地を取得する機能が有り、 この情報を利用すれば現在地をGoogleマップに表示することや、 近くのインターチェンジ、駅、店舗などを検索することが可能になります。 ここでは、書くキャリアごとの現在地取得法や、利用方法をご紹介します。
$(this).corner("left");位置情報の取得

各社ごとに取得方法が異なりますので、まずはキャリアを取得する必要が有ります。 これにはサーバの環境変数HTTP_USER_AGENTを参照します。
  if (preg_match("/UP\.Browser/i", $_SERVER[HTTP_USER_AGENT])) {
 	$userAgent[Career] = "au";
 } elseif (preg_match("/DoCoMo/i", $_SERVER[HTTP_USER_AGENT])) {
 	$userAgent[Career] = "docomo";
 } elseif (preg_match("/J-PHONE/i", $_SERVER[HTTP_USER_AGENT]) ||
 	preg_match("/Vodafone/i", $_SERVER[HTTP_USER_AGENT]) ||
 	preg_match("/SoftBank/i", $_SERVER[HTTP_USER_AGENT])) {
 	$userAgent[Career] = "softbank";
 }  
これはPHPの例ですが、$userAgent[Career]にau,docomo,softbank等のキャリア名が設定されます。 Perlでは以下のようにします。こちらも連想配列$userAgent{Career}に格納されます。
  if ($ENV{HTTP_USER_AGENT} =~ /UP\.Browser/i) {
 	$userAgent{Career} = "au";
 } elsif ($ENV{HTTP_USER_AGENT} =~ /DoCoMo/i) {
 	$userAgent{Career} = "docomo";
 } elsif ($ENV{HTTP_USER_AGENT} =~ /J-PHONE/i ||
 	$ENV{HTTP_USER_AGENT} =~ /Vodafone/i ||
 	$ENV{HTTP_USER_AGENT} =~ /SoftBank/i) {
 	$userAgent{Career} = "softbank";
 }  
キャリアが取得できましたので、各社ごとの取得方法によるタグです。
  • DoCoMo
    <a href="http:www.domain.jp/gps.php" lcs>現在地</a>
  • au
    <a href="device:gpsone?url=http:www.domain.jp/gps.php&ver=1&datum=0&unit=0">現在地</a>
  • SoftBank
    <a href="location:auto?url=http:www.domain.jp/gps.php">現在地</a>
この例では「現在地」をクリックすると、携帯の現在地をgps.phpに渡し、gps.phpが実行されます。 もちろん、渡すスクリプトは何でも結構です。 1つだけご注意いただくことは、auではhttp://からの完全なurl形式でなければスクリプトに情報が渡されませんので、 常にurl形式で指定することをお勧めします。 それではPHPでのサンプルです。
  if ($userAgent[Career] == "au") {
 	echo "
 	<a href=\"device:gpsone?url=http://www.domain.jp/gps.php&ver=1&datum=0&unit=0\">現在地</a>";
 } elseif ($userAgent[Career] == "docomo") {
 	echo "
 	<a href=\"http://www.domain.jp/gps.php\" lcs>現在地</a>";
 } elseif ($userAgent[Career] == "softbank") {
 	echo "
 	<a href=\"location:auto?url=http://www.domain.jp/gps.php\">現在地</a>";
 }  
Perlでは、
  if ($userAgent{Career} eq "au") {
 	print "
 	<a href=\"device:gpsone?url=http://www.domain.jp/gps.php&ver=1&datum=0&unit=0\">現在地</a>";
 } elsif ($userAgent{Career} eq "docomo") {
 	print "
 	<a href=\"http://www.domain.jp/gps.php\" lcs>現在地</a>";
 } elsif ($userAgent{Career} eq "softbank") {
 	print "
 	<a href=\"location:auto?url=http://www.domain.jp/gps.php\">現在地</a>";
 }  
これで情報はgps.phpに渡されました。(はず?)
それではgps.phpの取得方法を見てみましょう。こちらもキャリアごとに異なります。
  • DoCoMo, au
    $_REQUEST[gpsLat] = localdeg($_REQUEST[lat]);
    $_REQUEST[gpsLng] = localdeg($_REQUEST[lon]);
  • SoftBank
    preg_match("/N([\d\.]+)E([\d\.]+)$/", $_REQUEST[pos], $m);
    $_REQUEST[gpsLat] = localdeg($m[1]);
    $_REQUEST[gpsLng] = localdeg($m[2]);
DoCoMoとauは同じですが、SoftBankは異なります。 localdeg()は、取得した緯度、経度が度分秒の60進法ですので10進法に変換する関数です。
  if ($userAgent[Career] == "au" || $userAgent[Career] == "docomo"
 	&& $_REQUEST[lat] && $_REQUEST[lon]) {
 	$_REQUEST[gpsLat] = localdeg($_REQUEST[lat]);
 	$_REQUEST[gpsLng] = localdeg($_REQUEST[lon]);
 } elseif ($userAgent[Career] == "softbank" && $_REQUEST[pos]) {
 	preg_match("/N([\d\.]+)E([\d\.]+)$/", $_REQUEST[pos], $m);
 	$_REQUEST[gpsLat] = localdeg($m[1]);
 	$_REQUEST[gpsLng] = localdeg($m[2]);
 }
 function localdeg($val) {
 	$val = str_replace("+", "", $val);
 	preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d*)$/", $val, $m);
 	$d = $m[1]; $f = $m[2]; $b = "$m[3].$m[4]";
 	return($d + ($f * 60 + $b) / 3600);
 }  
これでグローバル変数$_REQUEST[gpsLat]と、$_REQUEST[gpsLng]に世界測地系10進数の緯度経度が格納されています。 世界測地系10進数は、Googleマップ標準仕様ですので、そのまま地図表示が可能です。 Perlでは以下のようになります。
  if ($userAgent{Career} =~ /(au|docomo)/
 	&& $_REQUEST{lat} && $_REQUEST{lon}) {
 	$_REQUEST{gpsLat} = localdeg($_REQUEST{lat});
 	$_REQUEST{gpsLng} = localdeg($_REQUEST{lon});
 } elseif ($userAgent{Career} eq "softbank" && $_REQUEST{pos}) {
 	$_REQUEST{pos} =~ /N([\d\.]+)E([\d\.]+)$/;
 	$_REQUEST{gpsLat} = localdeg($1);
 	$_REQUEST{gpsLng} = localdeg($2);
 }
 sub localdeg {
 	local($_) = $_[0];
 	s/\+//;
 	/^(\d+)\.(\d+)\.(\d+)\.(\d*)$/;
 	$d = $1; $f = $2; $b = "$3.$4";
 	$d + ($f * 60 + $b) / 3600;
 }  
Perlでは外部から取得したデータが連想配列%_REQUESTに格納されているものとしています。 こうしておくことでPHPへの移植性が高まります。

応用編サンプルがこちらに有りますので参考にしてみてください。
Comment
$(this).corner("left");コメントに関するお約束

  1. ご意見、ご希望、ご質問など、何かありましたらご投稿ください。
  2. ご質問に対する回答は、分かる範囲でお答えしますが、お約束は出来ません。
  3. 投稿していただいたコメントはこのページに記載されます。
  4. コメントは各ページごとに独立しています。それぞれのテーマに沿ったコメントをお願いします。
  5. タグはいっさい使用できません。タグもそのまま表示されます。
  6. 印は必須です。ハンドル名でも結構ですのでご記入ください。
  7. パスワードを記入しておけばご自分の記事を削除できます。
  8. 当サイトにふさわしくないと判断した記事は管理者の独断で削除することがあります。
お名前
パスワード
件名

Enquete
このページの情報、記事はお役に立ちましたでしょうか?
はい いいえ どちらとも言えない

※ご意見が有ればどうぞ(公開されません)
更新履歴
10/07/26 Winテーマの変更
10/06/08 まだまだ使えるXP
10/06/02 jQueryテーマ...
10/05/25 Win7は業務に...
10/04/11 携帯位置情報取得
10/03/09 カレンダーの追加
10/03/01 サービス開始
有料サービス
  1. データ変換サービス
    番地まで記載されたテキスト形式の住所データをお持ちの場合、「緯度」、「経度」及び、 「最寄り駅」と座標、「最寄のインター」と座標の情報を追加したCSVデータを作成してお返しします。 座標付ですので簡単にGoogleマップに位置表示することができます。
    【例】
    名称 住所
    東京タワー 東京都港区芝公園4丁目2-8

    名称 住所 緯度 経度 沿線 最寄り駅 緯度 経度 高速名 インター 緯度 経度
    東京タワー 東京都港区芝公園4丁目2-8 35.6585873 139.7454247 都営大江戸線 赤羽橋 35.655007 139.743642 首都高速都心環状線 芝公園 35.6544767 139.745769
    ※住所データは必須です。電話番号では特定できません。

    費用は1件当たり、わずか32円。100件で3,200円、1000件でも32,000円です。
    追加される最寄り駅、最寄のインター共に直線距離で最も近いもの1件です。複数必要な場合はお問合せください。
  2. システム開発
    Googleマップや最寄り駅、最寄のインターを利用したWEBシステムを開発します。
    自社製品が全国どこで購入可能で、どの駅で降りれば1番近いのかなどをユーザにお知らせすることができ、販売促進にも貢献します。 また、ご自分の住所を指定して最も近い店舗を検索したり、距離を指定して範囲内の店舗を検索して地図を表示するシステムの開発もできます。
    もちろん、携帯版も可能です。
    携帯版はGIF形式の静止画ですのでキャリヤや機種を選びません。 ほぼ、全て機種で使用可能なシステムになります。

    携帯電話ですからWEBのようなパフォーマンスは望めませんが、 静止画でも地図の「縮小」、「拡大」をサポートします。
    お見積もりは「お問合せ」から、 ご希望の機能をできるだけ詳しくお書きいただき、お送りください。
  3. 最新のユーザインターフェースの導入
    現在注目を集めているAjaxやJavascriptを使用したハイセンスなインターフェースの導入をお手伝いします。
    jQueryプラグインのオーバーレイを複数使用した最先端のドキュメントの生成が可能になります。 また、オーバーレイやAjaxを使用する事で、無駄なリロードを減らすことができ、パフォーマンスも向上します。
お問合せフォーム
  1. 全てのお問合せはこちらの専用フォームをご使用ください。 もちろん、ご意見/ご希望でも結構です。
  2. システムに存在しない路線や、新たに開通した路線をご存知の場合はお知らせください。
  3. 有料サービスで新たなシステム開発のお見積もりをご希望の場合は、 出来る限りご希望の機能を詳しくお願いします。
  4. は必須項目です。必ずご記入ください。
お名前
フリガナ
Email
Email(確認) ※確認のためもう一度 (コピー禁止)
タイトル お問合せ お見積もり ご意見/ご希望
内容