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.
This commit is contained in:
Bryan Housel
2015-02-20 14:53:07 -05:00
parent ad8c381301
commit 861bd14903
2 changed files with 19 additions and 8 deletions
+4 -2
View File
@@ -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));
}
}
};
+15 -6
View File
@@ -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() {