ThinkGeo.com    |     Documentation    |     Premium Support

Custom Zoom Levels and ApplyUntilZoomLevel

I am using custom zoom levels with my project.  I use the following code to set up each map layer:



    int minZoomLevel = MyProject.DataInterface.GetMinZoomLevel(layer) - 1;
    MapLayer.ZoomLevelSet.CustomZoomLevels[minZoomLevel].CustomStyles.Add(new MyStyle(ColorSource.Feature, layer));
    MapLayer.ZoomLevelSet.CustomZoomLevels[minZoomLevel].ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

minZoomLevel could be any value between 0 and 19, but for testing purposes I am only using 0, 2, 4, and 6.  I am also using SyncClientZoomLevels.  The features appear at the proper time, but they disappear when I get to about ZoomLevel 15.  I am zooming in on line features that cross the center of the map window, so I am sure that I'm not zooming in of empty space.  If it makes any difference, at zoom level 15 the scale drops below 1:1000.  I have placed a break point inside my custom style.  The DrawCore method doesn't appear to fire when I hit zoom level 15.  Any suggestions on how to troubleshoot this issue?


Also, I am using SQL Server spatial with this project, and the zoom level doesn't appear to affect the time it takes to draw a feature layer (table).  As I am zooming in, shouldn't it take less time to draw the features, since there should be fewer to draw?


Charles



Charles, 
 It’s hard to determine the reason why the DrawCore method isn’t invoked. As I guessed, maybe it caused by the invalid zoomLevel. Can you send a sample to us or post some code about customizing zoomLevel? Also you can have a look at a code community sample code.thinkgeo.com/projects/list_files/customizezoomlevels about Customizing ZoomLevel. 
 I agree that fewer features, more efficiently technically. But it’s just supposed to. Maybe some unexpected reasons also affect the drawing time, such as the style defined for the ZoomLevel. 
 Thanks, 
 Johnny 


Johnny,


I built this simple app to demonstrate the problem.  It is using shape file data so there are no issues with sql server.  I removed the bin and obj directories to decrease the size of the zip file.


Charles



TestCustomZoomLevels.zip (15.3 KB)



Charles,


Please don’t use zoomLevel**.ApplyUntilZoomLevel = ApplyUntilZoomLevel.ZoomLevel** if the CustomZoomLevels are used. This is an issue that had been submitted to our issueList. I think you can change the scale of each zoomLevel if you still use 20 zoom levels. Please have a look at the sample we have updated. Here is another online sample about how to customize zoomlevels in DesktopEdition code.thinkgeo.com/projects/show/customzoomlevels.
Thanks,
Johnny

001_TestCustomZoomLevels.zip (12.1 KB)

Johnny,


Hearing that something is on your 'issue list' is hardly satisfactory.  I'm not sure why you attached a modified project since it doesn't use custom zoom levels at all.  If I remove the ApplyUntilZoomLevel from my code, the window displays nothing at all.  Is there any estimate as to when this will be fixed?  I need to use custom zoom levels with my project and deadlines are looming.


