ThinkGeo.com    |     Documentation    |     Premium Support

SyncClientZoomLevels

Few people must be using custom zoom levels or I would expect more discussion of this method being depricated.


I have a custom mapping application written in C# with both a desktop and web version.  I am using MsSql2008Featurelayers.  I wrote parts of the desktop version first.  I am using custom zoom levels so that when zoomed all the way out, the map area covers just the map data (not the whole world).  To do this, I use custom zoom levels in which I have set my own scales.  I use the following code in the desktop version as add each map layer:


     ZoomLevelSet customZooms = GetCustomZoomLevels();

     if (mapWindow.ZoomlevelSet.CustomZoomLevels.Count == 0)

          mapWindow.ZoomLevelSet = customZooms;


This code didn't work in the web edition so I changed it as follows: 


     ZoomLevelSet customZooms = GetCustomZoomLevels();

     mapWindow.SyncClientZoomLevels(customZooms);


Now SyncClientZoomLevels has been depricated.  I tried the desktop code in the web version.  The web page appears without any map data.  Since it didn't throw an error, I tried zooming in.  If I zoom in about half way on the zoom bar, my map data appears.  The web control doesn't appear to be using my custom scales.


Am I doing something wrong?


Charles


 



 Hello Charles,


 
Thanks for your post, for now we have a new way ZoomLevelSet, so we decide deprecate the old way ClientZoomLevelScales and SyncClientZoomLevels. 
 
Those two are almost the same, the both are a collection that includeing a double value, for the (public ZoomLevelSet ZoomLevelSet) type ZoomLevelSet is a collection of Scale. and the Scale is a double value. 
 
So my suggestion is give up the CustomZoomLevels and use ZoomLevelSet. Please see the code below:

ZoomLevelSet customZooms = GetCustomZoomLevels();
Map1.ZoomLevelSet = customZooms ;

 
Any more questions please feel free to let me know. 
 
Regards, 
 
Gary

Hi Charles,


You apparently missed this thread on the subject: gis.thinkgeo.com/Support/Dis...fault.aspx


The new implementation doesn't seem to work in the release version of 5.5, you need at least build 70 to make it work.


I too would've liked to keep the old implementation, but do acknowledge that technically reasons may have made changes necessary.


Cheers.


 



 Lars,


 
Thanks for the reply.  Actually I did see your post, but since it ended in 'Anyone?', and it was over a month old I decided to start a new thread.  I am using 5.5.0.91.
 
I managed to get this to work as follows:
 
This is the old code to create a CustomZoomLevelSet:
 

    private ZoomLevelSet GetCustomZoomLevels()
    {
        try
        {
            int MinScale = 500000;
            double[] scales = new double[20];
            double r = Math.Pow(Convert.ToDouble(MinScale) / 100.0d, 1.0d / 19.0d);

            // ZoomLevel scales is a reverse geometric progression starting
            // at 100 and ending at MinScale in 20 steps
            // (ZoomLevel01.Scale = MinScale, ZoomLevel20.Scale = 100).
            for (int looper = 19; looper >= 0; looper--)
            {
                scales[looper] = Math.Round(100.0 * Math.Pow(r, (double)(19 - looper)));
            }

            ZoomLevelSet ReturnValue = new ZoomLevelSet();
            for (int looper = 0; looper < scales.Length; looper++)
            {
                ZoomLevel zoom = new ZoomLevel(scales[looper]);
                zoom.Name = looper.ToString();
                ReturnValue.CustomZoomLevels.Add(zoom);
            }
            return ReturnValue;
        }
        catch
        {
            throw;
        }
    }

 
Change this in the for loop to use normal zoom levels:
 

    ZoomLevelSet ReturnValue = new ZoomLevelSet();
    for (int looper = 0; looper < scales.Length; looper++)
        {
            ZoomLevel zoom = ReturnValue.GetZoomLevels()[looper];
            zoom.Scale = scales[looper];
            zoom.Name = looper.ToString();
        }
    return ReturnValue;

 
Since I am also using Custom Styles, I had to change my code to add the custom style to the normal zoom set rather than the CustomZoomLevels:
 

    for (int looper = minZoomLevel; looper < 20; looper++)
        MapLayer.ZoomLevelSet.GetZoomLevels()[looper].CustomStyles.Add(newStyle);

 
Finally, every time you postback, the map control reverts to the standard (whole world) zoom level set.  In your Page_Load event you need to reset the map control zoom level set to the customized zoom level set.
 
For Gary, I think it would have been clearer from the onset if you had deprecated CustomZoomLevels completely.  Is there a purpose for keeping them?

Hi Charles,


If you only saw "Anyone?" you missed page 2 


My own code is simpler to yours, as I keep the 20 predefined zoom levels. This is what I use now:



Dim scaleMax As Double = 1000000 'or some other value
scaleMax *= 2.0 'to enable zooming out once

For i As Integer = 1 To 20
    Dim scl As Double = scaleMax / Math.Pow(2, i - 1)
    Map1.ZoomLevelSet.GetZoomLevels(i - 1).Scale = scl
Next

Map1.ZoomTo(Map1.CurrentExtent.GetCenterPoint, scaleMax / 2) 'next to highest
 

I tried several work-arounds, but upgrading the DLLs and setting the zoom levels before calling the initial ZoomTo solved it for me.


Cheers.



 Lars, 


 
I appreciate your help.
 
 
Charles, 
 
Have you try the code above? I change it to c# version.
 

double scaleMax = 1000000;
//or some other value
scaleMax *= 2.0;
//to enable zooming out once

for (int i = 1; i <= 20; i++) {
double scl = scaleMax / Math.Pow(2, i - 1);
Map1.ZoomLevelSet.GetZoomLevels(i - 1).Scale = scl;
}

//next to highest
Map1.ZoomTo(Map1.CurrentExtent.GetCenterPoint, scaleMax / 2);

 
And please get the 5.5.xx.0, this is the development version, we will make changes in this and synchronize to 5.5.0.xx release version after all fix confirm.
 
Please let me know if you have any queries.
 
Regards,
 
Gary

I did get the code to work as indicated in my post of 2/20.  Since the zoom levels are data set specific I couldn’t use the simpler code Lars provided.  I think my confusion involved the narrow view that SyncClientZoomLevels was deprecated, rather than the wider view that I needed to stop using the CustomZoomLevels collection. 
  
 Charles

Hello Carles, 
  
 I’m glad it’s working now, please feel free to let us know your questions. 
  
 Regards, 
  
 Gary