Restricted Extents

Topics: SharpMap v0.9 / v1.x
Editor
May 19, 2014 at 2:35 PM
Hi,

Is there a way I can stop the user from:
  1. zooming out beyond a set extent
  2. zooming in beyond a certain scale
  3. pan outside of a set extent
I know there is an maximum extent property on the map, but its really the zooming in and panning that I'm looking at.

Thanks
Coordinator
May 20, 2014 at 7:07 AM
If you set MaximumExtent you need to set map.EnforceMaximumExtent = true;

The MapViewportGuard class currently does not enforce a minimum scale but that should be fairly easy to handle.
Editor
May 20, 2014 at 8:27 AM
Hi Felix,

Would you recommend a modification to the Mapviewportguard, or just hook the map zoom event and if the zoom is beyond the threshold, set it to the minimum?
Coordinator
May 20, 2014 at 9:13 AM
Edited May 20, 2014 at 10:27 AM
Robert_Smart wrote:
Would you recommend a modification to the Mapviewportguard
yes, and provide a patch or check it in :)
Editor
May 20, 2014 at 1:58 PM
Also is there a way I can just lock the map? so I can just fix an extent and stop any panning, zooming etc
Coordinator
May 21, 2014 at 2:51 PM
I just noticed, everything is in place:
map.ZoomToBox(...);
map.MaximumExtent = map.Envelope;
map.MinmumZoom = map.MaximumZoom = map.Zoom;
map.EnforceMaximumExtents = true;
Editor
May 21, 2014 at 3:22 PM
Awesome
Editor
May 22, 2014 at 2:25 PM
I've tried to make so that the map can't zoom out beyond the extents of the background map and the behaviour is almost there. I'm using this method

private void FixMaxExtents()
    {
        Envelope  env =null;
        foreach (var layer in Map.BackgroundLayer)
        {
            if (env == null)
            {
                env = layer.Envelope;
            }
            else
            {
                env.ExpandToInclude(layer.Envelope);
            }
        }

        Map.MaximumExtents = env;
        Map.EnforceMaximumExtents = true;
    } 
The behaviour is almost right, but it seems to fit the extent to the widest dimensions of the mapbox and the extent. For Example, I'm loading a standard OSM tilelayer into a rectangular window (wider rather than taller). The above method fixes the extents so that it cannot be panned left to right, but it can still be panned up and down. So it fits the extent to the widest dimension of the display. I really need it to fit the smallest dimension that the whole map is displayed with no panning in either direction. I can't help but think there must be some simple math to make this happen. Maybe expand the envelope vertically by the height/width ratio?
Coordinator
May 23, 2014 at 7:28 AM
The code you posted fixes the extent to the maximum extent of the background layer. It does not take into account any map envelope to map size ratio. If the extent you evaluate is square, but your MapBox is not, the MapViewPortguard will allow panning at MaximumExtent in the direction of the smaller side of the MapBox.

If you don't want that, you need to somewhat change the extent that it matches the width/height ratio of the mapbox control.
Editor
May 23, 2014 at 9:49 AM
I have investigated a bit more and the behaviour is still a bit odd.

I noticed that if load the data and call Map.ZoomToExtents. Then the extents are set how I would expect.

So I changed the code to this:
        var env = Map.GetExtents();
        Map.ZoomToExtents();
        Map.MaximumExtents = Map.GetExtents();
        Map.EnforceMaximumExtents = true;
        Map.ZoomToBox(env);
And it still fits the map to largest dimension, rather than the smallest.

I went off the idea of calculating the ratio of height to width as this would have to be calculated on every resize.

My use case is that I'm displaying a png image (a schematic map with other polygons etc drawn over the top) and I need an option to lock the extent so it can't be zoomed in on. So I really need the whole image displayed no matter the shape of the window. As it is it only fits it to the largest dimension