ThinkGeo.com    |     Documentation    |     Premium Support

How to limit the zoom level?

In my app I want to configure 10 zoom levels. By default, the map control has 20 zoom levels. I want to configure those zoom levels, and also limit the maximum zoom to which the user can scroll using the mouse scroll. Is there an example about that or any guidelines about this configuration?



Sorry, I found the example now. I’ll explore it and if I have any further question I’ll let you know.

There is the Code Community project Zoom Levels Partitioning that shows what you are asking. If you found other examples, would you mind pointing us which ones for everybody to benefit? Thank you.


code.thinkgeo.com/projects/show/zoomlevels



Val, 



I tried to configure the 10 zoom levels but I still have 20 zoom levels. I want to limit that to 10. Also, there's some confusion with the map styles, maybe I'm missing something.

I'll try to explain it a little better. First, I got my initial scale just to have a reference from where to start. I got the initial scale value to work with through roadsLayer.ZoomLevelSet.GetZoomLevels()[0].Scale. The value I got was 590591790 

After that, I kept dividing this number by 2 until I got the 10 levels. So that I ended up with this method: 



private ZoomLevelSet GetCustomZoomLevelSet() 



var initialScale = 590591790; 

ZoomLevelSet zoomLevelSet = new ZoomLevelSet(); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 2)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 4)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 8)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 16)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 32)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 64)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 128)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 256)); 

zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 512)); 

return zoomLevelSet; 





which I assigned to my WPF Map Reference: wpfMap.ZoomLevelSet = GetCustomZoomLevelSet(); 



In my shapefile configuration I used: 



ShapeFileFeatureLayer roadsLayer = new ShapeFileFeatureLayer(@"Data\rodovias.shp"); 

var initialScale = 590591790; 

roadsLayer.ZoomLevelSet.CustomZoomLevels.Add(GetLineStyleZoomLevel(initialScale, LineStyles.Highway1)); 

roadsLayer.ZoomLevelSet.CustomZoomLevels.Add(GetLineStyleZoomLevel(initialScale / 2, LineStyles.Highway2)); 

roadsLayer.ZoomLevelSet.CustomZoomLevels.Add(GetLineStyleZoomLevel(initialScale / 4, LineStyles.Highway3)); 

roadsLayer.ZoomLevelSet.CustomZoomLevels.Add(GetLineStyleZoomLevel(initialScale / 8, LineStyles.Highway4)); 

roadsLayer.ZoomLevelSet.CustomZoomLevels.Add(GetLineStyleZoomLevel(initialScale / 16, LineStyles.Highway5)); 



And the function GetLineStyleZoomLevel is like: 



private ZoomLevel GetLineStyleZoomLevel(double scale, LineStyle ls) 



ZoomLevel zoomLevel = new ZoomLevel(scale); 

zoomLevel.DefaultLineStyle = ls; 

return zoomLevel; 

}



Thank you for sending us that code. I let you know that we will work on your case first thing tomorrow morning.

I created a sample app on my side and I used your GetCustomZoomLevelSet function which set 10 different zoom levels for a layer. Each zoom level being half in scale of the previous one.


I don't understand what you are doing with lines such as this one:


roadsLayer.ZoomLevelSet.CustomZoomLevels.Add(GetLineStyleZoomLevel(initialScale, LineStyles.Highway1)); 


I have my sample app working just fine with the code below. I just used a different reference scale and different symbols for testing purpose.


 


 



 private void LoadPost7459()
        {
            wpfMap1.MapUnit = GeographyUnit.DecimalDegree;
            wpfMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            ShapeFileFeatureLayer layer1 = new ShapeFileFeatureLayer(@"..\..\Data\austinstreets.shp");
            LineStyle lineStyle = new LineStyle(new GeoPen(GeoColor.StandardColors.Red, 2));
           
            layer1.ZoomLevelSet = GetCustomZoomLevelSet();
            layer1.ZoomLevelSet.CustomZoomLevels[0].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Red, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[1].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Green, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[2].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Orange, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[3].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.OrangeRed, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[4].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Blue, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[5].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.BlueViolet, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[6].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.DarkSeaGreen, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[7].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.DeepPink, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[8].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.YellowGreen, 2, true);
            layer1.ZoomLevelSet.CustomZoomLevels[9].DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Violet, 2, true);


            LayerOverlay layerOverlay = new LayerOverlay();
            layerOverlay.Layers.Add(layer1);
            wpfMap1.Overlays.Add(layerOverlay);

            layer1.Open();
            wpfMap1.CurrentExtent = layer1.GetBoundingBox();
            layer1.Close();

            wpfMap1.Refresh();
        }

        private ZoomLevelSet GetCustomZoomLevelSet()
        {
            var initialScale = 144187;  //590591790;
            ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 2));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 4));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 8));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 16));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 32));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 64));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 128));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 256));
            zoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(initialScale / 512));
            return zoomLevelSet;
        }