ガラケーで現在地の地図表示(ドコモの場合)

スポンサーリンク
スポンサーリンク

ドコモの携帯(ガラケー)で、iアプリを使用せずに現在地付近の地図を表示する方法を2つ紹介します。
iモード版エリアマップの使用と、現在地のグーグルマップを表示するWEBサイトです。

iモード版エリアマップを表示する

ドコモには電波状況を確認する為の地図が用意されていますが、ドコモのサイト内なのでパケット通信料無料で地図を確認できます。
まず、iモードで、「i menu」→「お客様サポート」→「サービスエリア」とたどります。
サービスエリア検索の箇所で地域を選択した後、次の画面で「サービスエリア検索」を選択します。

「住所検索」「iエリア検索」「GPS検索」いずれかを選択すると、現在地付近の地図が表示されます。
「iエリア検索」を選択した場合は、携帯が通信している基地局を基に表示しますので、現在地とずれが生じます。

ドコモのサイト内なのでパケット通信料無料です。

現在地のグーグルマップを表示する

ドコモの携帯で現在地のグーグルマップを下の画像のように示します。
GPS未搭載の端末でも、現在地付近を表示することが出来ます。

画像

ドコモのガラケーからhttp://vogel.dip.jp/sv/gmap0.html にアクセスし、MAP のリンクをクリックすると下記画面になるので、「OK」ボタンを押します。
(パソコンからはアクセス出来ません)

画像

すると、冒頭の画面のように、現在地付近の地図が表示されます。

*、# で地図を拡大、縮小します。
数字キーを押すと、その方向に地図が移動します。
数字の5を押すと、最初に表示した位置に戻ります。

この地図の表示では、オープンiエリアという、iモードに提供する位置情報取得の機能を使っています。

作ろうiモードコンテンツ:オープンiエリア | サービス・機能 | NTTドコモ

ドコモでは全国各地を 505 エリアに区切っていますが、携帯が通信している基地局を基に、エリアの座標をiモードコンテンツで取得することが出来ます。
基地局の情報を基に座標を取得するので、おおまかな現在地でしか取得できないのですが、GPS未搭載の端末でも利用できます。

位置情報取得の方法ですが、まずiモードコンテンツをCGIで作成します。
下記の書式の URL に iモードでアクセスすると、「iモードコンテンツのURL」が読みだされます。
この時、iモードコンテンツのCGIでは、座標がパラメータ LAT,LON で渡されるので、これを取得できるようにします。

http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE&msn=OPENAREAKEY&posinfo=1&nl=iモードコンテンツのURL

例えば、下記のURLにアクセスすると、http://vogel.dip.jp/sv/gmap.cgi にアクセスされます。
(パソコンからはアクセス出来ません)

http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE&msn=OPENAREAKEY&posinfo=1&nl=https://pcvogel.sarakura.net/sv/gmap.cgi

map.cgi では座標がパラメータ LAT,LON で渡されるので、これを基に地図を表示します。
指定座標の地図画像は、Google Static Maps API を使用して表示します。
下記書式で地図画像を指定します。

http://maps.google.com/maps/api/staticmap??パラメータ

パラメータでは以下のようなものを指定します。

マップの大きさ:size=横サイズx縦サイズ
マップの中心座標:center=中心緯度,中心経度
ズームレベル:zoom=ズームレベル
マーカの座標:markers=中心緯度,中心経度

例えば、次のように使用すると、
http://maps.google.com/maps/api/staticmap?center=35.39346,132.68707&markers=size:tiny|35.39346,132.68707&size=240×240&sensor=false&format=jpg&zoom=16

以下の地図が表示されます。

画像

以上の流れで地図を表示します。
なお、参考までにサイトのCGIのソースを示します。

map.cgi

#!/usr/bin/perl
use utf8;
$M_WIDTH = 240;
$M_HEIGHT = 240;
$BASE = "/sv";
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'});
} else {
    $alldata = $ENV{'QUERY_STRING'};
}
foreach $data (split(/&/, $alldata)) {
    ($key, $value) = split(/=/, $data);
    $value =~ s/\+/ /g;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
    $value =~ s/\t//g;
    $arg{"$key"} = $value;
}
if( $arg{'LAT'} eq "" || $arg{'LON'} eq ""  ){
    $lat = "35.39346";
    $lon = "132.68707";
}else{
    $lat = gpsone2degree($arg{'LAT'});
    $lon = gpsone2degree($arg{'LON'});
}
if( $arg{'CLAT'} eq "" || $arg{'CLON'} eq ""  ){
    $clat = $lat;
    $clon = $lon;
}else{
    $clat = $arg{'CLAT'};
    $clon = $arg{'CLON'};
}
if( $arg{'MLAT'} eq "" || $arg{'MLON'} eq ""  ){
    $mlat = $lat;
    $mlon = $lon;
}else{
    $mlat = $arg{'MLAT'};
    $mlon = $arg{'MLON'};
}
if( $arg{'ZM'} eq "" ){
    $zm = 16;
}else{
    $zm = $arg{'ZM'};
}
$vlat = 0.00045 * $M_WIDTH / 240 * ( 2 ** ( 17 - $zm ) );
$vlon = 0.0005 * $M_HEIGHT / 240 * ( 2 ** ( 17 - $zm ) );
print "Content-type: text/html\n\n";
print '<html>';
print '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
print '<body>';
print "";
$mapurl = sprintf( "http://maps.google.com/maps/api/staticmap?center=%.5f,%.5f&markers=size:tiny|%.5f,%.5f&size=%dx%d&sensor=false&format=jpg" , $clat , $clon , $mlat , $mlon , $M_WIDTH , $M_HEIGHT );
print "<img src=\"$mapurl&zoom=$zm\" />";
print "<br>";
print "<a href=\"" .getmapurl($clat,$clon,$zm+1,$mlat,$mlon). "\" accesskey=\"*\">* 拡大</a>  <a href=\"" .getmapurl($clat,$clon,$zm-1,$mlat,$mlon). "\" accesskey=\"#\"># 縮小</a>";
print "<br>";
print "移動 ";
print "<a href=\"" .getmapurl($clat+$vlat,$clon-$vlon,$zm,$mlat,$mlon) . "\" accesskey=\"1\">1</a>";
print "<a href=\"" .getmapurl($clat+$vlat,$clon      ,$zm,$mlat,$mlon) . "\" accesskey=\"2\">2</a>";
print "<a href=\"" .getmapurl($clat+$vlat,$clon+$vlon,$zm,$mlat,$mlon) . "\" accesskey=\"3\">3</a>";
print "<a href=\"" .getmapurl($clat      ,$clon-$vlon,$zm,$mlat,$mlon) . "\" accesskey=\"4\">4</a>";
print "<a href=\"" .getmapurl($mlat      ,$mlon      ,$zm,$mlat,$mlon) . "\" accesskey=\"5\">5</a>";
print "<a href=\"" .getmapurl($clat      ,$clon+$vlon,$zm,$mlat,$mlon) . "\" accesskey=\"6\">6</a>";
print "<a href=\"" .getmapurl($clat-$vlat,$clon-$vlon,$zm,$mlat,$mlon) . "\" accesskey=\"7\">7</a>";
print "<a href=\"" .getmapurl($clat-$vlat,$clon      ,$zm,$mlat,$mlon) . "\" accesskey=\"8\">8</a>";
print "<a href=\"" .getmapurl($clat-$vlat,$clon+$vlon,$zm,$mlat,$mlon) . "\" accesskey=\"9\">9</a>";
sub getmapurl {
    return sprintf( "$BASE/gmap.cgi?MLAT=$_[3]&MLON=$_[4]&CLAT=$_[0]&CLON=$_[1]&ZM=$_[2]" );
}
sub gpsone2degree {
    my @v;
    my $tmp;
    @v = split( '\.' , $_[0] );
    $tmp = "$v[2].$v[3]";
    $tmp *= 1;
    return $v[0] + ($v[1]/60) + ($tmp/3600);
}

以上、ドコモの携帯(ガラケー)で、iアプリを使用せずに現在地付近の地図を表示する方法でした。

参考

作ろうiモードコンテンツ:オープンiエリア | サービス・機能 | NTTドコモ

HTML:Googleマップを携帯サイトで表示する方法 | raining

Static Maps API V2 デベロッパー ガイド – Google Maps Image API ― Google Developers

コメント

タイトルとURLをコピーしました