Клуб API Карт

Найдено на тему «фильтрация»:
objectManager.setFilter() из input
arzanal
25 июля 2017, 08:41

Добрый день!

как реализовать фильтр чтобы

objectManager.setFilter('id ==  было равно то что я ввожу из <input type ='text' name ='id'</input>');

Пожалуйста помогите

если можно более подробным примером

СПАСИБО

2 комментария
setFilter,ObjectManager,фильтрация
Фильтрация объектов ObjectManager
Николай Круглов
15 мая 2017, 17:00

Подскажите пожалуйста возможно ли реализовать  фильтрацию  меток  в objectManager  через checkbox в html.

На примере: https://tech.yandex.ru/maps/jsbox/2.1/object_manager_geojson

Метки фильтруються из списка на самой карте.

Можно ли вынисти их за пределы карты в html

как в примере: https://tech.yandex.ru/maps/jsbox/2.1/geoobjects_menu

Тяжел разобраться) в JS слабак... Носом тыкнете в нужную сторону... Пожалуйста!

1 комментарий
фильтрация,ObjectManager
Фильтрация myPlacemark
Максим Е.
5 февраля 2017, 21:26

Всем привет!

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

Собственно сам пример кода

<script type="text/javascript">
ymaps.ready(init);

function init () {
    var myMap = new ymaps.Map("map", {
            center: [55.167102, 61.397612],
            zoom: 11,
            controls: []
        }, {
            searchControlProvider: 'yandex#search',
            suppressMapOpenBlock: true
        });


myPlacemark1 = new ymaps.Placemark([55.167418, 61.379358], {
balloonContent: '1'
}, {
            iconLayout: 'default#image',
            iconImageHref: 'URL',
            iconImageSize: [26, 42],
            iconImageOffset: [-13, -42],
            balloonPanelMaxMapArea: 0
        }), 

myPlacemark2 = new ymaps.Placemark([55.162772, 61.292724], {
balloonContent: '2'
}, {
            iconLayout: 'default#image',
            iconImageHref: 'URL',
            iconImageSize: [26, 42],
            iconImageOffset: [-13, -42],
            balloonPanelMaxMapArea: 0
        }), 

myPlacemark3 = new ymaps.Placemark([55.194160, 61.362174], {
balloonContent: '3'
}, {
            iconLayout: 'default#image',
            iconImageHref: 'URL',
            iconImageSize: [26, 42],
            iconImageOffset: [-13, -42],
            balloonPanelMaxMapArea: 0
        }), 

myPlacemark4 = new ymaps.Placemark([55.142332, 61.375979], {
balloonContent: '4'
}, {
            iconLayout: 'default#image',
            iconImageHref: 'URL',
            iconImageSize: [26, 42],
            iconImageOffset: [-13, -42],
            balloonPanelMaxMapArea: 0
        }), 
clusterer = new ymaps.Clusterer({
        clusterBalloonContentLayoutWidth: 330,
        clusterBalloonContentLayoutHeight: 300,
        clusterBalloonAccordionShowIcons: false,
        clusterBalloonContentLayout: 'cluster#balloonAccordion',
        clusterDisableClickZoom: true,
        clusterOpenBalloonOnClick: true,
            clusterIcons: [{
                href: 'URL',
                size: [45, 55],
                offset: [-22, -55]
            }]});

clusterer.add(myPlacemark1).add(myPlacemark2).add(myPlacemark3).add(myPlacemark4);
var myBalloonLayout = ymaps.templateLayoutFactory.createClass();
ymaps.layout.storage.add();

myMap.geoObjects.add(clusterer);
}


</script>

Выводить метки через myPlacemark№ очень удобно в моем случае. Как устроить фильтрацию на данном примере?

1 комментарий
фильтрация
Фильтр в ObjectManager
Феликс
17 мая 2016, 14:45

Добрый день.

Фильтрую метки слеюдующим способом:

YAMAP.MMObjectManager.setFilter(function (object) {
    return object.properties.FILTER.CLASS == "Премиум";
});

