Что такое код getcurrentposition


Содержание

Geolocation getCurrentPosition() API

Description

The getCurrentPosition method retrieves the current geographic location of the device. The location is expressed as a set of geographic coordinates together with information about heading and speed. The location information is returned in a Position object.

Syntax

Here is the syntax of this method −

Parameters

Here is the detail of parameters −

showLocation − This specifies the callback method that retrieves the location information. This method is called asynchronously with an object corresponding to the Position object which stores the returned location information.

ErrorHandler − This optional parameter specifies the callback method that is invoked when an error occurs in processing the asynchronous call. This method is called with the PositionError object that stores the returned error information.

options − This optional parameter specifies a set of options for retrieving the location information. You can specify (a) Accuracy of the returned location information (b) Timeout for retrieving the location information and (c) Use of cached location information.

Return value

The getCurrentPosition method does not return a value.

Геолокация

Геолокация позволяет определять географическое местоположение посетителей веб-сайта. И это не означает просто страну или даже город, в котором находится посетитель. Геолокация может сузить информацию о местоположении человека к городскому кварталу или даже определить его точные координаты, если он зашел на страницу со смартфона.

Все основные браузеры предоставляют хороший уровень поддержки геолокации:

Браузерная поддержка возможности геолокации

Браузер IE Firefox Chrome Safari Opera Safari iOS Android
Минимальная версия 9 3.5 5 5 10.6 3.2 2.1

Большинство новых возможностей JavaScript, которые мы рассмотрели ранее, были частью первоначальной спецификации HTML5, а потом были отделены, когда спецификацию передали в ведение организации W3C. Но геолокация никогда не была частью HTML5, а просто полностью сформировалась приблизительно в то же самое время. Но почти все рассматривают эту возможность вместе с возможностями HTML5, как часть одной большой волны будущих технологий.

Принцип работы геолокации

Возможность геолокации вызывает довольно много вопросов у людей, которых обычно нельзя назвать параноиками. Например, каким образом может какое-то программное обеспечение знать, что я не болею, как я сказал своему начальнику, а смотрю футбол в кафе? В нем что, есть какой-то скрытый код, который отслеживает все мои действия? Интересно, что это за фургон там на улице и те люди, которые прикидываются, будто бы они меняют колесо?

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

Веб-страница хочет получить данные о местоположении посетителя. Посетитель может разрешить предоставлять эти данные или же не предоставлять их. Такое поведение браузера Chrome не является собственной инициативой его разработчиков, а официальным правилом стандарта геолокации, требующим, чтобы каждый веб-сайт, пытающийся получить данные о местоположении посетителя, получил для этого его разрешение.

Чтобы вычислить местоположение посетителя, браузер заручается помощью , например, для Chrome это сервис Google Location Services. Определение местоположения является задачей не из легких, и поставщик применяет несколько разных подходов для ее решения.

В случае настольного компьютера с фиксированным (т.е. небеспроводным) подключением, метод простой, но дает не очень точные результаты. Когда кто-то подключается к интернету, данные с его компьютера или локальной сети направляются (через кабель, выделенную линию или коммутируемое телефонное соединение) на мощное сетевое аппаратное устройство, которое, в свою очередь, направляет их в интернет. Это аппаратное устройство имеет однозначный IP-адрес, т.е. числовой код, который идентифицирует это устройство для других участников сети. Это устройство также имеет физический почтовый адрес.

Поставщик местоположения использует эти два типа информации для определения географического местоположения посетителя веб-страницы. Сначала вычисляется IP-адрес устройства, через которое осуществляется подключение, а затем определяется его физический адрес. Естественно, такой непрямой подход позволяет определить точное местоположение не пользователя, а только его интернет-провайдера.

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

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

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

А в случае подключения с мобильного телефона поставщик местоположения применяет подобный метод триангуляции, но использует сигналы от разных антенн мобильной связи. Эта быстрая, сравнительно эффективная процедура обычно позволяет определить местоположение посетителя с точностью до 1 км.

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

Конечно же, возможны и другие способы определения местоположения. Ничто не препятствует поставщику местоположения использовать для этого другие источники информации, такие как данные от RFID-устройств (Radio Frequency Identification — радиочастотная идентификация), данные от устройств Bluetooth, файлы cookies с информацией от картографического сайта наподобие Google Maps и т.п.

Из всего этого можно сделать следующий вывод: независимо от способа подключения к интернету, даже если посетитель веб-сайта сидит за настольным компьютером, возможность геолокации позволяет определить его местонахождение с большей или меньшей точностью. А если он выходит в интернет с мобильного телефона или с устройства, оснащенного аппаратным обеспечением GPS, его местоположение может быть определено с точностью скорее большей, чем меньшей.

В каких сферах применять геолокацию?

Ответив на большой вопрос, как работает геолокация, нам нужно разобраться еще с одним: какая нам от нее польза?

