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