С Фильтром все ок, но я не пойму как мне получить список отфильтрованных объектов?
 

1 комментарий
ObjectManager,метка,фильтрация
Фильтрация меток на карте с помощью ObjectManager. Да, опять
olegfact
14 апреля 2016, 10:38

Добрый день.

Вот, пытаюсь реализовать фильтрацию меток черех ObjectManager. 
Собственно карта: https://github.com/Theder/eco-project/blob/OlegZ/map.php
Обработчик карты: https://github.com/Theder/eco-project/blob/OlegZ/map/geoobjects_menu.js

Проблема в том, что используя objectManager.setFilter(), то придется прописывать его каждого состояния  чекбоксов. Но в результате, код будет не гибким. 

Есть ли какие-то примеры реализации фильтрации с ObjectManager.

1 комментарий
фильтрация,ObjectManager
Как воссоздать функционал поиска организаций?
Valentin
4 апреля 2016, 14:04

Имеется множество координат, возможно их выводить сбоку как в примере поиска организаций? прим. https://yandex.ru/maps/213/moscow/?text=%D0%93%D0%B4%D0%B5%20%D0%BF%D0%BE%D0%B5%D1%81%D1%82%D1%8C&sll=37.620393%2C55.753960&sspn=2.068176%2C0.665271 

Интерисует сам список результатов поиска, который обновляется в зависимости от выбора города, адреса (в строке поиска), либо зума по карте.

Направьте в какую сторону копать. Спасибо. 

3 комментария
карта,фильтрация,поиск по организациям
Фильтрация объектов на карте
surrealistik
19 июня 2014, 16:30

1) Точки, выгружаемые из базы, сохранённые кошерно и они выводятся с помощью xml файла через geoXml. В мета данных у этих объектов есть параметр type, котоырй означает что эта точка относится к какому-то определённому типу. type = id категории например.

2) Есть менюха с типами (категориями) этих самых точке в виде чекбоксов.

Задача: отфильтровать это самое дело по этим типам. По умолчанию выделены все типы. При снятии галки пытаюсь отсеить ненужное, но получается какая-то ерунда, либо ничего не работает, либо всё удаляется.

Пытался раскуривать вот это, но что-то по ходу мозгов у мну не хватает категорически. Очень прошу помощи.

 

