ThinkGeo.com    |     Documentation    |     Premium Support

CurrentExtent Zoom Features

Hi,


I am using ThinkGEO Web Evaluation Edition 6.0.248.0.


I have a section of code where I allow the user to zoom into a feature (a point) by selecting the feature from a gridview (in its own updatepanel from the map updatepanel).


In the grid view selected index changed function, I find the feature in the map successfully and I can zoom the map to the feature by the following line of code successfully:


Map1.CurrentExtent = ExtentHelper.GetDrawingExtent(selected_features[0].GetBoundingBox(), (float)Map1.WidthInPixels, (float)Map1.HeightInPixels);


I would like to zoom out a couple clicks from this view; however, when I try Map1.ZoomOut or Map1.CurrentExtent.ScaleUp functions right after setting the extent, nothing happens; the map retains the original extent from the line above.


Any ideas on what I might be doing wrong?


Thanks,

Treasa



 Hi Treasa,


 
The way you are working is correct, but in web edition, zooming in/out are based on zoom levels; which means we snap the setting extent to the nearest zoom level. If the target scale doesn't change big enough, we will snap it back, so that it doesn't take effect in your code. 
 
For example, if we are in scale 1000, then we click on one feature and the new extent's scale is 1100, but the defined upper zoom level's scale is 2000. In this case, the target scale will snap to its nearest scale: 1000. This explains this issue.
To fix this issue, we just need scale the target extent up more. Hope it helps.
Map1.CurrentExtent = ExtentHelper.GetDrawingExtent(features[0].GetBoundingBox(), (float)Map1.WidthInPixels, (float)Map1.HeightInPixels);
// scale up 100% does the trick.
Map1.CurrentExtent.ScaleUp(100);

 
Thanks,
Howard

Hi Howard, 
  
 Thanks for the insight! I actually had to do Map1.CurrentExtent.ScaleUp(50000) to make it display at the right zoom level I wanted. But it works, so thank you very much for your help. 
  
 Treasa

Glad to hear this is working for you.

Hi, 
  
 In upgrading from Version 6.0 to Version 7.0, my scaling no longer works.  
  
 This is my code (and it worked in Version 6.0) 
 Map1.CurrentExtent = ExtentHelper.GetDrawingExtent(features[0].GetBoundingBox(), (float)Map1.WidthInPixels, (float)Map1.HeightInPixels); 
 Map1.CurrentExtent.ScaleUp(50000); 
  
 Now, in 7.0, the scale is always at the most zoomed in; but I would like to have it unzoomed a couple levels out. I tried changing the ScaleUp factor to 1, 10, 100, 10000000, etc. But the scale never changes. 
  
 Can you assist? 
  
 Thanks, 
 Treasa 


Hi Treasa, 
  
 Would you please provide us the wkt of featrues[0] for a further test? 
  
 Waiting for your further information 
  
 Summer

Is this what you need: {POINT(-77.4540933333333 39.0186683333333)} 


Hi, Treasa 
  
  
 Thanks for your query and sorry for the inconvenience, following code could show you a basic idea of the walkaround, would you please try it? 
   
 protected void Page_Load(object sender, EventArgs e) 
 { 
      Map1.MapUnit = GeographyUnit.DecimalDegree; 
      PointShape point = (PointShape)BaseShape.CreateShapeFromWellKnownData("POINT(-77.4540933333333 39.0186683333333)"); 
      RectangleShape pontBoundingBox = point.GetBoundingBox(); 
      BaseShape bufferShape = pontBoundingBox.Buffer(650, GeographyUnit.DecimalDegree, DistanceUnit.Meter); 
      Map1.CurrentExtent = bufferShape.GetBoundingBox(); 
      Feature feature = new Feature(point); 
      InMemoryFeatureLayer featureLayer = new InMemoryFeatureLayer(); 
      featureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.City5; 
      featureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
      featureLayer.InternalFeatures.Add(feature); 
      LayerOverlay Overlay = new LayerOverlay(); 
      webOverlay.Layers.Add(featureLayer); 
      Map1.CustomOverlays.Add(Overlay); 
 } 
  
 if you have any more question , please feel free to let us know. 
  
 Best regards. 
  
 Summer 


Hi Summer, 
  
 This code worked great. Thank you for your help. 
  
 Treasa

Hi Treasa, 
  
 Great to hear it helped, if you have any more question, please feel free to let us know. 
  
 Best Regards 
  
 Summer

Hi Summer:



We are having the same issue.  We are using the ASP .Net MVC version and the current save image doesn’t respect the zoom level. We have tried your work around but both methods.  Please help.



Thanks,

Adrian 

Hi Adrian,



The biggest difference between the WebEdtion and MvcEdition is mvc edition needs to sync the client side info to the server side, or the server side don’t know what the client side changed. For example, after we zoom in several zooms on the map,  the server side still keeps the previous zoom. 