Здесь ключевым аспектом, который нужно понимать, является то, что функциональность геолокации позволяет определить приблизительные географические координаты посетителя страницы. И это все. Веб-разработчик должен объединить эту простую, но важную информацию с более подробными данными о местоположении посетителя. Эти данные можно получить от веб-сервера (обычно из огромной серверной базы данных) или какой-либо географической веб-службы (скажем, Google Maps).

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


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

Хотя картографические и географические услуги, предоставляемые другими компаниями, довольно обширны, мы рассмотрим одну из них — Google Maps — чуть позже.

Определение координат посетителя

Возможность геолокации предельно проста. Она состоит из трех методов объекта : getCurrentPosition(), watchPosition() и clearWatch().

Объект navigator — это сравнительно незначительная часть JavaScript. Его несколько свойств предоставляют информацию о текущем браузере и его возможностях. Наиболее полезным из них является свойство navigator.userAgent, которое предоставляет информационную строку, содержащую подробные данные о браузере, его версии, а также операционной системы, в которой он выполняется.

Для получения местоположения посетителя вызывается метод getCurrentPosition(). Но следует понимать, что процесс определения местоположения занимает определенное время, в течение которого никакой уважающий себя браузер не остановит всю деятельность на странице, пока ожидает эти данные. Поэтому метод getCurrentPosition() исполняется асинхронно, т.е. после его запуска продолжается выполнение следующего за ним кода. Когда определение местоположения завершится, для обработки результатов активируется другой фрагмент кода.

Можно ожидать, что завершение определения местоположения сопровождается извещением, во многом подобном тому, как сообщается об окончании загрузки изображения или чтения текстового файла. Но язык JavaScript можно назвать каким угодно, но только не последовательным. И при вызове метода getCurrentPosition() ему передается .

Далее приведен пример вызова этого метода:

При исполнении этот код вызывает метод getCurrentPosition() и передает ему функцию. Когда браузер завершит процесс определения местоположения, он активирует эту функцию, которая выводит окно сообщения:

Не забывайте: использование геолокации допустимо только в том случае, если браузер поддерживает эту возможность и посетитель разрешит ее применение. Также разумно протестировать страницу, применяющую эту возможность, прежде чем размещать ее на веб-сервере для практического применения. В противном случае могут возникнуть проблемы (например, не будет функционировать обработка ошибок геолокации), и некоторые браузеры вообще не смогут определить местоположение пользователя.

Определение точности предоставленного местоположения

При успешном выполнении метода getCurrentPosition() код получает объект position, который имеет два свойства: timestamp (содержит время выполнения геолокации) и coords (содержит географические координаты).

Но свойство coords в свою очередь является подобъектом объекта position и кроме свойств latitude и longitude, определяющих географические координаты посетителя, имеет еще несколько других свойств, предоставляющих дополнительную информацию о местоположении. Это такие свойства, как altitude (высота над уровнем моря), heading (направление движения) и speed (скорость). Но на данный момент эти свойства не поддерживаются ни одним браузером.

Более интересным является свойство accuracy, которое указывает точность определенного местоположения в метрах. (Это означает, что по мере понижения точности данных местоположения значение свойства accuracy возрастает, что может несколько сбивать с толку.) Например, значение свойства accuracy, равное 2135 метрам, означает, что местоположение пользователя было определено в пределах этого расстояния.

Илон Маск рекомендует:  md5 - Возвращает MD5 хэш строки

Свойство accuracy полезно для определения качества результатов геолокации. Например, если значение свойства accuracy измеряется десятками километров, данные геолокации вряд ли имеют какую-либо практическую ценность:

В таком случае, возможно, разумно известить пользователя о неопределенных данных его местоположения и/или предложить ему ввести правильную информацию самому.

Обработка ошибок

Функциональность геолокации не срабатывает, если посетитель отказывается дать разрешение на ее применение. В таком случае функция завершения в нашем примере не вызывается и страница не будет знать, то ли браузер все еще пытается определить местоположение или же произошла ошибка в исполнении кода.

Для решения этой проблемы при вызове метода getCurrentPosition() ему нужно передавать не одну функцию, а две. Первая функция, как мы уже рассмотрели, вызывается в случае успешного завершения процесса геолокации. В противном же случае вызывается вторая функция. Далее приведен пример с использованием этих двух функций:

При вызове функции ошибки геолокации браузер передает ей объект ошибки, который имеет два свойства: code (содержит числовой код, указывающий один из четырех типов ошибки) и message (содержит короткое извещение о проблеме). Обычно извещение предназначено для тестирования, а код ошибки используется кодом функции для определения, каким образом решать данную проблему.

Модифицированная функция ошибки, которая проверяет все возможные значения кода ошибки, выглядит так:

Установка параметров геолокации

Итак, мы рассмотрели, как вызывать метод getCurrentPosition() с двумя параметрами: функцией для обработки успеха геолокации и функцией для обработки ошибки при попытке ее выполнения. Но этому методу можно передавать еще один параметр, коим является объект, устанавливающий определенные параметры геолокации.

В настоящее время можно установить три параметра, каждый из которых соответствует отдельному свойству объекта параметров геолокации. В следующем примере устанавливается один параметр enableHighAccuracy:

А в этом примере устанавливаются все три параметра:

В обоих этих примерах параметры геолокации устанавливаются посредством литералов объектов JavaScript.

Что же означают эти свойства? Свойство enableHighAccuracy задействует высокоточное определение местоположения, используя систему GPS (если устройство поддерживает эту возможность и посетитель разрешил ее использование). Не устанавливайте этот параметр, если только вам не требуется получить точные координаты, т.к. ее применение сильно повышает расход заряда аккумулятора устройства браузера. По умолчанию свойству enableHighAccuracy присваивается значение false.

Свойство timeout определяет период времени, в течение которого страница будет ожидать получения данных геолокации, прежде чем считать попытку неудачной.

Значения timeout устанавливается в миллисекундах, т.е. 10 000 мс означает максимальное ожидание 10 с. Отсчет начинается после того, как пользователь согласится предоставить данные геолокации. По умолчанию свойству timeout присваивается 0, означающий, что страница будет ожидать результаты геолокации бесконечно, не активируя ошибку тайм-аута.

Свойство maximumAge позволяет кэширование данных о местоположении. Например, значение maximumAge, равное 60 000 мс, разрешает пользоваться данными геолокации, полученными минуту назад. Это позволяет сэкономить время и вычислительные ресурсы, а также означает, что результаты геолокации будут менее точными, если посетитель перемещается. По умолчанию свойству maximumAge присваивается 0, означающий, что кэшированные результаты геолокации никогда не используются. Свойству можно также присвоить специальное значение infinity, в этом случае будут использоваться кэшированные данные геолокации любой давности.

Отображение карты

Определение географических координат местоположения посетителя веб-сайта — конечно же, интересный трюк. Но он быстро утрачивает свою привлекательность, если мы не найдем этой информации какое-либо полезное применение. За этим дело не станет, т.к. в интернете имеются целые россыпи данных географического местоположения. (Часто проблемой является преобразование этой информации в формат, полезный для веб-приложения.)

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

Используя Google Maps, можно создать карту любого размера любой части мира. Можно управлять взаимодействием посетителей с этой картой, генерировать маршруты для проезда из одной точки в другую и, что наиболее полезно, накладывать на эту карту свою информацию.


Служба Google Maps предоставляет свои услуги на бесплатной основе (даже для коммерческих сайтов) при условии бесплатного доступа к сайту. (Для платных сайтов Google предоставляет платный картографический сервис.) В настоящее время Google Maps не вставляет свою рекламу на сайты, пользующиеся ее услугами, но лицензионные условия явно оговаривают право на это в будущем.

На рисунке ниже показана модифицированная версия страницы геолокации. Здесь полученные географические координаты пользователя служат для отображения его местоположения на карте:

Создание такой страницы не представляет никаких сложностей. Первым делом нам нужна ссылка на сценарии интерфейса API Google Maps. Эта ссылка размещается перед всеми блоками сценариев, которые используют функциональность картографии:

Далее нам будет нужен элемент

Размер карты можно определить с помощью правила таблицы стилей:

Теперь все готово к использованию функциональностей, предоставляемых Google Maps. Первым делом нужно создать поверхность карты. В этом примере карта создается при загрузке страницы, чтобы ее можно было использовать в функциях успеха или ошибки геолокации. (В конце концов, ошибка геолокации означает всего лишь то, что страница не может определить текущее местоположение пользователя. В таком случае все равно имеет смысл отображать карту, но только центрировать ее относительно точки с координатами по умолчанию.)

Далее приведен код, исполняемый при загрузке страницы. Сначала он создает карту, а потом пытается определить местоположение посетителя:

Но созданная этим кодом карта еще не отображается на странице, т.к. еще не установлена географическая позиция. Для этого нужно создать специфическую глобальную точку, используя объект LatLng, которая потом помещается на карту посредством метода setCenter() карты. Далее приведен код, который выполняет все эти действия для координат посетителя:

Этого кода будет достаточно для отображения карты наподобие показанной на рисунке выше. Но к этой базовой карте можно добавить разные примочки, например отображение других мест во врезке или же всплывающее информационное окно. Последнее создается с помощью объекта infoWindow. Далее приведен код для создания и отображения всплывающего информационного окна (как на рисунке выше):

Наконец, в случае ошибки геолокации или отсутствия ее поддержки в браузере посетителя можно выполнить, по сути, те же действия, но используя альтернативные предустановленные координаты вместо координат посетителя:

Отслеживание перемещений посетителя

Во всех рассмотренных нами до сих пор примерах мы использовали метод getCurrentPosition(), являющийся ключевой функциональностью геолокации. Но объект geolocation имеет еще два других метода, которые позволяют отслеживать перемещения посетителя и извещать страницу об этих перемещениях.

Первым из этих методов является метод watchPosition() который в значительной степени похож на метод getCurrentPosition(). Подобно методу getCurrentPosition(), метод watchPosition() принимает параметры: функцию успеха (единственный обязательный параметр) и функцию ошибки:

