Кастомизация балуна метки

216
05 июня 2018, 09:00

1)Подскажите, как добавить изображение в балун?

Создаю кастомный кластеризатор:

var places = [];
groups.forEach(function (grp) {
    grp.items.forEach(function (plc) {
        places.push(plc)
    });
});
// Создаем собственный макет с информацией о выбранном геообъекте.
var customItemContentLayout = ymaps.templateLayoutFactory.createClass(
    // Флаг "raw" означает, что данные вставляют "как есть" без экранирования html.
    '<h2 class=ballon_header>{{ properties.balloonContentHeader|raw }}</h2>' +
    '<img class=balloon_img>{{properties.balloonImage|raw }}</img>'+
    '<div class=ballon_body>{{ properties.balloonContentBody|raw }}</div>' +
    '<div class=ballon_footer>{{ properties.balloonContentFooter|raw }}</div>'
);
var clusterer = new ymaps.Clusterer({
    clusterDisableClickZoom: true,
    clusterOpenBalloonOnClick: true,
    // Устанавливаем режим открытия балуна. 
    // В данном примере балун никогда не будет открываться в режиме панели.
    clusterBalloonPanelMaxMapArea: 0,
    // Устанавливаем размер макета контента балуна (в пикселях).
    clusterBalloonContentLayoutWidth: 500,
    // Устанавливаем собственный макет.
    clusterBalloonItemContentLayout: customItemContentLayout,
    // Устанавливаем ширину левой колонки, в которой располагается список всех геообъектов кластера.
    clusterBalloonLeftColumnWidth: 120
});
// Заполняем кластер геообъектами со случайными позициями.
getPointData = function (index) {
        return {
        balloonImage: places[index].img,
        balloonContentHeader: places[index].name,
        balloonContentBody: places[index].Body,
        balloonContentFooter: places[index].Footer,
        clusterCaption: '<strong>' + places[index].name + '</strong>'
    }; 
},
getPointOptions = function () {
   return {
       preset: 'islands#redIcon'
   };
},
points = [];
groups.forEach(function (grp) {
   grp.items.forEach(function (plc) {
       points.push(
           plc.center
       );
   });
});
geoObjects = [];
for (var i = 0, len = points.length; i < len; i++) {
    geoObjects[i] = new ymaps.Placemark(points[i], getPointData(i), 
    getPointOptions());
}
clusterer.add(geoObjects);
myMap.geoObjects.add(clusterer);
myMap.setBounds(clusterer.getBounds(), {
    checkZoomRange: true
});

Данные координат и данных для меток тянутся из другого .js файла который имеет вид

var groups = [
    {           style: "islands#redIcon",
            items: [
            {
                center: [50.621523, 36.578564],
                name: "Корпус №1",
                Header: "Корпус №1",
                Body: "<p>Факультет математики и естественнонаучного образования;</p> <p>Институт инженерных технологий и естественных наук - инженерно-физическое направление;</p> <p><strong>Приемная комиссия</strong></p>",
                img: '<img src="image/logo_name.jpg" />'
            },
            {
                center: [50.621442, 36.577685],
                name: "Корпус №2",
                Header: "Корпус №2",
                Body:"Институт педагогический;<p> Факультет иностранных языков",
                img: '<img src="image/logo_name.jpg" />'
            },

Проблема в том, что стили применяются к кластеризированным меткам, а если они находятся отдельно, то изображение и стили не применяются. Может быть решением является создание отдельного макета для единичного балуна? или как по другому это можно организовать?

Answer 1

Самый простой способ сделать балун с фотографией, это задать balloonContentBody.

ymaps.ready(function() { 
  var myMap = new ymaps.Map('map', { 
    center: [55.733835, 37.588227], 
    zoom: 12, 
    controls: [] 
  }); 
 
  var myPlacemark = new ymaps.Placemark(myMap.getCenter(), { 
    balloonContentBody: [ 
      '<address>', 
      '<strong>Офис Яндекса в Москве</strong>', 
      '<br/>', 
      'Адрес: 119021, Москва, ул. Льва Толстого, 16', 
      '<br/>', 
      'Подробнее: <a href="https://company.yandex.ru/">https://company.yandex.ru</a>', 
      '<br/>', 
      '<img src="http://mis.mixmarket.biz/r/200/65735/149827303.jpg"/>', 
      '</address>' 
    ].join('') 
  }, { 
    preset: 'islands#redDotIcon' 
  }); 
 
  myMap.geoObjects.add(myPlacemark); 
  myPlacemark.balloon.open(); 
});
html, 
body, 
#map { 
  width: 100%; 
  height: 100%; 
  padding: 0; 
  margin: 0; 
}
<script type="text/javascript" src="https://api-maps.yandex.ru/2.1/?lang=ru_RU"></script> 
<div id="map"></div>

READ ALSO
Вывод тегов в виде тега, а не текста

Вывод тегов в виде тега, а не текста

В переменную Vue записан тег (переменная SomeTag и тег <a href="test">топ ссылка</a>)При выводе <div>{{SomeTag}}</div> выводит: <a href="test">топ ссылка</a>,...

174
Получить список регионов из карты google

Получить список регионов из карты google

У меня есть карта google построенная по сводным таблицам (FusionTablesLayer)

171
Slack bot Api Как сделать отправку сообщения юзеру от бота?

Slack bot Api Как сделать отправку сообщения юзеру от бота?

С (WebAPI) и с помощью кода ниже отправлю сообщение указанному пользователю

148
Наличие противоречий и ошибок в функции

Наличие противоречий и ошибок в функции

Есть ли противоречия или ошибки в функции move(); ?

168