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

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
newz20
Сообщения: 172
Зарегистрирован: Пт апр 06, 2018 9:40 am
Благодарил (а): 93 раза
Поблагодарили: 93 раза

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

Сообщение newz20 » Пт май 17, 2019 10:08 am

ВНИМАНИЕ. Яндекс ввел ключ, внизу код поменял.
Действуя по инструкции с форума viewtopic.php?f=4&t=1858
Для тех у кого заблочен или "религиозных" противников Яндекса имеется вариант с Google.
После добавления Гуглом необходимости ввода АПИ ключа он перестал работать.
Код не мой, просто правлен или доработан
Вариантов на данный момент 2 json и xml поправим их и вернем к жизни
вариант json предусматривает правку только функции
(не проверял правильность постановки переменных в URL, возможно нужно будет поменять местами, в xml поменял так как не верно выводил место)

Код: Выделить всё

// Функция определения адреса по координатам 
function Getgeocode($lat, $lon)  {
$URL = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false&language=ru&key=ТУТ_ДОЛЖЕН_БЫТЬ_ВАШ_КЛЮЧ_АПИ";
$data = getUrl( $URL );
$json = json_decode( $data );
$res = $json->results[0]->formatted_address;
return $res;
}

Теперь к варианту с xml
Тут еще два варианта: правка только функции и с правкой еще и метода
С правкой метода сокращаем код и время на доли секунд

С правкой метода

Код: Выделить всё

function Getgeocode($Coordinates)  {
  $data_file="https://maps.googleapis.com/maps/api/geocode/xml?latlng=".$Coordinates."&key=ТУТ_ДОЛЖЕН_БЫТЬ_ВАШ_КЛЮЧ_АПИ&language=ru"; 
  $xml = simplexml_load_file($data_file); 
  $res=$xml->result[0]->formatted_address;
  return $res;
  }
  
Метод в таком варианте выглядеть станет так

Код: Выделить всё

 $Coordinates=$this->getProperty("Coordinates");
  $this->setProperty("Location",Getgeocode($Coordinates));


Без правки метода

Код: Выделить всё

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


На случай потери ветки из начала
Создаем метод SetLocation

Код: Выделить всё

$Coordinates=$this->getProperty("Coordinates");
$lat=substr($Coordinates,0,strpos($Coordinates,","));
$lon=substr($Coordinates,strpos($Coordinates,",")+1);
$this->setProperty("Location",Getgeocode($lon,$lat));
Создаем свойство Location
Метод привязваем на изменение координатам
Идем в файл своих функций и вставляем

Код: Выделить всё

function Getgeocode($lon, $lat)  {
  $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;
}

 
В конце файла должна быть пустая строка
При изменении координат запускается метод и вызывает функцию и возвращает адрес
За это сообщение автора newz20 поблагодарили (всего 3):
xor (Пт май 17, 2019 1:54 pm) • VladPTZ (Пт окт 04, 2019 2:25 pm) • Samir77 (Пт апр 24, 2020 10:51 am)
Рейтинг: 3.49%
VladPTZ
Сообщения: 395
Зарегистрирован: Вт май 31, 2016 6:56 pm
Откуда: Россия Карелия Петрозаводск
Благодарил (а): 95 раз
Поблагодарили: 57 раз

Re: Получение адреса по координатам Гугл

Сообщение VladPTZ » Пт окт 04, 2019 1:58 pm

newz20 писал(а):
Пт май 17, 2019 10:08 am
ВНИМАНИЕ. Яндекс ввел ключ, внизу код поменял.
Не понял как этот ключ поучить и от какого сервиса? Ключ от yandex tts не заработал.
Сервер МД на x86 micro pc ssd + HDD, OC Debian, терминал Xiaomi Redmi note 7
Мои исходники для мд управляемых устройств https://github.com/vgamaev/ESPMDDEVICE
newz20
Сообщения: 172
Зарегистрирован: Пт апр 06, 2018 9:40 am
Благодарил (а): 93 раза
Поблагодарили: 93 раза

Re: Получение адреса по координатам Гугл

Сообщение newz20 » Пт окт 04, 2019 10:44 pm

VladPTZ писал(а):
Пт окт 04, 2019 1:58 pm
newz20 писал(а):
Пт май 17, 2019 10:08 am
ВНИМАНИЕ. Яндекс ввел ключ, внизу код поменял.
Не понял как этот ключ поучить и от какого сервиса? Ключ от yandex tts не заработал.
https://developer.tech.yandex.ru/services/ для яндекса
https://console.cloud.google.com гугл тут лежит апи нужен вот этот Geocoding API

как получить проще у них и спросить, у яндекса JavaScript API и HTTP Геокодер, у гугла вроде мэпс. Простите не помню как у гугла но вроде надо создавать проект и в нем уже активировать апи.

отказался сейчас от обоих в пользу опенстрит. описал тут https://connect.smartliving.ru/profile/ ... og366.html
За это сообщение автора newz20 поблагодарил:
Samir77 (Пт апр 24, 2020 10:50 am)
Рейтинг: 1.16%
Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр
Благодарил (а): 100 раз
Поблагодарили: 1 раз

Re: Получение адреса по координатам Гугл

Сообщение vitosmaxim80sad145 » Сб апр 10, 2021 3:10 pm