Разница между этими двумя методами состоит в том, что метод watchPosition() может активировать функцию успеха неоднократно — по определению местоположения в первый раз, а потом каждый раз, когда он обнаруживает новое местоположение. Для настольных компьютеров, которые никогда не перемещаются, методы getCurrentPosition() и watchPosition() имеют абсолютно одинаковый эффект.

Но в отличие от метода getCurrentPosition() метод watchPosition() возвращает число. Это число можно сохранить и передать методу clearWatch(), чтобы прекратить отслеживать перемещения:

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

javascript — navigator.geolocation.getCurrentPosition занимает слишком много времени для выполнения

Я работаю над сайтом, который помимо прочего должен рассчитывать расстояние между пользователем (мобильным устройством или компьютером) и определенными ресторанами. Значения широты и долготы для каждого ресторана хранятся в таблице базы данных. Вот функции, которые я использую для расчета широты и долготы устройства:

(Я взял и персонализировал эти функции из другого ответа stackoverflow)

Функция showPosition сохраняет значения широты и долготы устройства в паре скрытых тегов с идентификаторами user_lat и user_long. Идея состоит в том, чтобы иметь их там для дальнейшего использования. Кроме того, я должен сказать, что я очень новичок в веб-разработке, и я не знаю лучших способов передачи параметров между JavaScript и PHP.

Функция, которую я использую для вычисления расстояния между двумя точками:

(также я взял это из другого ответа)

При запросе моей БД я получаю данные о ресторанах в файле JSON, а затем для каждой записи в нем мне нужно вычислить расстояние. Вот мой код:

Эта функция захватывает значения, ранее сохраненные в скрытых тегах, и производит расчет. Я ожидаю следующую последовательность событий:

  1. Функции getLocation вызывается и выполняется
  2. Функция showPosition вызывается и выполняется. Значения широты и долготы устройства хранятся в скрытых тегах.
  3. Функция getDistance вызывается столько раз, сколько записей в таблице базы данных. Расстояние рассчитывается каждый раз.

Моя проблема в том, что, хотя я вызываю эти функции в таком порядке, фактическая последовательность завершения — не 1, 2, 3, а 1, 3, 2. Для выполнения функции showPosition требуется около 5 секунд, и к тому времени, как это будет сделано, функция getDistance уже рассчитала неправильные расстояния. Я решил, что нужно либо отложить выполнение getDistance до завершения выполнения showPosition, либо выполнить showPosition заранее, чтобы это было сделано к моменту вызова getDistance. Проблема в том, что я запрашиваю базу данных, используя $ _POST, и, как я мог видеть, каждый раз, когда выполняется $ _POST, значения скрытых тегов сбрасываются.

Как я упоминал ранее, я очень новичок в веб-разработке, и может быть 100 разных (лучших) способов сделать то, что я пытаюсь сделать. Любая помощь будет высоко ценится. Благодарю.

Решение

Более простой способ сделать это — использовать JavaScript и перевести его с помощью API Карт Google. Большая часть работы сделана для вас, так почему бы не использовать ее?

Также просто для хорошей практики:

Всегда используйте частную, публичную или защищенную информацию. Также используйте классы

Проблема при использовании функции getCurrentPosition geoLocation в методе setInterval для получения текущей позиции пользователя с помощью React-Native

Мне нужно получить широту и долготу пользовательского местоположения для отображения текущей позиции на линии маршрута. Для достижения этой цели с помощью React-Native я использовал @mapbox/react-native-mapbox-gl npm. Мне нужно обновление местоположения аккуратности с небольшой частотой, поэтому я выбираю метод setInrval.


Я использовал функцию ниже, чтобы получить местоположение с интервалом

этот код snip perfectly working with Android devices но почему-то not working with iOS . В андроиде его полностью работает, как указано. он дает информацию о местоположении каждые 3 секунды, и я легко обновляю пользователя на линии маршрута. Но с iOS-устройствами и эмуляторами ничего не происходит. Никаких ошибок и исключений.

Илон Маск рекомендует:  Информационная безопасность. Вступление. Информация как объект защиты.

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

Я уже использовал watchPosition но он вернет результат после дальнего путешествия по линии маршрута. с этим пользователем прыгайте с 1 места на другое, но теперь плавно перемещайтесь по линии маршрута, поэтому я не хочу использовать это. Вот почему я иду с методом setInterval с методом getCurrentPosition . который отлично работает с Android. Я использовал приведенный ниже код для watchPosition

Я использовал ниже версию для реализации этой функциональности

@mapbox/react-native-mapbox-gl: 6.1.2 react-native: 0.55.4

Может кто-нибудь сталкивался с такими проблемами раньше? или есть идеи как решить это на iOS?

Новый обновленный код

Я также попытался с помощью рекурсивного метода, чтобы избежать метода setInterval с асинхронным вызовом, как показано ниже, но все еще не работает на iOS . .

javascript определение navigator.geolocation.getCurrentPosition иногда работает иногда не

