watchPosition () против getCurrentPosition () с setTimeout - PullRequest
24 голосов
/ 22 декабря 2009

Мне нужно определить местонахождение человека в пределах 50м. Мне интересно, должен ли я использовать navigator.location.watchPostion() или звонить getCurrentPostion() снова и снова. watchPostion() - это правильный API W3C для выполнения того, что я хочу, но практически это кажется излишним.

Вот мой код:

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(), загрузка страницы занимает некоторое время.

Ответы [ 2 ]

19 голосов
/ 29 декабря 2009

После серьезного тестирования я убедился, что watchPosition () даст вам точное местоположение намного быстрее, чем getCurrentPostion () снова и снова. При использовании watchPostion () карта ведет себя плохо, если вы перерисовываете ее снова и снова каждый раз, когда устройство обновляет ваше местоположение. Чтобы обойти это, я добавил слушателя к событию загруженных плиток, которое позволяет мне перерисовывать карту только в том случае, если на карте уже нет потока, пытающегося нарисовать. Как только пользователь будет доволен выбранным местоположением, я очищу часы. Это даст мне лучшее из обоих миров, что касается потребления батареи и точности.

12 голосов
/ 11 августа 2010

Каждый раз, когда вы вызываете getCurrentLocation, gps запускается, что занимает несколько минут. Если вы вызываете watchPosition и ждете, пока не получите определенную точность, то снимите ваши часы, и вы получите лучшие результаты без затрат на постоянные часы.

...