2013-06-17 21 views
7

Farklı döşeme katmanları arasında geçiş yapılabildiği leaflet.js ile bir harita oluşturmaya çalışıyorum. Standart x, y ve z (oom) şemasıyla fayanslara hizmet eden fayans tutucularla mükemmel çalışır. Ancak, Microsoft Bing kendi quadkey şemasını kullanır. Xyz'i quad'a dönüştürmek için bir JavaScript işlevi buldum, ama nasıl kullanacağımı bilmiyorum. Benim örnek bakın:Leafletjs haritasında x/y/z fayans yerine Bing Quadkey karolarını kullanın

function toQuad(x, y, z) { 
    var quadkey = ''; 
    for (var i = z; i >= 0; --i) { 
     var bitmask = 1 << i; 
     var digit = 0; 
     if ((x & bitmask) !== 0) { 
      digit |= 1;} 
     if ((y & bitmask) !== 0) { 
      digit |= 2;} 
     quadkey += digit; 
    } 
    return quadkey; 
}; 
var openstreetmap = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'}), 
arcgissat = L.tileLayer('http://{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {subdomains: ['server', 'services'], attribution: '&copy; <a href="http://www.arcgis.com/">ArcGIS esri</a>'}) 
// bingsat = L.tileLayer('http://t{s}.tiles.virtualearth.net/tiles/a'+toQuad({x},{y},{z})+'.jpeg?g=1398', {subdomains: [0,1,2,3,4,5], attribution: '&copy; <a href="http://bing.com/maps">Bing Maps</a>'}), 
var map = L.map('map', { 
    center: [48.85,2.33], 
    zoom: 10, 
    layers: [openstreetmap] 
}); 
var baseLayers = { 
    "OpenStreetMap": openstreetmap, 
//  "Bing Sat": bingsat, 
      "ArcGIS esri Sat": arcgissat 
}; 
L.control.layers(baseLayers, null, {collapsed: false}).addTo(map); 

Temelde ben sadece {x} ile değişken bildiriminde iç JavaScript işlevini çağırmak için nasıl {y} ve sağlar leafletjs {z} değerlerini bilmiyorum.

cevap

11

L.TileLayer sınıfını genişleterek basit bir "BingLayer" oluşturabilirsiniz. Ardından, tercih ettiğiniz yeni şablonu kullanmak için getTileUrl yöntemini geçersiz kılmanız gerekir (ör. Haritalar için). Örnek için bağlantılı keman bakınız:

http://jsfiddle.net/nkmbx/

var BingLayer = L.TileLayer.extend({ 
getTileUrl: function (tilePoint) { 
    this._adjustTilePoint(tilePoint); 
    return L.Util.template(this._url, { 
     s: this._getSubdomain(tilePoint), 
     q: this._quadKey(tilePoint.x, tilePoint.y, this._getZoomForUrl()) 
    }); 
}, 
_quadKey: function (x, y, z) { 
    var quadKey = []; 
    for (var i = z; i > 0; i--) { 
     var digit = '0'; 
     var mask = 1 << (i - 1); 
     if ((x & mask) != 0) { 
      digit++; 
     } 
     if ((y & mask) != 0) { 
      digit++; 
      digit++; 
     } 
     quadKey.push(digit); 
    } 
    return quadKey.join(''); 
} 
}); 
+0

İşleri mükemmel, çok teşekkür ederim! – user168080