diff --git a/Makefile b/Makefile index f99342a98..4ba02a7b0 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,7 @@ data/data.js: $(DATA_FILES) js/lib/d3.v3.js \ js/lib/d3.combobox.js \ js/lib/d3.geo.tile.js \ + js/lib/d3.jsonp.js \ js/lib/d3.keybinding.js \ js/lib/d3.one.js \ js/lib/d3.size.js \ diff --git a/index.html b/index.html index 5b928ea28..d0fbab9d8 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,7 @@ + diff --git a/js/id/renderer/background_source.js b/js/id/renderer/background_source.js index 14e15852f..fc644e3ff 100644 --- a/js/id/renderer/background_source.js +++ b/js/id/renderer/background_source.js @@ -34,29 +34,29 @@ iD.BackgroundSource.template = function(data) { }; iD.BackgroundSource.Bing = function(data) { + // http://msdn.microsoft.com/en-us/library/ff701716.aspx + // http://msdn.microsoft.com/en-us/library/ff701701.aspx + var bing = iD.BackgroundSource.template(data), - url = "http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/0,0?zl=1&mapVersion=v1&key=Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU&include=ImageryProviders&output=xml"; + key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM + url = 'http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key + '&jsonp={callback}'; - var providers; - - d3.json(url, function(err, json) { - if (json) { - providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) { - return { - attribution: provider.attribution, - areas: provider.areas.map(function(area) { - return { - zoom: [area.zoomMin, area.zoomMax], - extent: iD.geo.Extent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]]) - } - }) - }; - }); - } + d3.jsonp(url, function(json) { + bing.providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) { + return { + attribution: provider.attribution, + areas: provider.coverageAreas.map(function(area) { + return { + zoom: [area.zoomMin, area.zoomMax], + extent: iD.geo.Extent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]]) + } + }) + }; + }); }); bing.copyrightNotices = function(zoom, extent) { - return providers.filter(function(provider) { + return bing.providers.filter(function(provider) { return _.any(provider.areas, function(area) { return extent.intersects(area.extent) && area.zoom[0] <= zoom && diff --git a/js/lib/d3.jsonp.js b/js/lib/d3.jsonp.js new file mode 100644 index 000000000..e0cd4a80e --- /dev/null +++ b/js/lib/d3.jsonp.js @@ -0,0 +1,25 @@ +d3.jsonp = function (url, callback) { + function rand() { + var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', + c = '', i = -1; + while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52)); + return c; + } + + function create(url) { + var e = url.match(/callback=d3.jsonp.(\w+)/), + c = e ? e[1] : rand(); + d3.jsonp[c] = function(data) { + callback(data); + delete d3.jsonp[c]; + script.remove(); + }; + return 'd3.jsonp.' + c; + } + + var cb = create(url), + script = d3.select('head') + .append('script') + .attr('type', 'text/javascript') + .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb)); +}; diff --git a/test/index.html b/test/index.html index c6c1f11c7..b08719039 100644 --- a/test/index.html +++ b/test/index.html @@ -26,6 +26,7 @@ +