Вот что я навоял  в коде самой страницы есть js вот такого вида 

 

 

 ymaps.ready(function() {           
homeMap = new ymaps.Map('homeBigMap',{center: [53.419121,59.067168 ] ,zoom: 8,type: "yandex#map"});
            homeMap.controls
                .add("zoomControl")
                .add(new ymaps.control.TypeSelector(["yandex#map","yandex#hybrid", "yandex#publicMap"]));
            var balloonTpl ='<div class="mapItemRow">';
            balloonTpl+='<h3  class="mapItemRowTitle"><a href="$[properties.metaDataProperty.AnyMetaData.link]">$[properties.name]</a></h3>';
            balloonTpl+='<div class="mapItemRowLinkOuter"><a class="mapItemRowLink" href="$[properties.metaDataProperty.AnyMetaData.link]">Подробнее →</a></div>';
            balloonTpl+='</div>';
            window.myObjects = ymaps.geoQuery(ymaps.geoXml.load("http://xn---74-6cda1a0bzbkdetf.xn--p1ai/pointslist.xml").then(function(res){
                homeMap.geoObjects.add(res.geoObjects);
                res.geoObjects.options.set({ balloonContentBodyLayout: ymaps.templateLayoutFactory.createClass(balloonTpl)});
            }));
            myObjects.addToMap(homeMap);
            $(document).on('change','input[name="discountType"]', function() {
                var shownObjects,
                    checked = new ymaps.GeoQueryResult(),
                    uncheked = new ymaps.GeoQueryResult();
                $('input[name="discountType"]').each(function(i,item){
                    if($(this).prop('checked')){
                        checked.add(myObjects.search('properties.metaDataProperty.AnyMetaData.type == "'+$(this).val()+'"'));
                    }else{
                        uncheked.add(myObjects.search('properties.metaDataProperty.AnyMetaData.type == "'+$(this).val()+'"'));
                    }
                    shownObjects = checked.add(uncheked).addToMap(homeMap);;
                    myObjects.remove(shownObjects).removeFromMap(homeMap);
                });
            });
        });

 

 Решение

 


    ymaps.ready(function() {
        homeMap = new ymaps.Map('homeBigMap',{center: [53.419121,59.067168 ] ,zoom: 11,type: "yandex#map"});
        homeMap.controls
            .add("zoomControl")
            .add(new ymaps.control.TypeSelector(["yandex#map","yandex#hybrid", "yandex#publicMap"]));
        var balloonTpl ='<div class="mapItemRow">';
        balloonTpl+='<h3  class="mapItemRowTitle"><a href="$[properties.metaDataProperty.AnyMetaData.link]">$[properties.name]</a></h3>';
        balloonTpl+='<div class="mapItemRowLinkOuter"><a class="mapItemRowLink" href="$[properties.metaDataProperty.AnyMetaData.link]">Подробнее →</a></div>';
        balloonTpl+='</div>';
        window.myObjects = ymaps.geoQuery(ymaps.geoXml.load("{{ URL::route('XMLpointslist', array(strtotime(Sale::orderBy('updated_at', 'DESC')->first()->updated_at))) }}").then(function(res){
            res.geoObjects.options.set({ balloonContentBodyLayout: ymaps.templateLayoutFactory.createClass(balloonTpl)});
        }));
        myObjects.addToMap(homeMap);
    });
    $(document).on('change','input[name="discountType"]',function(){
        var search = myObjects.search('properties.metaDataProperty.AnyMetaData.type == "'+$(this).val()+'"'); //  ищим точки, которые соответствуют типу
        if(search.getLength()){   // проверяем найдено чего или нет
            if($(this).prop('checked')){
                myObjects.add(search).addToMap(homeMap); // если галка была установлена, то добавляем их на карту
            }else{
                myObjects.remove(search).removeFromMap(homeMap); // если снята, то убираем с карты
            }
        }
    });
6 комментариев
метка,API 2.0,фильтрация,geoXml
Карта с группировкой
advneo
19 апреля 2013, 17:59

Здравствуйте,

Подскажите, пожалуйста, новичку, как можно сделать группировку точек на карте в списки и фильтры, наподобие как здесь:

http://www.yar-edudep.ru/big_map#

И может ли такую карту создавать обычный администратор, или только программист?

2 комментария
API 2.0,фильтрация,коллекции
Экспликация - как лучше реализовать
company.stlanik
1 апреля 2013, 15:02

Добрый день!

 

Есть карта, на которой изображен некий географический объект (заповедник), прорисованы границы, стоянки, дома отдыха и т.д.

Все эти объекты необходимо скрывать и показывать по нажатию на ссылки около карты (экспликация). Как это лучше всего реализовать?

Притом: все объекты типа точка запихануты в один массив для того, чтобы была кластеризация.

3 комментария
меню,метка,API 2.0,фильтрация
Как сделать перебор всех элементов на карте с частичным удалением?
Владимир Б.
23 марта 2013, 13:48

Добрый день

Задача - сделать фильтр по карте. Рассмотрим простейший вариант.

При нажатии на кнопку с id='onlyhand' остаются метки с propetries.name содержащим слово "участок"

Объекты на кару размещаются из xml добавлением в класстер clusterer.

 

Для начала я попробовал сделать перебор кластера методом each, оказалось что он перебирает только метки в зоне видимости и не объединенные в класстер.

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

$('#onlyhand').click(function(){
    clusterer.each(function (geoObject){
        clusterer.remove(geoObject);
    });
});

3 комментария
кластеризатор,API 2.0,фильтрация
Вопрос по зависимым селектам
bratyxa-servis
15 января 2013, 13:54

Привет всем недавно я спросил у бабушки-бетмена как делать зависимые селекты, что бы карта открывалась в выбранном регионе он мне кинул эту ссылку. В общем у меня вопросик а где брать эти самые кардинаты городов областей. Мне, например, надо по всей Беларуси. Зарание большое спасибо.

