ThinkGeo.com    |     Documentation    |     Premium Support

Customizing Zoom Levels

I am trying to modify the zoom levels so that the inner most zoom level is closer than the default.  I have tried modifying the default zoom level scles, but can't get the ZoomIn command to work consistently.  I assume this is because I am not using 50% scale change between zoom level.  I have tried using Custom zoom levels, but still can't get the inner most zoom level any closer to my map symbols.  I am using State Plane coordinates.  My default zoom level 1 scale when I open an overview map is about 600,000,000 and the default zoom level 20 scale is 1126.  I need the default zoom level 20 scale closer to 100.  I should also mention that I am using custom styles.  Do the styles have to be added to each zoom level?


Is there some sample code for desktop edition that demonstrates the use of custom zoom levels.  I have seen the web edition project, but it uses tools that are not available in desktop edition.


Charles



I think I found the answer (not to the sample project but to the problem).  I had to add the following to my zoom commands:


MapControl.MinimumScale = 1 (or 100 or whatever)


AND


MapControl.ZoomLevelSnapping = ZoomLevelSnapMode.None


I also had to abandon using the ZoomIn command in favor of the ZoomToScale command.  If you are interested in suggestions, you might add ZoomIn and ZoomOut commands without arguements that simply zooms to the next/previous zoom level.


Charles



In testing my zoom level changes, I noticed that filled polygons disappear when a coordinate falls off the map window.  Is there a work around or setting for this?


Charles




 Charles, 
  
 Thanks for your post and questions. 
  
 Currently, in our desktop edition, there is a limitation for using the CustomZoomLevels, we cannot support a customized zoom level set which contains the zoom level number is not 20 as its default value. 
  
  
 So basically, the customized zoom levels should work while there should still 20 zoom levels(scales) for your customized zoom level set. 
  
 If you still have problem, could you send us a small sample application to show your problem here? That would be very helpful. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Yale, 



Twenty custom zoom levels are plenty.  I just needed to change the scale of each so that the smallest scale was closer to 100.  Since I am not using the standard variance of .5 for the scale of each succeeding layer, I can't use the method ZoomIn(50) to change ZoomLevels consistently.  This is why I suggested ZoomIn and ZoomOut commands without arguments that simply changes from the current zoom level to the next. 



On further investigation, I have found that the polygon that is disappearing is not where I thought it was.  In troubleshooting the problem, I found that AreaBaseShape.ScaleDown() doesn't do what I expected.  I have a polygon with 4 vertices. 



1.  -50.0, -50.0 

2. 50.0. -50.0 

3.  0.0,  50.0 

4.  -50.0, -50.0 



This is a triangle with its center at 0,0.  When I scale this down using AreaBaseShape.ScaleDown(99d), I get the following coordinates: 



1.  -0.5, -17.0 

2.  0.5, -17.0 

3.  0.0, -16.0 

4.  -0.5, -17.0 



I was expecting: 



1.  -0.5, -0.5 

2.  0.5, -0.5 

3.  0.0, 0.5 

4.  -0.5, -0.5 



Am I interpreting Scale Down incorrectly? 



Charles



Charles,


I think the ScaleDown is correct. As in your sample, the center point of the triangle is (0,-16.6666666666667),  you see after the scale down, every point is closer to the center point which is not (0, 0) in this case, that's the way it should work.

 


About the custom ZoomLevels, here we have a post talking in detail about it. Could you please have a look? Although it's in the Web Forum the general concept about ZoomLevels are the same.


gis.thinkgeo.com/Support/Dis...fault.aspx


Let us know if you have more issues.


Thanks,


Ben



Ben, 
  
 You are correct about the scale down.  I fixed that problem by translating the center point to (0, 0) before scaling and rotating, and then translating back.  My symbols now appear to be in the correct location. 
  
 About the zoom levels, let me try to explain what I want to do.  I hope that I can explain this properly.  
  
 Right now there is a noticeable lag when opening my overview map.  There are only 600 features being displayed, but the number of coordinates is huge.  The lag becomes unacceptable when zooming, particularly when wheel zooming.  It is more pronounced at the lower (higher?) zoom levels (i.e 1, 2, etc).  I am pretty sure that this lag is due to the number of features, and especially the detail of the features, that are drawn at these zoom levels.  Since I only have one feature record for each feature, I get all of the feature detail no matter what zoom level I am using. 
  
 I saw a post where you describe maintaining multiple shape files with different levels of detail to be used at different zoom levels.  I want to implement a variation of this in my SQL Spatial database.  I’m thinking about maintaining multiple records for each feature, generalized for different zoom levels.  I think this is possible since I don’t input or edit features often.  The generalized feature records would have a field that represents the zoom level.  I would then include a zoom level when querying for features.  I need a method of determining the current zoom level for the map window.  I know I can get the scale and I can find the zoom level from the scale.  I can do this in the OnCurrentExtentChanged override function.  Since I am using a custom MsSql2008FeatureLayer, and modifying the query already, including a where clause for the zoom level is not an issue.   
  
 Can you answer the following: 
  
 Is there a “Current Zoom Level” for the map window? 
 Is there a faster way to determine the zoom level than calculating the scale and then comparing the scale to the zoom level scales? 
 Does the extent of the map window change before the queries fire to retrieve the data? 
 How are the default zoom level scales determined? 
  
 I should mention that I have set ZoomLevelSnapping = None and MinimumScale = 1 in case that affects your answers. 
  
 Charles

Hi Charles,


Following is my answers for your questions:
Q1: Is there a "Current Zoom Level" for the map window? 
A1: No, but you can get the current ZoomLevel by an API in the ZoomLevelSet class:


ZoomLevel currentZoomLevel = zoomLevelSet.GetZoomLevel(winformsMap1.CurrentExtent, winformsMap1.Width, winformsMap1.MapUnit);


Q2: Is there a faster way to determine the zoom level than calculating the scale and then comparing the scale to the zoom level scales? 
A2: The GetZoomLevel above method is just implemented by comparing the scale, and I think this method is very fast. I used Stopwatch to debug this method, and it just cost 1 millisecond.
Q3: Does the extent of the map window change before the queries fire to retrieve the data? 
A3: Yes, the current extent is changed first, and then the map.Refresh function will fire to retrieve data.
Q4: How are the default zoom level scales determined?
A4: The default zoom level scales are determined based on the Google map.
Any more questions please let me know.
Thanks,
sun

sun, 
  
 Thanks for the response.  I understand everything except the last one.  What Google map?  Does it cover the entire US (in my case where I am using a US state plane projection?  
  
 Charles

Charles,


Our default zoom level scales are determined with the same rule of OpenLayers as following way:

trac.openlayers.org/wiki/SettingZoomLevels


We compare this result with Google Map and found it also apply this logic.


Any more questions just feel free to let me know.


Thanks.


Yale