はじめに
ご存知の通り、携帯端末には現在地の位置情報を基地局ベース、もしくはより精度の高いGPSを使用して送信する機能がついています。この機能を使用して、現在いる場所の地図を表示したり、最寄り駅を表示したりするサービスが各社から提供されています。
位置情報の送信・取得方法はキャリアごとに異なりますが、仕様さえ理解すれば個人で運用しているサイトにも簡単に導入できます。まだ試したことのない方は、この機会にぜひお試しください。
対象読者
PerlでCGIアプリケーションを作成したことがあり、位置情報を利用したい方。
必要な環境
Perl 5.8以上が動作する環境。
iモード 「オープンiエリア」
ドコモが提供する基地局ベースのエリア送信サービスで、すべてのiモード対応端末で利用できます。「NTTドコモ 作ろうiモードコンテンツ:オープンiエリア」で仕様が公開されています。
下記のパラメータをドコモの位置情報取得用のURL(http://w1m.docomo.ne.jp/cp/iarea)に送信することで端末から位置情報を送信できます。
パラメータ | 説明 |
ecode | OPENAREACODE(固定) |
msn | OPENAREAKEY(固定) |
nl | 遷移先URL |
arg1 | 付加パラメータ |
arg2 | 同上 |
<a href="http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE& msn=OPENAREAKEY&nl=http%3a%2f%2fexample.com%2fsample1.cgi& arg1=param1%3dfoo">送信</a>
<form action="http://w1m.docomo.ne.jp/cp/iarea" method="get"> <input type="hidden" name="ecode" value="OPENAREACODE"> <input type="hidden" name="msn" value="OPENAREAKEY"> <input type="hidden" name="nl" value="http://example.com/sample1.cgi"> <input type="hidden" name="arg1" value="param1=foo"> <input type="submit" value="送信"> </form>
nlで指定した遷移先URLにPOSTリクエストでエリアコード(AREACODE)が渡されます。オープンiエリアでは位置情報を日本全国を505のエリアに分けた5桁のエリアコードで表します。
arg1、arg2にパラメータを付加しておけば指定したパラメータ名と値が引き継がれ渡されます。
パラメータ | 説明 | 例 |
AREACODE | エリアコード | 例)05902 |
付加パラメータ1 | 送信時にarg1で指定したパラメータ名と値の組み合わせ | |
付加パラメータ2 | 送信時にarg2で指定したパラメータ名と値の組み合わせ |
#!/usr/bin/perl use strict; use CGI; my $q = CGI->new; my $areacode = $q->param('AREACODE'); my $param1 = $q->param('param1'); print $q->header(-charset=>'Shift_JIS'),<<END; <html> <body> areacode:$areacode<br> param1:$param1<br> </body> </html> END
EZweb 「簡易位置情報」
EZwebで提供する簡易的に位置情報が分かるサービスです。EZweb対応端末(auの一部端末、ツーカーを除く)で利用可能です。「KDDI au EZfactory:簡易位置情報」で仕様が公開されています。
deviceスキームを使用し、url
パラメータに遷移先URLを指定して位置情報を送信します。
<a href="device:location?url=http://example.com/sample2.cgi">送信</a>
urlで指定した遷移先のプログラムに下記の情報が渡されます。
パラメータ | 説明 | 例 |
datum | 測地系 | 例)tokyo |
unit | 座標系 | dms(固定) |
lat | 緯度 | 例)+35.43.25.38 |
lon | 経度 | 例)+135.43.25.38 |
#!/usr/bin/perl use strict; use CGI; my $q = CGI->new; my $lat = $q->param('lat'); my $lon = $q->param('lon'); print $q->header(-charset=>'Shift_JIS'),<<END; <html> <body> latitude:$lat<br> longitude:$lon<br> </body> </html> END
Yahoo!ケータイ
ステーション(エリアに密着した情報を自動的に受信するYahoo!ケータイのサービス)対応端末で利用できます。
C2型、W型は非対応です。またC3型の一部端末、3GC型の一部端末も利用できません。「SoftBank:技術資料 HTML編」で仕様が公開されています。
3GC型と3GC型以外とで位置情報の取得方法が異なるので注意してください。
3GC型以外
<form>
または<a>
タグにz
属性を付けるだけで位置情報を送信できます。
<a href="http://example.com/sample3.cgi?param1=foo" z>送信</a>
<form action="http://example.com/sample3.cgi" z> <input type="hidden" name="param1" value="foo"> <input type="submit" value="送信"> </form>
遷移先のプログラムで環境変数「X-JPHONE-GEOCODE」から位置情報を取り出します。
X-JPHONE-GEOCODEは緯度(北緯aa度bb分cc秒の数値を繋げた値)、経度(東経ddd度ee分ff秒の数値を繋げた値)、住所文字列(URIエンコードされたShift_JISの文字列)を\x1aでつなげた文字列になっているので、これを区切って利用します。
#!/usr/bin/perl use strict; use CGI; my $q = CGI->new; my $geocode = $ENV{HTTP_X_JPHONE_GEOCODE}; $geocode =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; my($lat,$lon,$address) = split(/\x1a/,$geocode); my $param1 = $q->param('param1'); print $q->header(-charset=>'Shift_JIS'),<<END; <html> <body> latitude:$lat<br> longitude:$lon<br> address:$address<br> param1:$param1 </body> </html> END
3GC型
locationスキームを使用して位置情報を送信します。
測位方法をcell(簡易位置情報による測位)、gps(GPSによる精度の高い測位)、auto(端末で優先されている測位方法で測位)から選べますが、autoにしておくのが無難でしょう。
<a href="location:auto?url=http://example.com/sample4.cgi& param1=foo">送信</a>
パラメータ | 説明 | 例 |
pos | 緯度経度 | 例)N35.39.38.75E139.43.48.31 |
geo | 測地系 | wgs84: WGS84系、 tokyo: 日本測地系、 itrf: ITRF系 |
x-acr | 測位精度 | 1: 300m以上(簡易位置情報)、 2: 50~300m(GPS)、 3: 50m以下(GPS) |
#!/usr/bin/perl use strict; use CGI; my $q = CGI->new; my ($lat,$lon) = $q->param('pos') =~ /^([N|S][\d\.]+)([E|W][\d\.]+)$/; my $param1 = $q->param('param1'); print $q->header(-charset=>'Shift_JIS'),<<END; <html> <body> latitude:$lat<br> longitude:$lon<br> param1:$param1 </body> </html> END