4 комментария
API 2.0,фильтрация
Коллекции коллекций с метками
Мошиков Владислав
4 января 2013, 21:33

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

Пример на который можно опираться:

кухни->Виды кухонь(АХиатская, Европейская, Кавказская)->Адреса ну или не адреса а оставшиесья метки..

 

6 комментариев
API 2.0,фильтрация,коллекции
Создание меню для отображения коллекций геообъектов
tekunova
28 декабря 2012, 16:45
Создание меню для отображения коллекций геообъектов

В последнее время в клубе нас часто спрашивают различные варианты примера меню для групп геообъектов. Так как все возможные кейсы предусмотреть невозможно, мы решили написать статью и по шагам объяснить подход к созданию такого меню.
Чтобы задать логику элементам меню, нужно связать его DOM-представление с ссылкой на объект API, с которым этот пункт меню будет взаимодействовать. Мы будем слушать событие 'click' на DOM-элементе и удалять или добавлять соответствующий геообъект с карты через API.


Построение меню из массива исходных данных

Существует множество различных вариантов, позволяющих нам осуществить это связывание, но все они в основном сводятся к перебору некоторого массива исходных данных, представляющих собой элементы, описывающие группы геообъектов.

Допустим у нас есть такой массив исходных данных:



// Группы объектов
var groups = [{
name: "Известные памятники",
preset: "twirl#redIcon",
style: "important",
items: [{
center: [50.426472, 30.563022],
name: "Монумент 'Родина-Мать'"
}, {
center: [50.45351, 30.516489],
name: "Памятник Богдану Хмельницкому"
}, {
center: [50.454433, 30.529874],
name: "Арка Дружбы народов"
}]
}, {
name: "Покушайки",
preset: "twirl#greenIcon",
style: "success",
items: [{
center: [50.50955, 30.60791],
name: "Ресторан 'Калинка-Малинка'"
}, {
center: [50.429083, 30.521708],
name: "Бар 'Сало-бар'"
}, {
center: [50.450843, 30.498271],
name: "Абсент-бар 'Палата №6'"
}, {
center: [50.454834, 30.516498],
name: "Ресторан 'Спотыкач'"
}]
}, {
name: "Оригинальные музейчики",
preset: "twirl#orangeIcon",
style: "warning",
items: [{
center: [50.443334, 30.520163],
name: "Музей грамзаписи и старинных музыкальных инструментов"
}, {
center: [50.446977, 30.505269],
name: "Музей истории медицины или Анатомический театр"
}, {
center: [50.452512, 30.530889],
name: "Музей воды. Водно-информационный центр"
}]
}, {
name: "Красивости",
preset: "twirl#blueIcon",
style: "info",
items: [{
center: [50.45987, 30.516174],
name: "Замок Ричарда-Львиное сердце"
}, {
center: [50.445049, 30.528598],
name: "'Дом с химерами'"
}, {
center: [50.449156, 30.511809],
name: "Дом Рыцаря"
}]
}];


Чтобы создать на его основе меню и маркеры на карте, нам необходимо в цикле перебирать элементы этого массива, например, с помощью стандартного метода forEach:


// Контейнер для меню.
var menu = $('<ul class="nav nav-list"/>');
// Перебираем все группы.
groups.forEach(function (group) {
// DOM-представление группы.
var menuItem = $('<li class="nav-header">' + group.name + ''),
// Создадим коллекцию для геообъектов группы.
collection = new ymaps.GeoObjectCollection(null, { preset: group.preset });
});


Для каждого элемента массива, представляющего собой описание группы геообъектов, мы создаем DOM-представление в виде элемента меню и представление на карте: коллекцию. Затем мы добавляем коллекцию на карту, а элемент — в меню. Мы будем обрабатывать клики на элементе и при их возникновении будем удалять или добавлять соответствующую коллекцию на карту, а также скрывать или отображать подменю.


