geolocationでの位置情報取得
iphone safariやfirefox3.5以上で、javascriptを用いて位置情報が取得できる。
http://dev.w3.org/geo/api/spec-source.html
簡単に、getCurrentPositionで位置情報が取得できるのだが
iphoneでやると、なんとも精度が悪い。
一発の取得精度に依存する。
accuracyをみると700とかとんでもない値がかえってくる。
おそらく基地局依存?
そこでwatchPositionをつかって連続して取得し、一定精度になったら取得をやめる実装を行う。
こちらがgetCurrentPosition
navigator.geolocation.getCurrentPosition(function(pos){ //pos.coords.latitude, pos.coords.longitudeに緯度経度が入ってる }, function(error){}, {enableHighAccuracy:true,timeout:1000,maximumAge:0} );
watchPositionを使って実装
var wathId; watchId = navigator.geolocation.watchPosition(function(pos){ //任意の精度以下になったら取得をやめる if(pos.coords.accuracy < 300){ navigator.geolocation.clearWatch(watchId); }, function(error){}, {enableHighAccuracy:true,timeout:1000,maximumAge:0} );
これで満足いく精度が得られる。
ただ任意の精度以下にならない場合の処理時間でtimeoutするなどの工夫が必要。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>untitled</title> </head> <body> <script type="text/javascript"> function getPos(){ navigator.geolocation.getCurrentPosition(sFunc, fFunc, {enableHighAccuracy:true,timeout:1000,maximumAge:0} ); } var sFunc=function(pos){ alert(pos.coords.accuracy); if(pos.coords.accuracy>100){ getPos(); } } function display(pos,ptime){ var a = document.getElementById("test"); var b=["<ul>", "<li>time: ",ptime/1000,"</li>", "<li>lat : ",pos.coords.latitude,"</li>", "<li>lon: ",pos.coords.longitude,"</li>", "<li>accuracy: ",pos.coords.accuracy,"</li>", "</ul>"]; a.innerHTML = b.join(''); } var fFunc=function(e) { } var watchId; var startTime; var currentTime; function watchPos(){ startTime = new Date(); watchId = navigator.geolocation.watchPosition(function(pos){ currentTime = new Date(); var processingTime = currentTime - startTime; display(pos,processingTime); if(pos.coords.accuracy < 300 || processingTime > 15000){ navigator.geolocation.clearWatch(watchId); } },function(){}, {enableHighAccuracy:true,timeout:1000,maximumAge:0}); } </script> <input type="button" value="get Position" onclick="getPos();"> <input type="button" value="watch position" onclick="watchPos();"> <div id="test"></div> </body> </html>
- 作者: Mark Pilgrim,矢倉眞隆(監訳),水原文
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/04/23
- メディア: 大型本
- 購入: 12人 クリック: 350回
- この商品を含むブログ (13件) を見る
- 作者: David Flanagan,村上列
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/08/10
- メディア: 大型本
- 購入: 12人 クリック: 252回
- この商品を含むブログ (18件) を見る