геолокация на сайте (17)

Эта библиотека добавляет желаемые опцииAccuracy и maxWait для вызовов геолокации, что означает, что она будет пытаться получить позицию до тех пор, пока точность не окажется в заданном диапазоне.

Поэтому у меня довольно простой бит JS, использующий jammy navigator.geolocation.getCurrentPosition.

В основном, что происходит здесь, мы получаем текущую позицию, если она получена, два «водяных знака» помещаются в два поля, которые говорят «Текущая позиция», и два скрытых поля создаются с использованием данных lat-long как их значение (они удаляются в начале, чтобы они не дублировались каждый раз). Есть также две кнопки, которые имеют функцию щелчка, привязанную к ним, которые делают то же самое. К сожалению, каждый третий раз или около того, он работает. В чем проблема?

Вы не получите сообщение об ошибке, поскольку по умолчанию он не имеет таймаута (по крайней мере, я думаю). У меня была такая же проблема с firefox только для меня, firefox всегда дает тайм-аут. Вы можете установить тайм-аут самостоятельно, как это.

Я установил максимальный возраст Infinity, чтобы убедиться, что это не проблема. Моя функция отлично работает в chrome, но я получаю тайм-аут каждый раз в firefox.

Я рекомендую внимательно следить за вашими ошибками. Ожидайте всего. У вас есть резервный план для всего. Я использую некоторые значения или значения по умолчанию из моей базы данных в случае сбоев геолокации google и геолокации навигатора.

Я наконец нашел рабочую версию для Firefox, chrome и default navigator в android (только 4.2):

У меня были подобные проблемы, и мы изучали возможность того, что у браузеров есть ограничения на то, как часто можно вызвать getCurrentPosition. Кажется, я часто могу получить место, но если я сразу обновляю страницу, он будет тайм-аут. Если я немного подожду, я могу снова найти место. Обычно это происходит с FF. В Chrome и Safari я еще не заметил, что время ожидания getCurrentPosition. Просто мысль.

Хотя я не могу найти документацию для поддержки этого, это был вывод, который я пришел после долгих испытаний. Возможно, у кого-то еще есть информация об этом?

Поэтому я столкнулся с тем же. Я пробовал решение тайм-аута, которое работало, но не надежно. Я обнаружил, что если вы просто назовете это дважды, местоположение будет обновлено должным образом

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

Или, если вы хотите убедиться, что это будет продолжаться, пока вы не захотите сдаться, вы можете попробовать что-то вроде этого.

У меня, вероятно, есть несколько типов и некоторые орфографические ошибки здесь, но я надеюсь, что вы поняли эту идею. Дайте мне знать, есть ли у кого-нибудь вопросы или кто-то находит что-то лучше.

Ответ @ brennanyoung велик, но если вам интересно, что делать в случае сбоя, вы можете использовать API геолокации IP, такой как https://ipinfo.io (который является моей службой). Вот пример:

У меня была такая же проблема, и я почти ничего не узнал об этом. В книгах ничего нет. Наконец, я нашел этот трезвый запрос в и (ha!), Это был последний импульс, который мне нужен для создания учетной записи здесь.

И у меня есть частичный ответ, но, увы, не полный.

Прежде всего, поймите, что таймаут по умолчанию для getCurrentPosition бесконечен (!). Это означает, что ваш обработчик ошибок никогда не будет вызван, если getCurrentPosition зависает где-то на задней панели.

Чтобы получить тайм-аут, добавьте дополнительный третий параметр к вашему вызову getCurrentPosition, например, если вы хотите, чтобы пользователь подождал не более 10 секунд, прежде чем дать им понять, что происходит, используйте:

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

На работе, однако, я испытываю довольно странные вариации в поведении: Geolocation работает на некоторых компьютерах все время (IE исключается, конечно), другие работают только в хромированном и сафари, но не в firefox (проблема gecko?), Другие работают один раз, потом fail — и шаблон меняется от часа к часу, изо дня в день. Иногда у вас есть «удачливый» компьютер, иногда нет. Может быть, убойные козы в полнолуние помогут?

Я не смог понять это, но я подозреваю, что инфраструктура задней части более неравномерна, чем рекламируется в различных gung-ho книгах и веб-сайтах, которые продвигают эту функцию. Я действительно хочу, чтобы они были немного более откровенными в отношении того, насколько эта функция и насколько важна эта настройка тайм-аута, если вы хотите, чтобы обработчик ошибок работал правильно .

Сегодня я пытался научить этого материала студентам и имел смущающую ситуацию, когда мой собственный компьютер (на проекторе и несколько больших экранов) терпел неудачу, тогда как около 80% студентов получали результат почти мгновенно (используя точно такая же беспроводная сеть). Очень сложно решить эти проблемы, когда мои ученики также делают опечатки и другие промахи, и когда мой собственный компьютер также терпит неудачу.

Во всяком случае, я надеюсь, что это поможет некоторым из вас, ребята. Спасибо за проверку работоспособности!


Это работает для меня каждый раз:

