From 52e9259108950be4165fb4cf8175496c6649a246 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 20 Mar 2013 17:02:24 -0700 Subject: [PATCH 1/5] Show Bing logo (#1095) --- img/bing.png | Bin 2065 -> 0 bytes img/bing_maps.png | Bin 0 -> 4960 bytes js/id/ui/attribution.js | 15 +++++++++------ 3 files changed, 9 insertions(+), 6 deletions(-) delete mode 100644 img/bing.png create mode 100644 img/bing_maps.png diff --git a/img/bing.png b/img/bing.png deleted file mode 100644 index a5a5c38dd6ecbdb779f57f08e506a82f15d4932d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmV+s2=4cZP)jkO7iV5`B{bNS1sTr>l~npx+@;p3*+%EkIoq3RwdkIslj^B2qFw zdOizK0diRQRuL0dWJV8v&43wF2=^EO3rMa)LdH+BCIKE&MovaD64FVIf{2P_MZ@3< zk_^Oz_>e8osp?R`ls8mx!7>`V)<3163r5uVuA$mI+^{5PG~1wc(T8Zs47Otb5G!mo zvWQp147G#sESr?&h=l1s-`dM9H>Wb^{82$xRgqzGMTKc>X^GJZKgS7PQaTfmi*im} zuvc2_w=(Af5j93mb8X(t>Z)w!aLr~N`MTd|8}g{QSUl3wSlV^6!){DZQCsH8bXr}q z4^CY#K6}Yg%n}xSj6@kIFtc-ObFpbuBkRV z-O~Zh7u~}ZDC=tfB<2L$x~ACw&YtFx8DBWL^)F}g`WzmC#P)UNlPygpw)(0Z#|`In z_PI-rn!o?onmy}}2zqW@xsa9Trw4v}Z_$~>g@$wRs81;+^6-6S?BK4oopAd-0IeU$ zGHBJ0-(TqfjJ|cer)mEuSB#%`+)Od0Yf|<;y=wkjgkH<@p=8y?Q1I33&l8Ke~LBa(oPPMlLD?7C<8S&;md~-GCqHibDHdXsNNI zMR5J&l#Pj25|?ez!-m~H;eOAyT0amOBzfJ0%Ovy1CpJ_%A%BFu=Po&!b?`P3dA7&ufumPtVmOFla<>)d`7o8~DD|p&p4gSJN5tcCPV5;kw$(AHNDP(TcldJ3 z>5D_FH`fSf@Q4uSo^^I+54WYx06Bq)C!pL!E!yr|w;t%Xx8zY+oK2I32JgQEr+}#SZRlWRQ;mGD=J|mJ%w=g>T<(iS0VnzUjN( z@r=Fy`o0w0oL6E_^OoeMPrE#R9X2m0tJqgqO^MO_w-*|F%Jb6asMo9`PjKHHxMiGPFf-}alb06^vP1dJWMV`im7u1;1dOdJ<4ef{v| zGz`PmS5LE#|9pSuvT~D-&J&D^F1`kY{73h08f@(L zm@3+#Pqya$(4RQBCUQZPtX8K#3o_sJ!~#Y*I*{X7xS zNL?-2A0UK9A_-v@rz;x61S8YRP=w3Fu!24_Kn9y8QpuwA6H2p~GeQ_E;h+dui<1yi z5v2bDa1X9T=*7~!t+{NJhSXV-F|WX{vVfF=LNp&xz57u6ZkV!H<2x9m!kbnt97#z| z3i?7(O^0R740)`fxol$Jj{4(}S6|VDA>`(-O-4>(iaiad^(u>f>Yg``Ty4H+bD902 vs4}6kx}V&zs23V$CruT7m^z|&eimQ=1{zwxm7VxX00000NkvXXu0mjf#!l)o diff --git a/img/bing_maps.png b/img/bing_maps.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc4b1dfa3751d3121c5a0258c636f6730408224 GIT binary patch literal 4960 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 eiTq#XPX7%r;sQdx<|{-10000b&;= literal 0 HcmV?d00001 diff --git a/js/id/ui/attribution.js b/js/id/ui/attribution.js index ec98a84b8..c986206c6 100644 --- a/js/id/ui/attribution.js +++ b/js/id/ui/attribution.js @@ -9,16 +9,19 @@ iD.ui.Attribution = function(context) { if (!d) return; - var desc = t('imagery.provided_by', { - source: (d.data.sourcetag || d.data.name) - }); + var source = d.data.sourcetag || d.data.name; + + if (d.data.logo) { + source = '' + } + + var desc = t('imagery.provided_by', {source: source}); if (d.data.terms_url) { provided_by.append('a') - .attr('href', (d.data.terms_url || '')) + .attr('href', d.data.terms_url) .attr('target', '_blank') - .classed('disabled', !d.data.terms_url) - .text(desc); + .html(desc); } else { provided_by.text(desc); } From d4b923bd70014e89485f051ddb83fab62c14becc Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 20 Mar 2013 17:52:47 -0700 Subject: [PATCH 2/5] WIP on Bing copyright notices (#1096) --- js/id/renderer/background_source.js | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/js/id/renderer/background_source.js b/js/id/renderer/background_source.js index 3ddc76477..14e15852f 100644 --- a/js/id/renderer/background_source.js +++ b/js/id/renderer/background_source.js @@ -33,6 +33,43 @@ iD.BackgroundSource.template = function(data) { return generator; }; +iD.BackgroundSource.Bing = function(data) { + 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"; + + 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]]) + } + }) + }; + }); + } + }); + + bing.copyrightNotices = function(zoom, extent) { + return providers.filter(function(provider) { + return _.any(provider.areas, function(area) { + return extent.intersects(area.extent) && + area.zoom[0] <= zoom && + area.zoom[1] >= zoom; + }) + }).map(function(provider) { + return provider.attribution; + }).join(', '); + }; + + return bing; +}; + iD.BackgroundSource.Custom = function() { var template = window.prompt('Enter a tile template. Valid tokens are {z}, {x}, {y} for Z/X/Y scheme and {u} for quadtile scheme.'); if (!template) return null; From 235cb52d264b58d942d67e26294e64b03eb0a876 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 21 Mar 2013 11:39:33 -0700 Subject: [PATCH 3/5] Bing API supports JSONP --- Makefile | 1 + index.html | 1 + js/id/renderer/background_source.js | 36 ++++++++++++++--------------- js/lib/d3.jsonp.js | 25 ++++++++++++++++++++ test/index.html | 1 + 5 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 js/lib/d3.jsonp.js 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 @@ + From e01d2e611ff26fa448177b7382010a89fd4965b5 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 21 Mar 2013 12:23:57 -0700 Subject: [PATCH 4/5] Display Bing copyrights --- js/id/id.js | 8 +++++++- js/id/renderer/background.js | 5 ++++- js/id/renderer/background_source.js | 12 ++++++++---- js/id/ui.js | 1 - js/id/ui/attribution.js | 26 ++++++++++++++++++++++---- js/id/ui/background.js | 16 +++++----------- 6 files changed, 46 insertions(+), 22 deletions(-) diff --git a/js/id/id.js b/js/id/id.js index d6696ca02..8048175e9 100644 --- a/js/id/id.js +++ b/js/id/id.js @@ -102,7 +102,13 @@ window.iD = function () { context.zoomOut = map.zoomOut; /* Background */ - var backgroundSources = iD.data.imagery.map(iD.BackgroundSource.template); + var backgroundSources = iD.data.imagery.map(function(source) { + if (source.sourcetag === 'Bing') { + return iD.BackgroundSource.Bing(source, context.background().dispatch); + } else { + return iD.BackgroundSource.template(source); + } + }); backgroundSources.push(iD.BackgroundSource.Custom); context.backgroundSources = function() { diff --git a/js/id/renderer/background.js b/js/id/renderer/background.js index 9fe8a7378..83ffc31a8 100644 --- a/js/id/renderer/background.js +++ b/js/id/renderer/background.js @@ -168,14 +168,17 @@ iD.Background = function() { } } + background.dispatch = d3.dispatch('change'); + background.source = function(_) { if (!arguments.length) return source; source = _; cache = {}; tile.scaleExtent((source.data && source.data.scaleExtent) || [1, 20]); setHash(source); + background.dispatch.change(); return background; }; - return background; + return d3.rebind(background, background.dispatch, 'on'); }; diff --git a/js/id/renderer/background_source.js b/js/id/renderer/background_source.js index fc644e3ff..d0d3f1197 100644 --- a/js/id/renderer/background_source.js +++ b/js/id/renderer/background_source.js @@ -29,20 +29,22 @@ iD.BackgroundSource.template = function(data) { } generator.data = data; + generator.copyrightNotices = function() {}; return generator; }; -iD.BackgroundSource.Bing = function(data) { +iD.BackgroundSource.Bing = function(data, dispatch) { // http://msdn.microsoft.com/en-us/library/ff701716.aspx // http://msdn.microsoft.com/en-us/library/ff701701.aspx var bing = iD.BackgroundSource.template(data), key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM - url = 'http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key + '&jsonp={callback}'; + url = 'http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key + '&jsonp={callback}', + providers = []; d3.jsonp(url, function(json) { - bing.providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) { + providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) { return { attribution: provider.attribution, areas: provider.coverageAreas.map(function(area) { @@ -53,10 +55,12 @@ iD.BackgroundSource.Bing = function(data) { }) }; }); + dispatch.change(); }); bing.copyrightNotices = function(zoom, extent) { - return bing.providers.filter(function(provider) { + zoom = Math.min(zoom, 21); + return providers.filter(function(provider) { return _.any(provider.areas, function(area) { return extent.intersects(area.extent) && area.zoom[0] <= zoom && diff --git a/js/id/ui.js b/js/id/ui.js index 9ecefa26b..b9e73fabd 100644 --- a/js/id/ui.js +++ b/js/id/ui.js @@ -100,7 +100,6 @@ iD.ui = function(context) { linkList.append('li') .attr('class', 'attribution') .attr('tabindex', -1) - .data([context.background().source()]) .call(iD.ui.Attribution(context)); linkList.append('li') diff --git a/js/id/ui/attribution.js b/js/id/ui/attribution.js index c986206c6..4cc50b48c 100644 --- a/js/id/ui/attribution.js +++ b/js/id/ui/attribution.js @@ -1,6 +1,8 @@ iD.ui.Attribution = function(context) { - return function attribution(selection) { - var d = selection.data()[0]; + var selection; + + function update() { + var d = context.background().source(); var provided_by = selection .html('') @@ -10,13 +12,11 @@ iD.ui.Attribution = function(context) { if (!d) return; var source = d.data.sourcetag || d.data.name; - if (d.data.logo) { source = '' } var desc = t('imagery.provided_by', {source: source}); - if (d.data.terms_url) { provided_by.append('a') .attr('href', d.data.terms_url) @@ -25,5 +25,23 @@ iD.ui.Attribution = function(context) { } else { provided_by.text(desc); } + + var copyright = d.copyrightNotices(context.map().zoom(), context.map().extent()); + if (copyright) { + provided_by.append('span') + .text(copyright); + } + } + + return function(select) { + selection = select; + + context.background() + .on('change.attribution', update); + + context.map() + .on('move.attribution', _.throttle(update, 400)); + + update(); }; }; diff --git a/js/id/ui/background.js b/js/id/ui/background.js index b97ff1274..2e92ba0c0 100644 --- a/js/id/ui/background.js +++ b/js/id/ui/background.js @@ -1,6 +1,5 @@ iD.ui.Background = function(context) { - var event = d3.dispatch('cancel', 'save'), - key = 'b', + var key = 'b', opacities = [1, 0.5, 0], directions = [ ['left', [1, 0]], @@ -57,16 +56,11 @@ iD.ui.Background = function(context) { } } - function selectLayer(d) { + function selectLayer() { content.selectAll('a.layer') .classed('selected', function(d) { return d.data.name === context.background().source().data.name; }); - - context.container() - .select('.attribution') - .data([d]) - .call(iD.ui.Attribution(context)); } function clickSetSource(d) { @@ -85,7 +79,7 @@ iD.ui.Background = function(context) { .imagery_used(d.data.sourcetag || d.data.name); } context.redraw(); - selectLayer(d); + selectLayer(); } function clickGpx(d) { @@ -139,7 +133,7 @@ iD.ui.Background = function(context) { layerLinks.exit() .remove(); - selectLayer(context.background().source()); + selectLayer(); } function clickNudge(d) { @@ -289,5 +283,5 @@ iD.ui.Background = function(context) { .call(keybinding); } - return d3.rebind(background, event, 'on'); + return background; }; From 5c6398e7732b36513b2272920300b32ffaa87557 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Mon, 25 Mar 2013 15:05:30 -0400 Subject: [PATCH 5/5] Position bing logo, add attribution --- css/app.css | 5 +++++ js/id/renderer/background_source.js | 10 ++++++---- js/id/ui/attribution.js | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/css/app.css b/css/app.css index 25ba70bcf..49173df81 100644 --- a/css/app.css +++ b/css/app.css @@ -1564,6 +1564,11 @@ div.combobox { color:#fff; } +.source-image { + height:20px; + vertical-align:top; +} + .user-list a:not(:last-child):after { content: ', '; } diff --git a/js/id/renderer/background_source.js b/js/id/renderer/background_source.js index d0d3f1197..46c93821f 100644 --- a/js/id/renderer/background_source.js +++ b/js/id/renderer/background_source.js @@ -40,7 +40,8 @@ iD.BackgroundSource.Bing = function(data, dispatch) { var bing = iD.BackgroundSource.template(data), key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM - url = 'http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key + '&jsonp={callback}', + url = 'http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + + key + '&jsonp={callback}', providers = []; d3.jsonp(url, function(json) { @@ -51,7 +52,7 @@ iD.BackgroundSource.Bing = function(data, dispatch) { return { zoom: [area.zoomMin, area.zoomMax], extent: iD.geo.Extent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]]) - } + }; }) }; }); @@ -65,7 +66,7 @@ iD.BackgroundSource.Bing = function(data, dispatch) { return extent.intersects(area.extent) && area.zoom[0] <= zoom && area.zoom[1] >= zoom; - }) + }); }).map(function(provider) { return provider.attribution; }).join(', '); @@ -75,7 +76,8 @@ iD.BackgroundSource.Bing = function(data, dispatch) { }; iD.BackgroundSource.Custom = function() { - var template = window.prompt('Enter a tile template. Valid tokens are {z}, {x}, {y} for Z/X/Y scheme and {u} for quadtile scheme.'); + var template = window.prompt('Enter a tile template. ' + + 'Valid tokens are {z}, {x}, {y} for Z/X/Y scheme and {u} for quadtile scheme.'); if (!template) return null; return iD.BackgroundSource.template({ template: template, diff --git a/js/id/ui/attribution.js b/js/id/ui/attribution.js index 4cc50b48c..f06b04972 100644 --- a/js/id/ui/attribution.js +++ b/js/id/ui/attribution.js @@ -13,7 +13,7 @@ iD.ui.Attribution = function(context) { var source = d.data.sourcetag || d.data.name; if (d.data.logo) { - source = '' + source = ''; } var desc = t('imagery.provided_by', {source: source});