Как стать автором
Обновить

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

Время на прочтение3 мин
Количество просмотров2.1K
В какой стране мы живем? Правильно — в России.
Так зачем же привязывать себя к забугорным картам от 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, и он «просто заработает», либо написать обратную функцию. Тогда красивые Яндекс.Балууны заработают на Г картах…

Нам хватило описаных патчей, чтобы запустить новый вариант карт. Возможно что-то мы не учли, но за неделю тестирования глюков не вылезло.
Теги:
Хабы:
Всего голосов 10: ↑6 и ↓4+2
Комментарии5

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань