ThinkGeo.com    |     Documentation    |     Premium Support

Setting new zoom levels based on current extent

Hello,



I have a problem with the zoom levels:

So now Comes my problem:



I have a button which has the exact code from the “Full Extent” button from the Map Suite Explorer. (wiki.thinkgeo.com/wiki/Sourc…ainForm.cs) So basically I do this:
map.CurrentExtent = GetFullExtent(map); 


So now comes my problem:

In the Map Suite Explorer my Shape-File fits now perfectly the map size after hitting my Full Extent button, but in my application it does not fit the Shape in the map.

I assume the problem are the zoom levels. The next zoom Level seems to be too big for the new extent so the map does not change my layer visual extent.

I need a method to get the new scale after setting the currentExtent. If I refresh the map after setting the new extent I will get only the old scale.

After getting the new scale I can build with it new custom zoom levels.



Somehow the Map Suite Explorer seems to have much more than 20 Zoom Levels.



My goal is to have the exact same behaviour as the “Full Extent” button in the Map Suite Explorer with my own button.



I hope you can help me.

Daniel





Hi Daniel, 
  
 Map Suite Explorer is code based on Service Edition, but your product is WPF Desktop edition, the extent will auto snap to nearest zoomlevel. 
  
 So follow your requirement, you should want to get your target extent first, then call ExtentHelper.GetScale to get suitable scale and update it to customer zoomlevelset. 
  
 Regards, 
  
 Don

Hello Don,



Thank you very much for your answer.



I already thought of that and I tried it the way you described. But somehow it didn’t worked out for me.



Can you provide me a sample which can show me how I can determine the new scale of the new extent and to set that as Level 1 in the customer zoomlevels and the rest 2-20 is calculated from Level 1?



Regards 

Daniel

Hi Daniel, 
  
 I think this code can works for you: 
  
  
 private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            RectangleShape rect = new RectangleShape(-20, 20, 20, -20);

            InMemoryFeatureLayer layer = new InMemoryFeatureLayer();
            layer.InternalFeatures.Add(new Feature(rect));
            layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.Red);
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay overlay = new LayerOverlay();
            overlay.Layers.Add(layer);

            winformsMap1.Overlays.Add(overlay);

            
            winformsMap1.CurrentExtent = rect;
            winformsMap1.Refresh();
        }

        private void buttonZoomTo_Click(object sender, EventArgs e)
        {
            RectangleShape rect = new RectangleShape(-20, 20, 20, -20);

            double targetScale = ExtentHelper.GetScale(rect, winformsMap1.Width, GeographyUnit.DecimalDegree);
            double currentScale = targetScale;

            ZoomLevelSet set = new ZoomLevelSet();
            for (int i = 0; i < 20; i++)
            {
                set.CustomZoomLevels.Add(new ZoomLevel(currentScale));
                currentScale = currentScale / 2;
            }

            winformsMap1.ZoomLevelSet = set;

            winformsMap1.CurrentExtent = rect;
            winformsMap1.Refresh();
        }

 
  
 Regards, 
  
 Don

Hello Don,



I tried your piece of code in my application and it worked perfectly. Thank you very much for the help. :)



Regards

Daniel

Hi Daniel, 
  
 We are glad to hear it works for you. 
 More queries, don’t hesitate to let us know. 
  
 Thanks, 
 Troy