-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAccuratePosition.js
70 lines (64 loc) · 2.23 KB
/
AccuratePosition.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// AccuratePosition
// 時間の許す限り正確な位置情報を取得する
// http://pear.jp/
function getAccuratePosition(successCallback, errorCallback, option){
// 位置情報に対応していなければ終了
if(!navigator.geolocation){
var error = new Object();
error.code = 9;
error.message = 'Geolocation APIが利用できません。';
errorCallback(error);
return;
}
// 変数の初期化
var watch_id = undefined;
var timer_id = undefined;
var position = undefined;
var limit = option && option.limit ? option.limit : 100;
var timeout = option && option.timeout ? option.timeout : 0;
// タイムアウトをセット
if(timeout > 0){
timer_id = setTimeout(
function(){
// 位置情報の取得を中止する
if(watch_id){
navigator.geolocation.clearWatch(watch_id);
watch_id = undefined;
}
// 位置情報が取得できていればsuccessCallbackに送る
if(position){
successCallback(position);
}
else{
var error = new Object();
error.code = 9;
error.message = '位置情報の取得でタイムアウトしました。';
errorCallback(error);
return;
}
},
timeout
);
}
// 取得を実行
watch_id = navigator.geolocation.watchPosition(
function(p){
// 取得のたびに更新する
position = p;
// 求める精度に達すればsuccessCallbackに送る
if(position.coords.accuracy < limit){
// タイムアウト監視を止める
if(timer_id){
clearTimeout(timer_id);
timer_id = undefined;
}
navigator.geolocation.clearWatch(watch_id);
successCallback(position);
}
},
function(e){
errorCallback(e);
},
{enableHighAccuracy:true, maximumAge:0}
);
}