Хотя это не очень точно. Самое смешное, что на том же устройстве, если я его запускаю, он откладывает меня примерно на 100 метров (каждый раз), но если я пойду на карты Google, он точно найдет мое местоположение. Поэтому, хотя я думаю, что enableHighAccuracy: true помогает ему работать последовательно, это, похоже, не делает его более точным .

Спасибо всем за их вклад, это помогло мне.

Помимо использования функции watchPosition () вместо getCurrentPosition (), я также обнаружил, что мне нужно переместить вызов из документа document.ready () в голову.

вот мое решение благодаря закрытию:

Второй параметр, переданный в Geolocation.getCurrentPosition() — это функция, которую вы хотите обрабатывать с ошибками геолокации. Сама функция обработчика ошибок получает объект PositionError с подробными сведениями о том, почему попытка геолокации не удалась. Я рекомендую выводить ошибку на консоль, если у вас есть проблемы:

Выполнение этого в моем коде показало сообщение «Поставщик местоположения сети по адресу« https://www.googleapis.com/ »:« Возвращенный код ошибки 400 ». Оказывается, Google Chrome использует API Google, чтобы получить местоположение на устройствах, на которых нет встроенного GPS (например, большинство настольных компьютеров). Google возвращает приблизительную широту / долготу на основе IP-адреса пользователя. Однако в сборках разработчиков Chrome (таких как Chromium on Ubuntu) нет ключа доступа к API, включенного в сборку браузера. Это приведет к сбою запроса API. См. Chromium Issue 179686: Geolocation дает 403 ошибки для деталей.

Это уже старый вопрос, но все ответы не помогли решить мою проблему, поэтому добавим тот, который я наконец нашел. Он пахнет хаком (и он один), но всегда работает в моей ситуации. Надеюсь, в вашей ситуации тоже.

Это хакерский способ, которым я обойду это, по крайней мере, он работает во всех существующих браузерах (в Windows у меня нет Mac):

Это также будет работать, если кто-то нажимает кнопку «закрыть» или не выбирает «нет» или выбирает параметр «Никогда не Share» в Firefox.

Неуклюжий, но он работает.

То же самое происходит с людьми, это прекрасно работает в Chrome (стабильный, dev и canary), а не в FF и Safari. Он также отлично работает на моем iPhone и iPad (Safari!). Это может быть связано с относительной новизностью этой функции (т.е. это ошибка). Я трачу почти неделю на это сейчас, и я просто не могу заставить его работать над этими браузерами

Вот что я нашел:

В первый раз, когда вы вызываете getCurrentPosition, он отлично работает. Любой последующий вызов никогда не возвращается, т. Е. Он не запускает функции successCallback или errorCallback. Я добавил несколько вариантов позиции к моему призыву, чтобы доказать свою точку зрения:

и он время от времени каждый раз (после первого успешного вызова). Я думал, что могу исправить это с помощью maximumAge, но это, похоже, не работает, так как предполагается, что он будет работать:

это должно предотвращать фактическое вызов функции getCurrentPosition, если вы вызываете ее в течение 60 секунд, но она игнорирует это (однако это может быть связано с тем, что я действительно обновляю свою страницу для запуска второго вызова, не уверен, что это постоянный по отношению к другим вызовам)

Кстати, даже примеры Google не работают в этих браузерах, что заставляет меня поверить, что это действительно ошибки браузера, попробуйте, дважды загрузите его в Safari, и он не будет работать во второй раз.

Если кто-нибудь найдет решение для этого, ПОЖАЛУЙСТА, дайте мне знать :-)

Может быть хорошей идеей использовать службу getCurrentPosition IP-адреса в качестве резервного метода, когда getCurrentPosition терпит неудачу. Например, с нашим api https://ip-api.io

Я недавно заметил эту проблему, и я не уверен, как это происходит, но иногда появляется, что firefox зацикливается на чем-то, загруженном в кеш. После очистки кеша и перезапуска firefox он снова функционирует.

Я отправлю это здесь, если это будет полезно для всех .

Я использую cordova-2.0.0 и Android-эмулятор google api level16.

Всякий раз, когда я запускаю navigator.geolocation.getCurrentPosition я всегда получаю error3 . Мой код кратко:

Илон Маск рекомендует:  Команды 3dnow ( начиная с k6 2 )

Если у кого есть идея, почему error3 , просьба дать предложения. большое спасибо

Тоже, но страшный «код ошибки 3» продолжал появляться … Ни

Помог … Только силовой велоспорт (но я полагаю, что убийца браузера будет делать то же самое). Android (4.1.2) заставил браузер повторить вопрос «Share position?». Пользователю выкинуть код ошибки 3 из двери …

Я предполагаю, что в какой-то ситуации (что я не могу повторить, извините) браузер сохраняет недопустимую позицию для этого сайта – или – помнит об отказе в обмене на этом сайте …

Извините за поздний ответ (и, возможно, неполный) … Если у кого-то есть доказательства, пожалуйста, поделитесь им … ��

