一些需要引入的Api,就不提了,直接上代码:
const TintLayer = BaseTileLayer.createSubclass({
properties: {
urlTemplate: null,
tint: {
value: null,
//type: Color
}
},
// 生成给定级别、行和列的平铺url
getTileUrl: function (level, row, col) {
return this.urlTemplate.replace("{z}", level).replace("{x}",
col).replace("{y}", row);
},
fetchTile: function (level, row, col) {
// let url = this.getTileUrl(level, row, col);
var p = 1
var oldLv = level
if (level > 18) {
p = Math.pow(2, level - 18)
var oldRow = row
var oldCol = col
row = Math.trunc(row / p)
col = Math.trunc(col / p)
level = 18
}
var url = this.urlTemplate.replace("{z}", level).replace("{x}", col).replace("{y}", row);
return esriRequest(url, {
responseType: "image",
allowImageDataAccess: true
}).then(function (response) {
let image = response.data;
let width = this.tileInfo.size[0];
let height = this.tileInfo.size[0];
// create a canvas with 2D rendering context
let canvas = document.createElement("canvas");
let context = canvas.getContext("2d");
canvas.width = width;
canvas.height = height;
// Draw the blended image onto the canvas.
if (oldLv > 18) {
var ux = width / p
var uy = height / p
var r = oldRow % p
var c = oldCol % p
context.drawImage(image, c * ux, r * uy, ux, uy, 0, 0, width, height)
} else {
context.drawImage(image, 0, 0, width, height);
}
return canvas;
}.bind(this));
}
});
//随机算出八个数带入url
const tdt_n = Math.floor(Math.random() * 8);
const tiandituVec = new TintLayer({
urlTemplate: "http://t" + tdt_n + ".tianditu.gov.cn/DataServer?T=vec_w&tk=" + “天地图Key” + "&x={x}&y={y}&l={z}",
tint: new Color("#004FBB"),
title: "矢量图"
});
const tiandituCva = new TintLayer({
urlTemplate: "http://t" + tdt_n + ".tianditu.gov.cn/DataServer?T=cva_w&tk=" + “天地图Key” + "&x={x}&y={y}&l={z}",
tint: new Color("#004FBB"),
title: "注记"
});
const tiandituImg = new TintLayer({
urlTemplate: "http://t" + tdt_n + ".tianditu.gov.cn/DataServer?T=img_w&tk=" + “天地图Key” + "&x={x}&y={y}&l={z}",
tint: new Color("#004FBB"),
title: "影像图"
});
const map = new Map({
logo: false,
});
this.map = map
map.add(tiandituImg)
map.add(tiandituCva)
const view = new MapView({
map: map,
center:[122.106863,30.016028],
zoom: 12,
container: "map"
});