// Добавляем коллекцию на карту.
myMap.geoObjects.add(collection);
menuItem
// Добавляем пункт в меню.
.appendTo(menu)
// Навешиваем обработчик клика по пункту меню.
.on('click', function (e) {
// Скрываем/отображаем пункты меню данной группы.
$(this)
.nextUntil('.nav-header')
.removeClass('active')
.slideToggle('fast');
// Скрываем/отображаем коллекцию на карте.
if (collection.getParent()) {
myMap.geoObjects.remove(collection);
} else {
myMap.geoObjects.add(collection);
}
});


Далее мы обрабатываем все элементы группы также с помощью forEach:


// Перебираем элементы группы.
group.items.forEach(function (item) {
// DOM-представление элемента группы.
var menuItem = $('<li><a href="javascript:void(0)">' + item.name + '</a></li>'),
// Создаем метку.
placemark = new ymaps.Placemark(item.center, { balloonContent: item.name });
// Добавляем метку в коллекцию.
collection.add(placemark);
menuItem
// Добавляем пункт в меню.
.appendTo(menu)
// Навешиваем обработчик клика по пункту меню.
.on('click', function (e) {
// Отменяем основное поведение (переход по ссылке)
e.preventDefault();
// Выставляем/убираем класс active.
menuItem
.toggleClass('active')
.siblings('.active')
.removeClass('active');
// Открываем/закрываем баллун у метки.
if (placemark.balloon.isOpen()) {
placemark.balloon.close();
} else {
// Плавно меняем центр карты на координаты метки.
myMap.panTo(placemark.geometry.getCoordinates(), {
delay: 0,
callback: function () {
placemark.balloon.open();
}
});
}
});
});


Здесь по аналогии мы создаем API-представление для каждого элемента группы в виде метки, которую добавляем в API-представление группы (коллекцию), и DOM-представление в виде элемента меню, который добавляем в меню после пункта соответствующей группы. Затем навешиваем на него обработчик события 'click', при возникновении которого будем открывать или закрывать балун у метки, а также менять центр карты.

После обработки всех данных нам остается добавить меню на страницу и установить область видимости карты в соответствии с её содержимым:


// Добавляем меню в сайдбар.
menu.appendTo($('#sidebar'));
// Выставляем масштаб карты чтобы были видны все группы.
myMap.setBounds(myMap.geoObjects.getBounds());


Итоговый код можно посмотреть тут.

Построение меню на основе YMapsML-файла

Этот вариант является достаточно распространенным, т.к. довольно удобно хранить коллекции геообъектов в формате XML у себя на сервере или на maps.yandex.ru в Моих картах. Реализовать его, пожалуй, даже проще в связи с тем, что geoXML-загрузчик возвращает нам готовые API-коллекции геообъектов, которые нам остается только добавить на карту.


// Загрузка YMapsML-файла.
ymaps.geoXml.load("http://api.yandex.ru/maps/doc/ymapsml/1.x/examples/xml/menufromymapsml.xml")
.then(function (res) {
// Все содержимое YMapsML файла возвращается ввиде коллекции.
var groups = res.geoObjects,
// Стили для DOM-представлений групп.
styles = {
"default#redPoint": "important",
"default#greenPoint": "success",
"default#orangePoint": "warning",
"undefined": "info"
};
// Добавляем все группы на карту.
myMap.geoObjects.add(groups);
});


Для построения меню нам нужно перебирать эти коллекции, например, с помощью метода each или итератора. Затем, получив в обработчике элементы коллекции, строить по ним пункты меню, связывая их с геообъектами посредством интерфейса DOM-событий.
Данные для пунктов меню (название) в этом варианте мы получаем из данных геообъектов и коллекций.


