Геокодування на льоту
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 хвилин