HTML5 地理位置 watchPosition 只被调用一次

Posted

技术标签:

【中文标题】HTML5 地理位置 watchPosition 只被调用一次【英文标题】:HTML5 geolocation watchPosition getting called just once 【发布时间】:2014-05-16 17:13:20 【问题描述】:

我正在使用 html 5 创建一个 android 应用程序,并且我想在用户移动时从用户那里访问 latlong。我使用了 watchPostion,但它只给了我一次用户位置。

    var watchID;
var geoLoc;

function showLocation(position) 
  var latitude = position.coords.latitude;
  var longitude = position.coords.longitude;

    var ll=new google.maps.LatLng(latitude, longitude);
    map.setCenter(ll);

  console.log("Latitude : " + latitude + " Longitude: " + longitude);


function errorHandler(err) 
  if(err.code == 1) 
    console.log("Error: Access is denied!");
  else if( err.code == 2) 
    console.log("Error: Position is unavailable!");
  
    
    if(navigator.geolocation)
      // timeout at 60000 milliseconds (60 seconds)
      var options = timeout:60000;
      geoLoc = navigator.geolocation;
      watchID = geoLoc.watchPosition(showLocation, 
                                     errorHandler,
                                     options);


   else
      console.log("Sorry, browser does not support geolocation!");
   

【问题讨论】:

【参考方案1】:

几个月前我一直在做类似的事情。我记得有同样的问题。也许这会有所帮助。

$(document).ready(function()  
    initLocationProcedure();


function initLocationProcedure() 
    map = new google.maps.Map(document.getElementById('map_canvas'), 
          zoom : 17
    );

    if (navigator.geolocation) 
        navigator.geolocation.getCurrentPosition(displayAndWatch, locError, 
            enableHighAccuracy : true,
            timeout : 60000,
            maximumAge : 0
        );
     else 
        alert("Your phone does not support the Geolocation API");
    


function displayAndWatch(position) 
    // set current position
    setUserLocation(position);
    // watch position
    watchCurrentPosition();


function setUserLocation(pos) 
    // marker for userLocation
    userLocation = new google.maps.Marker(
           map : map,
           position : new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude),
           title : "You are here",
           icon : "../img/user-location.svg",
    // scroll to userLocation
    map.panTo(new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude));
);

这就是你要找的东西

function watchCurrentPosition() 
    var positionTimer = navigator.geolocation.watchPosition(function(position) 
        setMarkerPosition(userLocation, position);
        map.panTo(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
    );


function setMarkerPosition(marker, position) 
     marker.setPosition(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
     console.log(position);

小提琴http://jsfiddle.net/XEFks/

【讨论】:

嗨 Barto,我尝试使用您的代码,但仍然遇到同样的问题。我在移动浏览器上尝试了代码,它工作正常,但在桌面浏览器上我只得到一次位置。 我把它放在了小提琴jsfiddle.net/XEFks,如果你打开页面并查看控制台,你应该会看到更新位置(控制台中会有一个 Gelocation 对象)。它不会每秒更新一次,因为首先设置了位置,当找到更好的位置时,会更新第一个位置,依此类推。 (肯定在这里工作) 好的。所以你的意思是如果位置没有更新,那么在位置改变之前我将无法获得位置。所以简而言之,不可能在桌面上重复获取位置,因为它不会改变它的位置? 不,不是直接来自导航器对象。当然,您可以反复调用getCurrentPosition() 来返回您的坐标。【参考方案2】:

您需要确保调用带有 id 的 Geolocation.clearWatch() 方法,以便它重置位置。

请看下面的例子:

Web/API/Geolocation.watchPosition

Geolocation.watchPosition() 方法用于注册一个处理函数,该处理函数将在每次设备位置发生变化时自动调用。您还可以选择指定错误处理回调函数。

此方法返回一个监视 ID 值,该值可用于通过将其传递给 Geolocation.clearWatch() 方法来取消注册处理程序。

语法

var id, target, option;

function success(pos) 
  var crd = pos.coords;

  if (target.latitude === crd.latitude && target.longitude === crd.longitude) 
    console.log('Congratulation, you reach the target');
    navigator.geolocation.clearWatch(id);
  
;

function error(err) 
  console.warn('ERROR(' + err.code + '): ' + err.message);
;

target = 
  latitude : 0,
  longitude: 0,


options = 
  enableHighAccuracy: false,
  timeout: 5000,
  maximumAge: 0
;

id = navigator.geolocation.watchPosition(success, error, options);

您也可以尝试像下面这样包装 clear 函数。还将其设置为 null 将确保它得到更新。

// clear the watch that was started earlier
// 
function clearWatch() 
    if (watchID != null) 
        navigator.geolocation.clearWatch(watchID);
        watchID = null;
    

【讨论】:

还是不行。我使用了 clearWatch,但我不明白为什么我的代码不起作用。 你用过clearwatch(watchID);像这样。传入原始ID? 是的。我就这样用过。 我刚刚将 successfunction 替换为 `function success(pos) var crd = pos.coords; if (target.latitude === crd.latitude && target.longitude === crd.longitude) console.log('恭喜你到达目标'); navigator.geolocation.clearWatch(watchID);手表ID = null; ; ` 谢谢@SoftwareCarpenter!工作完美。快乐编码:)【参考方案3】:
function watchCurrentPosition() 
    var positionTimer = navigator.geolocation.watchPosition(function(position) 
        setMarkerPosition(userLocation, position);
        map.panTo(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
    );

这肯定会有所帮助..

【讨论】:

以上是关于HTML5 地理位置 watchPosition 只被调用一次的主要内容,如果未能解决你的问题,请参考以下文章

HTML 5 地理位置 watchPosition

如果您调用 watchPosition 并更改页面而不调用 clearWatch 会发生啥?

距离回调的 HTML5 地理位置

带有 html 5 观察位置的谷歌地图(防止地图刷新)

iPhone 上的 HTML5 地理定位问题

IOS6 地理位置 watchPosition 回调失败