Веб-разработка / Не ждём когда очнётся Яндекс. Сами добавляем станции метро на Яндекс.Карты

Для тех кто не в курсе, у меня есть проект http://zaproezd.kz
На почту часто стали писать: «когда вы добавите метро?».

Сперва я не считал это нужным, потому что:
  1. У метро ещё не запутанная схема, а пересадки автобус->метро у меня пока не сделаны, сейчас работает только автобус->автобус, троллейбус->троллейбус, трамвай->трамвай. Руки никак не дойдут объединить разные типы транспорта.
  2. Я не думал что им кто то пользуется серьёзно, ну чтобы добраться на работу например. Мне казалось что это больше алматинский аттракцион ))) Но неделю назад прокатившись в 6 часов вечера, я понял что люди то и детей с садика везут, и с работы едут, и пришли в метро не как я — тупо покататься на паровозике, да на станции поглазеть )))

Решил на время пока нет разнотипных пересадок сделать как в гугле:



То есть показывать станции метро на карте всегда, а не по включению чекбокса. Так как Яндекс ещё не добавил на свою карту станции метро, было решено использовав его API, сделать это самому.

В API Яндекс.Карт есть такая штука как метка (YMaps.Placemark)
// Создает метку
var placemark = new YMaps.Placemark(new YMaps.GeoPoint(37.609218,55.753559));
// Устанавливает содержимое, которое покажет при щелчке по метке
placemark.name = "Станция Байконур";
// Добавляет метку на карту
map.addOverlay(placemark);

Ничего сложного, можно ещё задавать свои стили, я добавил свои, потому что стандартные метки яндекса огроменные и закрывают названия улиц, что для меня критично. Несмотря на то что я сделал свои маленькие метки, мне не понравилось как метка 14х14 пикселей, смотрится при уменьшении зума карты. Улицы и дома становились меньше, а метки метро в размерах не менялась и закрывали своими тушами важные участки карты.

Нужно чтобы метки уменьшались и увеличивались в зависимости от зума, подумал я. Начались поиски решения, у YMaps.Placemark в свойствах ничего нужного не было найдено. Пошарив по API, нашёлся диспетчер объектов (YMaps.ObjectManager). У него был метод add, в который первым параметром шла метка(или массив меток), а вторым и третьим минимальный и максимальный зум при котором она видна.

В итоге получился вот такой код:
function metro() {
        // массив с координатами и названиями станций метро
    	var arrMetro = {
    			"Алатау": "76.89599,43.238482", "Ауэзова": "76.917297,43.240953",
    			"Байконур": "76.927168,43.240654", "Абай": "76.950782,43.242419",
    			"Алмалы": "76.9456,43.251572", "Жибек Жолы": "76.944806,43.259673",
    			"Райымбек": "76.944924,43.270806"
    			};
    	var objManager = new YMaps.ObjectManager(); // создаю диспетчер объектов
    	oMap.addOverlay(objManager);

    	// стили для большой метки
    	var ms = new YMaps.Style();
    	ms.iconStyle = new YMaps.IconStyle();
    	ms.iconStyle.href = "/images/metro.png";
    	ms.iconStyle.size = new YMaps.Point(14, 14); // 14х14 пикселей
    	ms.iconStyle.offset = new YMaps.Point(-7, -7);

        // стили для маленькой метки
        var msl = new YMaps.Style();
        msl.iconStyle = new YMaps.IconStyle();
        msl.iconStyle.href = "/images/metro.png";
        msl.iconStyle.size = new YMaps.Point(10, 10); // 10х10 пикселей
        msl.iconStyle.offset = new YMaps.Point(-5, -5);

        var aPlOpt  = {hasHint: true, hasBalloon : false, style: ms}; // options для больших меток
        var aPlOptL = {hasHint: true, hasBalloon : false, style: msl}; // options для маленьких меток
    	
        var aResMet  = []; // массив для больших меток
        var aResMetL = []; // массив для маленьких меток
        for (var iKey in arrMetro)
        {
        	var aMetPoint = arrMetro[iKey].split(","); // пилим координаты
                var oPoint = new YMaps.GeoPoint(aMetPoint[0], aMetPoint[1]);

                // создаю большую метку и закидываю её в массив
        	var pMetro = new YMaps.Placemark(oPoint, aPlOpt);
        	pMetro.name = iKey;
        	aResMet.push(pMetro);

        	// создаю маленькую метку и закидываю её в массив
        	var pMetroL = new YMaps.Placemark(oPoint, aPlOptL);
    		pMetroL.name = iKey;
    		aResMetL.push(pMetroL);
        }

        // закидываю метки в диспетчер объектов (массив, мин.зум, макс.зум)
        objManager.add(aResMetL, 12, 14);
    	objManager.add(aResMet, 15);
    }

Что же он делает. Если зум от 12 до 14, то показываются маленькие метки, как только зум становится больше, маленькие метки стираются с карты, а на их место отрисовываются большие.

от 12 до 14:

от 15 и выше:


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


 

Комментарии (6)

RSS свернуть / развернуть
+
0
avatar yakooobin
  • 21 / февраля / 2012 11:03
Я не думал что им кто то пользуется серьёзно, ну чтобы добраться на работу например. Мне казалось что это больше алматинский аттракцион ))) Но неделю назад прокатившись в 6 часов вечера, я понял что люди то и детей с садика везут, и с работы едут, и пришли в метро не как я — тупо покататься на паровозике, да на станции поглазеть )))
Да чувак, его уже юзают по полной :)
+
0
avatar RadMax
  • 21 / февраля / 2012 20:52
А я был в шоке от того, что в него ходят не как в парк развлечений )))
+
0
avatar yrnt
  • 21 / февраля / 2012 11:53
прикольно, лови +
+
0
avatar KaDuman
  • 21 / февраля / 2012 14:30
молодец
+
0
avatar KirillIvanov
  • 5 / марта / 2012 00:51
Полезный проект! Добавил в адрес к интренет-магазину клиентки номера автобусов которые туда идут и ссылку на Запроезд.кз чтоб сразу могли посмотреть каждый маршрут.
Еще бы можно было бы как-то код давать прямо к каждому маршруту, чтобы сразу на страницу маршрута автобуса вела. Или ссылку на место с приложенными номерами маршрутов (так даже лучше).
+
0
avatar RadMax
  • 5 / марта / 2012 09:17
В голове уже давно крутится задача сделать ссылки с параметрами, чтобы по ним можно было сразу переходить: на конкретный маршрут, на уже выбранный на карте поиск «в радиусе» или «от до». Но никак под неё времени выделить не получается :) Щас взялся дизайн подтянуть, как закончу, возьмусь за задачу с параметрами в ссылках.

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.