Есть большое количесвто компании, около 4 тыс. Они разделены по типам (рестораны, клубы, салоны красоты...). Нужно реализовать возможность включить/выключить слой (рубрику). Все почти получилось, только есть одно маленькое "но". Вот ссылка на страницу: http://karta.izum.ua
Попытаюсь описать свои действия:
1. Создаю и инициализирую 6 ObjectManager, каждый ObjectManager есть слой:
function initObjManagers()
{objManagerBeautyshops =
new YMaps.ObjectManager();
objManagerClubs =
new YMaps.ObjectManager();
objManagerDesigners =
new YMaps.ObjectManager();
objManagerFitness =
new YMaps.ObjectManager();
objManagerRestaurants =
new YMaps.ObjectManager();
objManagerShopping =
new YMaps.ObjectManager();
}
2. добавляю на карту метки (компании). Адреса компаний пересекаются, поэтому я сгруппировал точки с одинаковыми координатами. И каждый элемент массива list - это equalPoints - массив компаний с одинаковыми координатами.
function
setCompaniesOnMap(list, isFind)
for (var i = 0; i < list.length; i++)
{
var point = list[i];
var lengthEqualPoints = point.equalPoints.length;
{
// формируем метку для первой компании из списка
var company = point.equalPoints[0];
placemark = getPlacemark(point.geoPoint.longitude, point.geoPoint.latitude, getPlacemarkStyleByRubric(rubric));
findZoom = collectFindData(isFind, point);
// наносит на карту метку одной компании
setOneCompanyOnMap(point, 0, 0, findZoom);
if(lengthEqualPoints > 1)
{
var offset = offsetValue;
setPlacemarkEvents(point, placemark, offset, findZoom);
}
}
else alert("Метод 'GetCompanyList' веб-сервиса 'http://izum.ua/WebServices/LocationService.asmx' вернул некорректные данные");
);
function getPlacemark(longitude, latitude, sKey)
{
var point = new YMaps.GeoPoint(longitude, latitude);
return new YMaps.Placemark(point, {style:sKey});
}
// константа - глобальная переменная
var maxZoom = 17;
function collectFindData(isFind, point)
{
findZoom = maxZoom;
if (isFind)
{
findZoom = 5;
gCollectionBounds.add(
for (var i = 0; i < point.equalPoints.length; i++)
{
var company = point.equalPoints[i];
var rubric = company.rubric;
if (!rubricIds.contains(rubric))
rubricIds.push(rubric);
}
}
return findZoom;
}
function setOneCompanyOnMap(point, index, offset, findZoom)
{
var company = point.equalPoints[index];
var rubric = company.rubric;
placemark = getPlacemark(point.geoPoint.longitude, point.geoPoint.latitude, getPlacemarkStyleByRubric(rubric));
if (offset > 0)
placemark._point.__lng = placemark._point.__lng + offset;
// получаем ObjectManager рубрики текущей компании
objManager = getObjectManagerByRubric(rubric);
// добавляем на карту метку
objManager.add(placemark, findZoom, maxZoom);
// добавляем обработчик для метки компании для раскрытия информации о компании
setCompanyInfo(placemark, company);
function setCompanyInfo(placemark, company)
{
observer = YMaps.Events.observe(placemark,
{
});
}
// глобальный enum
var
function getObjectManagerByRubric(rubric)
{
switch(rubric)
{
case Rubrics.SHOPPING:
objManager = objManagerShopping;
break;
case Rubrics.CLUBS:
objManager = objManagerClubs;
break;
case Rubrics.RESTAURANTS:
objManager = objManagerRestaurants;
break;
case Rubrics.FITNESS:
objManager = objManagerFitness;
break;
case Rubrics.DESIGNERS:
objManager = objManagerDesigners;
break;
case Rubrics.BEAUTYSHOPS:
objManager = objManagerBeautyshops;
break;
}
return objManager;
}
Проблема состоит в следующем.Делаем поиск по улице. При наведении курсора на метку, появляются компании с таким же адресом. Все ок. Но если я пытаюсь выключить какой-нибудь из слоев, то отключаются только компании которые находятся сверху идентичных по адресу им компаний, т.е. метки, на которые вешали события MouseOver и Click. Но при всем этом, если включить максимальный 17 масштаб, то отключаются все метки, как и должны, все работает.