From 861bd149033d73f8da4a5d26ae64eb27a3c76c7f Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 20 Feb 2015 14:53:07 -0500 Subject: [PATCH] map#trimmedExtentZoom Like map#extentZoom, but uses trimmed viewport instead of full viewport to avoid putting the extent under UI buttons and border elements. This is because in conflict resolution the user will be extentZooming to see their changes and it was annoying to have the change appear under the UI. Also using this in zoomToGPXLayer. --- js/id/renderer/background.js | 6 ++++-- js/id/renderer/map.js | 21 +++++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/js/id/renderer/background.js b/js/id/renderer/background.js index 8b74795e7..3e5d4b5f6 100644 --- a/js/id/renderer/background.js +++ b/js/id/renderer/background.js @@ -151,14 +151,16 @@ iD.Background = function(context) { background.zoomToGpxLayer = function() { if (background.hasGpxLayer()) { - var viewport = context.map().extent().polygon(), + var map = context.map(), + viewport = map.trimmedExtent().polygon(), coords = _.reduce(gpxLayer.geojson().features, function(coords, feature) { var c = feature.geometry.coordinates; return _.union(coords, feature.geometry.type === 'Point' ? [c] : c); }, []); if (!iD.geo.polygonIntersectsPolygon(viewport, coords)) { - context.map().extent(d3.geo.bounds(gpxLayer.geojson())); + var extent = iD.geo.Extent(d3.geo.bounds(gpxLayer.geojson())); + map.centerZoom(extent.center(), map.trimmedExtentZoom(extent)); } } }; diff --git a/js/id/renderer/map.js b/js/id/renderer/map.js index 8532bde71..8d9529561 100644 --- a/js/id/renderer/map.js +++ b/js/id/renderer/map.js @@ -342,7 +342,7 @@ iD.Map = function(context) { map.zoomTo = function(entity, zoomLimits) { var extent = entity.extent(context.graph()), - zoom = map.extentZoom(extent); + zoom = map.trimmedExtentZoom(extent); zoomLimits = zoomLimits || [context.minEditableZoom(), 20]; map.centerZoom(extent.center(), Math.min(Math.max(zoom, zoomLimits[0]), zoomLimits[1])); }; @@ -391,19 +391,28 @@ iD.Map = function(context) { projection.invert([dimensions[0] - pad, headerY + pad])); }; - map.extentZoom = function(_) { - var extent = iD.geo.Extent(_), - tl = projection([extent[0][0], extent[1][1]]), + function calcZoom(extent, dim) { + var tl = projection([extent[0][0], extent[1][1]]), br = projection([extent[1][0], extent[0][1]]); // Calculate maximum zoom that fits extent - var hFactor = (br[0] - tl[0]) / dimensions[0], - vFactor = (br[1] - tl[1]) / dimensions[1], + var hFactor = (br[0] - tl[0]) / dim[0], + vFactor = (br[1] - tl[1]) / dim[1], hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2, vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2, newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff); return newZoom; + } + + map.extentZoom = function(_) { + return calcZoom(iD.geo.Extent(_), dimensions); + }; + + map.trimmedExtentZoom = function(_) { + var trimY = 120, trimX = 40, + trimmed = [dimensions[0] - trimX, dimensions[1] - trimY]; + return calcZoom(iD.geo.Extent(_), trimmed); }; map.editable = function() {