使用setTimeout调用watchPosition()和getCurrentPosition() [英] watchPosition() vs getCurrentPosition() with setTimeout

查看:314
本文介绍了使用setTimeout调用watchPosition()和getCurrentPosition()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要确定一个人在50米以内的位置。我想知道是否应该一次又一次地使用 navigator.location.watchPostion()或者调用 getCurrentPostion() watchPostion()是正确的W3C API,用于执行我想要的功能,但实际上,它似乎过度杀伤。

$ b

这是我的代码:

  var map = null; 
var marker = null;
var layer = null;

函数locFn(pos){

var lat = pos.coords.latitude;
var lon = pos.coords.longitude;

$(#hlat)。val(lat);
$(#hlong)。val(lon);

document.getElementById(lnkMap)。href =
http://maps.google.com/maps?q=My+Loc@+ lat
+ ,+ lon +& z = 18& t = h;

var point = new GLatLng(lat,lon);

if(pos.coords.accuracy <100){
map.setCenter(point,18);

if(marker!= null){
marker.setLatLng(point);
}
else {
var ico = new GIcon();
ico.image =img / Blue-Dot.png;
ico.iconSize = new GSize(22,22);
ico.iconAnchor = new GPoint(11,11);
marker = new GMarker(point,{icon:ico});
layer = map.addOverlay(marker,{title:你在这里。});


else if(pos.coords.accuracy> 2000){
if(marker!= null){marker.setLatLng(point); }
map.setCenter(point,15);
}
else if(pos.coords.accuracy> 900){
if(marker!= null){marker.setLatLng(point); }
map.setCenter(point,16);
}
else if(pos.coords.accuracy> 100){
if(marker!= null){marker.setLatLng(point); }
map.setCenter(point,17);



函数locFail(){
// alert(检索位置失败。);
}

var watchID = null;

函数processPoints(){
map = new GMap2(document.getElementById(map_canvas),
{mapTypes:[G_HYBRID_MAP]});
try {
watchID = navigator.geolocation.watchPosition(locFn,locFail,
{enableHighAccuracy:true});

catch(err){/ * desktop?* /}
}
$(function(){processPoints();});

我注意到 watchPostion()好像最终导致更多的准确性(一段时间后),但我想知道如果位置变化太快,导致很多东西被下载到我的地图画布上,并且有很多过期的http请求会过时,取而代之的是新的。当我使用 watchPosition()时,它需要一段时间才能加载页面。


I need to determine a person's location within 50m. I'm wondering if I should use navigator.location.watchPostion() or call getCurrentPostion() over and over again. watchPostion() is the proper W3C API for doing what I want, but practically, it seems to be overkill.

Here's my code:

var map = null;
var marker = null;
var layer = null;

function locFn(pos) {

  var lat = pos.coords.latitude;
  var lon = pos.coords.longitude;

  $("#hlat").val(lat);
  $("#hlong").val(lon);

  document.getElementById("lnkMap").href = 
    "http://maps.google.com/maps?q=My+Loc@" + lat
    + "," + lon + "&z=18&t=h";

  var point = new GLatLng(lat, lon);

  if (pos.coords.accuracy < 100) {
    map.setCenter(point, 18);

    if (marker != null) {
      marker.setLatLng(point);
    }
    else {
      var ico = new GIcon();
      ico.image = "img/Blue-Dot.png";
      ico.iconSize = new GSize(22, 22);
      ico.iconAnchor = new GPoint(11, 11);
      marker = new GMarker(point, { icon: ico });
      layer = map.addOverlay(marker, { title: "You are here." });
    }
  }
  else if (pos.coords.accuracy > 2000) {
    if (marker != null) { marker.setLatLng(point); }
    map.setCenter(point, 15);
  }
  else if (pos.coords.accuracy > 900) {
    if (marker != null) { marker.setLatLng(point); }
    map.setCenter(point, 16);
  }
  else if (pos.coords.accuracy > 100) {
    if (marker != null) { marker.setLatLng(point); }
    map.setCenter(point, 17);
  }
}

function locFail() {
  //alert("Failed to retrieve location.");
}

var watchID = null;

function processPoints() {
  map = new GMap2(document.getElementById("map_canvas"), 
                  { mapTypes: [G_HYBRID_MAP] });
  try {
    watchID = navigator.geolocation.watchPosition(locFn, locFail,
          { enableHighAccuracy: true });
  }
  catch(err) { /* desktop?*/ }
}
$(function(){processPoints();});

I've noticed watchPostion() seems to ultimately result in more accuracy (after a while), but I'm wondering if the position changes so fast that it results in a lot of thing being downloaded to my map canvas, with constant http requests that are soon out-of-date, replaced by the new ones coming in. When I use watchPosition(), it does take a while before the page loads.

解决方案

After some serious testing, I have verified watchPosition() will give you an accurate location much more quickly than getCurrentPostion() over and over again. When using watchPostion(), the map behaves poorly if you redraw it over and over again every time the device updates your location. To get around this, I have added a listener to the tilesloaded event, which allows me to only redraw the map if there is not already a thread trying to draw on the map. Once the user is happy with the determined location, I will clear the watch. This will get me the best of both worlds, as far as battery consumption and accuracy are concerned.

这篇关于使用setTimeout调用watchPosition()和getCurrentPosition()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