HOW TO
ArcGIS Server .NET and Java APIs provide a CenterAndScale class to help zoom to an extent based on a centerpoint and a scale.
The user can get the map extent (MapExtent) from the result of a map export (MapImage).
To complete the map extent based on a centerpoint and a scale without having to get it from the output image, calculate the map extent on the client side. Instructions provided describe how to compute the map extent based on a centerpoint and a scale for ArcGIS Server client applications.
/* The function requires MapServer WSDL’s MapServerInfo, ImageDisplay, CenterAndScale object and an already created EnvelopeN object (by ref) which will be modified */
private void ComputeExtent(MapServerWSDL.MapServerInfo pMSI, MapServerWSDL.ImageDisplay pImageDisplay, MapServerWSDL.CenterAndScale pCenterAndScale, ref MapServerWSDL.EnvelopeN pOutEnvelope)
{
try
{
/* dividing image width by DPI to get it in Inch */
double dblImgWidthInInch = pImageDisplay.ImageWidth / pImageDisplay.ImageDPI;
double dblImgHeightInInch = pImageDisplay.ImageHeight / pImageDisplay.ImageDPI;
/* converting Inch to meter (assume the map is in meter) */
double dblImgWidthInMapUnit = dblImgWidthInInch * 0.0254;
double dblImgHeightInMapUnit = dblImgHeightInInch * 0.0254;
/* calculating half of map’s height & width at the specific scale */
double dX = (dblImgWidthInMapUnit * pCenterAndScale.Scale) / 2;
double dY = (dblImgHeightInMapUnit * pCenterAndScale.Scale) / 2;
/* using the center point and width & height created before, it is computing map’s extent */
MapServerWSDL.PointN pCtrPnt = pCenterAndScale.Center as MapServerWSDL.PointN;
double minX = pCtrPnt.X - dX;
double maxX = pCtrPnt.X + dX;
double minY = pCtrPnt.Y - dY;
double maxY = pCtrPnt.Y + dY;
/* assigning values to the Envelope object passed by the caller function */
pOutEnvelope.XMin = minX;
pOutEnvelope.XMax = maxX;
pOutEnvelope.YMin = minY;
pOutEnvelope.YMax = maxY;
/* printing out the extent */
Debug.Print("ComputeExtent Result: " + pOutEnvelope.XMin.ToString() + ", " + pOutEnvelope.YMin.ToString() + ", " + pOutEnvelope.XMax.ToString() + ", " + pOutEnvelope.YMax.ToString());
}
catch (Exception exp)
{
MessageBox.Show(exp.Message, "Error in ComputeExtent", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Note: DCOM connection is no longer supported in ArcGIS for Server 10.1. If you need to use the following code in 10.1, do not use ServerContext.
/* ** esriDisplay library must be referenced.
The function requires MapServerInfo, ImageDisplay, CenterAndScale
object and returns IEnvelope
ServerContext is optional, only required when your application works
with ServerContext */
private IEnvelope ComputeExtent(IMapServerInfo pMapServerInfo, IImageDisplay pImageDisplay, ICenterAndScale pCenterAndScale, IServerContext pServerContex)
{
try
{
/* aRect holds information about the client side’s map size in pixel */
tagRECT aRect = new tagRECT();
aRect.top = 0;
aRect.left = 0;
aRect.bottom = pImageDisplay.Height;
aRect.right = pImageDisplay.Width;
/* when application uses ServerContext, DisplayTransformation will be created in ServerContext */
IDisplayTransformation pDT;
if (pServerContex != null)
pDT =
pDT = new DisplayTransformationClass();pServerContex.CreateObject("esriDisplay.DisplayTransformation") as IDisplayTransformation;
else
/* Setting different DisplayTransformation properties to compute extent */
pDT.Bounds = pMapServerInfo.FullExtent;
IEnvelope pMDscExtent = pMapServerInfo.DefaultMapDescription.MapArea.Extent;
pMDscExtent.CenterAt(pCenterAndScale.Center);
pDT.VisibleBounds = pMDscExtent;
pDT.SpatialReference = pMapServerInfo.DefaultMapDescription.SpatialReference;
pDT.Units = pMapServerInfo.MapUnits;
pDT.set_DeviceFrame(ref aRect);
pDT.Resolution = pImageDisplay.DeviceResolution;
pDT.ScaleRatio = pCenterAndScale.MapScale;
/* printing map extent */
Debug.Print("New Map Extent - After ScaleRatio: " + pDT.FittedBounds.XMin.ToString() + ", " + pDT.FittedBounds.YMin.ToString() + ", " + pDT.FittedBounds.XMax.ToString() + ", " + pDT.FittedBounds.YMax.ToString());
//returning new map extent
return pDT.FittedBounds;
}
catch (Exception exp)
{
MessageBox.Show(exp.Message, "Error in ComputeExtent", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
Article ID: 000009601
Get help from ArcGIS experts
Start chatting now