watchPosition()和getCurrentPosition()在使用setTimeout时有何区别?

29
我需要确定一个人的位置在50米以内。 我想知道我是否应该使用 navigator.location.watchPosition() 或反复调用 getCurrentPosition()watchPosition() 是我想要做的正确的 W3C API,但实际上,它似乎有点过度设计。
以下是我的代码:
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();});

我注意到watchPostion()似乎最终会导致更高的精度(经过一段时间后),但我想知道位置变化是否如此之快,以至于会下载大量内容到我的地图画布中,并且存在不断的HTTP请求,这些请求很快就会过时,被新的请求所替换。当我使用watchPosition()时,页面加载需要一段时间。


你能否提供一个完整的HTML+Javascript示例,包括listener和enableContinuousZoom()调用?我对GMap2不熟悉,所以我需要进行逆向工程...但这可能会在未来为其他人节省一些工作... - ftrotter
请查看我在下面回复Sam的评论。 - devlord
看文档似乎在 GetCurrentPosition(立即运行成功处理程序)和 WatchPosition(设计为用户在页面上的整个时间内运行)的极端之间缺少一些东西。我希望在 GetCurrentPosition 调用中有一个“准确度阈值”选项 - 等待此准确度或超时。除非其他人已经使用 WatchPosition 创建了这个选项,否则我猜现在我会这样做。 - Ian Grainger
2个回答

24

经过严格测试,我验证了watchPosition()比反复使用getCurrentPosition()更快地提供准确位置。使用watchPosition()时,如果每次设备更新位置就不停重新绘制地图,则地图的表现将变得非常糟糕。为了解决这个问题,我添加了一个侦听器到tilesloaded事件,这样我只需在没有线程尝试在地图上绘制时才重新绘制地图。一旦用户确定了位置,我就会清除watch。这将使我在电池消耗和准确性方面获得最佳效果。


12

每次调用getCurrentLocation函数时,需要启动GPS定位功能,这需要花费一些时间。如果你使用watchPosition函数,并等待达到一定精度后再停止watch,你将获得更好的结果,而且不需要持续监控的额外开销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接