File: bing.js

package info (click to toggle)
modestmaps-js 3.3.6%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 1,184 kB
  • ctags: 1,465
  • sloc: makefile: 58
file content (68 lines) | stat: -rw-r--r-- 2,339 bytes parent folder | download | duplicates (2)
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
// namespacing!
if (!MM) {
  MM = { };
}

MM.BingProvider = function(key, style, onready) {

    this.key = key;
    this.style = style;
    
    // hit the imagery metadata service
    // http://msdn.microsoft.com/en-us/library/ff701716.aspx
    
    // Aerial, AerialWithLabels, Road
    var script = document.createElement('script');
    script.type = 'text/javascript';
    document.getElementsByTagName('head')[0].appendChild(script);
    script.src = 'http://dev.virtualearth.net/REST/V1/Imagery/Metadata/'+style+'/?key='+key+'&jsonp=onBingComplete';
    
    function toMicrosoft(column, row, zoom) {
        // generate zoom string by interleaving row/col bits
        // NB:- this assumes you're only asking for positive row/cols
        var quadKey = "";
        for (var i = 1; i <= zoom; i++) {
            var rowBit = (row >> zoom-i) & 1;
            var colBit = (column >> zoom-i) & 1;
            quadKey += (rowBit << 1) + colBit;
        }
        return quadKey;
    }

    var provider = this;

    window.onBingComplete = function(data) {
        var resourceSets = data.resourceSets;
        for (var i = 0; i < resourceSets.length; i++) {
            var resources = data.resourceSets[i].resources;
            for (var j = 0; j < resources.length; j++) {
                var resource = resources[j];

                var serverSalt = Math.floor(Math.random() * 4);
                provider.getTile = function(coord) {
                    var quadKey = toMicrosoft(coord.column, coord.row, coord.zoom);
                    // this is so that requests will be consistent in this session, rather than totally random
                    var server = Math.abs(serverSalt + coord.column + coord.row + coord.zoom) % 4;
                    return resource.imageUrl
                        .replace('{quadkey}',quadKey)
                        .replace('{subdomain}', resource.imageUrlSubdomains[server]);
                };
                // TODO: use resource.imageWidth
                // TODO: use resource.imageHeight
            }
        }

        // TODO: display data.brandLogoUri
        // TODO: display data.copyright
        onready(provider);
    };
};

MM.BingProvider.prototype = {
    key: null,
    style: null,
    subdomains: null,
    getTileUrl: null
};

MM.extend(MM.BingProvider, MM.MapProvider);