Почему геолокация на моем плагине карты Wordpress нестабильна? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть веб-сайт на основе wordpress (aboutmyjourney.com), который использует плагин Maps Marker Pro для отслеживания и отображения местоположения пользователя на карте во время поездки на поезде. (Маркер карты отображает карту с кнопкой, которую нужно нажать, чтобы включить или выключить отображение местоположения). По его поведению видно, что включена высокая точность (GPS).

Когда я нажимаю, чтобы начать отслеживать местоположение на поезде, он работает нормально в течение нескольких минут, но затем часто становится неустойчивым - иногда он обновляется быстро, но иногда он останавливается на несколько минут. Это может звучать так, как если бы для исправления не было достаточно хорошего сигнала GPS, и нет доступного местоположения мачты мобильной сети, НО .....

... У меня также есть совершенно отдельное приложение для Android, которое отслеживает местоположение. Это запрашивает местоположение каждые 20 секунд с использованием Google Play Services, а затем получает широковещательный приемник для прослушивания ответа о местоположении. Если я оставлю это приложение запущенным во время использования веб-сайта, то положение на карте больше не будет зависать, а будет регулярно обновляться как часовой механизм, каждые 20 секунд. Из этого я заключаю, что: 1. GPS / геолокация работает нормально на моих мобильных устройствах, и 2. Плагин карты на моем веб-сайте получает трансляцию местоположения, которая запускается моим приложением.

Поэтому мне (начинающему разработчику веб-сайта) кажется, что API геолокации браузера не всегда обеспечивает регулярное обновление позиций, хотя я знаю, что это возможно, поскольку геолокация моего приложения для Android / Google Play Services позволяет получить регулярные, надежные исправления положения.

Я использую браузер Chrome, работающий на устройствах Android (я пробовал его на нескольких устройствах).

Может кто-нибудь помочь мне понять, что здесь происходит? Есть ли обходной путь, который улучшит производительность API геолокации браузера?


После долгих экспериментов я обнаружил проблему, а также нашел способ ее обойти, которой я поделюсь, если она актуальна для всех остальных:

Проблема заключалась в том, что плагин mapsmarker использует только грубое местоположение (вышка сотовой связи) и не может инициировать высокую точность (GPS). Это приводит к тому, что местоположение не обновляется до тех пор, пока мобильное соединение не переключится на новую вышку сотовой связи, что может занять несколько минут, и вообще не будет обновлений, если поезд находится в мертвой зоне без приема на мобильные устройства.

Однако плагин реагирует на любые трансляции с исправлением местоположения, инициированные другим программным обеспечением. Поэтому обходной путь должен был включать некоторый отдельный код javascript с помощью navigator.geolocation.watchPosition (), который инициирует высокоточное определение местоположения GPS. Затем плагин карты использует полученные частые исправления GPS и обновляется плавно и регулярно, без проблем.

В случае, если это полезно для таких новичков, как я, код, который я использовал, был следующим:

Код в теле основной веб-страницы для создания кнопки для включения и выключения GPS:

<a href="#" class="button1" id="trackbutton" onclick="trackToggle();">USE GPS</a>

кнопка 1 определена в дополнительном CSS:

.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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...