I looked at the code comunity project and it is a good example of changing drawing colors and setting scales at custom zoom levels, but the zoom level scales used are still a regular progression of previous scale / 2^x.  I suspect the reason that this project is limited to 10 custom zoom levels is that the ending scale would be too small to use over 20 zoom levels starting at 1:150000 (I calculate the ending scale at 1:0.03 and I'm not sure what that means).  I need scales that progress from an initial scale to 1:100.  This works out to more like previous scale / 1.y^x over 20 zoom levels.


Charles



Charles, 
  
   I am looking into this and I think there is misunderstanding of how to use the ZoomLevelSet regarding custom zoom levels.  There is also a disconnect with how the SyncClientZoomLevels works.  I think there will be no need make any changes for us but we need to provide a detailed explanation of how this works.  I will attempt to give you an overview and then tomorrow, if necessary, create a concrete set of sample showing all of this. 
  
 1. The ZoomLevelSets for each layer are totally disconnected and separate from the ZoomLevelSet you pass to the SyncClientZoomLevels  method.  What I mean by this is that your layers could have a set of three custom zoom levels and your ZoomLevelSet for the SyncClientZoomLevels could have twenty.  It is of course good if the zoom level’s break around the same points though. 
  
 2. There are two ways to customize zoom levels.  The first is that you can modify the scale property of the default ZoomLevelSet directly.  You can do something like Layer.ZoomLevelSet.ZoomLevel1.Scale = 1,000,000.  The way we determine which zoom level to use is that we find the zoom level where the scale is the closest to the scale that is represented by the current extent on the screen.  If you only wanted 4 zoom levels you could do the following:  Layer.ZoomLevelSet.ZoomLevel1.Scale = 1,000,000; Layer.ZoomLevelSet.ZoomLevel2.Scale = 500,000; Layer.ZoomLevelSet.ZoomLevel3.Scale = 100,000; Layer.ZoomLevelSet.ZoomLevel4.Scale = 0; Layer.ZoomLevelSet.ZoomLevel5.Scale = 0; and so on setting the scale for the zoom levels 5-20 all to zero.  In this case if the scale was 100,000,000 then it would use zoom level 1 and if the scale was 10 then it would use zoom level 4.  If you use this way you can use the ApplyUntilZoomLevel just fine jsut consider custom scales you set. 
  
 3.  The other way to cusotmize your zoom levels is to use the ZoomLevelSet.CustomZoomLevels.  We typically recommend this when you have more than 20 zoom levels as you cannot do the trick as we mentioned in item 2.  It can be handy for just a few zoom levels as well.  Remember that the zoom levels you use for your layers are disconnected from the zoom levels of the map itself to snap so for one layer you could have two custom zoom levels say for scale 1,000,000 and for scale 100,000.  When the scale of the map is closer to 1,000,000 it will use that style and when it is closer to 100,000 then it will use that style.  You can do this while haveing 20 zoom levels in the ZoomLevelSet you use for the SyncClientZoomLevels.  They are completely disconnected.  Layer2 on the same map could have four zoom levels to suit it as well.  One at 1,500,000, 750,000, 600,000 and 105,000.  When we process each layer we get the current scale and evaluate each layer independently. 
  
 My suggestion in all of this is if you will have roughly 20 zoom levels is to modify the scales in the default ZoomLevelSet.  In this way you can still use the ApplyUntil method and you never have to touch the CustomZooms collection. 
  
 You can also create your own ZoomLevelSet object by inheriting from the ZoomLevelSet and in the constructor set your own zoom levels.  This is what we have done for classes like GoogleMapsZoomLevelSet and a few others.   
  
 I hope this helps and let me know if you have any questions.  If this makes sense let me know and maybe we can bypass building the samples. 
  
 David

Charles, 
  
   I made one mistake in the example above.  I went the wrong way in my example.  In section 2 if you wanted to create 4 zoom levels here is what you would do. 
  
 [Set all zoom levels between 1-16 to scale=double.max] 
 Layer.ZoomLevelSet.ZoomLevel17.Scale = double.max; 
 Layer.ZoomLevelSet.ZoomLevel18.Scale = 1,000,000 
 Layer.ZoomLevelSet.ZoomLevel19.Scale = 500,000 
 Layer.ZoomLevelSet.ZoomLevel20.Scale = 100,000;  
  
 If the scale is 50 then it will select zoom level 20.  If the scale is 100,000,000 then it will select scale 18.  It would have to be a crazy large scale to ever select scale 17.  This effectively means that level 17 cannot be selected. 
  
 I will correct the previous post tomorrow.  Sorry for that! 
  
 David

David, 
  
 Thank you for the detailed reply.  I was originally using the standard zoom level but ran into a problem as noted in this post: 
  
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/7516/afv/topic/Default.aspx#19635 
  
 My understanding from the reply to that post was that I can’t change the scale of the default zoom level set.  I was able to change it but it seemed to reset itself.  If I can change the scale of the default zoom levels and have them behave as expected, it would certainly be easier to use the default set.   
  
 I have a suggestion as well.  Can you add the ability to reference the default zoom levels by index?  In my project, I want to set a minimum zoom level that displays features for a layer based on a value in the database.  The code I use now is: 
  
 ZoomLevelSet.CustomZoomLevels[minLevel].CustomStyles.Add… 
  
 This is much easier than trying to set the custom style of the default ZoomLevelXX. 
  
 Charles 


Charles, 
  
   Could you give me some more details on when it would ‘reset itself’?  I know we use other zoom level sets quite often.  I will setup a sample tomorrow to show how it works.  I am pretty sure we can get it working without using the CustomZoomLevels collection and instead change the scales or create our own custom zoom level set. 
  
   I can see how you would want to get the zoom levels like that.  Let me consider how to expose that.  Maybe we could have a ZoomLevelSet.GetZoomLevelByNumber(int zoomLevel) or something like that?  If we go the route of creating the custom zoom level set then we can easily add this method without much hassle.   
  
 David

David,


Sorry for the delay.  I can't remember exactly how or when the DefaultZoomLevel scales changed.  I did solve this problem by adding my custom style to each ZoomLevel in which I wanted features to display.  I think this is the purpose of the ApplyUntilZoomLevel setting and it seems to work.


Charles



Charles, 
  
   The apply until should be the equivalent to adding the style to all of the zoom level.  Of course if you add them yourself then that solves it also.  Let us know if you have any more questions. 
  
 David