Клуб API Карт

Реализация слоев через ObjectManager

irzhavskiy1984
11 февраля 2009, 15:49

Есть большое количесвто компании, около 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 масштаб, то отключаются все метки, как и должны, все работает.

3 комментария
Подписаться на комментарии к посту
Йопт! Сколько кода =) Ничего не понял и сайт тоже у меня не загрузился... оооооооооочень медленно и ничего не заработало. Можешь на narod.ru выложить? В принципе помогу - если смогу) З.Ы. Кидай в след. раз меньше исходников и лучше обычным текстом.
На сколько я могу судить вы столкнулись с проблемой описанной здесь http://clubs.ya.ru/4611686018427393745/replies.xml?item_no=2313 А именно что ObjectManager не удаляет с карты объекты добавленные уже после добавения ObjectManger'a на карту.
Помочь Вам, к сожалению, пока не смогу. А вот сайт Ваш посмотрел, у Вас стоит новостийный скрипт. Подскажите как поменять группу новостей с сохранениемс стилей. Если тупо изменить block 223 на 224 группа меняется, но стили пропадают.