В статье будут 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
Не забываем нажимать палец вверх, это стимулирует авторов к написанию других статей.
Краснодар, Россия
На форуме: newz20