Меня это очень застопорило. В принципе, единственный способ заставить его вернуть данные – это, в частности, передача

Работа с HTML5 Geolocation API

Давайте поговорим о HTML5 Geolocation API, которое используется для получения географического положения пользователя. С помощью API геолокации, пользователь может поделиться с доверительным веб-приложением своим местоположением.

Ключевой момент в конфиденциальности передаваемой информации. Браузеры не могут получать информацию о местоположении пользователя без согласия самого пользователя. Иными словами, пользователь должен дать согласие на передачу своего местоположения или отказаться от передачи данных. Диалог с пользователем обычно ведется через информационную панель в верхней части окна браузера.

Сразу стоит отметить, что Геолокацию поддерживаю все современные браузеры и даже IE. Общая картина выгладит так: IE9+, FireFox 3.5+, Safari 5.0+, Chrome 5.0+, Opera 10.6+, iPhone 3.0+, Android 2.0+.


Проверка поддержки Geolocation API браузером

Работать с геолокацией нужно через объект navigator.geolocation, который содержит всего 3 метода.

navigator.geolocation.getCurrentPosition() — Определяет текущее местоположение пользователя.
navigator.geolocation.watchPosition() – Всякий раз определяет текущее местоположение пользователя, как только оно изменяется. Устройство пользователя само определяет оптимальный интервал опроса.
navigator.geolocation.clearWatch() – Останавливает слежение за пользователем инициированное методом watchPosition.

Методы getCurrentPosition и watchPosition похожи, за исключением того, что метод watchPosition пытается следить за сменой положения пользователя и его работа напоминает функцию setInterval, только без указания времени интервала опроса, за это отвечает само устройство пользователя. Метод watchPosition возвращает идентификатор, который нужен методу clearWatch для остановки слежения.

Далее все примеры будут основаны на методе getCurrentPosition.

success – callback функция, которая будет вызвана при успешном определении геопозиции пользователя.
error — callback функция, которая будет вызвана при ошибке или отмене определения геопозиции пользователем.
options – необязательный параметр, который должен быть объектом с дополнительными опциями.

Объект options может содержать некоторые свойства:

enableHighAccuracy – точность определения позиции (true/false) большая точность, меньшая точность. Для задействования средств определения геопозиции с большой точностью, устройство пользователя должно быть оборудовано этими средствами. Например, в мобильных устройствах, этим средством может выступать GPS. В противном случае, никакого эффекта от переключения этого параметра не произойдет.
timeout — количество миллисекунд, которое веб-приложение будет ожидать для получения положения пользователя. Таймер не начнет отсчет, пока пользователь не даст разрешение на вычисление его положение.
maximumAge — количество миллисекунд, пока данные хранятся в кэше. То есть не требуется постоянно заново определять геопозицию пользователя, а можно быстро взять старые данные.

Функция обратного вызова success принимает объект Position, который содержит данные о геопозиции пользователя.

Position.coords.latitude — широта в виде числа;
Position. coords.longitude — долгота в виде числа;
Position.coords.accuracy — точность позиции;
Position.coords.altitude — высота в метрах над средним уровнем моря;
Position.coords.altitudeAccuracy — точность положения высоты;
Position.coords.heading — градусы по часовой стрелке от севера;
Position.coords.speed — скорость в метрах в секунду;
Position.timestamp — время отклика.

Функция обратного вызова error принимает объект PositionError, который содержит код ошибки и текстовое сообщение.

PositionError.code – код ошибки, который является цифровым значением:

1 соответствует константе PERMISSION_DENIED – пользователь отказался сообщать своё метоположение;
2 соответствует константе POSITION_UNAVAILABLE – сеть не работает, нет связи со спутниками;
3 соответствует константе TIMEOUT – работа завершилась по таймауту, определение геопозиции занимает слишком много времени.

PositionError.message – сообщение, которое не предназначено для пользователя, а больше подходит для логов.

И так. А немного кода.

Вот и все. Благодаря этому простому функционалу данные о геопозиции пользователя можно использовать для многих целей. Например больше не нужно хранить огромную базу интервалов IP адресов по странам и городам, да и которую ещё нужно постоянно обновлять.

geolocation.getCurrentPosition не работает в ночное время — Как предоставить собственный ключ api? — javascript

Это длинный вопрос, возможно, очень короткий ответ.

В моем приложении rails 5 я использую эту довольно основную реализацию JS геолокации api для получения местоположения пользователей из браузера:

ОБНОВЛЕНИЕ: Вот весь script, который использует плагин geocomplete (https://ubilabs.github.io/geocomplete/):

Как-то смешно проблема в том, что эта реализация отлично работает в течение дня (я базируюсь в Германии), но ночью возвращает ошибку как в Firefox, так и в Chrome:).

Код ошибки, возвращаемый в Firefox: < code: 2, message: "Unknown error acquiring position" >, Chrome печатает дополнительную информацию: message: «Network location provider at https://www.googleapis.com/ : Returned error code 403.»

