Я должен определить местоположение человека в 50 м. Я задаюсь вопросом, должен ли я использовать navigator.location.watchPostion()
или звоните getCurrentPostion()
много раз. watchPostion()
надлежащий 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()
, это действительно требует времени перед загрузками страницы.
После серьёзного тестирования я проверил, что функция watchPosition() даст вам точное местоположение намного быстрее, чем getCurrentPostion() снова и снова. При использовании функции watchPostion(), карта ведет себя плохо, если вы перерисовываете её снова и снова каждый раз, когда устройство обновляет ваше местоположение. Чтобы обойти это, Я добавил слушателя к событию загрузки плиток, что позволяет мне перерисовывать карту только в том случае, если еще нет нити, пытающейся нарисовать на карте. Как только пользователь будет доволен определенным местоположением, я очищу часы. Это позволит мне получить лучшее из обоих миров, что касается потребления батареек и точности.
.Каждый раз, когда вы вызываете getCurrentLocation, запускается GPS, что занимает несколько секунд. Если вы вызовете watchPosition и подождете, пока не получите определенную точность, а затем снимите часы, вы получите лучшие результаты без накладных расходов, связанных с постоянными часами.