diff --git a/lib/OpenLayers/Control/OverviewMap.js b/lib/OpenLayers/Control/OverviewMap.js index 0da1f056c0..31ae04d293 100644 --- a/lib/OpenLayers/Control/OverviewMap.js +++ b/lib/OpenLayers/Control/OverviewMap.js @@ -88,7 +88,7 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { * resolution at which to zoom farther in on the overview map. */ maxRatio: 32, - + /** * APIProperty: mapOptions * {Object} An object containing any non-default properties to be sent to @@ -103,6 +103,12 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { */ handlers: null, + /** + * Property: resolutionFactor + * {Object} + */ + resolutionFactor: 1, + /** * Constructor: OpenLayers.Control.OverviewMap * Create a new overview map @@ -402,6 +408,13 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { Math.max(mapExtent.bottom, maxExtent.bottom), Math.min(mapExtent.right, maxExtent.right), Math.min(mapExtent.top, maxExtent.top)); + + if (this.ovmap.getProjection() != this.map.getProjection()) { + testExtent = testExtent.transform( + this.map.getProjectionObject(), + this.ovmap.getProjectionObject() ); + } + var resRatio = this.ovmap.getResolution() / this.map.getResolution(); return ((resRatio > this.minRatio) && (resRatio <= this.maxRatio) && @@ -423,8 +436,16 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { // zoom out overview map targetRes = this.maxRatio * mapRes; } - this.ovmap.setCenter(this.map.center, - this.ovmap.getZoomForResolution(targetRes)); + var center; + if (this.ovmap.getProjection() != this.map.getProjection()) { + center = this.map.center.clone(); + center.transform(this.map.getProjectionObject(), + this.ovmap.getProjectionObject() ); + } else { + center = this.map.center; + } + this.ovmap.setCenter(center, this.ovmap.getZoomForResolution( + targetRes * this.resolutionFactor)); this.updateRectToMap(); }, @@ -486,6 +507,15 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { } }); + if (this.ovmap.getProjection() != this.map.getProjection()) { + var sourceUnits = this.map.getProjectionObject().getUnits() || + this.map.units || this.map.baseLayer.units; + var targetUnits = this.ovmap.getProjectionObject().getUnits() || + this.ovmap.units || this.ovmap.baseLayer.units; + this.resolutionFactor = sourceUnits && targetUnits ? + OpenLayers.INCHES_PER_UNIT[sourceUnits] / + OpenLayers.INCHES_PER_UNIT[targetUnits] : 1; + } }, /** @@ -493,14 +523,16 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { * Updates the extent rectangle position and size to match the map extent */ updateRectToMap: function() { - // The base layer for overview map needs to be in the same projection - // as the base layer for the main map. This should be made more robust. - if(this.map.getUnits() != 'degrees') { - if(this.ovmap.getProjection() && (this.map.getProjection() != this.ovmap.getProjection())) { - OpenLayers.Console.userError(OpenLayers.i18n("sameProjection")); - } + // If the projections differ we need to reproject + var bounds; + if (this.ovmap.getProjection() != this.map.getProjection()) { + bounds = this.map.getExtent().transform( + this.map.getProjectionObject(), + this.ovmap.getProjectionObject() ); + } else { + bounds = this.map.getExtent(); } - var pxBounds = this.getRectBoundsFromMapBounds(this.map.getExtent()); + var pxBounds = this.getRectBoundsFromMapBounds(bounds); if (pxBounds) { this.setRectPxBounds(pxBounds); } @@ -512,6 +544,11 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { */ updateMapToRect: function() { var lonLatBounds = this.getMapBoundsFromRectBounds(this.rectPxBounds); + if (this.ovmap.getProjection() != this.map.getProjection()) { + lonLatBounds = lonLatBounds.transform( + this.ovmap.getProjectionObject(), + this.map.getProjectionObject() ); + } this.map.panTo(lonLatBounds.getCenterLonLat()); }, diff --git a/tests/manual/overviewmap-projection.html b/tests/manual/overviewmap-projection.html new file mode 100644 index 0000000000..bb15c9fc35 --- /dev/null +++ b/tests/manual/overviewmap-projection.html @@ -0,0 +1,70 @@ + +
+ + + + + + + + + + ++ Acceptance test for different projections in map and overview map. + The map uses EPSG:900913, the overview map EPSG:4326. Zoom the map and + drag both the map and the overview map to see it in action. +
+ + +