2009-12-22 26 views
22

Birinin yerini 50m içinde belirlemem gerek. navigator.location.watchPostion() kullanmalı mıyım yoksa tekrar getCurrentPostion() numaralı telefonu arayayım mı diye merak ediyorum. watchPostion(), istediğimi yapmak için uygun W3C API'sıdır, ancak pratik olarak, aşırı bir şekilde görünüyor. İşte watchPosition() vs getCurrentPosition() ile setTimeout

benim kod:

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/[email protected]" + 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();}); 

ben watchPostion() sonuçta (bir süre sonra) daha doğru yol gibi görünüyor fark ettik, ama pozisyon o kadar hızlı bir sürü neden olduğu değişiklikleri merak ediyorum Harita tuvalime yüklenen şey, yakında güncel olmayan sabit http istekleri ile gelen yenileriyle değiştirilir. watchPosition()'u kullandığımda, sayfanın yüklenmesinden önce biraz zaman alır.

+0

Çözümünüzün tam HTML + Javascript'inin bir örneğini gönderebilmenin herhangi bir yolu var mı? Dinleyici ve enableContinuousZoom() çağrıları dahil mi? GMap2'ye aşina değilim ve bu yüzden mühendisliği tersine çevirmek zorundayım ... Ama bir gün ayakkabımı başka birisine kurtarabilirim. Bir gün ... – ftrotter

+0

Sam'e cevap verdiğim yorumu kontrol edin. – devlord

+0

Belgelere bakıldığında, GetCurrentPosition (ASAP başarı işleyicisini çalıştıran) ve WatchPosition (kullanıcının tüm sayfada çalışacağı şekilde tasarlanan) uçları arasında eksik bir şey var gibi görünüyor. GetCurrentPosition çağrısında bu doğruluğu ya da zaman aşımı için bekleyen bir 'doğruluk eşiği' seçeneğini isterdim. Bunu daha önce hiç kimse bunu WatchPosition kullanarak oluşturmadıysa, şimdi bunu yapacağım. –

cevap

17

Bazı ciddi sınamalardan sonra, watchPosition() öğesinin doğru bir yere tekrar getCurrentPostion() öğesinden daha hızlı bir şekilde doğrulayacağını doğruladım. WatchPostion() işlevini kullanırken, cihaz konumunuzu her güncellediğinde tekrar tekrar çizerseniz harita kötü davranır. Bunu aşmak için, harita üzerinde çizim yapmaya çalışan bir konu yoksa haritayı yeniden çizmeme izin veren fayans yüklü olaya bir dinleyici ekledim. Kullanıcı belirlenen konumdan memnun olduğunda, saati temizlerim. Bu, pil tüketimi ve doğruluğu söz konusu olduğunda, her iki dünyanın da en iyisini alacağım.

12

Her defasında getCurrentLocation çağrısı yaptığınızda, birkaç saniye süren gps döndürülür. Eğer watchPosition'ı çağırırsanız ve kesin bir doğruluk elde edene kadar beklerseniz, daha iyi sonuç alacağınız saatinizi, sabit bir saatin tepesi olmadan çıkarın.

İlgili konular