Website made with rich jQuery,Ajax & Perl,PHP
ジオステーション
Sponsor
携帯位置情報から地図表示(連載)
[最終更新日:2011/01/29]
大変多くの方にご覧いただいているようでうれしいですね。ありがとうございます。
多くの方にご覧いただくと、それぞれに興味をお持ちのこともさまざまなようですので、 平行して複数の連載を行っていこうかなと思っています。

今回は携帯の位置情報を取得して、その場所をGoogleマップに表示してみましょう。 実際にどのような場面で役に立つのかは不明ですが、少なくても道に迷った場合は便利でしょう。

$(this).corner("left");Googleマップに登録

Googleマップをご自分のサイトで使用するには、使用するサイト(ドメイン)を登録しなければなりません。 当サイトでは、www.inetagency.netを登録していますので、このドメイン内であればいくつでも使用できると言うことです。
まずは、こちらで登録してマップキーを取得します。 Googleのアカウントをお持ちでない場合はユーザ登録も必要ですが、どちらも無料ですので気楽に登録してください。 マップキーは地図を表示するたびに必要になりますので大切に保管しておきましょう。

$(this).corner("left");PHPのコーディング

今回は最も簡単なPHPで書いてみます。
携帯電話用ですので、携帯電話デフォルトのSHIFT_JISで記述しておきます。
  <?php
 $mapkey = "ABQIAAAAXaiz8IPqqQm7vTNKlRQknRTYEOJ5jQ5L8kDHjMxDX6oeptZ9GCEQ";
 if (preg_match("/UP\.Browser/i", $_SERVER[HTTP_USER_AGENT])) {
 	$href = "<a href=\"device:gpsone?url=http://www.inetagency.net/gps.php&ver=1&datum=0&unit=0\">現在地</a>";
 } elseif (preg_match("/DoCoMo/i", $_SERVER[HTTP_USER_AGENT])) {
 	$href = "<a href=\"http://www.inetagency.net/gps.php\" lcs>現在地</a>";
 } 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])) {
 	$href = "<a href=\"location:auto?url=http://www.inetagency.net/gps.php\">現在地</a>";
 }
 if ($_REQUEST[lat] && $_REQUEST[lon]) {
 	$_REQUEST[gpsLat] = localdeg($_REQUEST[lat]);
 	$_REQUEST[gpsLng] = localdeg($_REQUEST[lon]);
 } elseif ($_REQUEST[pos]) {
 	preg_match("/N([\d\.]+)E([\d\.]+)$/", $_REQUEST[pos], $m);
 	$_REQUEST[gpsLat] = localdeg($m[1]);
 	$_REQUEST[gpsLng] = localdeg($m[2]);
 }
 if ($_REQUEST[gpsLat] && $_REQUEST[gpsLng]) {
 	$center = "$_REQUEST[gpsLat],$_REQUEST[gpsLng]";
 	$markers = "$_REQUEST[gpsLat],$_REQUEST[gpsLng],reda";
 	$contents = "<img
 	src=\"http://maps.google.com/staticmap?center=$center&zoom=13&size=240x320&markers=$markers&key=$mapkey\" />";
 } else {
 	$contents = "
 	携帯電話の位置情報から<br>
 	現在地を地図に表示します。<br>
 	■$href";
 }
 header("Content-type:text/html; charset=SHIFT_JIS");
 $html =<<<_
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html;charset=SHIFT_JIS" />
 <title>現在地</title>
 </head>
 <body>
 $contents
 </body>
 </html>
 _;
 echo $html;
 exit;
 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);
 }
 ?>  
それでは少し解説です。携帯用ですのでパソコンでのアクセスでは動作しません。
  • 2行目はGoogleマップの表示に必要なマップキーを変数に設定しています。
  • 3から11行は、携帯各社ごとに位置情報の取得方が異なりますので、 環境変数$_SERVER[HTTP_USER_AGENT]を確認してタグを作成しています。 詳細はこちらでも解説しています。
  • 12行から19行は、送信されてきた位置情報を専用の変数$_REQUEST[gpsLat]と$_REQUEST[gpsLng]に格納しています。 これは、各社ごとに異なる環境変数に格納されていますので統一するためと、 $_REQUESTを使用することで、次なるステップに送信する場合に便利だからです。
  • 25行からは、最初にアクセスされた場合のメッセージと、 位置情報取得のタグを表示します。

    3キャリアで、位置情報が受信できた場合は、$_REQUEST[gpsLat]と$_REQUEST[gpsLng]に値がセットされていますので、 値がセットされていなければ初めてアクセスされたとしています。
  • 20行からが地図表示です。

    $_REQUEST[gpsLat]と$_REQUEST[gpsLng]に値がセットされていれば位置情報が正常に受信されたと言う事で地図を表示します。

    $centerは、地図の中心を取得した位置情報に、 $markersは、取得した座標にマークを付けています。
    23行は、これらの情報を元にGoogleマップにアクセスしています。

    携帯用Googleマップは静止画(gif)ですので、3キャリア共に問題なく表示されます。
  • 45行は、座標値をGoogleマップ用に変換する関数です。 GoogleマップはYahooマップとは異なり、世界測地系、10進法でなければなりません。 取得した携帯の緯度、経度は世界測地系ですが60進法ですので10進法に変換しています。 世界測地系と日本測地系、10進法と60進法については、 こちらでも詳しく解説しています。
