ThinkGeo.com    |     Documentation    |     Premium Support

Custom zoom or modification the scale of the zoom min/zoom max of the default zoom

.


Hi, 
 
I have a question about the zoomLevel.
 
I would like to increase the scale minimum and the scale maximum.
So the code is  : 
 
  double d = map.CurrentScale;
 map.ZoomLevelSet.ZoomLevel01.Scale = Math.Round(d, 10);
 map.ZoomLevelSet.ZoomLevel02.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel01.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel03.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel02.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel04.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel03.Scale / 2, 10);
map.ZoomLevelSet.ZoomLevel05.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel04.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel06.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel05.Scale / 2, 10);
map.ZoomLevelSet.ZoomLevel07.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel06.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel08.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel07.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel09.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel08.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel10.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel09.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel11.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel10.Scale / 2, 10);
  map.ZoomLevelSet.ZoomLevel12.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel11.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel13.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel12.Scale / 2, 10);
map.ZoomLevelSet.ZoomLevel14.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel13.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel15.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel14.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel16.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel15.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel17.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel16.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel18.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel17.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel19.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel18.Scale / 2, 10);
 map.ZoomLevelSet.ZoomLevel20.Scale = Math.Round(map.ZoomLevelSet.ZoomLevel19.Scale / 2, 10);
 
 map.MinimumScale = Math.Round(map.ZoomLevelSet.ZoomLevel19.Scale / 2, 10);
 map.MaximumScale = Math.Round(d, 10);
 
But my question is  : 
What is the best solution ?
Modify the scale of the default zoom as above or create our own zoom with CutomZoomLevel ?
Is there a number of levels of zoom not to be exceeded ? (less than 20 or no limit ...)
 
Thanks a lot for your help.
 
Regards.
 
Steph.
 
 

 Hi Steph,


 
The map zoomlevel won't exceeded unless we set a terrible big number technically :). 
This ZoomLevelSet property associates with many operations. For example, the mouse scroll up/down zooms the map in/out to the zoom level next to the current scale. Also, the pan zoom bar will adjust its height depending on the custom zoom level count, etc. Please feel free to try out your custom zoom levels and find the best user experience.
 
Here is a method might help you to figure out how to set a new zoom levels.
 
private static void CustomizeZoomLevel(WpfMap wpfMap, double maxScale, int zoomLevelCount)
{
    // zoom level count is zero doesn't make sense.
    if (zoomLevelCount == 0) throw new NotSupportedException();

    ZoomLevelSet customZoomLevelSet = new ZoomLevelSet();
    for (int i = 0; i < zoomLevelCount; i++)
    {
        double tempScale = maxScale / Math.Pow(2, i);
        customZoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(tempScale));
    }

    wpfMap.ZoomLevelSet = customZoomLevelSet;
}

By the way, our MapSuite GisEditor has 25 zoom levels by default, just like using this way, if you interesting in this, please take a look at this one. gis.thinkgeo.com/Products/GISEditor/tabid/908/Default.aspx 


 
Thanks,
Howard


Hi Howard, 


Thanks for your help.


I have few more questions


Configuration 1 :  I have 20 zoomlevels.


What I did, I changed the scale for each level of zoom.


I did that for the zoomlevel for the control wpfMap and for each layers.


  internal static void CustomScaleZoomLevel(ZoomLevelSet zoomLv)


        {


            zoomLv.ZoomLevel01.Scale = Math.Round(ConstantsMap.CURRENTEXTENDDFAULT_FR, 10);


            zoomLv.ZoomLevel02.Scale = Math.Round(zoomLv.ZoomLevel01.Scale / 2, 10);


            zoomLv.ZoomLevel03.Scale = Math.Round(zoomLv.ZoomLevel02.Scale / 2, 10);


            zoomLv.ZoomLevel04.Scale = Math.Round(zoomLv.ZoomLevel03.Scale / 2, 10);


            zoomLv.ZoomLevel05.Scale = Math.Round(zoomLv.ZoomLevel04.Scale / 2, 10);


            zoomLv.ZoomLevel06.Scale = Math.Round(zoomLv.ZoomLevel05.Scale / 2, 10);


            zoomLv.ZoomLevel07.Scale = Math.Round(zoomLv.ZoomLevel06.Scale / 2, 10);


            zoomLv.ZoomLevel08.Scale = Math.Round(zoomLv.ZoomLevel07.Scale / 2, 10);


            zoomLv.ZoomLevel09.Scale = Math.Round(zoomLv.ZoomLevel08.Scale / 2, 10);


            zoomLv.ZoomLevel10.Scale = Math.Round(zoomLv.ZoomLevel09.Scale / 2, 10);


            zoomLv.ZoomLevel11.Scale = Math.Round(zoomLv.ZoomLevel10.Scale / 2, 10);


            zoomLv.ZoomLevel12.Scale = Math.Round(zoomLv.ZoomLevel11.Scale / 2, 10);


            zoomLv.ZoomLevel13.Scale = Math.Round(zoomLv.ZoomLevel12.Scale / 2, 10);


            zoomLv.ZoomLevel14.Scale = Math.Round(zoomLv.ZoomLevel13.Scale / 2, 10);


            zoomLv.ZoomLevel15.Scale = Math.Round(zoomLv.ZoomLevel14.Scale / 2, 10);


            zoomLv.ZoomLevel16.Scale = Math.Round(zoomLv.ZoomLevel15.Scale / 2, 10);


            zoomLv.ZoomLevel17.Scale = Math.Round(zoomLv.ZoomLevel16.Scale / 2, 10);


            zoomLv.ZoomLevel18.Scale = Math.Round(zoomLv.ZoomLevel17.Scale / 2, 10);


            zoomLv.ZoomLevel19.Scale = Math.Round(zoomLv.ZoomLevel18.Scale / 2, 10);


            zoomLv.ZoomLevel20.Scale = Math.Round(zoomLv.ZoomLevel19.Scale / 2, 10);           


        }


 


I would be used customZoomLevel with 20 levels ( zoomLevelCount = 20)


 internal static ZoomLevelSet CustomizeZoomLevel(double maxScale, int zoomLevelCount)


        {


            // zoom level count is zero doesn't make sense.


            if (zoomLevelCount == 0) throw new NotSupportedException();





            ZoomLevelSet customZoomLevelSet = new ZoomLevelSet();


            for (int i = 0; i < zoomLevelCount; i++)


            {


                double tempScale = maxScale / Math.Pow(2, i);


                customZoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(tempScale));


            }


            return customZoomLevelSet;


        }





The both methods are equals ? 


The advantage of the first method (CustomScaleZoomLevel) is with the customStyle, I can use ApplyUntilZoomLevel


 zleDtOccup.ZoomLevel10.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level11 ;


                zleDtOccup.ZoomLevel10.CustomStyles.Add(AreaStyles.CreateHatchStyle(GeoHatchStyle.Cross, GeoColor.FromArgb(150, GeoColor.StandardColors.Black), GeoColor.StandardColors.Transparent,


                     GeoColor.StandardColors.Black, 1, LineDashStyle.Solid, 0, 0));


                zleDtOccup.ZoomLevel12.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


                zleDtOccup.ZoomLevel12.CustomStyles.Add(AreaStyles.CreateHatchStyle(GeoHatchStyle.Cross, GeoColor.FromArgb(150, GeoColor.StandardColors.Black), GeoColor.StandardColors.Transparent,


                    GeoColor.StandardColors.Black, 1, LineDashStyle.Solid, 0, 0));


                zleDtOccup.ZoomLevel12.CustomStyles.Add(tolerancePointStyle);


 


But with the customZoomLevel, I can't use ApplyUntilZoomLevel so I have to define the custom styles for each level .... ?


 


Configuration 2  : I have 17 levels.


 


So I can do if i use defaultZoom


  internal static void CustomScaleZoomLevel(ZoomLevelSet zoomLv)


        {


            zoomLv.ZoomLevel01.Scale = Math.Round(ConstantsMap.CURRENTEXTENDDFAULT_FR, 10);


            zoomLv.ZoomLevel02.Scale = Math.Round(zoomLv.ZoomLevel01.Scale / 2, 10);


            zoomLv.ZoomLevel03.Scale = Math.Round(zoomLv.ZoomLevel02.Scale / 2, 10);


            zoomLv.ZoomLevel04.Scale = Math.Round(zoomLv.ZoomLevel03.Scale / 2, 10);


            zoomLv.ZoomLevel05.Scale = Math.Round(zoomLv.ZoomLevel04.Scale / 2, 10);


            zoomLv.ZoomLevel06.Scale = Math.Round(zoomLv.ZoomLevel05.Scale / 2, 10);


            zoomLv.ZoomLevel07.Scale = Math.Round(zoomLv.ZoomLevel06.Scale / 2, 10);


            zoomLv.ZoomLevel08.Scale = Math.Round(zoomLv.ZoomLevel07.Scale / 2, 10);


            zoomLv.ZoomLevel09.Scale = Math.Round(zoomLv.ZoomLevel08.Scale / 2, 10);


            zoomLv.ZoomLevel10.Scale = Math.Round(zoomLv.ZoomLevel09.Scale / 2, 10);


            zoomLv.ZoomLevel11.Scale = Math.Round(zoomLv.ZoomLevel10.Scale / 2, 10);


            zoomLv.ZoomLevel12.Scale = Math.Round(zoomLv.ZoomLevel11.Scale / 2, 10);


            zoomLv.ZoomLevel13.Scale = Math.Round(zoomLv.ZoomLevel12.Scale / 2, 10);


            zoomLv.ZoomLevel14.Scale = Math.Round(zoomLv.ZoomLevel13.Scale / 2, 10);


            zoomLv.ZoomLevel15.Scale = Math.Round(zoomLv.ZoomLevel14.Scale / 2, 10);


            zoomLv.ZoomLevel16.Scale = Math.Round(zoomLv.ZoomLevel15.Scale / 2, 10);


            zoomLv.ZoomLevel17.Scale = Math.Round(zoomLv.ZoomLevel16.Scale / 2, 10);


            zoomLv.ZoomLevel18.Scale = 0;


            zoomLv.ZoomLevel19.Scale = 0;


            zoomLv.ZoomLevel20.Scale = 0;


 


With customZoomLevel (zoomLevelCount = 17)


internal static ZoomLevelSet CustomizeZoomLevel(double maxScale, int zoomLevelCount)


        {


            // zoom level count is zero doesn't make sense.


            if (zoomLevelCount == 0) throw new NotSupportedException();





            ZoomLevelSet customZoomLevelSet = new ZoomLevelSet();


            for (int i = 0; i < zoomLevelCount; i++)


            {


                double tempScale = maxScale / Math.Pow(2, i);


                customZoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(tempScale));


            }


            return customZoomLevelSet;


        }


 


In this case, as you say the pan zoom bar will adjust its height depending on the custom zoom. But with the method CustomScaleZoomLevel, the pan zoom bar adjust its height on 20 levels.


 


So both methods have their advantages and inconveniences.


The use of ZoomDefault (ZoomLevel01, ZoomLevel02, etc ....) or a custom zoom depends on our needs or is there a method that you recommand ?


Thanks a lot for your help.


Regards.


 


Steph.


 




Hi Steph, 
  
 Thanks for your feedback and detail scenario. 
 For your first configuration, please don’t worry using custom zoom levels on the map. Because it doesn’t affect the zoom levels on the layers. Technically, the two methods are the same, for there might be some precession difference. 
  
 When setting zoom levels on the map, it only affects the pan zoom bar and relative operations such as mouse scroll up/down to zoom. FeatureLayer maintains its zoom levels itself, which means map’s zoom levels won’t sync to the layer. In another word, we can keep map using custom zoom levels while layer uses default zoom levels. So we still can use ZoomLevel01.ApplyUntilZoomLevel on the layers in your scenario. 
  
 One thing to be aware is that, the map’s zoom levels is not sync to the layer, it only affects the zooming in/out. The layers’ zoom level affects the rendering, if we expect to have best experience of rendering, we need sync the scales to the layer manually. So we can use custom zoom levels on the map, while using default zoom levels on the layers. Hope it makes sense. 
  
 This can also fix the second issue I think. 
  
 Please have a try and feel free to let me know if you have more queries. 
  
 Thanks, 
 Howard

Hi Howard,  
  
 Thanks for your help. 
 It is possible that I have other questions later on this subject. 
  
 Thanks again. 
  
 Regards. 
 Steph. 


Hi Steph, 
  
 You are welcome, just feel free to let us know when you have more queries. 
  
 Thanks, 
 Howard