This repository has been archived by the owner on May 24, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 127
/
Image Overlay Tile Layer.html
122 lines (98 loc) · 4.73 KB
/
Image Overlay Tile Layer.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<!DOCTYPE html>
<html lang="en">
<head>
<title>Image Overlay Tile Layer - Bing Maps Samples</title>
<meta charset="utf-8" />
<link rel="shortcut icon" href="/favicon.ico"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="This sample shows how to extend a tile layer such that it breaks an bounded image overlay up into invidiual tiles and renders it." />
<meta name="keywords" content="Microsoft maps, map, gis, API, SDK, Bing, Bing Maps" />
<meta name="author" content="Microsoft Bing Maps" />
<meta name="screenshot" content="screenshot.jpg" />
<script>
var map;
function GetMap() {
var bounds = Microsoft.Maps.LocationRect.fromCorners(new Microsoft.Maps.Location(40.5, -123.5), new Microsoft.Maps.Location(40, -123));
map = new Microsoft.Maps.Map('#myMap', {
bounds: bounds
});
//Load the spatial math module which provides useful tile math calculations.
Microsoft.Maps.loadModule('Microsoft.Maps.SpatialMath', function () {
var layer = new ImageOverlayLayer(map, 'https://bingmapsisdk.blob.core.windows.net/isdksamples/topographicMap.gif', bounds);
});
}
var ImageOverlayLayer = function (map, imageUrl, bounds) {
var tileLayer;
var img;
function loadLayer() {
var self = this;
//Pre-load the image befor ecreating a tile layer.
img = new Image();
//Since the image is hosted on a different domain, use CORs. Remove this if the image is locally hosted.
img.crossOrigin = 'Anonymous';
//When the image has loaded, create a tile layer and add it to the map.
img.onload = function () {
tileLayer = new Microsoft.Maps.TileLayer({
mercator: new Microsoft.Maps.TileSource({
uriConstructor: getTilePath
})
});
map.layers.insert(tileLayer);
};
img.src = imageUrl;
}
function getTilePath(tile) {
//Create an off screen canvas.
var canvas = document.createElement('canvas');
canvas.width = 256;
canvas.height = 256;
var context = canvas.getContext('2d');
//Calculate the extents of the image bounds based on the current zoom level of the tile.
var topRightImgPixels = Microsoft.Maps.SpatialMath.Tiles.locationToGlobalPixel(bounds.getNorthwest(), tile.zoom);
var bottomLeftImgPixels = Microsoft.Maps.SpatialMath.Tiles.locationToGlobalPixel(bounds.getSoutheast(), tile.zoom);
//Calculate the dimensions of the image at the tiles zoom level.
var width = bottomLeftImgPixels.x - topRightImgPixels.x;
var height = bottomLeftImgPixels.y - topRightImgPixels.y;
//Calculate the offset of the top left corner of the image relative to the top left corner of the tile in pixels at zoom.
var x = topRightImgPixels.x - tile.x * 256;
var y = topRightImgPixels.y - tile.y * 256;
//Draw the image on the off screen canvas.
context.drawImage(img, x, y, width, height);
//Generate a data URL for the off screen canvas.
return canvas.toDataURL();
}
this.dispose = function () {
if (tileLayer) {
map.layers.remove(tileLayer);
tileLayer = null;
img = null;
}
};
this.getBaseTileLayer = function () {
return tileLayer;
};
this.setOptions = function (options) {
tileLayer.setOptions(options);
};
loadLayer();
};
</script>
</head>
<body>
<div id="myMap" style="position:relative;width:100%;min-width:290px;height:600px;background-color:gray"></div>
<fieldset style="width:800px;margin-top:10px;">
<legend>Image Overlay Tile Layer Sample</legend>
This sample shows how to extend a tile layer such that it breaks an bounded image overlay up into invidiual tiles and renders it.
</fieldset>
<script>
// Dynamic load the Bing Maps Key and Script
// Get your own Bing Maps key at https://www.microsoft.com/maps
(async () => {
let script = document.createElement("script");
let bingKey = await fetch("https://samples.azuremaps.com/api/GetBingMapsKey").then(r => r.text()).then(key => { return key });
script.setAttribute("src", `https://www.bing.com/api/maps/mapcontrol?callback=GetMap&key=${bingKey}`);
document.body.appendChild(script);
})();
</script>
</body>
</html>