以前auの端末での取得方法を書きましたが、先日電話機をDoCoMoに変更したのでDoCoMo端末での取得方法をメモ。
・・・といってもやり方はauよりもより楽で、aタグかformタグに「lcs」という属性を付けるだけです。
後はURLにデータが足されて送られてきます。
得られるデータはauよりだいぶ少ないですが。
■送られるデータ
lat(緯度:latitude)「±dd.mm.ss.sss」で表記。
lon(経度:longitude)「±ddd.mm.ss.sss」で表記。
geo(測地系:datum)geo=wgs84(大文字か小文字かは指定がないのでどちらでも読めるようにしておくこと)
ただ、日本測地系はもう使われなくなったこともあり、GPSのデータは実質的にWGS84以外が来ることはないでしょう。
x-acc(測位レベル:accuracy)1~3の数字が入る。大きいほど正確。
auの時と同じようにこんな感じでGoogleMapとMapionのURLに変換するCGIを作りました。

「表示コード」というのは、生成したURLを携帯電話で扱うのがメンドクセーって人のためのオマケ機能で、このボタンを押すと5分間有効な4桁の数字が表示されます。その4桁の数字をPCでこちらのページに入力すると、携帯電話で取得したURLが表示される仕組みです。
ご旅行の記録をWeb日記に貼るときなどにどうぞー。
アクセスはこちらからどうぞ。
au版もこちらにあります。

URLエンコード(Percent-Encoding)をデコードする方法は単純な処理なので実装するのは簡単なのですが、いざ欲しいと思うと何故かOSには用意されていなかったりします。
ググれば一発だろ! と思っても何故かすんなりは見つからないか、見つかっても冗長だったりするので毎回新たに書いているのですが、今回で最後にしたいのでここに貼りつけておきます。
エンコードは今回必要無かったので作ってませんが必要になった時に作ります。
urlDecode()にバッファとその長さと変換したい文字列を渡します。
なんか見本で見かけるソースよりやけに短くなってしまうのですが、何か自分が間違っているんだろうか・・・。(RFCは読んでいない)
9 :int valueFromHexChar(char hex)
10 :{
11 : if('0' <= hex && hex <= '9') return hex - '0';
12 : else if('A' <= hex && hex <= 'F') return hex - 'A' +10;
13 : else if('a' <= hex && hex <= 'f') return hex - 'a' +10;
14 : else return 0;
15 :}
16 :
17 ://typedef unsigned int size_t;
18 :void urlDecode(char* decoded
19 : ,size_t decoded_length
20 : ,const char* source)
21 :{
22 : decoded_length--; //最後の\0の分
23 : while(*source && decoded_length){
24 : if(*source == '%'){
25 : if(*(source+1) == '\0') break; //%の後2Byte続かずに備えて
26 : *(decoded++)
27 : = (valueFromHexChar( *(source+1) ) <<4 )
28 : + valueFromHexChar( *(source+2) );
29 : source += 3;
30 : }else if(*source == '+'){
31 : *(decoded++) = ' ';
32 : source++;
33 : }else{
34 : *(decoded++) = *(source++);
35 : }
36 : decoded_length--;
37 : }
38 : *decoded = '\0';
39 :}