AUのGPS機能とGoogle Static Maps APIを連携させてみる。
[,right]
googleマップが携帯でも表示可能となった(http://googlejapan.blogspot.com/2008/03/google_1433.html)らしいので、早速AUのGPS機能と連携させてみる。バイクでツーリング行って迷った時に便利だからね。
実際に作ってみた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:gpsoneでGPS情報の取得が始まる。もちろん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の先頭の+記号が空白に置き換わり、Pythonのcgiライブラリの[]でKeyError(だったかな)が発生した。置き換わらないようにcgi.escape()とか使ってみたけど置き換わるので、lstrip()で空白を除去。これで、問題なく動作はするんだけど…なんだかなぁ。
PCでは発生せずに携帯(W52CA)のみで発生するんだけど…CGIモジュールのバグなのかなぁ…
ともかく、これで地図を持たずにふらっとツーリング出かけたときにも何とかなる…かもw