// Перебираем все группы.
groups.each(function (group) {
// Определяем стиль для группы.
var preset = group.options.get('preset') || 'twirl#blueIcon',
style = styles[preset.match(/#([a-z]+)[A-Z]/)[1]],
// Имя группы.
name = group.properties.get('name'),
// DOM-представление группы.
menuItem = $('<li class="nav-header">' + name + '');
menuItem
// Добавляем пункт в меню.
.appendTo(menu)
// Навешиваем обработчик клика по пункту меню.
.on('click', function (e) {
// Скрываем/отображаем пункты меню данной группы.
$(this)
.nextUntil('.nav-header')
.removeClass('active')
.slideToggle('fast');
// Скрываем/отображаем коллекцию на карте.
if (group.getParent()) {
groups.remove(group);
} else {
groups.add(group);
}
});
});


С элементами группы та же история, geoXML загрузчик превратит их в готовые метки, и нам не придется их самим создавать и добавлять на карту. Нужно лишь позаботиться об их DOM-представлении.


// Перебираем элементы группы.
group.each(function (item) {
var name = item.properties.get('name'),
// DOM-представление элемента группы.
menuItem = $('<li><a href="javascript:void(0)">' + name + '</a></li>');
// Добавляем пункт в меню.
menuItem
.appendTo(menu)
// Навешиваем обработчик клика по пункту меню.
.on('click', function (e) {
e.preventDefault();
// Выставляем/убираем класс active.
menuItem
.toggleClass('active')
.siblings('.active')
.removeClass('active');
// Открываем/закрываем балун у метки.
if (item.balloon.isOpen()) {
item.balloon.close();
} else {
// Плавно меняем центр карты на координаты метки.
myMap.panTo(item.geometry.getCoordinates(), {
delay: 0,
callback: function () {
item.balloon.open();
}
});
}
});
});


Итоговый пример можно посмотреть тут.

Подключение существующего меню к геообъектам на карте

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

Это можно сделать, проставив DOM-элементам атрибуты id, а геообъектам передать произвольное поле в объекте-данных (поле properties в первом параметре в конструкторе коллекции и второй параметр в конструкторе метки).

Таким образом создание коллекции с названием и идентификатором будет выглядеть следующим образом:


var group1 = new ymaps.GeoObjectArray({
properties: {
id: 'group-1',
name: 'Известные памятники'
}
}, {
preset: 'twirl#redIcon'
});


Далее наполним коллекцию метками с помощью метода add:


group1
.add(new ymaps.Placemark([50.426472, 30.563022], { id: 'group-1-1', balloonContent: 'Монумент "Родина-Мать"' }))
.add(new ymaps.Placemark([50.45351, 30.516489], { id: 'group-1-2', balloonContent: 'Памятник "Богдану Хмельницкому"' }))
.add(new ymaps.Placemark([50.454433, 30.529874], { id: 'group-1-3', balloonContent: 'Арка Дружбы народов' }));


Поскольку в данном примере мы не будем хранить ссылки на коллекции, мы поместим наши коллекции в еще одну коллекцию, назовем ее visible и добавим ее на карту. Чтобы скрыть коллекции с карты мы будем переносить их (добавлять) в другую коллекцию, назовем ее hidden, которую мы не будем добавлять на карту. Стоит отметить в API все геообъекты и коллекции реализуют интерфейс IChildOnMap. Следовательно добавление геообъекта или коллекции в другую коллекцию удалит его из текущей коллекции. В нашем случае перенос коллекции геообъектов из visible в hidden приведет к удалению этой коллекции с карты.


// Добавляем все группы в одну коллекцию.
visible
.add(group1)
.add(group2)
.add(group3)
.add(group4);
// Добавляем все группы на карту.
myMap.geoObjects.add(visible);


Теперь если мы добавим коллекцию group1 в другую коллекцию hidden,


hidden.add(group1);


она автоматически будет удалена из коллекции visible и соответственно с карты.

Поместим код управления видимостью коллекций на карте в отдельный метод groupToggle, принимающий идентификатор коллекции.


// Ищем нужную группу и добавляем/удаляем ее с карты.
function groupToggle (id) {
// Все группы лежат внутри одной коллекции, которую мы получили из YMapsML.
var it, group;
// Сначала ищем в видимой на карте коллекции.
it = visible.getIterator();
while (group = it.getNext()) {
if (group.properties.get('id') === id) {
hidden.add(group);
return;
}
}
// Если мы сюда попали, значит коллекция уже удалена и надо искать в удаленных.
it = hidden.getIterator();
while (group = it.getNext()) {
if (group.properties.get('id') === id) {
visible.add(group);
return;
}
}
}


В данном методе мы будем использовать итератор вместо уже знакомого нам метода each. Он имеет преимущество, так как мы можем при нахождении нужного элемента завершить перебор коллекции и выйти из функции вызовом return.

Обработчик клика на DOM-представлении коллекций будет выглядеть следующим образом:


$('.nav-header').on('click', function (e) {
// Скрываем/отображаем пункты меню данной группы.
$(this)
.nextUntil('.nav-header')
.removeClass('active')
.slideToggle('fast');
// Скрываем/отображаем коллекцию на карте.
groupToggle(this.id);
});


Для обработки кликов по пунктам меню, которые связаны с элементами группы, будем использовать следующий код:


// Обрабатываем клики на пунктах меню элементов группы.
$('li:not(.nav-header)').on('click', function (e) {
// Отменяем основное поведение (переход по ссылке)
e.preventDefault();
$(this)
.toggleClass('active')
.siblings('.active')
.removeClass('active');
itemToggle(this.id);
});


В методе itemToggle также будем использовать итераторы:


// Ищем нужную метку и открываем/закрываем ее балун.
function itemToggle (id) {
var it = visible.getIterator(),
group;
while (group = it.getNext()) {
for (var i = 0, len = group.getLength(); i < len; i++) {
var placemark = group.get(i);
if (placemark.properties.get('id') === id) {
if (placemark.balloon.isOpen()) {
placemark.balloon.close();
} else {
myMap.panTo(placemark.geometry.getCoordinates(), {
delay: 0,
callback: function () {
placemark.balloon.open();
}
});
}
return;
}
}
}
}


Итоговый пример можно посмотреть тут.

API 2.0,примеры,статьи,фильтрация,коллекции
поиск по карте объектов,загруженных с помощью ymapsML
Удалённый пользователь
7 декабря 2012, 12:36

возник вопрос. есть карта,объекты на которую добавляются через data.php файл,в котором сгенерирован xml объекты из базы данных. необходимо без перезагрузки страницы осуществлять фильтрацию-поиск объектов на этой карте (т е удалить старые и нарисовать найденные).  карта загружается следующим образом

 ymaps.ready(init);

        function init () {
            myMap = new ymaps.Map("Map", {
                    center: [53.904098,27.547099],
                    zoom: 12
                });

res=ymaps.geoXml.load(url)
                .then(function (res) {

//код добавления и кластеризации

});

подскажите,в каком направлении думать?

возможно ли каким-то образом осуществить с помощью аякса типа

 function doupdate(){

// myMap.geoObjects.remove(placemarks);
 var res = $.ajax({
    'type': 'POST',
    'url': '/data.php',
    'data': '',
    'success': function (res) {
   }

    })
} где в дату помещать параметры поиска. как потом полученный ответ опять разместить на карте?

13 комментариев
API 2.0,фильтрация,YMapsML
Не удаляются метки после их добавления на карту
SFAIRAT-L
8 мая 2012, 23:03

Помогите решить проблему с удалением определенных меток с карты после их добавления.

Суть следующая:

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

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

<script type="text/javascript">
 
var map;
 
window.onload = function () {
            map = new YMaps.Map(document.getElementById("YMapsID1")
            map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 4);
 
            map.addControl(new YMaps.TypeControl()
            map.addControl(new YMaps.ToolBar()
            map.addControl(new YMaps.Zoom()
            map.addControl(new YMaps.ScaleLine()
            map.enableScrollZoom(
 
YMaps.Events.observe(map, map.Events.Click, function (map, e) {
     map.openBalloon(e.getCoordPoint(), new myLayout(e.getCoordPoint())
}
 
}
 
function showgroups(a,b){
//Запрос данных и вывод меток на карту
YMaps.jQuery.getJSON("vivodpointsmap.php", {id:a,type:b},
function(json){
for (i = 0; i < json.markers.length; i++) {
var placemark=new YMaps.Placemark(new YMaps.GeoPoint(json.markers[i].lat,json.markers[i].lng)
placemark.description = '<div style="color:#ff0303;font-weight:bold">'+json.markers[i].name+'</div>';
placemark.description = placemark.description+'<br /><a href="..../item.php?id='+json.markers[i].id+'" target="_blank">Подробнее</a>';
//Проверяем чекбоксы
if ($(":checkbox[id=checkBx" + a + "]").is(":checked"))
{
map.addOverlay(placemark);
}
else
{
map.removeOverlay(placemark);
}
}
}
return false;
}
 
</script> 

 

<input type='checkbox' id='checkBx22' onClick='showgroups(22,1);'>Чекбокс1<br>

<input type='checkbox' id='checkBx16' onClick='showgroups(16,1);'>Чекбокс2<br>

<input type='checkbox' id='checkBx45' onClick='showgroups(45,1);'>Чекбокс3<br>

.....

<input type='checkbox' id='checkBx35' onClick='showgroups(35,1);'>Чекбокс30<br>

 

Насколько я понимаю map.removeOverlay(placemark); не может удалять уже добавленные метки, исходя из полученных данных. И заносить эти метки в группы по чекбоксам тоже наверно не получится, потому что чекбоксов будет очень много. Или же я изначально не правильно начал реализацию данной идеи.

Подскажите в чем дело?

8 комментариев
метка,фильтрация
Прошу помощи решить проблему
Сергей У.
25 августа 2011, 15:56

Есть пример добавления меток пользователями и вывод их по категориям http://webmap-blog.ru/examples/vivodpoints-2.html. Все работает хорошо, но есть одна проблема. Когда добавляются несколько меток подряд на карту для одной категории, третья метка два раза заноситься в базу данных. Прошу подсказать, почему это происходит?

2 комментария
метка,фильтрация
[РЕШЕНО] Ссылки и ballon - фильтрация объектов
Дмитрий Бабанов
2 августа 2010, 12:24

Доброго всем.
Суть проблемы - у меня отдельным скриптом (не js) строится список объектов. Вторым скриптом строяться метки этих объектов на карте. При клике на метку на карте - у меня все нормально открывается ballon и выделяется указанный объект по id. А вот как сделать обратное мне не понять.

При загрузку страницы у меня есть уже все объекты и все их метки на карте. При клике на объект мне надо открыть принадлежащий ему ballon не скрывая всех. Поступить как в примере с "вокзалами" не могу.

 

Решение

Иногда возникает необходимость
обратиться к объекту ballon соверешенно из другого места, и по некоторым
причинам не возможно / не хочется возиться с оверлеями. Выход из данной
ситуации, такой - при создании карты с метками, группируем их и даем
каждой метке уникальный id. А потом из любого места на страницы мы можем
обратиться к нужной нам метке по id - и вызвать ballon (фильтрация)

 

код карты:

         var group;

        // Создание обработчика для события window.onLoad
        YMaps.jQuery(function () {
            // Создание экземпляра карты и его привязка к созданному контейнеру
            var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);

            // Установка для карты ее центра и масштаба
            map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 6);
            map.enableScrollZoom();

            // Группа объектов
            group = new YMaps.GeoObjectCollection();
            map.addOverlay(group);

            // Добавление объектов
            var placemark = new YMaps.Placemark(new YMaps.GeoPoint(37, 55));
            placemark.id = 1;
            group.add(placemark);

            var placemark2 = new YMaps.Placemark(new YMaps.GeoPoint(36, 54));
            placemark2.id = 2;
            group.add(placemark2);
        })

Код фильтрации и вызова ballon:

        function openPlacemarkById (id) {
            var filterObjects = group.filter(function (obj) {
                return obj.id == id;
            });

            filterObjects[0].openBalloon();

            return false;
        }

Ну и совсвенно код ссылки:

<a href="#"onclick="return openPlacemarkById(1)">1</a>


За помощь спасибо   - собственно он и автор этого всего )))

 

1 комментарий
меню,фильтрация