ThinkGeo.com    |     Documentation    |     Premium Support

Implementing Custom Scales: CustomZoomLevels vs ZoomLevel0x.Scale

Hello, I recently upgraded to ThinkGeo 5.0 and noticed that the Map.ClientZoomLevelScales array and the function Map.SyncClientZoomLevels( ) are noted as "deprecated".


Up until now, I had set up my ThinkGeo map as follows:




protected void Generate_Map( )
{
double StartScale = 55000000;

for ( int i = 0; i < 20; ++i )
{
Map.ClientZoomLevelScales[i] = double.Parse( String.Format( "{0:G2}", StartScale / Math.Pow( 1.5, i ) ) );
}

// ...
// Create myLayer and define myAreaStyle (NOT SHOWN)
// ...

CustomZoomLevels_Initialize( myLayer );
myLayer.ZoomLevelSet.CustomZoomLevels[0].DefaultAreaStyle = myAreaStyle;
CustomZoomLevels_Apply( myLayer, 0, 19 );
}

protected void CustomZoomLevels_Initialize( FeatureLayer featureLayer )
{

foreach ( double scale in Map.ClientZoomLevelScales )
{
featureLayer.ZoomLevelSet.CustomZoomLevels.Add( new ZoomLevel( scale ) );
}
}

protected void CustomZoomLevels_Apply( FeatureLayer featureLayer, int zoomLevelStart, int zoomLevelEnd )
{
if ( zoomLevelEnd <= zoomLevelStart )
{
return;
}

ZoomLevelSet zoomLevelSet = featureLayer.ZoomLevelSet;

for ( int i = zoomLevelStart + 1; i <= zoomLevelEnd; ++i )
{
if ( i > ( zoomLevelSet.CustomZoomLevels.Count - 1 ) || i < 0 )
{
continue;
}

foreach ( ThinkGeo.MapSuite.Core.Style style in zoomLevelSet.CustomZoomLevels[zoomLevelStart].CustomStyles )
{
zoomLevelSet.CustomZoomLevels[i].CustomStyles.Add( style );
}
zoomLevelSet.CustomZoomLevels[i].DefaultAreaStyle = zoomLevelSet.CustomZoomLevels[zoomLevelStart].DefaultAreaStyle;
zoomLevelSet.CustomZoomLevels[i].DefaultLineStyle = zoomLevelSet.CustomZoomLevels[zoomLevelStart].DefaultLineStyle;
zoomLevelSet.CustomZoomLevels[i].DefaultPointStyle = zoomLevelSet.CustomZoomLevels[zoomLevelStart].DefaultPointStyle;
zoomLevelSet.CustomZoomLevels[i].DefaultTextStyle = zoomLevelSet.CustomZoomLevels[zoomLevelStart].DefaultTextStyle;
}
}





My question now is... what is the best way to implement this?  Is it better to NOT use CustomZoomLevels, and simply set Layer.ZoomLevelSet.ZoomLevel01.Scale, especially because I only need 20 zoom levels.  How do we set the ClientZoomLevelScales now that they are deprecated?  Would like to know the optimal way of doing this.

Update.


Seems like on individual Layers I can use either:


 



        
  • Layer.CustomZoomLevels[x].Scale (e.g. Layer.CustomZoomLevels[0] = Map.ClientZoomLevelScales[0])

  •     
  • ZoomLevel0x.Scale (e.g. ZoomLevel01.Scale = Map.ClientZoomLevelScales[0] )


I haven't tried using Map.ZoomLevelSet.  Still using Map.ClientZoomLevelScales.



Dear Abner, 
  
 Thanks for your post, because we have a new way ZoomLevelSet, so we decide deprecate the old way ClientZoomLevelScales. 
  
 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. 
  
 Any more questions please feel free to let me know. 
  
 Regards, 
  
 Gary

Hi, 
  
 I.e. "Map1.ZoomLevelSet.GetZoomLevels(i).Scale = xx" instead of "Map1.ClientZoomLevelScales(i) = xx" ? 
  
 Cheers 


Hello Lars I, 



Yes, almost like that, you can use  


Map1.ZoomLevelSet.GetZoomLevels()[i].Scale = xx;


or 


Map1.ZoomLevelSet.GetZoomLevel(Map1.CurrentExtent, double.Parse(Map1.Width.ToString()), Map1.MapUnit).Scale = xx;



Regards, 



Gary



Hi Gary,



I'm using VB, and need to replace my assignments to the ClientZoomLevelScales collection with a similar one.



I'm trying to set zoom levels to fit my area of interest (Denmark), preventing zoom-outs to the entire globe.



But the above (Map1.ZoomLevelSet.GetZoomLevels(i).Scale) unfortunately isn't working properly.


