newz20

 
<<< Back

Получение адреса по координатам.

В статье будут Openstreetmap, Google , Яндекс.

Всего в статье рассмотрим 3 сервиса геокодирования. Это все знаменитые и знакомые нам картографические сервисы.

Google - работает с api ключем и первым ввел его в сервис геокодирования, ключ дается на год бесплатно, а дальше я не читал. Да и не важно, раз в год можно и побаловать Гиганта созданием нового аккаунта.

В классе Users cоздаем метод SetLocation

$Coordinates=$this->getProperty("Coordinates");
$lat=substr($Coordinates,0,strpos($Coordinates,","));
$lon=substr($Coordinates,strpos($Coordinates,",")+1);
$this->setProperty("Location",Getgeocode($lat,$lon));

Там же создаем свойство Location
Метод привязваем на изменение координатам
Идем в файл своих функций (my_funcs.php лежит в папке lib) и вставляем

function Getgeocode(($lat, $lon))  {
  $data_file="https://maps.googleapis.com/maps/api/geocode/xml?latlng=$lat,$lon&key=ТУТ_ДОЛЖЕН_БЫТЬ_ВАШ_КЛЮЧ_АПИ&language=ru"; 
  $xml = simplexml_load_file($data_file); 
  $res=$xml->result[0]->formatted_address;
  return $res;
  }  

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

Яндекс - до недавнего времени мой любимый поставщик адресов работал без api ключа, сегодня api ключ стал требовать (кто-то утверждает что работает и без апи еще, не мой случай), получить можно тут https://developer.tech.yandex.ru/services/, но там что-то про правила бесплатного использования и т.д. Короче не так скоро и нас забанят, конечно если не гнать запросы через реальный сайт указанный в заявке.
Все по инструкции выше кроме вставки самой функции, тут другой код будет

Код для своих функций (my_funcs.php лежит в папке lib) с указанием api ключа

function Getgeocode($lat, $lon)  {
    $api='Ваш_АПИ_КЛЮЧ';
  $data_file="http://geocode-maps.yandex.ru/1.x/?apikey=".$api."&geocode=".$lon.",".$lat; 
  $xml = simplexml_load_file($data_file); 
  $res=$xml->{'GeoObjectCollection'}->{'featureMember'}[0]->{'GeoObject'}->{'metaDataProperty'}->{'GeocoderMetaData'}->{'AddressDetails'}->{'Country'}->{'AddressLine'};
  return $res;
}

код без ключа, ну а вдруг будет работать

function Getgeocode($lat, $lon)  {
    $data_file="http://geocode-maps.yandex.ru/1.x/?geocode=".$lon.",".$lat; 
  $xml = simplexml_load_file($data_file); 
  $res=$xml->{'GeoObjectCollection'}->{'featureMember'}[0]->{'GeoObject'}->{'metaDataProperty'}->{'GeocoderMetaData'}->{'AddressDetails'}->{'Country'}->{'AddressLine'};
  return $res;
}

Openstreetmap - Раньше меня Яндекс полностью устраивал, ну а теперь пришло время открытых и бесплатных проектов. "Ограничения: один запрос в секунду." - уверен нам хватит.
Все по инструкции выше кроме вставки самой функции, тут другой код будет

Код для своих функций (my_funcs.php лежит в папке lib) с указанием api ключа

function Getgeocode($lat, $lon)  {
$URL = "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$lat."&lon=".$lon."&zoom=18&addressdetails=1"; 
$data = getUrl( $URL );
$json = json_decode( $data);
$res = $json->address->state.", ";
$res .=$json->address->city.", ";
$res .=$json->address->road.", ";
$res .=$json->address->house_number;
return $res;
  }  

Вот собственно и все.
P.S. У меня в файле функций есть каждый из кодов. Имеют они названия с порядковыми номерами, function Getgeocode2($lat, $lon), function Getgeocode3($lat, $lon) и конечно function Getgeocode($lat, $lon). Теперь если нам захочется сменить Openstreetmap обратно на Яндекс, идем в метод SetLocation и правим тут номер $this->setProperty("Location",Getgeocode2($lon,$lat));.

P.P.S. Внимание встречаются люди у которых выводит адрес вообще другого места и даже страны. В меняйте местами переменные $lat и $lon вот тут function Getgeocode(($lat, $lon))

Ссылка на форум https://mjdm.ru/forum/viewtopic.php?f=27&t=6443

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

Discuss (13) (17)

See also:
2020-10-26 Немного о безопасности.
2020-08-17 Переключение режима устройства долгим удержанием
2020-04-09 Автоматизация бэкапов (полный/мини) через модуль Backup от Eraser1981
2020-04-09 Добавление прокси в сценарий для обхода блокировки
2020-02-19 Правильно привязываем свойства и методы в настройках Модулей
2020-01-23 Как привязать метод к свойству или разберемся в структуре объектов
2019-09-13 Ввод пин-кода или киношный экран разблокировки версия исправленная и доработанная
2019-09-12 Ввод пин-кода или киношный экран разблокировки
2018-11-12 Получение данных со стороннего сайта (аналог веб-переменным)
2018-09-26 Светильник на ws2812 + светильник с аккумулятором (часть прошивка)
2018-09-24 Светильник на ws2812 + светильник с аккумулятором (часть сборка)
2018-09-17 Немного про правильную перезагрузку.
2018-09-14 Светильник на ws2812 + светильник с аккумулятором

Краснодар, Россия

На форуме: newz20