ThinkGeo.com    |     Documentation    |     Premium Support

Fundamental issues with zoom levels

We recently switched to the WPF controls from Winforms, and update to 5.0. I'm now having some issues with the default zoom levels. I'm admittedly not an expert in this area; I didn't write our GIS integration originally.


 


What is happening is the zoom bar doesn't seem to be scaling based on the size of the shapefile. For instance, this is plot map of a cemetary. In an ideal world, when the zoom was completely out, it would be at or just larger than the bounding box of the shapefile. And it would allow me to zoom in essentially as close as possible. But What's happening is that although I set my map's currentExtent = shapefile.GetBoundingBox(), the zoom is already 90% in. So we have almost no leeway when zooming in further:



 


As you can see I'm just using the CS HowDoISamples project, substituting my own shapefile:


 


 Map1.MapUnit = GeographyUnit.Meter;

 ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(@"J:\common\GISData\SPRINGFIELDCM\Davis_Cemetery_GIS_2-7-2011\Shapefiles\Plot_Boundary.shp");

 layer.Open();
 Map1.CurrentExtent = layer.GetBoundingBox();
 layer.Close();

 layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

 layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
 layer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.Canal1;
 layer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.Capital1;
 layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.Railway1("TextColumnName");


 LayerOverlay staticOverlay = new LayerOverlay();
 staticOverlay.Layers.Add("delta", layer);
 Map1.Overlays.Add(staticOverlay);
    Map1.Refresh();


 


I've also noticed that changing the MapUnit has some minor effect on the zoom levels. Thanks for the help!



Kevin, 
  
 I’m working on your sample project with shape file, thanks for your sample with shape file, if there are any updates I will let you know, 
  
 Thanks, 
  
 Scott,

Kevin,


  About the default zoom bar, you have to be aware that it goes from zoom level 1 (at the world level) to zoom level 20 (at the street level). So if you set the extent of your map to the bounding box of a layer that is at a large scale such as your cemetary shapefile, your map extent is going to be at zoom level 20, 19 or 18. If you use the zoom bar and go to zoom level 1 you would be at the world level showing all the continents (if you had that layer).


 In your case, since you are going to deal with only data at street levels, you might want to use custom zoom levels and that way the zoom bar will reflect the range of zoom levels you have. I recommend you take a look at the sample app Zoom Levels Partitioning. In this sample, the way the custom zoom levels are created is different from what you need but you should be able to work from that for your case.


wiki.thinkgeo.com/wiki/Map_S...rtitioning


 


 Also, never change the MapUnit for your map. The MapUnit is set once based on the unit your data is in and it should never change otherwise functions like distance queries, zoom levels etc are not going to work properly.


 


 



Kevin, 
  
 Sorry for answering you delay, just worked several high priority tickets or posts and I checked out your shape file with your code and I found out the reason why the boundingbox of the shape file is under the zoomlevel 18, not the zoomlevel1. Here is the scale for the bounding box of your shape file below: 
  
 4505.8577728271484. 
  
 And here are the pre-define scales for all zoomlevels based on the meter map unit in our core code: 
  
     //zoomLevel20 = new ZoomLevel(1126.4644432067871); 
             //zoomLevel19 = new ZoomLevel(2252.9288864135742); 
             //zoomLevel18 = new ZoomLevel(4505.8577728271484); 
             //zoomLevel17 = new ZoomLevel(9011.7155456542969); 
             //zoomLevel16 = new ZoomLevel(18023.431091308594); 
             //zoomLevel15 = new ZoomLevel(36046.862182617188); 
             //zoomLevel14 = new ZoomLevel(72093.724365234375); 
             //zoomLevel13 = new ZoomLevel(144187.44873046875); 
             //zoomLevel12 = new ZoomLevel(288374.8974609375); 
             //zoomLevel11 = new ZoomLevel(576749.794921875); 
             //zoomLevel10 = new ZoomLevel(1153499.58984375); 
             //zoomLevel09 = new ZoomLevel(2306999.1796875); 
             //zoomLevel08 = new ZoomLevel(4613998.359375); 
             //zoomLevel07 = new ZoomLevel(9227996.71875); 
             //zoomLevel06 = new ZoomLevel(18455993.4375); 
             //zoomLevel05 = new ZoomLevel(36911986.875); 
             //zoomLevel04 = new ZoomLevel(73823973.75); 
             //zoomLevel03 = new ZoomLevel(147647947.5); 
             //zoomLevel02 = new ZoomLevel(295295895); 
             //zoomLevel01 = new ZoomLevel(590591790); 
  
 So please compare the scale of your shapefile’s boundingbox to the scales above, you may find out the zoomlevel18’s scale is the same as your shapefile’s boundingbox. So actually the shapefile’s bounding box is zoomlevel18. That’s correct. This is determined by your shape file.  
  
 Also please notice Val’s comments, he talked the same problem to me and please never change the MapUnit for your map. 
  
 Thanks, 
  
 Scott,

Thank you both for your help. I ended up creating custom zoom levels based on a calculated minzoom and maxzoom. Things seem to be working well now. 



Kevin, 
  
 Any more questions just tell us. 
  
 Regards, 
  
 Gary