diff --git a/src/plots/mapbox/mapbox.js b/src/plots/mapbox/mapbox.js index c8ab4b1e650..64117d422e9 100644 --- a/src/plots/mapbox/mapbox.js +++ b/src/plots/mapbox/mapbox.js @@ -456,7 +456,7 @@ proto.initFx = function(calcData, fullLayout) { optsNow._input.bearing = optsNow.bearing = viewNow.bearing; optsNow._input.pitch = optsNow.pitch = viewNow.pitch; - gd.emit('plotly_relayout', self.getViewEdits(viewNow)); + gd.emit('plotly_relayout', self.getViewEditsWithDerived(viewNow)); } wheeling = false; @@ -504,7 +504,7 @@ proto.initFx = function(calcData, fullLayout) { function emitUpdate() { var viewNow = self.getView(); - gd.emit('plotly_relayouting', self.getViewEdits(viewNow)); + gd.emit('plotly_relayouting', self.getViewEditsWithDerived(viewNow)); } map.on('drag', emitUpdate); @@ -527,7 +527,7 @@ proto.initFx = function(calcData, fullLayout) { optsNow._input.pitch = optsNow.pitch = viewNow.pitch; gd.emit('plotly_doubleclick', null); - gd.emit('plotly_relayout', self.getViewEdits(viewNow)); + gd.emit('plotly_relayout', self.getViewEditsWithDerived(viewNow)); }); // define event handlers on map creation, to keep one ref per map, @@ -747,11 +747,22 @@ proto.getView = function() { var mapCenter = map.getCenter(); var center = { lon: mapCenter.lng, lat: mapCenter.lat }; + var canvas = map.getCanvas(); + var w = canvas.width; + var h = canvas.height; return { center: center, zoom: map.getZoom(), bearing: map.getBearing(), - pitch: map.getPitch() + pitch: map.getPitch(), + _derived: { + coordinates: [ + map.unproject([0, 0]).toArray(), + map.unproject([w, 0]).toArray(), + map.unproject([w, h]).toArray(), + map.unproject([0, h]).toArray() + ] + } }; }; @@ -768,6 +779,13 @@ proto.getViewEdits = function(cont) { return obj; }; +proto.getViewEditsWithDerived = function(cont) { + var id = this.id; + var obj = this.getViewEdits(cont); + obj[id + '._derived'] = cont._derived; + return obj; +}; + function getStyleObj(val) { var styleObj = {}; diff --git a/test/jasmine/tests/mapbox_test.js b/test/jasmine/tests/mapbox_test.js index b92e8ad1318..35bd9b09b4e 100644 --- a/test/jasmine/tests/mapbox_test.js +++ b/test/jasmine/tests/mapbox_test.js @@ -1226,11 +1226,18 @@ describe('@noCI, mapbox plots', function() { expect(layout.zoom).toBeCloseTo(zoom); } - function _assert(center, zoom) { + function _assert(center, zoom, lon0, lat0, lon1, lat1) { _assertLayout(center, zoom); expect([evtData['mapbox.center'].lon, evtData['mapbox.center'].lat]).toBeCloseToArray(center); expect(evtData['mapbox.zoom']).toBeCloseTo(zoom); + expect(evtData['mapbox._derived']).toEqual({ + coordinates: [ + [lon0, lat1], + [lon1, lat1], + [lon1, lat0], + [lon0, lat0] + ]}); } _assertLayout([-4.710, 19.475], 1.234); @@ -1241,7 +1248,9 @@ describe('@noCI, mapbox plots', function() { expect(relayoutCnt).toBe(1, 'relayout cnt'); expect(relayoutingCnt).toBe(1, 'relayouting cnt'); expect(doubleClickCnt).toBe(0, 'double click cnt'); - _assert([-19.651, 13.751], 1.234); + _assert([-19.651, 13.751], 1.234, + -155.15981291032617, -25.560300274373148, + 115.85734493011842, 47.573988219006424); return _doubleClick(p1); }) @@ -1249,7 +1258,9 @@ describe('@noCI, mapbox plots', function() { expect(relayoutCnt).toBe(2, 'relayout cnt'); expect(relayoutingCnt).toBe(1, 'relayouting cnt'); expect(doubleClickCnt).toBe(1, 'double click cnt'); - _assert([-4.710, 19.475], 1.234); + _assert([-4.710, 19.475], 1.234, + -140.21950652441467, -20.054298691163496, + 130.79765131602989, 51.4513888208798); return _scroll(pointPos); })