Добрый день!
как реализовать фильтр чтобы
objectManager.setFilter('id == было равно то что я ввожу из <input type ='text' name ='id'</input>');
Пожалуйста помогите
если можно более подробным примером
СПАСИБО
Добрый день!
как реализовать фильтр чтобы
objectManager.setFilter('id == было равно то что я ввожу из <input type ='text' name ='id'</input>');
Пожалуйста помогите
если можно более подробным примером
СПАСИБО
Подскажите пожалуйста возможно ли реализовать фильтрацию меток в 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 слабак... Носом тыкнете в нужную сторону... Пожалуйста!
Всем привет!
Прошу сильно не кричать, но очень прошу помочь))) Карту для сайта начал собирать неделю назад и знакомиться с документацией и примерами тоже. Собрал рабочий пример, но теперь не могу разобраться, как создать фильтрацию в нем - необходимо добавить один параметр (например, день недели) с несколькими чекбоксами (события в понедельник, во вторник и т.д.), по которым бы и производилась фильтрация и показывались/скрывались метки.
Собственно сам пример кода
<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№ очень удобно в моем случае. Как устроить фильтрацию на данном примере?
Добрый день.
Фильтрую метки слеюдующим способом:
YAMAP.MMObjectManager.setFilter(function (object) {
return object.properties.FILTER.CLASS == "Премиум";
});С Фильтром все ок, но я не пойму как мне получить список отфильтрованных объектов?
Добрый день.
Вот, пытаюсь реализовать фильтрацию меток черех 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.
Имеется множество координат, возможно их выводить сбоку как в примере поиска организаций? прим. 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
Интерисует сам список результатов поиска, который обновляется в зависимости от выбора города, адреса (в строке поиска), либо зума по карте.
Направьте в какую сторону копать. Спасибо.
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#h ybrid", "yandex#publicMap"])); var balloonTpl ='<div class="mapItemRow">';balloonTpl+='<h3 class="mapItemRowTitle"><a href="$[properties.metaDataProperty.AnyMetaData.li nk]">$[properties.name]</ a></h3>'; balloonTpl+='<div class="mapItemRowLinkOuter"><a class="mapItemRowLink" href="$[properties.metaDataProperty.AnyMetaData.li nk]">Подробнее →</a></div>'; balloonTpl+='</div>';window.myObjects = ymaps.geoQuery(ymaps.geoXml.load("http://xn---74-6cda1a0bzbkdetf.xn--p1ai/pointslist ").then(function(res){.xml 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,it em){ if($(this).prop('checked')){checked.add(myObjects.search('properties.metaDataP roperty.AnyMetaData.type == "'+$(this).val()+'"')); }else{uncheked.add(myObjects.search('properties.metaData Property.AnyMetaData.type == "'+$(this).val()+'"')); }shownObjects = checked.add(uncheked).addToMap(homeMap);;myObjects.remove(shownObjects).removeFromMap(homeM ap); });});});
Решение
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#h ybrid", "yandex#publicMap"])); var balloonTpl ='<div class="mapItemRow">';balloonTpl+='<h3 class="mapItemRowTitle"><a href="$[properties.metaDataProperty.AnyMetaData.li nk]">$[properties.name]</ a></h3>'; balloonTpl+='<div class="mapItemRowLinkOuter"><a class="mapItemRowLink" href="$[properties.metaDataProperty.AnyMetaData.li nk]">Подробнее →</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.AnyM etaData.type == "'+$(this).val()+'"'); // ищим точки, которые соответствуют типу if(search.getLength()){ // проверяем найдено чего или нетif($(this).prop('checked')){myObjects.add(search).addToMap(homeMap); // если галка была установлена, то добавляем их на карту}else{myObjects.remove(search).removeFromMap(homeMap); // если снята, то убираем с карты}}});
Здравствуйте,
Подскажите, пожалуйста, новичку, как можно сделать группировку точек на карте в списки и фильтры, наподобие как здесь:
http://www.yar-edudep.ru/big_map#
И может ли такую карту создавать обычный администратор, или только программист?
Добрый день!
Есть карта, на которой изображен некий географический объект (заповедник), прорисованы границы, стоянки, дома отдыха и т.д.
Все эти объекты необходимо скрывать и показывать по нажатию на ссылки около карты (экспликация). Как это лучше всего реализовать?
Притом: все объекты типа точка запихануты в один массив для того, чтобы была кластеризация.
Добрый день
Задача - сделать фильтр по карте. Рассмотрим простейший вариант.
При нажатии на кнопку с id='onlyhand' остаются метки с propetries.name содержащим слово "участок"
Объекты на кару размещаются из xml добавлением в класстер clusterer.
Для начала я попробовал сделать перебор кластера методом each, оказалось что он перебирает только метки в зоне видимости и не объединенные в класстер.
Подскажите, пожалуйста, как приведенный ниже пример заставить работать по всем меткам?
$('#onlyhand').click(function(){
clusterer.each(function (geoObject){
clusterer.remove(geoObject);
});
});
Привет всем недавно я спросил у бабушки-бетмена как делать зависимые селекты, что бы карта открывалась в выбранном регионе он мне кинул эту ссылку. В общем у меня вопросик а где брать эти самые кардинаты городов областей. Мне, например, надо по всей Беларуси. Зарание большое спасибо.
Собственно какие методы можно или нужно применять в данном случае?
Пример на который можно опираться:
кухни->Виды кухонь(АХиатская, Европейская, Кавказская)->Адреса ну или не адреса а оставшиесья метки..
В последнее время в клубе нас часто спрашивают различные варианты примера меню для групп геообъектов. Так как все возможные кейсы предусмотреть невозможно, мы решили написать статью и по шагам объяснить подход к созданию такого меню.
Чтобы задать логику элементам меню, нужно связать его 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/y mapsml/1.x/examples/xml/m enufromymapsml.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;
}
}
}
}
Итоговый пример можно посмотреть тут.
возник вопрос. есть карта,объекты на которую добавляются через 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) {
}
})
} где в дату помещать параметры поиска. как потом полученный ответ опять разместить на карте?
Помогите решить проблему с удалением определенных меток с карты после их добавления.
Суть следующая:
Есть ряд чекбоксов. В зависимости от нажатого чекбокса, на карте выводятся определенные метки.
Необходимо чтобы после снятия галочки с уже нажатого чекбокса, эти самые метки были удалены. Но при этом, чтобы метки добавленные при нажатии других чекбоксов оставались на карте.
К сожалению все приведенные примеры не подходят для моих целей, но мне все же получилось реализовать процесс вывода на карту, только вот удаление не работает.
<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.marke
placemark.description = '<div style="color:#ff0303;font
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); не может удалять уже добавленные метки, исходя из полученных данных. И заносить эти метки в группы по чекбоксам тоже наверно не получится, потому что чекбоксов будет очень много. Или же я изначально не правильно начал реализацию данной идеи.
Подскажите в чем дело?
Есть пример добавления меток пользователями и вывод их по категориям http://webmap-blog.ru/examples/vivodpoints-2.html. Все работает хорошо, но есть одна проблема. Когда добавляются несколько меток подряд на карту для одной категории, третья метка два раза заноситься в базу данных. Прошу подсказать, почему это происходит?
Доброго всем.
Суть проблемы - у меня отдельным скриптом (не 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>
За помощь спасибо- собственно он и автор этого всего )))