Here's what I do:



        Dim DotsPerInch As Double = 96
        Dim inchesPerUnit As New Collection

        Dim w As Double = Map1.Width.Value
        Dim h As Double = Map1.Height.Value

        inchesPerUnit.Add(4374754, "DecimalDegrees")
        inchesPerUnit.Add(12.0, "Feet")
        inchesPerUnit.Add(39.3701, "Meter")

        Dim res As Double = Math.Max(maxExtent.Width / w, maxExtent.Height / h)

        Dim scaleMax As Double = res * inchesPerUnit(Map1.MapUnit.ToString) * DotsPerInch
        scaleMax *= 2.0 'one step out is max

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

        Map1.CurrentScale = scaleMax / 2 'next to highest

Cheers.


 



Hello Lars I, 



The code looks like no problem, and what's the situation for this error, is it ignoring some zoomlevel, like from zoomlevel1 to zoomlevel3? 



Regards, 



Gary



Hi Gary, 
  
 The problem seems to be, that the set scales are completely ignored. I’m setting the map’s CurrentExtent, then assigning client zoom level scales according to this extent, which ought to result in setting my actual zoom level to level 2 (Map1.CurrentScale = scaleMax / 2). 
  
 But my map keeps behaving like it’s on zoom level 7 or 8, so the set scale values are not in effect. This didn’t happen before when assigning the values to ClientZoomLevelScales ! 
  
 Please advise. 


Hello Lars I, 
  
 Can you check your maxExtent.Width and maxExtent.Height? Sometimes it’s not the pixel, also if you can provide a sample let us have some test, I’m appropriate that. 
  
 Regards, 
  
 Gary

Hi Gary, 
  
 A sample would be just the code I’ve posted above, prepended with a statement like this: 
  
 Map1.CurrentExtent = New RectangleShape(400000, 6500000, 1000000, 6000000) 'Denmark UTM 32N ETRS89 (epsg:25832) 
  
 I can see that the stored values change, but they don’t seem to come into effect even though the page reloads. 
  
 Cheers. 


Hello Lars I, 
  
 Thanks for your further information, but what’s your maxExtent? 
  
 Thanks for your help and patience. 
  
 Regards, 
  
 Gary

Hi Gary, 
  
 The variable mapExtent is just a named parameter to the subroutine contaiing the code, and its value is set equal to Map.CurrentExtent after I set the largest zoom extent I want in the map. 
  


Are you there Gary ? 


Lars,


 Gary will not be able to assist you on this post for the week. I have been reading the post but there is a lot of back and forth bewteen you two so that it is a little confusing to figure out how much as been acomplished and how much still needs to be worked on. Can you give me a little sumary of the situation right now? And of course, having a little sample would help a lot. Thank you.



Hi Val,


Ok, here goes with a very simple example:



Map1.ZoomTo(New ThinkGeo.MapSuite.Core.PointShape(588000, 6140000), 50000) '"city" level

Dim scaleMax As Double = Map1.CurrentScale * 2.0 'current is next-to-heighest

For i As Integer = 1 To 20
  Dim scl As Double = scaleMax / Math.Pow(2, i - 1)
  'Map1.ClientZoomLevelScales.Item(i - 1) = scl '4.5 code, this worked !
  Map1.ZoomLevelSet.GetZoomLevels(i - 1).Scale = scl
Next


My intention is leaving the map on zoom level 2, i.e. next-to-highest, but as the map picture shows, the client scale bar is on level 13 or 14.


This leads me to the conclusion, that either I'm missing some "execute" command, or the new setup doesn't work.


Please advise.


 




Here's the map screen shot



Hi, 
  
 Actually it looks like the scale bar ‘marker’ is totally frozen, whenever I zoom in and out using the mouse wheel. 
  
 And I’m still stuck with “world view” scales :-( 
  
 Something’s definitely not working like it should. 
  
 Using Firefox 8 if that matters. 


Lars,


 I am still a little fuzzy on what you are trying to accomplish exactely but based on your sample code, your picture and your explanation, you would assume that you want to set your map with 3 zoom levels or some limited number of zoom levels so that the highest zoom level is at a city level (such as in your picture with Odense, Denmark). And you want to have the zoom bar reflecting this with the highest level being the one that you set (city level), not world level. Do I understand right? Did you look at the web sample Customize ZoomLevels in the Code Community? wiki.thinkgeo.com/wiki/Map_Suite_We...ZoomLevels. That might be what you are looking for with the function SyncClientZoomLevels. I tried to modify it to fit your case but I don't understand it very well and furthermore I am little clumsy in the web environment. If you are still struggling after that, please, respond to this post with the exact requirements you have and I will have a guy from the Web Development team write a little sample. Thank you.



Hi Val,


Fuzzy? I thought it was clear from my code and my comments that I wanted to use my own set of user zooms.


ThinkGeo chose to remove the "ClientZoomLevelScales" construct, which worked perfectly in 4.5, but noone seems to have been able to give but a fuzzy answer on how to recreate the same effect in Web Edition version 5.5 !


The example you're referring to is non-functional or obsolete. The only difference between my provided code and the example code is the call to a method named SyncClientZoomLevels, but this method is apparently absent in version 5.5 !


PLEASE provide a simple, clear - and working - example on how to set (e.g.) 20 custom zoom levels using WEB EDITION 5.5 !


 



Anyone ?