Сервис Яндекс.Карты предоставляет доступ к API Геокодера, который позволяет по адресу получить координаты объекта на карте, также поддерживается обратное геокодирование. В этой статье приведен пример обращения к API Геокодера с помощью PHP CURL.
Для запросов к API потребуется ключ, получить его можно на https://developer.tech.yandex.ru/services/, заполнив небольшую анкету.
Документация по формату запроса можно посмотреть на https://yandex.ru/dev/maps/geocoder/doc/desc/concepts/input_params.html
Далее, пример как получить все доступные данные по адресу в виде PHP массива:
$address = 'Москва, Тверская, д.7';
$ch = curl_init('https://geocode-maps.yandex.ru/1.x/?apikey=КЛЮЧ&format=json&geocode=' . urlencode($address));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
print_r($res);
Результат:
Array(
[response] => Array(
[GeoObjectCollection] => Array(
[metaDataProperty] => Array(
[GeocoderResponseMetaData] => Array(
[request] => Москва, Тверская, д.7
[results] => 10
[found] => 1
)
)
[featureMember] => Array(
[0] => Array(
[GeoObject] => Array(
[metaDataProperty] => Array(
[GeocoderMetaData] => Array(
[precision] => exact
[text] => Россия, Москва, Тверская улица, 7
[kind] => house
[Address] => Array(
[country_code] => RU
[formatted] => Россия, Москва, Тверская улица, 7
[Components] => Array(
[0] => Array(
[kind] => country
[name] => Россия
)
[1] => Array(
[kind] => province
[name] => Центральный федеральный округ
)
[2] => Array(
[kind] => province
[name] => Москва
)
[3] => Array(
[kind] => locality
[name] => Москва
)
[4] => Array(
[kind] => street
[name] => Тверская улица
)
[5] => Array(
[kind] => house
[name] => 7
)
)
)
[AddressDetails] => Array(
[Country] => Array(
[AddressLine] => Россия, Москва, Тверская улица, 7
[CountryNameCode] => RU
[CountryName] => Россия
[AdministrativeArea] => Array(
[AdministrativeAreaName] => Москва
[Locality] => Array(
[LocalityName] => Москва
[Thoroughfare] => Array(
[ThoroughfareName] => Тверская улица
[Premise] => Array(
[PremiseNumber] => 7
)
)
)
)
)
)
)
)
[name] => Тверская улица, 7
[description] => Москва, Россия
[boundedBy] => Array(
[Envelope] => Array(
[lowerCorner] => 37.607107 55.755657
[upperCorner] => 37.615318 55.760287
)
)
[Point] => Array(
[pos] => 37.611212 55.757972
)
)
)
)
)
)
)
Видно, что координаты передаются строкой «37.611212 55.757972», достанем их и преобразуем в массив:
$coordinates = $res['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos'];
$coordinates = explode(' ', $coordinates);
print_r($coordinates);
Результат:
Array(
[0] => 37.611212
[1] => 55.757972
)
Нужно учесть, что первое значение – долгота, а второе – широта. Т.к. в разных сервисах яндекса используется разная последовательность значений.