So, we need to pass the current client scale to the server and then assign it to the server map. Please try the below codes:

 


    function saveMap() {
        Map1.ajaxCallAction(@ViewContext.RouteData.Values[“Controller”].ToString()’‘SaveMap’, { scale: Map1.getScale() }, function () { });
 
Server:
[MapActionFilter]
        public void SaveMap(Map map, GeoCollection<object> args)
        {
            double scale = double.Parse(args[0].ToString());
            map.CurrentScale = scale;
            // Save map
        }

Please let us know if any questions.

Thanks,

Troy

cool, I tried this suggestion and it seems the saved map keeps the same scale. However, the map extent is different. 
  
 I did try to pass the client map extent, then in the server side: map.CurrentExtent = myClientSidemapExtent. It seems to me that I could not keep both scale and map extent the same or no change, probably due to the different aspect ratios of these two maps (on web page and printer page). 
  
 Is this correct? 
  
 Thanks,

Thanks Troy for your insight.  It doesn’t help even I added the scale.



We use a “PagePrinterLayer” and MapPrintLayer to handle the image generation.  Here are some code snippet for your information:



           map.CurrentScale = double.Parse(args[5].ToString());

            MapPrinterLayer mpl = new MapPrinterLayer();



            PagePrinterLayer pagePrinterLayer = new PagePrinterLayer(PrinterPageSize.AnsiA, PrinterOrientation.Landscape);
            RectangleShape pageBoundingbox = pagePrinterLayer.GetPosition (PrintingUnit.Inch);
            pagePrinterLayer.Open();



           mpl.Layers.Add(pagePrinterLayer);
           mpl.MapUnit = GeographyUnit.Meter;
           RectangleShape currentMapExt = new RectangleShape(double.Parse(Locations[0]), double.Parse(Locations[3]), double.Parse(Locations[2]), double.Parse(Locations[1]));


            mpl.MapExtent = currentMapExt; 


            mpl.SetPosition(pageBoundingbox.Width, pageBoundingbox.Height,


                pageBoundingbox.GetCenterPoint().X, pageBoundingbox.GetCenterPoint().Y, PrintingUnit.Inch);
        

For some reason the real zoom level, scale and extend doesn’t transfer to the MapPrintlayer correctly.



Please help



Thanks,

Adrian





 
  

Hello, guangming,



Yes, there are two maps and their resolutions system are isolated. So, we can’t give the page/web map scale to the print map.



Adrian,

I didn’t know you are using MapPrinter to print the map and I thought you are simply use the map.GetBitmap method. As guangming metioned you are using two difference maps, then what we should do is calculating a property map extent to the print map based on page/web map extent. would you please try the use the below codes:


double newScale =  double.Parse(args[5].ToString());
            mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);

Also, could you make sure the map extent is under meter rather than decimal degree?

Thanks,



Troy

we are actually passing map extent from the client side as you can see. The map unit is meter. 
  
 with different PrinterOrientation (Landscape or Portrait), do we need to switch width and height when: 
 mpl.SetPosition(pageBoundingbox.Height, pageBoundingbox.Width,  
                 pageBoundingbox.GetCenterPoint().X, pageBoundingbox.GetCenterPoint().Y, PrintingUnit.Inch); ? 
  
 I assumed that passing the right map extent from the client side, keeps the map scale not changed. however, it seemed not. 
  
 so in our case is the width/height affect how the map is printed?

Hi Guangming, 
  
 Yes, I think you need to modify the width and height if you switch PrinterOrientation, because it looks only PagePrinterLayer support set PrinterOrientation. 
  
 And I think you should want to set ResizeMode and DragMode for keep bouding box haven’t been modified. Does that because your bouding resized so you haven’t got correct result? 
  
 Regards, 
  
 Don 
  
  
  


Thanks Don for your reply.



The following code in your previous post doesn’t work.

double newScale =  double.Parse(args[5].ToString());
            mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height); 



It seems that set up the DragMode and PrintMode helps to some degree but not quite yet.  I am not sure if I set these mode correctly.  Here is what I added:

            pagePrinterLayer.DragMode = PrinterDragMode.Fixed;
            pagePrinterLayer.Open();

           

           MapPrinterLayer mpl = new MapPrinterLayer();


           mpl.Layers.Add(pagePrinterLayer);


           mpl.ResizeMode = PrinterResizeMode.MaintainAspectRatio;



Please help.



Thanks,

Adrian

Hi Adrian, 
  
 The code from Troy just tell you how to pass the parameter, but I don’t think the args[5] is what you want, if you met exception here, you can debug the code and find what’s the parameter you want. 
  
 Set DragMode and PrintMode is the advice for guangming, do you met same problem that printed image are not just like the page? 
  
 Regards, 
  
 Don