Клуб API Карт

Как убрать с карты динамически показанные метки?

Пост в архиве.

 Принцип:

Есть порядка 200 точек (меток), есть несколько кнопок (галочек) управления. Все эти 200 точек могут биться на несколько типов учреждений (например, многоэтажка, частный дом и т.п.). Но в то же время могут биться и на другие группы, например, магазин, ларек и т.п. Т.е. все эти маленькие группы могут перекликаться.

Вопрос:

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

Код примерно следующий:

var uchr_arr = [];
var placemark = [];
placemark[0] = new YMaps.Placemark(new YMaps.GeoPoint(xxx,xxx), {style: \"icons#style_school_sov\"});\n
placemark[0].name = 'Учреждение 1';\n
placemark[0].description = 'Описание учреждения 1';\n
//uchr_arr - [id, uchr_type, rajon, number]
uchr_arr = uchr_arr.concat([["0", "school", "sov", "52"]]);\n
placemark[1] = new YMaps.Placemark(new YMaps.GeoPoint(xxx,xxx), {style: \"icons#style_school_sov\"});\n
placemark[1].name = 'Учреждение 2';\n
placemark[1].description = 'Описание учреждения 2';\n
uchr_arr = uchr_arr.concat([["1", "dou", "len", "44"]]);\n
//и еще раз 200 в php-цикле
//дальше создали меню с галочками, и нажимаем на эту галочку:
li.bind(\"click\", function () {
    var link = YMaps.jQuery(this);
    if (link.attr(\"checked\")) {
        var filter_add = new Array();
        filter_add = ivedu_find_objects(uchr_arr, link.attr(\"id\"), map);
        for (i=0; i<filter_add.length; i++) {
            var uchr_id = uchr_arr[filter_add[i]][0];
            map.addOverlay(placemark[uchr_id]);
        }
    }
    else
    {
        var filter_remove = ivedu_find_objects(uchr_arr, link.attr(\"id\"), map);
        for (i=0; i<filter_add.length; i++) {
            var uchr_id = uchr_arr[filter_remove[i]][0];
            map.removeOverlay(placemark[uchr_id]);
        }
    }
});
//функция поиска по районам:
function ivedu_find_objects(uchr_arr, id, map) {
    var filter_out = [];
    for (i=0;i<uchr_arr.length;i++) {
        if (id==0) { var rajon = \"sov\"; }
        if (id==1) { var rajon = \"okt\"; }
        if (id==2) { var rajon = \"len\"; }
        if (id==3) { var rajon = \"fr\"; }
        if (uchr_arr[i][2] == rajon) {
            filter_out = filter_out.concat(uchr_arr[i][0]);
        }
    }
    return filter_out;
}

Т.е. по сути, есть массив точек. Часть этих точек размещаются на карте с помощью map.addOverlay(placemark[uchr_id]), но потом не хотят удаляться. Почему?

Варианты с группами мне не подходят, т.к., повторюсь, одно и то же учреждение может относиться к нескольким группам - комбинаций из 200 учреждений может быть очень много.

Пробовал через uchr_arr[i].filter(function (obj) { } (естественно с корректным формированием uchr_arr в самом начале), но та же песня - создаваться точки-то создаются, а вот удаляться никак не хотят.

Есть, конечно, вариант "из пушки по воробьям" - при удалении части меток удалять абсолютно все, а потом заново выставлять те метки, которые не должны быть удалены, но, думаю, должно быть более корректное решение.

1 комментарий

Эх, я косячник..

не ту переменную написал в коде удаления...

 

 

        var filter_remove = ivedu_find_objects(uchr_arr, link.attr(\"id\"), map);
        for (i=0; i<filter_add filter_remove.length; i++) {
            var uchr_id = uchr_arr[filter_remove[i]][0];
            map.removeOverlay(placemark[uchr_id]);
        }