Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Perlで作るモバイルサイトのコツ:第3回

携帯電話の位置情報を取得する

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/10/04 00:00

本連載では、Perlによる携帯サイトを構築する上で役立つ、さまざまなTipsを解説していきます。第3回は、各携帯キャリアにおける位置情報の送信・取得方法を紹介します。

目次

はじめに

 ご存知の通り、携帯端末には現在地の位置情報を基地局ベース、もしくはより精度の高いGPSを使用して送信する機能がついています。この機能を使用して、現在いる場所の地図を表示したり、最寄り駅を表示したりするサービスが各社から提供されています。

 位置情報の送信・取得方法はキャリアごとに異なりますが、仕様さえ理解すれば個人で運用しているサイトにも簡単に導入できます。まだ試したことのない方は、この機会にぜひお試しください。

対象読者

 PerlでCGIアプリケーションを作成したことがあり、位置情報を利用したい方。

必要な環境

 Perl 5.8以上が動作する環境。

iモード 「オープンiエリア」

 ドコモが提供する基地局ベースのエリア送信サービスで、すべてのiモード対応端末で利用できます。「NTTドコモ 作ろうiモードコンテンツ:オープンiエリア」で仕様が公開されています。

 下記のパラメータをドコモの位置情報取得用のURL(http://w1m.docomo.ne.jp/cp/iarea)に送信することで端末から位置情報を送信できます。

オープンiエリア送信パラメータ
パラメータ 説明
ecode OPENAREACODE(固定)
msn OPENAREAKEY(固定)
nl 遷移先URL
arg1 付加パラメータ
arg2 同上
aタグでの位置情報送信例
<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タグでの位置情報送信例
<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にパラメータを付加しておけば指定したパラメータ名と値が引き継がれ渡されます。

オープンiエリア受信パラメータ
パラメータ 説明
AREACODE エリアコード 例)05902
付加パラメータ1 送信時にarg1で指定したパラメータ名と値の組み合わせ  
付加パラメータ2 送信時にarg2で指定したパラメータ名と値の組み合わせ  
sample1.cgi
#!/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タグでの位置情報送信例
<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
sample2.cgi
#!/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タグでの位置情報送信例
<a href="http://example.com/sample3.cgi?param1=foo" z>送信</a>
formタグでの位置情報送信例
<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でつなげた文字列になっているので、これを区切って利用します。

sample3.pl
#!/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タグでの位置情報送信例
<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)
sample4.cgi
#!/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

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:Perlで作るモバイルサイトのコツ

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5