Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов на одну карту

Просмотров: 279 | Комментариев: 1

Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоблоке некоторое количество элементов, в принципе любое. Пусть, это будут офисы продаж.

Задача: вывести все офисы продаж на карту с метками и основными данными о точке- в бубл (или как, там называется эта штука- при клике на метку).

Собираем все координаты и нужные данные для карты

Для начала нам нужно собрать все координаты, всех элементов в один массив. Для этого, пробежимся методом CIBlockElement::GetList - по всем элементам этого инфоблока. Получив данные из свойства "Привязка к яндекс картам" (в моем случае, его код ATT_YA_MAP) и название элемента.

$iblock_id = 10; // ID инфоблока с кторым работаем
    $mapData = CIBlockElement::GetList(
        Array("ID" => "ASC"),
        Array("IBLOCK_ID" => $iblock_id),
        false,
        false,
        Array(
            'ID',
            'NAME',
            'PROPERTY_ATT_YA_MAP',
            'PROPERTY_ATT_PHONE',
        )
    );
    while ($ar_fields = $mapData->GetNext()) {

        $onMap = explode(",",$ar_fields['PROPERTY_ATT_YA_MAP_VALUE']);
        $mapLAT = $onMap[0];
        $mapLON = $onMap[1];
        $arPlacemarks[] = array(
            "LAT" => $mapLAT,
            "LON" => $mapLON,
            "TEXT" => $ar_fields["NAME"] . $ar_fields["PROPERTY_ATT_PHONE_VALUE"],
        );

    }

Пояснения к тому что происходит:

  • В свойстве "Привязка к яндекс картам", данные хранятся в виде строки с широтой и долготой, указанные через запятую.
  • Мы, с помощью функции explode, разбиваем эту строку на массив $onMap. Запятую используем как разделитель.
  • В переменные $mapLAT и $mapLON загоняем широту и долготу (елементы массива $onMap) соответственно
  • Создаем массив $arPlacemarks в который передаем широту и долготу. В элемент "TEXT" передали название элемента и номер телефона (из свойства элемента инфоблока - ATT_PHONE)

Из элемента массива $arPlacemarks "TEXT" - как раз и собираются данные для бабла (и как, там называется эта штука- при клике на метку).

Выводим все точки на одну Яндекс карту

Дальше, просто выводим стандартный компонент "bitrix:map.yandex.view" и передаем массив $arPlacemarks в параметр компонента "MAP_DATA" (превращая массив в serialize строку)

 $APPLICATION->IncludeComponent(
    "bitrix:map.yandex.view",
    "",
     Array(
        "INIT_MAP_TYPE" => "MAP",
        "MAP_DATA" => serialize(array('yandex_scale' => 3, 'PLACEMARKS' => $arPlacemarks)),
        "MAP_WIDTH" => "100%",
        "MAP_HEIGHT" => "350",
        "CONTROLS" => array("ZOOM", "MINIMAP", "TYPECONTROL", "SCALELINE"),
        "OPTIONS" => array("DESABLE_SCROLL_ZOOM", "ENABLE_DBLCLICK_ZOOM", "ENABLE_DRAGGING"),
         "MAP_ID" => ""
    ),
false

В общем-то и все. Должна вывестись единая Яндекс карта, со всеми метками из элементов нужного инфоблока.

Метки на карте из инфоблока

Добавлено чуть позже: сфокусировать карту в области точек.

Если все точки на карте, более менее не далеко друг от друга и нужно сфокусировать карту в их области. Что бы не показывать всю Россию, например, если точки находятся в Новосибирске.

Можно передать в "MAP_DATA" позицию последней (из GetList) точки, просто добавив:

"MAP_DATA" => serialize(array(
            'yandex_lat' => $onMap[0], 
            'yandex_lon' => $onMap[1], 
            'yandex_scale' => 9, 
            'PLACEMARKS' => $arPlacemarks)),

Мы их передали в yandex_lat и yandex_lon. А параметр yandex_scale - это приближение карты (по моему: 0 - максимально близко и 30- максимально высоко)


Αнтон
это с применением стандартной функции настраиваемой яндекс-карты?
а как заменить эти типовые точки на собственные, если требуется разделять объекты по значимости ??
Михаил
Цитата
Αнтон Μаксимов написал:
это с применением стандартной функции настраиваемой яндекс-карты?
а как заменить эти типовые точки на собственные, если требуется разделять объекты по значимости ??
Тут, пока не подскажу. Чуть позже, буду решать эту задачку. Если не забуду, допишу в эту заметку
Αнтон
по идее - работающее решение у меня под руками есть
но оно готовое и не мое.. придется копаться в коде значит..

Кроме создания сайтов, я так же веду блог с заметками о вебразработке, записываю бесплатные видеоуроки и содержу форум, на котором можно задавать вопросы и просто общаться. Заметки, преимущественно - это короткие или подробные рецепты, по реализации часто требуемого функционала- в рамках разработки сайтов на 1С-Битрикс

Показать еще