Геометрические объекты и балуны в Рабмлер-Картах

в 11:43, , рубрики: Блог компании «Афиша» и «Рамблер», карты, Рамблер, рамблер-карты, метки: , ,

Геометрические объекты и балуны в Рабмлер Картах

Те, кто уже пользовался API карт других разработчиков, думаю, без труда разберутся и с API Рамблер-Карт. Набор классов и методов достаточно стандартный и очевидный.

Документацию можно найти тут: http://maps.rambler.ru/api/docs.

Чтобы на примере разобраться с тем, как придавать геометрическим объектам внешний вид, отличный от дефолтного, решим простую задачку. Создадим карту древних областей Москвы, чтобы при наведении курсора на ту или иную область она выделялась цветным многоугольником, а при левом клике открывался балун с небольшой информацией о ней.

1. Создаём карту. Это просто: задаём параметры контейнера

<div id="myMap" style="width:800px;height:600px;"></div>

… и помещаем в него карту map — экземпляр класса RMap.

//создаём карту, задаём координаты её центра и масштаб
var map = new RMap('myMap', {
    //координаты центра Москвы
    center: {"lon":37.62074982031279,"lat":55.75337144909794} ,
    zoom: 13, // подбираем подходящий масштаб
    styles: {
        //выключаем отображение меток
        Marker: {style: {display: "none"}}
    },
    dragging: false, //отключаем возможность перетаскивания карты...
    zooming: false, //и изменения масштаба: вся функциональность сосредоточена на одном участке
    widgets: false, //отключаем за ненадобностью виджеты
    controls: false //и элементы управления
});

2. Теперь создадим переменную areas с информацией об областях, их границах (точках для построения многоугольников) и цвете отображения на карте: красный — Кремль, жёлтый — Китай-город, белый — Белый город и коричневый — Земляной город. Для экономии пространства сейчас опишем только Кремль, а полный пример можно найти в конце статьи.

//список исторических областей Москвы
var areas = {
    //Кремль
    kremlin: {
        name: "Кремль",
        desc: "— древнейшая часть Москвы, и т.д. и т.п.",
        background: "#FF0000",
        points: [
            {"lon":37.61318805816646,"lat":55.74786393721869},
            {"lon":37.611128121643006,"lat":55.74931626156693},
            {"lon":37.616106301574696,"lat":55.75614145874745},
            {"lon":37.62232902648932,"lat":55.7526806043867},
            {"lon":37.62374523284919,"lat":55.749606719921196},
            {"lon":37.6174366772461,"lat":55.74895318557001}
        ]
    },
    … //остальные области описываются аналогичным образом
};

3. Далее создадим функцию, которая будет менять внешний вид многоугольника области с невидимого (прозрачность = 0) на видимый (прозрачность = 0.5) и обратно. Для этого используем метод setView класса Polygon.

//создаём функцию для отображения или скрытия многоугольника
function toggle(area, doShow) {
    //если на области открыт балун, то ничего не делаем
    if(area.hasBalloon)
        return;
    //иначе функция изменяет прозрачность нужного многоугольника
    area.polygon.setView({
        style: {
            backgroundOpacity: doShow ? 0.5 : 0
        }
    });
};

//функции-помощницы
function show(area) {
    toggle(area, true);
}
function hide(area) {
    toggle(area, false);
}

4. Далее создаём функцию отображения областей. Она создаёт многоугольники и добавляет к ним обработчики, которые будут изменять их прозрачность многоугольника при наведении на него курсора, а при отводе — возвращать его в исходное состояние (невидимый). Щелчок мышью по многоугольнику будет открывать информационное окно (т.н. балун) в месте клика. Содержимое балуна и само его появление зависят от места, где был произведён щелчок мышкой: если ткнуть вне многоугольников, ничего не должно происходить.

//обрабатываем все области по очереди
for(var k in areas) {
    prepareArea(areas[k]);
}

function prepareArea(area) {
    //создаём многоугольник для отображения нужной области
    area.polygon = map.geometry.create("polygon", {
        points: area.points,
        style: {
            lineWidth: 0, //отключаем отображение границ
            background: area.background, //устанавливаем нужный цвет многоугольнику
            backgroundOpacity: 0 //по умолчанию область невидима
        }
    }, true);

    //устанавливаем обработчики на наведение/отведение курсора
    area.polygon.on('mouseover', function(evt) {
        show(area);
    });
    area.polygon.on('mouseout', function(evt) {
        hide(area);
    });

    //обработчик клика — открывается балун
    area.polygon.on('lclick', function(evt){
        //убираем всё лишнее
        map.geometry.remove("marker");
        for(var k in areas)
            areas[k].hasBalloon = false;
        //скрываем все области, кроме нужной
        for(var k in areas)
            if(areas[k] !== area)
                hide(areas[k]);

        //открываем балун в точке щелчка мыши (функцию showBalloon объявим чуть ниже)
        showBalloon(area, {
            x: evt.x,
            y: evt.y
        });
    });

    // устанавливаем изначальное положение балуна 
    if(area.balloonAt)
        showBalloon(area, area.balloonAt);
}

5. И — вуаля: функция, открывающая балун.

function showBalloon(area, crd) {
    //создаём метку
    var mrkr = map.geometry.create("marker", {
        coord: map.makeCoord(crd)
    }, true);

    //добавляем к ней балун
    mrkr.addBalloon({
        style: balloonStyle,
        closeButton: true,
        content: {
            name: area.name,
            desc: area.desc
        },
        template: balloonTmpl
    }, true);

    //обработчик события при закрытии балуна — скрываем все области
    mrkr.balloon.on('hide', function(evt) {
        area.hasBalloon = false;
        for(var k in areas)
            hide(areas[k]);
    });
    show(area);
    area.hasBalloon = true;
}

Посмотреть на результат и исследовать полный исходный код можно здесь.

Автор: 127

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js