Помогите настроить ,что-то делаю не так .создал my_funcs.php туда вставил

function Getgeocode($lat, $lon) {
$URL = "https://nominatim.openstreetmap.org/rev ... sdetails=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;
}

метод SetLocation
$Coordinates=$this->getProperty("Coordinates");
$lat=substr($Coordinates,0,strpos($Coordinates,","));
$lon=substr($Coordinates,strpos($Coordinates,",")+1);
$this->setProperty("Location",Getgeocode($lat,$lon));
$this -> setProperty('latitude',$lat);
$this -> setProperty('longitude',$lon);

if ($this -> getProperty('HomeDistance') > 100) {
$this -> setProperty("Location",$res);
} else {
$this -> setProperty("Location",'Дом');
$this -> callMethod('gotHome');
}

и теперь в верху в админке function Getgeocode($lat, $lon) { $URL = "https://nominatim.openstreetmap.org/rev ... sdetails=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; }
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

Re: Получение адреса по координатам Гугл

Сообщение xor » Сб апр 10, 2021 8:26 pm

vitosmaxim80sad145 писал(а):
Сб апр 10, 2021 3:10 pm
и теперь в верху в админке function Getgeocode($lat, $lon) { $URL = "https://nominatim.openstreetmap.org/rev ... sdetails=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; }
файл должен начинаться с
<?php
и заканчиваться пустой строкой, кмк
и кодировка должна быть утф-8 без бом
За это сообщение автора xor поблагодарил:
vitosmaxim80sad145 (Вс апр 11, 2021 9:24 am)
Рейтинг: 1.16%
Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр
Благодарил (а): 100 раз
Поблагодарили: 1 раз

Re: Получение адреса по координатам Гугл

Сообщение vitosmaxim80sad145 » Пн апр 12, 2021 9:26 am

xor писал(а):
Сб апр 10, 2021 8:26 pm
vitosmaxim80sad145 писал(а):
Сб апр 10, 2021 3:10 pm
и теперь в верху в админке function Getgeocode($lat, $lon) { $URL = "https://nominatim.openstreetmap.org/rev ... sdetails=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; }
файл должен начинаться с
<?php
и заканчиваться пустой строкой, кмк
и кодировка должна быть утф-8 без бом
Большое СПАСИБО ,да добавил <?php в начале и всё заработало , но оно не совсем правильно пишет в гугл локациях пищет верньй адрес а тут через рас .
А не подскажите сейчас в свойстве локация не пишет ничего ,а в свойство seenAt адрес или локацию .Но если дом то пишет и там и там, как сделать чтобы писало в Location, а в seenAt писало где был в последний рас ну тоесть предыдущее
Просто спросить для себя если адрес уже есть в Google Location что нельзя его просто подтянуть от туда, а не создавать новые функции ?
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 54 раза
Контактная информация:

Re: Получение адреса по координатам Гугл

Сообщение S_Nick » Чт июл 29, 2021 11:59 am

Я использую геокодинг от https://dadata.ru/api/
Может кому-то пригодиться.
Добавляем файл в /lib/_dadata.getgeocode.php
Нужно получить и вписать свои API ключи в код:

Код: Выделить всё

<?php

function dadata_get_curl($url, $header) {
	$ch = curl_init();
	for ($i = 0; $i <= 3; $i++) {
		if (!$ret) {
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_HEADER, false);
			if ($header) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
			curl_setopt($ch, CURLOPT_TIMEOUT, 30);
			//print_arr(curl_getinfo($ch))
			$ret = curl_exec($ch);
			$info_arr = curl_getinfo($ch);
			//print_arr($info_arr);
			if (curl_errno($ch)) {
				print_arr("Error Curl: " . curl_error($ch) . " / Попытка #" . $i);
			}
		}
	}
	curl_close($ch);
	return $ret;	
}

function dadata_getgeocode_count() {
	//https://dadata.ru/api/stat/
	$token = "*******************************************"; //s_nick@tut.by
	$secret_key = "************************************************";

	$header[1] = "Authorization: Token " . $token;
	$header[2] = "X-Secret: " . $secret_key;
	$url = "https://dadata.ru/api/v2/stat/daily"; //Проверить, не исчерпан ли лимит запросов на день.

	$ret = dadata_get_curl($url, $header);
	$ret = json_decode($ret);
	$ret = (array)$ret->{'services'}->{'suggestions'};
	$ret = $ret[0];

	return $ret;
}

function dadata_getgeocode($lat, $lon) {
	if ($lat && $lon) {
		//https://dadata.ru/api/geolocate/
		$token = "*************************************************";

		$header[0] = "Accept: application/xml";
		$header[1] = "Authorization: Token " . $token;
		$url = "https://suggestions.dadata.ru/suggestions/api/4_1/rs/geolocate/address?lat=" . $lat . "&lon=" . $lon;

		$ret = dadata_get_curl($url, $header);
		$ret = simplexml_load_string($ret);
		$ret = (array)$ret->{'suggestions'}[0]->{'value'};
		$ret = $ret[0];
	}
	if (!$ret) $ret = "Не определено";
	return $ret;
}
?>
Вызывается функцией dadata_getgeocode($lat, $lon);
Ответить