このサンプルでは、スクリプトのファイル名にgps.phpと付けています。

$(this).corner("left");Perlのコード

最後に、まったく同じPerlのコードも添えておきます。
このPerlには、オリジナルライブラリperl-lib.plが必要です。 ダウンロードしてrequireでインクルードしてください。
  #!/usr/bin/perl
 require "Ctrl/cgi-lib/perl-lib.pl";
 readparts('_REQUEST');
 
 $mapkey = "ABQIAAAAXaiz8IPqqQm7vTNKlRQknRTYEOJ5jQ5L8kDHjMxDX6oeptZ9GCEQ";
 if ($ENV{HTTP_USER_AGENT} =~ /UP\.Browser/i) {
 	$href = "<a href=\"device:gpsone?url=http://www.inetagency.net/gps.cgi&ver=1&datum=0&unit=0\">現在地</a>";
 } elsif ($ENV{HTTP_USER_AGENT} =~ /DoCoMo/i) {
 	$href = "<a href=\"http://www.inetagency.net/gps.cgi\" lcs>現在地</a>";
 } elsif ($ENV{HTTP_USER_AGENT} =~ /J-PHONE/i ||
 	$ENV{HTTP_USER_AGENT} =~ /Vodafone/i ||
 	$ENV{HTTP_USER_AGENT} =~ /SoftBank/i) {
 	$href = "<a href=\"location:auto?url=http://www.inetagency.net/gps.cgi\">現在地</a>";}
 if ($_REQUEST{lat} && $_REQUEST{lon}) {
 	$_REQUEST{gpsLat} = localdeg($_REQUEST{lat});
 	$_REQUEST{gpsLng} = localdeg($_REQUEST{lon});
 } elsif ($_REQUEST{pos}) {
 	$_REQUEST{pos} =~ /N([\d\.]+)E([\d\.]+)$/;
 	$_REQUEST{gpsLat} = localdeg($1);
 	$_REQUEST{gpsLng} = localdeg($2);
 }
 if ($_REQUEST{gpsLat} && $_REQUEST{gpsLng}) {
 	$center = "$_REQUEST{gpsLat},$_REQUEST{gpsLng}";
 	$markers = "$_REQUEST{gpsLat},$_REQUEST{gpsLng},reda";
 	$contents = "<img
 	src=\"http://maps.google.com/staticmap?center=$center&zoom=13&size=240x320&markers=$markers&key=$mapkey\" />";
 } else {
 	$contents =<<;
 	<font size="2">
 	携帯電話の位置情報から<br />
 	現在地を地図に表\示します。<br />
 	■$href</font>
 
 }
 $html =<<;
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html;charset=SHIFT_JIS" />
 <title>現在地</title>
 </head>
 <body>
 $contents
 </body>
 </html>
 
 print "Content-type:text/html; charset=SHIFT_JIS\n\n";
 print $html;
 exit;
 sub localdeg {
 	local($_) = $_[0];
 	s/\+//;
 	/^(\d+)\.(\d+)\.(\d+)\.(\d*)$/;
 	$1 + ($2 * 60 + "$3.$4") / 3600;
 }
  
このソースコードをコピーして使用する場合は、文字コードをSHIFT_JIS、 改行コードをLFにしてgps.cgiで保存してください。 文字コードが異なると文字化けの原因に、改行コードが異なるとサーバエラーになります。 また、空行も重要な役割を担っていますので、空行を詰めてもサーバエラーになります。

サンプルはこちらにあります。 http://www.inetagency.net/gps.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(確認) ※確認のためもう一度 (コピー禁止)
タイトル お問合せ お見積もり ご意見/ご希望
内容