ThinkGeo.com    |     Documentation    |     Premium Support

Get scale/actual extent of a target extent server-side

My eventual goal is to be able to return the map to an extent which surrounds all map features on the client side. Since there does not appear to be a way to easily do so entirely on the client side, I decided the easiest thing to do would be to calculate a bounding extent on the server and pass it to the client every time new map elements were added.


Setting the CurrentExtent property of a map on the server side does not necessarily ensure that is the extent of the viewport on the client side (which makes sense to prevent distortion as a result of having a viewport with weird dimensions). However, there is no way that I can find what the extent that the viewport will have on the client will be. This would not be an issue if setting the CurrentExtent property on the server side had the same result as calling the zoomToExtent property on the client, but for some reason they have different results.


Another option would be to send the center of the extent (since setting CurrentExtent to A on the server and calling zoomToExtent(A) on the client both result in a viewport with the same center), and the scale that will be used to display the extent on the client, but the CurrentScale property on the server does not update when CurrentExtent is set - it only seems to be set on postback.


So my question is, on the server, is there a way to determine either:



        
  • The extent of the viewport on the client given a known CurrentExtent property on the server

  •     
  • The scale which will initially be used on the client given the CurrentExtent property on the server



Adam, 



Sure, we can mange it via IcallbackeventhandlerCallback or Ajax. The OnClientExtentChanged event of the map will be raised as soon as the extent of viewport on client changed, so we can add a callback here and send the client extent to server side. 



Any question please let us know. Thanks. 

Johnny 



 



My goal is not to preserve the state of the viewport - I want to know what the viewport will be if I were to set the extent server-side. I don't necessarily want to change the extent. Consider the following example:


I have a page with a map and two buttons on it. The first button does a partial postback to the server, which pulls some random points out of a database or something and adds them to the map without changing the current viewport. The second button (which should not cause a postback of any kind) sets the viewport so that all the points on the map are visible.


If I were to calculate a bounding extent on the server after I add the random points and set the map's CurrentExtent property to the bounding extent, then when the map is rendered on the client the viewport's extent will be such that all the points of the map are visible (however, the extent which is used for the viewport on the client is not the same extent that I would have set the CurrentExtent property to on the server). I don't want to change the viewport when button #1 is pressed, however. I have tried passing the bounding extent to the client via a hidden field and passing it to the zoomToExtent function on the client when button #2 is pressed, but that does not necessarily result in the viewport having an extent which shows all the points on the map (sometimes it does, but usually it's too small and there are features outside of the viewport).


There are two ways to solve this problem that I can think of - either calculate what the extent would be on the client if I had set the CurrentExtent property on the server, or calculate what the scale and center point would be on the client if I had set the CurrentExtent property on the server. Is there any way to do this, and if not, what algorithm is being used to choose the coordinates of the extent of the viewport after the CurrentExtent property is set on the server?



Adam, 
  
   I think i understand what you are looking to do.  I *think* the problem is that when you set an extent or a point etc then the extent is adjusted when we match it to the viewport to make sure the dimensions of the extent and of the viewport match.  This means the extent you set on the server side could be ‘adjusted’ when it makes it way to the viewport and I think this is what you may be experiencing.  Below is some handy code to adjust for these kinds of things and some other general function that I hope can hep you. 
  
 Adjusting the extent: 
  
   If the viewport is taller than wider but the extent you want to set is wider than taller we need to adjust the extent to make it mach the ratio of the actual viewport.  To do this we use the following method.  RectangleShape ExtentHelper.GetDrawingExtent(worldExtent,screenWidth,screenHeight) 
  
 Get the extent from a center point and screen width and height: 
  
   This is a little more tricky and I do not see a handy API for this.  Let me either find one or have one written for you. 
  
   I hope the first one solves your issues.  One other quick point.  If you are dealing with point then you may, when you query your back end data, slightly scale up your bounding box.  This is just for the query part.  This is because points in the geometry really have no area and are precise points.  When you render them they typically take up some area on the screen.  Because of this this points that are no strictly in the extent may show a little on the edge of the screen.  You may want to scale the extent up to capture these ones on the edge to give the user a better viewing experience.  
  
 David

Adam, 
  
   Before we go to work on the second formula can you let me know if my solution one works for you?  In this way we can schedule the other API for later. 
  
 David

That was just what I was looking for, David. Thank you for your help, David and Johnny.



Adam, 
  
   It’s our pleasure. 
  
 David