前言
虽然Cesium默认已经实现了Bing地图的调用,但需要申请key。如何不用key就可调用?抱着好奇的心态去看了下他的源代码。通过分析源代码,最终完成了调用,记录如下:
Cesium原始调用
关键源码
BingMapsImageryProvider.tileXYToQuadKey = function (x, y, level) {
var quadkey = "";
for (var i = level; 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;
};
function buildImageResource(imageryProvider, x, y, level, request) {
var imageUrl = imageryProvider._imageUrlTemplate;
var subdomains = imageryProvider._imageUrlSubdomains;
var subdomainIndex = (x + y + level) % subdomains.length;
return imageryProvider._resource.getDerivedResource({
url: imageUrl,
request: request,
templateValues: {
quadkey: BingMapsImageryProvider.tileXYToQuadKey(x, y, level),
subdomain: subdomains[subdomainIndex],
culture: imageryProvider._culture,
},
queryParameters: {
// this parameter tells the Bing servers to send a zero-length response
// instead of a placeholder image for missing tiles.
n: "z",
},
});
}
代码实现
风格 | 地址 |
---|---|
影像 | https://ecn.t{s}.tiles.virtualearth.net/tiles/a{q}.jpeg?n=z&g=11404 |
影像带标注 | https://ecn.t{s}.tiles.virtualearth.net/tiles/h{q}.jpeg?n=z&g=11404&mkt= |
https://t{s}.ssl.ak.dynamic.tiles.virtualearth.net/comp/ch/{q}?n=z&mkt=en-US&it=A%2CG%2CL&og=1638 | |
黑色 | https://t{s}.ssl.ak.dynamic.tiles.virtualearth.net/comp/ch/{q}?n=z&mkt=en-US&it=G%2CL&cstl=WD&og=1638 |
道路 | https://ecn.t{s}.tiles.virtualearth.net/tiles/r{q}.jpeg?n=z&g=11404&mkt=&shading=hill |
亮色 | https://t{s}.ssl.ak.dynamic.tiles.virtualearth.net/comp/ch/{q}?n=z&mkt=en-US&it=G%2CL&cstl=WL&og=1638 |
- 代码实现,在线代码
- 关键代码
//此方法应该是QGIS中q参数的计算方法
const tileXYToQuadKey = function (x, y, level) {
var quadkey = "";
for (var i = level; i >= 0; --i) {
var bitmask = 1 << i;
var digit = 0;
if ((x & bitmask) !== 0) {
digit |= 1;
}
if ((y & bitmask) !== 0) {
digit |= 2;
}
quadkey += digit;
}
if (quadkey[0] === '0') {
quadkey = quadkey.substr(1);
}
return quadkey;
};
const imageryProvider = new Cesium.UrlTemplateImageryProvider({
url: 'https://ecn.t{s}.tiles.virtualearth.net/tiles/a{q}.jpeg?n=z&g=11404',
subdomains: ['0', '1', '2', '3'],
tilingScheme: new Cesium.WebMercatorTilingScheme(),
customTags: {
q: function (imageryProvider, x, y, level) {
const result = tileXYToQuadKey(x, y, level);
console.log(imageryProvider, x, y, level, result);
return result;
},
},
});