Геокодування на льоту
20 Лютого 2020
наступна стаття
На одному з проєктів, над якими я працюю, ми отримали від замовника завдання додати список мережі відділень підприємства в інфоблок Бітрікс, а також показати їх на карті. Складність полягала в тому, що відділень було багато, а координати були відсутні. Тому ми прийняли рішення отримувати координати з адреси на льоту, в момент додавання елемента в інфоблок.
Була описана функція для події OnBeforeIBlockAdd, яка перед створенням елемента перевіряє, чи дані пишуться в потрібний інфоблок і чи не порожнє поле з адресою. Функція робить запит Yandex API і отримує координати, які записуються в призначені для користувача поля елементу інфоблоку. Основний тонкий момент — це правильне форматування рядка адреси.
Спрощений приклад коду функції геокодування, що спрацьовує при події додавання нового елементу Інфоблоку, виглядає наступним чином.
Додаємо обробник
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", array("Geocoding", "addCoordinates"));
Метод класу Geocoding, який визначає координати за адресою
public function addCoordinates(&$arFields)
{
$cityIblockID = 11; // код інфоблоку, в якому розміщується адреси
// перевірка, чи елемент зберігається в потрібний інфоблок
if ($arFields['IBLOCK_ID'] == $cityIblockID)
{
// перевірка, чи поле з адресою не порожнє
if(!empty($arFields["PREVIEW_TEXT"])){
// список параметрів для Yandex API
$params = array(
'geocode' => trim($arFields["PREVIEW_TEXT"]), // адреса
'format' => 'json',
'results' => 1,
'apikey' =>'00000000-0000-0000-0000-000000000000'
);
// надсилаємо запит
$curl = curl_init('https://geocode-maps.yandex.ru/1.x/?' . http_build_query($params, '', '&'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = json_decode(curl_exec($curl));
curl_close($curl);
// перевіряємо відповідь
if ($response->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found > 0)
{
// отримуємо координати
$points = explode(' ', $response->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos);
// записуємо координати в користувацькі властивості карти
$arFields['PROPERTY_VALUES'][40][n0][VALUE]=implode(',', array_reverse($points));
}
}
}
}
Ми зв'яжемось з Вами протягом 10 хвилин