Геокодування на льоту

20 Лютого 2020

наступна стаття
Олег Мостовий

Back End Developer

Олег Мостовий
Геокодування на льоту

На одному з проєктів, над якими я працюю, ми отримали від замовника завдання додати список мережі відділень підприємства в інфоблок Бітрікс, а також показати їх на карті. Складність полягала в тому, що відділень було багато, а координати були відсутні. Тому ми прийняли рішення отримувати координати з адреси на льоту, в момент додавання елемента в інфоблок.

Була описана функція для події 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 хвилин