Похоже, что 403 означает, что был достигнут предел использования предоставленного ключа api. Это объясняет, почему мой код работает в течение дня и начинает сбой ночью:).

Чтобы проверить это, я открыл конфигурацию firefox и вставил свой собственный ключ google goi в geo.wifi.uri и voilà, это работает.

Теперь мой вопрос (ы):

1) Эта проблема появляется в собственном браузере Google (Chrome), даже неудачный пример Mozilla (https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/Using_geolocation), можно ожидать google/mozilla и т.д., чтобы устранить эту проблему в ближайшее время, увеличив лимит запроса?

2) Запрос отправляется через браузер посетителя сайта. Есть ли способ передать мой собственный ключ google для геолокации api, чтобы браузер использовал его в запросе вместо стандартного?

3) Приведенный выше код отлично работает в браузере Chrome на моем телефоне Samsung s6, однако он не работает на том же телефоне, используя интернет-браузер Samsung. Любые намеки на то, что здесь происходит не так?

Набор данных внутри функции getCurrentPosition

Я делаю следующий:

Первое — я проверяю, если я уже загружены широты и долготы данных. Если у меня есть, я экономлю, что в массив с именем «местоположение».

Вторая вещь — если у меня нет каких-либо загруженных данных, я пытаюсь получить текущую позицию. После этого, я пытаюсь сохранить широту и долготу для текущего положения. И, в конце концов, я звоню setMap (); функция, где я проверяю массив местоположения и где я генерации карты.

Ну, как я сказал, что это . внутри «getCurrentPosition», я пытаюсь установить текущую позицию в «месте» массива, и после того, что я пытаюсь принять эти значения внутри setMap (); функция. Вот проблема, но только тогда, когда я установить «местоположение» значения внутри «getCurrentPosition». Если установить «местоположение» значения вручную перед (от «данных» массив), все работает отлично. Кроме того, когда я вызываю функцию setMap () внутри «getCurrentPosition», все работает отлично . но когда я называю его снаружи, не будет работать. Может кто-нибудь объяснить мне, что происходит и что я могу сделать?

Вы устанавливаете другую переменную внутри getCurrentPosition . Я хотел бы предложить исследовать переменные сферы. Проверьте этот вопрос.


Я не понимал, что функция, которую вы использовали была частью Javascript, я думал, что ты написал / получил его где-то.

Кроме того, я исправлюсь о масштабах. Так как вы используете массив, объем прекрасно, вы должны быть в состоянии установить его внутри функции обратного вызова просто отлично.

Что такое код getcurrentposition

Obtains the geographic position, in terms of latitude and longitude coordinates, of the device running Windows Internet Explorer.

Syntax

Parameters

Type: IDispatch

The handler function to call when geographic position is successfully obtained. The function specified by the successCallback parameter takes one position parameter.

errorCallback [in, optional]

Type: IDispatch

The handler function to call when the attempt to obtain geographic position fails. The function specified by the errorCallback parameter takes one positionError parameter. To use the options parameter without using the errorCallback parameter, set the errorCallback parameter to VT_NULL.

options [in, optional]

Type: IDispatch

A pointer to an object that implements >

enableHighAccuracy

Specify VARIANT_TRUE to obtain the most accurate position possible, or VARIANT_FALSE to optimize in favor of performance and power consumption.

timeout

A VT_I4 value that indicates the time, in milliseconds, allowed for obtaining the position.

If timeout is Infinity, (the default value), the location request will not time out. In this case, maximumAge is a VT_R8 value.

If timeout is zero ( 0 ) or negative, the results depend on the behavior of the location provider.

maximumAge

For finite values, a VT_I4 value indicating the maximum age, in milliseconds, of cached position information.

If maximumAge is non-zero, and a cached position that is no older than maximumAge is available, the cached position will be used instead of requiring that IWebGeolocation::getCurrentPositionobtain an updated location.

If maximumAge is zero ( 0 ), IWebGeolocation::getCurrentPosition will always try to obtain an updated position, even if a cached position is already available.

If maximumAge is Infinity, any cached position will be used regardless of its age, and IWebGeolocation::getCurrentPosition will only try to obtain an updated position if no cached position data exists. In this case, maximumAge is a VT_R8 value.

Return value

Type: HRESULT

If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code.

Standards information

  • Geolocation API Specification, Section 5.1

Remarks

Windows Internet Explorer 9. This property is supported only for webpages displayed in IE9 Standards mode. For more information, see Defining Document Compatibility.

When the IWebGeolocation::getCurrentPosition function is called, it initiates a request to acquire the geographic position, and then returns immediately. If the geographic position is successfully obtained, the callback function defined in the successCallback parameter is called. Te position parameter of that function contains the data describing the current geographic location of the device running Internet Explorer.

If the geographic location cannot be obtained and a callback function is specified as the errorCallback parameter, that function is called. The error parameter of the errorCallback function contains an error code indicating the reason for failure.

Support for the attributes of the options parameter depends on the location provider available to the device running Internet Explorer. There is no guarantee that changing the properties of these attributes will affect the results reported by the location provider.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL