ThinkGeo.com    |     Documentation    |     Premium Support

Smaller Zoom Steps in Printing

Hello,



We have created a publishing tool using the LargeScalePrinting example from the Wiki. 



One of the functionalities is letting the user zoom in/out through the buttons. Jump in steps that are too large, how can we decrease the zoom steps?

This is the code which we are using to perform the zoom in/out:




private void btnZoomIn_Click(object sender, RoutedEventArgs e)
{
    // Grab the MapPrinterLayer and adjust the extent
    PrinterInteractiveOverlay printerOverlay = (PrinterInteractiveOverlay)Map1.InteractiveOverlays["PrintPreviewOverlay"];
    MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerOverlay.PrinterLayers["MapLayer"]));
 
    // Here we snap the current scale to the default zoomLevelSet when we zoom in
    ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
    double newScale = ZoomLevelSet.GetLowerZoomLevelScale(ExtentHelper.GetScale(mapPrinterLayer.MapExtent, (float)mapPrinterLayer.GetBoundingBox().Width, mapPrinterLayer.MapUnit), zoomLevelSet);
    mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);            
 
    Map1.Refresh();
}
 
private void btnZoomOut_Click(object sender, RoutedEventArgs e)
{
    // Grab the MapPrinterLayer and adjust the extent
    PrinterInteractiveOverlay printerOverlay = (PrinterInteractiveOverlay)Map1.InteractiveOverlays["PrintPreviewOverlay"];
    MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerOverlay.PrinterLayers["MapLayer"]));
 
    // Here we snap the current scale to the default zoomLevelSet when we zoom in
    ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
    double newScale = ZoomLevelSet.GetHigherZoomLevelScale(ExtentHelper.GetScale(mapPrinterLayer.MapExtent, (float)mapPrinterLayer.GetBoundingBox().Width, mapPrinterLayer.MapUnit), zoomLevelSet);
    mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);           
 
    Map1.Refresh();
}

Regards,

Shahin

Shaahin,



I think you can define a custom zoomlevelset to achieve that, some codes as following:


ZoomLevelSet customZoomlevelSet = new ZoomLevelSet();
ZoomLevelSet defaultZoomlevelSet = new ZoomLevelSet();
foreach (var item in defaultZoomlevelSet.GetZoomLevels())
{
    ZoomLevel zoomLevel = new ZoomLevel(item.Scale);
    ZoomLevel smallerZoomLevel = new ZoomLevel(item.Scale / 2 + item.Scale / 4);
 
    customZoomlevelSet.CustomZoomLevels.Add(zoomLevel);
    customZoomlevelSet.CustomZoomLevels.Add(smallerZoomLevel);
}
 
double newScale = ZoomLevelSet.GetLowerZoomLevelScale(ExtentHelper.GetScale(mapPrinterLayer.MapExtent, (float)mapPrinterLayer.GetBoundingBox().Width, mapPrinterLayer.MapUnit), customZoomlevelSet);
mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);

The above codes will make the zoom increase to 40.



Please let us know if any questions.



Thanks,

Troy

Hi Troy, 
  
 Thank you for the code snippet and your reply.  
  
 Actually, I’ve replaced our code with yours and it has got improved which is very good.  
 But, I can’t understand the code completely, I understand how does CustomZoomLevel works but not quite sure why you have added both zoomLevel and the smallerZoomLevel to the customZoomLevels? Shouldn’t we just add smaller Zoomlevels to the CustomZoomLevel? on the flip side, Would you be kind enough to explain how did you calculate smallerZoomLevel? I mean this part: item.Scale / 2 + item.Scale / 4 
  
 Many thanks, 
 Shahin

Shahin,



Sure I can explain it more: In Zoomlevelset, by default, there are 20 pre-defined zoomlevel and each zoomlevel has a specified scale value which is calculated by max scale value with an algorithm (scale = maxScale/2^n). For example:

Zoom 1, scale = 590591790

Zoom 2, scale = 590591790/2

Zoom 3, scale = 590591790/2^2



So, in order to make the scales more closer, in my codes, between each zoom levels, I added one more zoomlevel named smallerZoomlevel with a scale value between original two zoom. And this smallerZoomLevel scale value is exactly equal to the currentzoomlevel.scale/2 + currentzoomlevel.scale/4; So, the new zoom levels would be like:

Zoom 1, scale = 590591790

zoom 1’ scale = 590591790/2 + 590591790/4

Zoom 2, scale = 590591790/2

Zoom 2’  scale = 590591790/2^2 + 590591790/2^2/4

Zoom 3, scale = 590591790/2^2





Of course, you can add any scale values for your custom zoomlevel, just make sure they are decreased.



Please let us know if any questions.



Thanks,



Troy

Troy,  
  
 I appreciate your detailed answer.  
  
 Cheers, 
 Shahin

You are welcome, Shahin. 
  
 Don’t hesitate to let us know if any other questions. 
  
 Thanks, 
  
 Troy