Как наши Соседи подружились с Яндекс.Картами

    В какой стране мы живем? Правильно — в России.
    Так зачем же привязывать себя к забугорным картам от Google?
    Мы живем в России, а для нее есть свои карты. Родные. Это Карты от Яндекса.


    Теперь еСоседи дружат с Яндекс.Картами. Зайдя на сайт, можно увидеть свой дом или дачу именно на них, и при желании сравнить с картами Google.

    Переход на Яндекс.Карты был сделан не только из патриотических соображений :)
    В ряде случаев покрытие Гугла по России далеко от идеала. При этом нельзя сказать, что Яндекс.Карты однозначно лучше. Зато на них иногда видно то, что отсутствует на картах Google. Вот любопытный пример почти зеркального отражения качественных участков:
    image image

    О том, как запитаться Яндексом на своем сайте, если у Вас уже поселился Гугл, читаем далее.


    Различия между Yandex и Google

    1. GLatLng и YMaps.GeoPoint используются в Г и Я соответственно.
    переход с одной системы на другую прост:
    function G2YA(a){return new YMaps.GeoPoint(a.lng(),a.lat())}
    function YA2G(a){return new GLatLng(a.getLat(),a.getLng());}


    2. Яндекс использует другой стандарт проекции, чуть уже epsg:3395 (подробности)

    3. Некоторые функции просто по-другому называются, некоторые немного по-другому работают.

    Как связать Яндекс и Гугл карты?

    Вариант — использовать прокси (описание прокси в клубе)
    Суть проста — обвертываем и гугл и яндекс интерфейсом.
    В нашем случае было немного проще — у нас обращение к координатам централизованое, SET был в одном месте, GET мы всеже пустили через прокси.
    Получилось нечто похожее на:

    map.getPane=function(a){return 0;}
    map.checkResize=function(){this.redraw(true);}
    map.disableScrollWheelZoom=function(){this.disableScrollZoom();}
    map.enableScrollWheelZoom=function(){this.enableScrollZoom();}
    map.fromLatLngToDivPixel=function(a){ YA=G2YA(a);return this.converter.coordinatesToMapPixels(YA);}
    map.fromContainerPixelToLatLng=function(a){ return YA2G(geo_map.converter.localPixelsToCoordinates(GP2YA(a)));}
    map.getMapCenter=function(){return YA2G(this.getCenter());}
    map.setMapType=function(a)
    {
    if(a==G_NORMAL_MAP )this.setType(YMaps.MapType.MAP);
    if(a==G_HYBRID_MAP )this.setType(YMaps.MapType.HYBRID);
    if(a==G_PHYSICAL_MAP )this.setType(YMaps.MapType.SATELLITE );
    }

    map.getCurrentMapType=function()
    {
    a=this.getType();
    if(a==YMaps.MapType.MAP )return G_NORMAL_MAP;
    if(a==YMaps.MapType.HYBRID )return G_HYBRID_MAP;
    if(a==YMaps.MapType.SATELLITE)return G_PHYSICAL_MAP;
    }

    YMaps.GeoBounds.prototype.getSouthWest=function(){ return YA2G(this.getLeftBottom());}
    YMaps.GeoBounds.prototype.getNorthEast=function(){ return YA2G(this.getRightTop());}


    Эвент сдвига карты в Гугле задается как
    GEvent.addListener(geo_map, "moveend", map_moveend_event );

    В Яндексе по-другому — приходится вешать на два события:

    YMaps.Events.observe(map, map.Events.Update,map_moveend_event);
    YMaps.Events.observe(map, map.Events.MoveEnd,map_moveend_event);


    Маркеры и «балуны» еСоседи не используют, но используют оверлеи, которые позволяют отобразить на карте все, что угодно.
    Если Вам интересно узнать, как это делается — kashey может описать подробнее, но уже в другом топике.

    Как подружить оверлеи Г и Я?

    Опять же все очень просто.

    GOverlay.prototype.onAddToMap = function(map,to)
    {
    this.initialize(map);
    to.appendChild(this.div_);
    this.onMapUpdate(map);
    return obj;
    }

    GOverlay.prototype.onRemoveFromMap = function(map)
    {
    return this.remove();
    }

    GOverlay.prototype.onMapUpdate = function(map)
    {
    this.redraw(true);
    }


    В функции onAddToMap создается див(_div) в который можно положить любые данные.
    В случае с Г картами его добавление на карту производиться в функции initialize командой
    if(GetMap().getPane(defmappane))
    GetMap().getPane(defmappane).appendChild(div);

    в случае Я карт, данная команда просто не сработает.
    В принципе, похожим образом можно и пропачить GMarker, и он «просто заработает», либо написать обратную функцию. Тогда красивые Яндекс.Балууны заработают на Г картах…

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

    Comments 5

      +3
      А я бы вот с Якарт с удовольствием перелез бы на Гмэпс. Но приходится пользоваться яндексом, так как в нем больше российских городов с детализированной картой (улицы, дома, поиск по адресу и т.д.). Но в яндексе никакая инфа по зарубежным странам и городам, поэтому и гугл интересен.
        0
        Да уж, по России у Яндекса есть преимущество в городах.
        Думаю, рекомендации в посте помогут перейти и с Я на Г =)
          0
          Может быть вам как раз подойдет прокси класс, в оверлеи обратную совместимость можно за 5 минут дописать.
          0
          Интересно — а можно както автоматически определять какая из карт в заданном регионе лучше и отображать именно ее?
            0
            В принципе можно перехватывать сообщения АПИ что «изображения данной местности нет, уменьшите зум» и переключаться на аналог, но часто в гугле такой ошибки не происходит — он просто показывает мытый снимок.
            Можно конечно взять эту картинку и проверить степень ее четкости, но
            — во первых, многовато картинок :)
            — во вторых, такая операция запрешена лицензией
            — в третьих, яндекс и гугл используют разные проекции, одновременно показывать данные обоих нельзя — они не сойдутся.
            Это конечно решаемо, но сильно в обход АПИ

          Only users with full accounts can post comments. Log in, please.