W3C геолокация возвращает кэшированные координаты - PullRequest
0 голосов
/ 25 октября 2018

У меня есть расширение Chrome, которое использует W3C Geolocation API для определения местоположения пользователя.Расширение в основном используется в Chromebook.

Я заметил, что API, по-видимому, большую часть времени возвращает одни и те же координаты (кэшируются?), Хотя у меня для параметра MaximumAge установлено значение 0. Я проверял это с помощьюразвернув расширение на Chromebook в местоположении # 1, затем перенес устройство в расположение # 2, которое находится на расстоянии около 1 километра.Там API был вызван снова, и он вернул те же координаты, что и раньше.Некоторое время спустя (у меня это было с 10-минутным интервалом), оно вернуло правильные координаты, но когда я вернулся в местоположение # 1, я снова получил кэшированные координаты, на этот раз из местоположения # 2.

Я пыталсяс getCurrentPosition, watchPosition и несколькими комбинациями объекта параметров, но всегда кажется, что он дает один и тот же результат.

Мой текущий код выглядит следующим образом:

function getGeolocation() {
  return new Promise((resolve, reject) => {
    const options = { enableHighAccuracy: true, timeout: 30000, maximumAge: 0 };
    navigator.geolocation.getCurrentPosition(resolve, reject, options);
  });
}

getGeolocation()
  .then(position => handler(position))
  .catch(err => console.error(err));

Мне нужноэто, чтобы вернуть правильные координаты с первой попытки или в течение разумного короткого периода времени.Любой совет?

Спасибо!

РЕДАКТИРОВАТЬ:

Заметьте, что изменение координат на вкладках датчиков браузера работает идеально каждый раз, но в реальной ситуации кажется, что возвращаемые кешированные результаты просто возвращаются вбольшинство случаев.

РЕДАКТИРОВАТЬ (5 ноября):

После еще одного тестирования кажется, что это происходит только на Chrome OS.Мы не можем воспроизвести такое же поведение на ПК (с расширением или без него).

1 Ответ

0 голосов
/ 02 ноября 2018

Вот некоторая информация, которую я собрал, исследуя W3C Geolocation API .

Сначала я запустил пример кода Wikipedia внизу страницы.Он почти такой же, как ваш код, только вы используете Promise .Оттуда я получил позицию широта и долгота с методом getCurrentPosition () .Метод watchPosition () также работал.

Я проверил это на своем ПК и отобразил результаты в консоли разработчика Chrome.Он также работал на моем мобильном телефоне во время ходьбы (последние несколько цифр менялись по широте и долготе).

Относительно интерфейса PositionOptions , чтение из ваших опций, время ожидания, которое может пройтиот вызова getCurrentPosition () или watchPosition () до вызова successCallback, которое составляет 30000 миллисекунд (30 секунд), и так как MaximumAge равно 0, он не будет использовать кэшированные расположения, вместо этого он должен немедленно попытаться получить новый объект позиции.

Теперь для важной детали.


enableHighAccuracy дает подсказку, что приложение хотело бы получить лучшийвозможные результаты.Но есть способы, которыми это определяется (проверьте статью в Википедии в начале, выделите «Источники местоположения»):

  1. GPS (Система глобального позиционирования) - имеетвысочайшая точность;в большинстве смартфонов Android точность может достигать 10 м.

  2. Отслеживание мобильного телефона - используется, если мобильный телефон или беспроводной модем используется без встроенного чипа GPS

  3. Система определения местоположения WiFi

  4. Расположение IP-адреса

Существует также точность позиционирования , которая дает точность в метрах .На моем ПК я получил точность около 100 000 метров, поэтому он не имеет значения широты и долготы (найдите его на картах Google, введите «широта, долгота» и посмотрите, куда указывает маркер. Также, console.log (position.скор. точность) ).На моем мобильном телефоне он находился на расстоянии 15–50 м.

Смартфон использует информацию о местоположении GPS, а ПК - местоположение в сети.Я не очень разбираюсь в Chromebook, но нашел этот ответ:

В настоящее время Chromebook не поддерживает функцию GPS.Но вы можете сообщить сайту ваше местоположение.Если вы используете Google в качестве поисковой системы по умолчанию на своем телефоне, ваше местоположение по умолчанию используется для поиска в Google.Если вы разрешите Chrome поделиться своим местоположением с сайтом, Chrome отправит информацию в Службу определения местоположения Google, чтобы получить оценку вашего местоположения.Затем Chrome может поделиться этой информацией с сайтом, который хочет узнать ваше местоположение.

Существуют и другие способы определения местоположения, см. API геолокации Карт Google .Кроме того, попробуйте найти различия между этими двумя .Надеюсь, это поможет в любом случае.

С уважением.

...