ThinkGeo.com    |     Documentation    |     Premium Support

Lose mouse wheel and double click zoom capabilities

When I modify the ZoomLevelSet I lose the ability to scroll using the mouse wheel or double click. Mouse wheel will only scroll out but not in and double click seems unresponsive. This is very easy to reproduce with the simple code below.




private void OnMap_Loaded(object sender, RoutedEventArgs e)
        {
            MainMap.Background = new SolidColorBrush(new Color() { A = 0x30, R = 0x00, G = 0x50, B = 0x50 });
            MainMap.MapUnit = GeographyUnit.DecimalDegree;
            MainMap.CurrentExtent = new RectangleShape(-180, 90, 180, -90);
            MainMap.RestrictExtent = new RectangleShape(-180, 90, 180, -90);
            MainMap.MapTools.Logo.Source = null;
            MainMap.MapResizeMode = MapResizeMode.PreserveScale;
 
            SetCustomScales();
             
            _coverageOverlay = new LayerOverlay();
            _coverageOverlay.WrappingMode = WrappingMode.None;
            _coverageOverlay.TileBuffer = 2;
            _coverageOverlay.DrawingExceptionMode = DrawingExceptionMode.DrawException;
            _coverageOverlay.DrawingQuality = DrawingQuality.HighQuality;
            _coverageOverlay.TileType = TileType.MultipleTile;
 
            try
            {
                TiledWmsLayer coverageLayer = coverageLayer = new TiledWmsLayer();
                coverageLayer.ServerUris.Add(new Uri("<a href="localhost">localhost</a>:21151/geoserver/ows"));
                coverageLayer.ActiveLayerNames.Add("GEOTIFF150M");
                coverageLayer.AxisOrder = WmsAxisOrder.XY;
                coverageLayer.Credentials = new NetworkCredential("admin""geoserver");
                coverageLayer.DrawingExceptionMode = DrawingExceptionMode.DrawException;
                coverageLayer.Parameters.Add("VERSION""1.1.1");
                coverageLayer.Parameters.Add("TILED""true");
 
                _coverageOverlay.Layers.Clear();
                _coverageOverlay.Layers.Add(coverageLayer);
            }
            catch (Exception ex)
            {
                 
            }
 
            MainMap.Overlays.Add("coverage", _coverageOverlay);
        }
 
         
        private void SetCustomScales()
        {
            ZoomLevelSet zls = new ZoomLevelSet();
 
            zls.CustomZoomLevels.Add(new ZoomLevel(150000000));
            zls.CustomZoomLevels.Add(new ZoomLevel(9000000));
            zls.CustomZoomLevels.Add(new ZoomLevel(500000));
            zls.CustomZoomLevels.Add(new ZoomLevel(9000));
            zls.CustomZoomLevels.Add(new ZoomLevel(1000));
 
            MainMap.ZoomLevelSet = zls;
        }

Could someone please help me get the default mouse functionality back after modifying the ZoomLevelSet?



Thanks



Ben




Hi Ben,



I find the issue, this is because the custom zoom level scales values range is not suitable. Please try the below codes:


private void SetCustomScales()
{
    ZoomLevelSet zls = new ZoomLevelSet();
 
    zls.CustomZoomLevels.Add(new ZoomLevel(150000000));
    zls.CustomZoomLevels.Add(new ZoomLevel(150000000 / Math.Pow(2, 1)));
    zls.CustomZoomLevels.Add(new ZoomLevel(150000000 / Math.Pow(2, 2)));
    zls.CustomZoomLevels.Add(new ZoomLevel(150000000 / Math.Pow(2, 3)));
    zls.CustomZoomLevels.Add(new ZoomLevel(150000000 / Math.Pow(2, 4)));
 
    Map1.ZoomLevelSet = zls;
}

The above is the standard zoolevel value, but we also can assign our custom value just near by the standard value.

Thanks,

Troy

This did work, but would this not be a bug because what it says is I can’t really have true custom zoom level sets? I can work around this, but my use case is to have maps at a known scale and navigate between the different maps as the user scrolls in or out (think FalconView, which is the map client we are replacing with MapSuite).

Hi Ben,



I guess you are right, it doesn’t make sense the mousewheel and zoom not work in this case, I will let our development team know this to see if there needs an enhancement. I will let you know if there are any updates.



Thanks for reporting this.

Troy

Hi Ben,



We are still working on figure out a better solution for this case, and also we have stopped the daily build as preparing for the MapSuite 8.0 release. Before that, here is a workaround for it:


internal class CustomExtentInteractiveOverlay : ExtentInteractiveOverlay
    {
        protected override InteractiveResult MouseDoubleClickCore(InteractionArguments interactionArguments)
        {
            if (interactionArguments.MouseButton == MapMouseButton.Left)
            {
                int zoomLevel = MapArguments.GetSnappedZoomLevelIndex(interactionArguments.CurrentExtent);
                if ((zoomLevel+1) < MapArguments.ZoomLevelScales.Count)
                {
                    double targetScale = MapArguments.ZoomLevelScales[zoomLevel];
                    ZoomPercentage = (int)((targetScale - MapArguments.ZoomLevelScales[zoomLevel + 1]) / targetScale * 100);
                    ZoomPercentage++;
                }
            }
            return base.MouseDoubleClickCore(interactionArguments);
        }
 
        protected override InteractiveResult MouseWheelCore(InteractionArguments interactionArguments)
        {
            int zoomLevel = MapArguments.GetSnappedZoomLevelIndex(interactionArguments.CurrentExtent);
            if ((zoomLevel + 1) < MapArguments.ZoomLevelScales.Count)
            {
                double targetScale = MapArguments.ZoomLevelScales[zoomLevel];
                ZoomPercentage = (int)((targetScale - MapArguments.ZoomLevelScales[zoomLevel + 1]) / targetScale * 100);
                ZoomPercentage++;
            }
            return base.MouseWheelCore(interactionArguments);
        }
    }

Then, we replace the default ExtentOverlay with this in the map:


wpfMap1.ExtentOverlay = new CustomExtentInteractiveOverlay();

Thanks,

Troy