Альтернатива Firefox Geolocation API

#firefox #geolocation

#firefox #геолокация

Вопрос:

Источник геолокации по умолчанию в FF устанавливается в about:config из параметра geo.wifi.uri в значение https://www.google.com/loc/json . Когда стандартный вызов геолокации выполняется в Javascript, например, navigator.geolocation.getCurrentPosition(handle_geolocation_query,handle_errors); Firefox запросит https://www.google.com/loc/json мой IP-адрес (рабочий стол) и вернет мое приблизительное местоположение.

Что я хочу сделать, так это настроить страницу на моем собственном сервере, которая возвращает определенное геолокационное местоположение; Я жестко закодирую значения широты, lon и точности, которые будут возвращены на мою страницу, которая выполняет вызов getCurrentPosition. Это позволит мне тестировать код для клиента в разных местах, фактически не отправляясь в эти физические местоположения для тестирования.

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

Страница размещена на Apache и будет сгенерирована на PHP.

Для этого примера предположим, что моя страница псевдогеолокации находится по адресу http://mysite/json/index.php .

Я попробовал это со следующим PHP-кодом:

 header('Content-type: application/json');
echo '{"position":'
 .    '{"coords":'
 .     '{'
 .      '"latitude":"80",'
 .      '"longitude":"-20",'
 .      '"altitude":"299",'
 .      '"accuracy":"111",'
 .      '"altitudeAccuracy":"222",'
 .      '"heading":"333",'
 .      '"speed":"44"'
 .     '}'
 .    '}'
 .   '}';
  

На моей странице вызова у меня есть следующий javascript:

 function initiate_geolocation() {
navigator.geolocation.getCurrentPosition(handle_geolocation_query,handle_errors);
}

function handle_geolocation_query(position){
 var foo = 'Lat: '   position.coords.latitude   "n"
           'Lon: '   position.coords.longitude   "n"
           'Alt: '   position.coords.altitude   "n"
           'Acc: '   position.coords.accuracy   "n"
           'AAc: '   position.coords.altitudeAccuracy   "n"
         ;
 alert(foo);
}

function handle_errors(error) {
 switch(error.code) {
  case error.PERMISSION_DENIED: alert("user did not share geolocation data");
  break;

  case error.POSITION_UNAVAILABLE: alert("could not detect current position");
  break;

  case error.TIMEOUT: alert("retrieving position timed out");
  break;

  default: alert("unknown error");
  break;
 }
}
  

Если для geo.wifi.uri установлено значение https://www.google.com/loc/json , я возвращаю свои широту, lon и точность, как ожидалось. Когда я меняю geo.wifi.uri на http://mysite/json или на http://mysite.json/index.php , я не получаю никакого видимого ответа, включая отсутствие выполнения раздела ошибки javascript.

Я предполагаю, что ответ находится в geolocation-API, но я не могу понять это, когда все, чего я действительно хочу, это вернуть правильно отформатированную информацию.

Любая помощь по этому вопросу будет оценена.

TL; DR: что требуется для генерации действительного ответа для geo.wifi.uri в качестве альтернативы https://www.google.com/loc/json ?

Ответ №1:

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

 {"location":{
    "latitude":<latitude value>,
    "longitude":<longitude value>,
    "address":{
    "country":"United States",
    "country_code":"US",
    "region":"<state>", 
    "city":"<city>",
    "street":"<streetname>",
    "street_number":"<street number>",
    "postal_code":"<zip code>" 
    }, 
    "accuracy":30.0} ,
 "access_token":"<long access token string>"}
  

Попробуйте придать своему ответу подобный вид и посмотрите, что получится.

Ответ №2:

Проверьте http://code.google.com/p/gears/wiki/GeolocationAPI раздел «Протокол поставщика сетевого местоположения» содержит как формат запроса, так и формат ответа.