AUのGPS機能とGoogle Static Maps APIを連携させてみる。

[,right]
googleマップが携帯でも表示可能となった(http://googlejapan.blogspot.com/2008/03/google_1433.html)らしいので、早速AUGPS機能と連携させてみる。バイクでツーリング行って迷った時に便利だからね。
実際に作ってみたURLはこちら(http://xanthus.s54.xrea.com/gsm/gsm.shtml)。AUの携帯からClick!をクリックすると、GPS情報の取得が始まりその辺りの地図が表示されるはず。Zoom inは19まで。Zoom outは0まで可能。
なお、PCだとGPS情報が取得できないので経度、緯度を指定したこちら(http://xanthus.s54.xrea.com/gsm/gsm2.cgi?lat=35.41.50.62&lon=139.34.58.55)。latとlonは適宜書き換えてください。
以下メモ。
まずは携帯からアクセスするHTMLが以下。

<html>
  <head>
    <title>Google Static Maps for AU-GPS</title>
  </head>
  <body>
	  現在地の地図を返します。
	  <a href="device:gpsone?url=http://xanthus.s54.xrea.com/gsm/gsm2.cgi&ver=1&datum=0&unit=0&acry=0&number=0">Click!</a>
  </body>
</html>

いくつかのパラメタはここ(http://siisise.net/gps.html)が良くまとまってます。
上のaタグをクリックすると、device:gpsoneGPS情報の取得が始まる。もちろんAUのみ(動作確認はW52CAだけ。多分41CAでも問題ない。その他は…わかんないw)。
GPS情報の取得が行われた後、urlパラメタに指定したURLに遷移して、パラメタ(って言うのかな?)にGPS情報が取得される。
GPS情報を取得するコード(Python)が以下(ソースはこちら:http://zr400d.googlepages.com/gsm2_.cgi)

#!/usr/local/bin/python
# coding: utf-8

#!D:\Python25\python.exe
#!C:\Python\python.exe

import cgi
import cgitb
cgitb.enable()

import GoogleStaticMapsUtil

# Google Maps API key
GMAK = "GOOGLE-MAPS-API-KEY"

# Google Static Maps size
size = (240,320)	# for W52CA by AU mobile phone

# dms -> deg transfer
def dms2deg( str ) :
	(d,m,s,s2) = str.split( '.' )
	s = s + '.' + s2
	d = float( d )
	m = float( m ) / 60.0
	s = float( s ) / 3600.0
	
	deg = d + m + s
	return deg


# main

fs = cgi.FieldStorage()

lat = fs['lat'].value
lon = fs['lon'].value
try :
	zoom = int( fs['zoom'].value )
except :
	zoom = 15

# dms -> deg
deg_lat = dms2deg( lat )
deg_lon = dms2deg( lon )

# center marker!
mi = GoogleStaticMapsUtil.MarkerInfo((deg_lat,deg_lon))

# google static maps util
gsm = GoogleStaticMapsUtil.GoogleStaticMapsUtil( GMAK )

# make url
url = gsm.make_url( (deg_lat,deg_lon) , zoom , size , None , (mi,) )

# make zoom in / zoom out url
zoom_in_url  = 'http://xanthus.s54.xrea.com/gsm/gsm2.cgi?lat=%s&lon=%s&zoom=%d' % ( lat.lstrip() , lon.lstrip() , zoom+1 )
zoom_out_url = 'http://xanthus.s54.xrea.com/gsm/gsm2.cgi?lat=%s&lon=%s&zoom=%d' % ( lat.lstrip() , lon.lstrip() , zoom-1 )

# output html code
print 'Content-Type: text/html'
print
print '<html><body>'
print 'lat,lon = %f,%f / zoom = %d<br>' % ( deg_lat , deg_lon , zoom )

# zoom in 
if zoom > 0 :
	print '<a href="%s">[zoom out] ' % zoom_out_url

# zoom out
if zoom < 19 :
	print '<a href="%s">[zoom in] ' % zoom_in_url
print '<br>'
print '<img src="%s">' % url
print '</body></html>'

GoogleStaticMapsUtilは、作りかけのGoogle Static Maps APIのラッパー(ソースはこちら:http://zr400d.googlepages.com/GoogleStaticMapsUtil.py)。経度、緯度、ズーム、画像サイズとマーカー(任意)を指定したらURLを吐いてくれる。
以前にGoogleMapsAPIをいじったことがあるので、結構簡単に出来る。googleのは比較的使いやすいAPIなんじゃないかな。
はまったのは、ズームイン/アウトの処理。

zoom_out_url = 'http://xanthus.s54.xrea.com/gsm/gsm2.cgi?lat=%s&lon=%s&zoom=%d' % ( lat.lstrip() , lon.lstrip() , zoom-1 )

で、なぜかlat,lonの先頭の+記号が空白に置き換わり、Pythoncgiライブラリの[]でKeyError(だったかな)が発生した。置き換わらないようにcgi.escape()とか使ってみたけど置き換わるので、lstrip()で空白を除去。これで、問題なく動作はするんだけど…なんだかなぁ。
PCでは発生せずに携帯(W52CA)のみで発生するんだけど…CGIモジュールのバグなのかなぁ…
ともかく、これで地図を持たずにふらっとツーリング出かけたときにも何とかなる…かもw