2013-03-09 1 views
0

У меня есть Яндекс тайлов (русский) работает в Google Maps API v2, но что-то не работает в Google Maps API v3, смотрите следующий jsfiddle: http://jsfiddle.net/VkGjq/1/Использование Яндекс карты плитки в Google Maps v3

Обратите внимание, что при переключении между дорожная карта Google и плитки Яндекса, они не выстраиваются в линию &, маркер находится в неправильном положении.

Для Maps v2, я сделал эквивалентную jsfiddle но он ломал, так как он необходим ключ API: http://jsfiddle.net/ggrgQ/1/

Вы можете увидеть аналогичный код здесь, но вам придется перемещаться в Москву вручную Яндекс не имеет любые приличные данные за пределами России: http://gpsloglabs.com/share/2367c16f3a0e75b05ac8a5529afba225dd929518/

Я не помню, где я получил код v3, но константы, похоже, примерно соответствуют версии v2. Кроме этого, я не понимаю, что делает проекция, я застрял.

Любые идеи?

Код из jsfiddle выглядит следующим образом:

var center = new google.maps.LatLng(55.75, 37.62); 
var mapOptions = { 
    zoom: 10, 
    center: center, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 
var map = new google.maps.Map(document.getElementById('map'), mapOptions); 

new google.maps.Marker({map: map, position: center}); 

map.mapTypes.set("Yandex", 
       new google.maps.ImageMapType(
        {getTileUrl: function(coord, zoom) { 
         return "http://vec0"+((coord.x+coord.y)%5)+".maps.yandex.net/tiles?l=map&v=2.16.0&x=" + 
          coord.x + "&y=" + coord.y + "&z=" + zoom + ""; 
        }, 
         tileSize: new google.maps.Size(256, 256), 
         isPng: true, 
         alt: "Yandex", 
         name: "Yandex", 
         projection: new YandexProjection(), 
         maxZoom: 17})); 

map.setOptions({mapTypeControlOptions: {mapTypeIds: [google.maps.MapTypeId.ROADMAP, "Yandex"]} }); 

function YandexProjection() { 
    this.pixelOrigin_ = new google.maps.Point(128,128); 
    var MERCATOR_RANGE = 256; 
    this.pixelsPerLonDegree_ = MERCATOR_RANGE/360; 
    this.pixelsPerLonRadian_ = MERCATOR_RANGE/(2 * Math.PI); 

    this.fromLatLngToPoint = function(latLng) { 
     function atanh(x) { 
      return 0.5*Math.log((1+x)/(1-x)); 
     } 
     function degreesToRadians(deg) { 
      return deg * (Math.PI/180); 
     } 
     function bound(value, opt_min, opt_max) { 
      if (opt_min != null) value = Math.max(value, opt_min); 
      if (opt_max != null) value = Math.min(value, opt_max); 
      return value; 
     } 

     var origin = this.pixelOrigin_; 
     var exct = 0.0818197; 
     var z = Math.sin(latLng.lat()/180*Math.PI); 
     return new google.maps.Point(origin.x + latLng.lng() *this.pixelsPerLonDegree_, 
            Math.abs(origin.y - this.pixelsPerLonRadian_*(atanh(z)-exct*atanh(exct*z)))); 
    }; 

    this.fromPointToLatLng = function(point) { 
     var origin = this.pixelOrigin_; 
     var lng = (point.x - origin.x)/this.pixelsPerLonDegree_; 
     var latRadians = (point.y - origin.y)/-this.pixelsPerLonRadian_; 
     var lat = Math.abs((2*Math.atan(Math.exp(latRadians))-Math.PI/2)*180/Math.PI); 
     var Zu = lat/(180/Math.PI); 
     var Zum1 = Zu+1; 
     var exct = 0.0818197; 
     var yy = -Math.abs(((point.y)-128)); 
     while (Math.abs(Zum1-Zu)>0.0000001){ 
     Zum1 = Zu; 
     Zu = Math.asin(1-((1+Math.sin(Zum1))*Math.pow(1-exct*Math.sin(Zum1),exct)) 
        /(Math.exp((2*yy)/-(256/(2*Math.PI)))*Math.pow(1+exct*Math.sin(Zum1),exct))); 
     } 
     if (point.y>256/2) { 
      lat=-Zu*180/Math.PI; 
     } else { 
      lat=Zu*180/Math.PI; 
     } 
     return new google.maps.LatLng(lat, lng); 
    }; 

    return this; 
} 

ответ

3

Оказывается, что projection свойство не может быть установлено с помощью ImageMapTypeOptions и должно быть назначено после ImageMapType было построено, этот jsfiddle прямо сейчас работы: http://jsfiddle.net/VkGjq/2/

var yandexMapType = new google.maps.ImageMapType(
        {getTileUrl: function(coord, zoom) { 
         return "http://vec0"+((coord.x+coord.y)%5)+".maps.yandex.net/tiles?l=map&v=2.16.0&x=" + 
          coord.x + "&y=" + coord.y + "&z=" + zoom + ""; 
        }, 
         tileSize: new google.maps.Size(256, 256), 
         isPng: true, 
         alt: "Yandex", 
         name: "Yandex", 
         maxZoom: 17}); 
// projection is ignored if passed to MapTypeOptions 
yandexMapType.projection = new YandexProjection(); 
map.mapTypes.set("Yandex", yandexMapType); 
0

К license agreement вы не можете использовать карты Яндекса без яндекс апи. Вы не можете использовать плитки yandex в листовке.

Вам нужно обернуть Яндекс апи или использовать http://leafletjs.com/plugins.html

Или написать собственной обертку.

Пример https://all-maps.herokuapp.com/

https://github.com/artamonovdev/all-maps

Смежные вопросы