我有一个基于wordpress的网站(aboutmyjourney.com),该网站使用Maps Marker Pro插件在火车上旅行时可以在地图上跟踪和显示用户的位置。 (“地图标记”显示带有点击按钮的地图,以打开/关闭位置显示)。从其行为,我可以看到启用了高精度(GPS)。
当我单击以开始跟踪火车旅程中的位置时,它可以在几分钟内正常运行,但随后常常变得不稳定-有时它更新很快,但有时却冻结了几分钟。听起来好像没有足够好的GPS信号来进行修复,也没有可用的移动网络天线杆位置,但是.....
...我还有一个完全独立的Android应用程序,可以跟踪位置。这会使用Google Play服务每20秒请求一个位置,然后让广播接收器侦听返回的位置响应。如果我在使用网站时让此应用运行,则地图上的位置不再冻结,而是每20秒作为发条定期更新。由此我得出以下结论:1. GPS /地理位置在我的移动设备上运行正常,并且2.我网站上的地图插件正在接收由我的应用触发的位置广播。
因此,对于我(新手网站开发人员)来说,似乎浏览器地理位置API并不总是提供定期的位置更新,即使我知道应该可以,因为我的应用程序的Android / Google Play服务地理位置可以定期进行可靠的位置定位。
我使用的浏览器是Chrome,可在Android设备上运行(我已经在多个设备上尝试过)。
有人可以帮助我了解这里的情况吗?是否有解决方法可以改善浏览器地理位置API的性能?
经过大量的实验,我发现了问题所在,并且找到了解决方法,以防万一它与其他人有关。
问题是mapsmarker插件仅使用粗略(手机信号塔)位置,无法启动高精度(GPS)。这导致位置不会更新,直到移动连接翻转到新的手机信号塔为止(这可能需要几分钟的时间),而且如果火车处于没有移动接收的死区中,则根本不会更新。
但是,插件确实可以响应由其他软件触发的任何位置定位广播。因此,解决方法是使用navigator.geolocation.watchPosition()包含一些单独的javascript代码,以启动高精度GPS定位。然后,地图插件会使用由此产生的频繁的GPS修复程序,并平稳,有规律地进行更新,完全没有问题。
如果它对像我这样的新手有帮助,我使用的代码如下:
主网页正文上的代码以创建一个按钮来打开和关闭GPS:
<a href="#" class="button1" id="trackbutton" onclick="trackToggle();">USE GPS</a>
在其他CSS中定义的按钮1:
.button1 {
display: inline-block;
padding-left:15px;
padding-right:15px;
border-radius: 20px;
font-weight: bold;
font-size:12pt;
text-align:center;
background: red;
color:black;
}
按钮触发的代码段,用于打开和关闭GPS。调用最后两个代码段之一:
<script type="text/javascript">
var gpsTrack = new Boolean(false);
function trackToggle(){
if (gpsTrack==false) {
rptFind();
gpsTrack=true;
} else {
stopFind();
gpsTrack=false;
};
};
</script>
打开GPS的代码段(在页面正文中定义为id =“ latlon”的点处以文本形式显示位置,并更改按钮文本)
<script type="text/javascript">
var posID=0;
var myLat=0;
var myLon=0;
var geoError = function(error) {
if (error.code<3){//[0=unknown 1=disallowed 2=unavailable 3=timeout]
alert("There was a problem with GPS tracking. Click the button to stop
GPS, then try again);
}
};
var geoOptions = {
enableHighAccuracy: true,
maximumAge: 1000,
timeout: 60000
};
var getpos=function(position){
document.getElementById("trackbutton").innerHTML="STOP GPS";
myLat=position.coords.latitude;
myLon=position.coords.longitude;
document.getElementById("latlon").innerHTML = "Postion Lat:"+position.coords.latitude+" Lon:"+position.coords.longitude;
}
function rptFind(){
if ("geolocation" in navigator){
posID=navigator.geolocation.watchPosition(getpos,geoError,geoOptions);
} else {
alert("Your browser doesn't appear to support geolocation");
}
}
</script>
代码段可关闭GPS :(清除位置显示并更改按钮文字)
<script type="text/javascript">
var stopOptions = {
enableHighAccuracy: false,
maximumAge: 500,
timeout: 1000
};
var stopError = function(error) {//ignore error
};
var stopPos=function(position){
document.getElementById("latlon").innerHTML = "";
document.getElementById("trackbutton").innerHTML="USE GPS";
}
function stopFind(){
navigator.geolocation.clearWatch(posID);
navigator.geolocation.getCurrentPosition(stopPos,stopError,stopOptions);
}
</script>