Заказать проект
Оставьте заявку для получения коммерческого предложения.
Заполните форму и мы вышлем Вам предложение в котором решим,
чем можем вам помочь.
Оставьте заявку для получения коммерческого предложения.
Заполните форму и мы вышлем Вам предложение в котором решим,
чем можем вам помочь.
Геокодирование на лету

Геокодирование на лету

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));
	                 }
	             }
	         }
	     }

Need help?

Ask a question.

Chat Now
Записаться На Консультацию
Записаться На Консультацию
Мы свяжемся
с вами
в течении
10 минут
laptop
Мы свяжемся с вами в течении 10 минут