ThinkGeo.com    |     Documentation    |     Premium Support

Am I doing Zoom Levels wrong?

 I am trying to set my own zoom levels, but it isn't working out very well.


When I load my GdiPlusRasterLayer, I call GetBoundingBox() on the layer and then calculate a rect about twice the size of the BoundingBox. I set that new larger rect as the CurrentExtent of the Map. That seems to work as I want.


I then take Map.CurrentScale and set that to be the scale of ZoomLevel01. I then run thru the other 19 ZoomLevels and set each one to be 70% of the value of the previous one. (so ZoomLevel02.Scale = 70% of ZoomLevel01.Scale,  ZoomLevel03.Scale = 70% of ZoomLevel02.Scale, etc).


In my case, ZoomLevel01.Scale is 1126.46 and ZoomLevel20.Scale is 1.28


When I display the Map, things look OK, but only the first 5 Zoom Levels seem to work via scroll wheel. (ie ZoomLevel01 to ZoomLevel05)  The scale for ZoomLevel05 is 270.46 and the scale for ZoomLevel06 is 189.32  (not that ZoomLevel06 seems to be available).


Can you tell me what is wrong with my ZoomLevels?


Dave



David, 
  
 From your description I think you did the right way, I couldn’t find the problem. Could you provide a simple code to show your problem? 
  
 Thanks, 
 James

 Sure:




//make a temp UTM worldfile from the provided L/L worldfile
string tempFile = SetUpUTMtmpFile(ofd.FileName); 

GdiPlusRasterLayer RasterLayer = new GdiPlusRasterLayer(ofd.FileName,tempFile);
RasterLayer.UpperThreshold = double.MaxValue;
RasterLayer.LowerThreshold = 0;
RasterLayer.Transparency = 255;
RasterLayer.Name = System.IO.Path.GetFileNameWithoutExtension(ofd.FileName);
                  
RasterLayer.Open();
RectangleShape rect = RasterLayer.GetBoundingBox();
RasterLayer.Close();

LayerOverlay ImageOverlay1 = new LayerOverlay();
ImageOverlay1.Layers.Add("RasterLayer", RasterLayer);
Map.Overlays.Add(ImageOverlay1);
BaseOverlays.Add(ImageOverlay1); //a List<Overlay> I have for housekeeping

File.Delete(tempFile);

Map.CurrentExtent = DoubleSize(rect);                    
                    
LargestScale = Map.CurrentScale;
RecalculateZoomLevels(LargestScale, .30);
Map.ZoomToScale(Map.ZoomLevelSet.ZoomLevel03.Scale);


And the called methods:


private RectangleShape DoubleSize(RectangleShape original)
{            
    double diffX = original.Width * .2;
    double diffY = original.Height * .2;

    return new RectangleShape(original.UpperLeftPoint.X - diffX, original.UpperLeftPoint.Y - diffY, original.LowerRightPoint.X + diffX, original.LowerRightPoint.Y + diffY);
}

private void RecalculateZoomLevels(double MaxScale, double StepPercent)
{
    StepPercent = 1 - StepPercent;
    double thisScale = MaxScale;
    Map.ZoomLevelSet.ZoomLevel01.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel02.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel03.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel04.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel05.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel06.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel07.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel08.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel09.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel10.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel11.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel12.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel13.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel14.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel15.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel16.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel17.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel18.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel19.Scale = thisScale;
    thisScale = thisScale * StepPercent;
    Map.ZoomLevelSet.ZoomLevel20.Scale = thisScale;
    thisScale = thisScale * StepPercent;
}

private string SetUpUTMtmpFile(string FileName)
{
    double deg2rad = Math.PI / 180;

    //figure out wordfile extention
    string ext = FileName.Substring(FileName.Length - 3, 3);
    string wfe = ext[0].ToString() + ext[2].ToString() + "w";
    string worldFilePath = FileName.Substring(0, FileName.Length - 3) + wfe;

    //Load world file, run to the last 2 lines, convert them to UTM and write out a temp worldfile
    StreamReader inFile = new StreamReader(worldFilePath);
    string tempFile = System.IO.Path.GetTempFileName();
    StreamWriter outFile = new StreamWriter(tempFile);
    double para1 = Convert.ToDouble(inFile.ReadLine());
    double para2 = Convert.ToDouble(inFile.ReadLine());
    double para3 = Convert.ToDouble(inFile.ReadLine());
    double para4 = Convert.ToDouble(inFile.ReadLine());
    double lon = Convert.ToDouble(inFile.ReadLine());
    double lat = Convert.ToDouble(inFile.ReadLine());

    double para1utm = para1 * 111321.543 * Math.Cos(lat * deg2rad);
    double para2utm = para2 * 111321.543;
    double para3utm = para3 * 111321.543 * Math.Cos(lat * deg2rad);
    double para4utm = para4 * 111321.543;

    FusionCoordinate fc = new FusionCoordinate(lat, lon, 0, 0, "");
    LLtoUTM(ref fc); //fill in the UTM poperties with data based on the LL properties

    outFile.WriteLine(para1utm.ToString());
    outFile.WriteLine(para2utm.ToString());
    outFile.WriteLine(para3utm.ToString());
    outFile.WriteLine(para4utm.ToString());
    outFile.WriteLine(fc.Easting.ToString());
    outFile.WriteLine(fc.Northing.ToString());

    UTMZone = fc.UTMZone;
    thisView.UTMZone = UTMZone;

    inFile.Close();
    outFile.Close();

    return tempFile;
}



David, 
  
   Thank you for sending the code. I see that it is a little more complex than anticipated. If you don’t mind, can you package it into a self contained sample app we can run? Since you know better then us your code, I think that it would take you less time for you to do that than for us, so that we can focus on solving the problem. Thank you.

 Not a problem Val.  I already had one partly build because of another issue currently with thinkGeo's development team.


When you run this application, click on "Make a Tab" and you will get a tab that has a raster pre-loaded using the code in my post. Using the scroll whell, notice that only ZoomLevel01 thru ZoomLevel09 are available.


I look forward to your analysis.


Dave



David, 
  
  Thank you very much for your sample app. Now how do we get to it?

 I sent a link to support@thinkgeo.com and asked that it be forwarded to you...


Dave



David, 
  
 I think Val will work on it once he got the sample, if you also want to let me look at the sample, you can let him forward to me. 
  
 Thanks, 
 James

Can you ask him for it? It is fine with me...


Dave



David,


 I looked at your sample app and it seems to me that the incorrect behavior is that it prevents you from zooming in. I think that by simply setting the property MinimunScale of the Map to 0, it is going to solve your problem. So in your code, simply add the line for the MinimumScale as below and it should work. I hope this solves your problem.


 



   Map = new WinformsMap();
    this.Controls.Add(Map);
    Map.Dock = DockStyle.Fill;
    Map.MapUnit = GeographyUnit.DecimalDegree;
    Map.MinimumScale = 0;
    Map.Disposed += new EventHandler(Map_Disposed);


That did the trick!  Thank you very much!


Dave



David,


 I am glad this helped you. Also, i want to make you aware of a Code Community sample we have on setting Custom Zoom Levels. You might be interested in checking that out, GetZoomLevel.


wiki.thinkgeo.com/wiki/Map_Suite_De...tZoomLevel


 We also have Zoom Levels Partitioning in relation to that subject:


wiki.thinkgeo.com/wiki/Map_Suite_De...rtitioning