ArcGIS USNG Coordinate Tool

CustomUSNGTool

/// Updated Aug 1,2009. ArcGIS 9.3.1 Web ADF

using ESRI.ArcGIS.ADF.ArcGISServer;

using ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer;

using ESRI.ArcGIS.ADF.Web.UI.WebControls;

using ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools;

using ESRI.ArcGIS.Geometry;

 

/* Add this custom tool to a toolbar associated with a

map control on a ArcGIS Server (ags) website. It can be used to add a usng coordinate (of correct precision based on map scale)

* and a label at any location on the map. */

 

public class CustomUSNGTool : IMapServerToolAction

{

public void ServerAction(ToolEventArgs args)

{

Map map = (Map)args.Control;

 

//For placing text element at Click location, Get Map functionality from Map Control and then get map description from map functionality

MapFunctionality mf = (MapFunctionality)map.GetFunctionality(0);

MapDescription mapDescription = mf.MapDescription;

PointEventArgs pargs = (PointEventArgs)args;

IConversionMGRS convertPoint;

IGeographicCoordinateSystem m_GCS;

IProjectedCoordinateSystem m_PCS;

ISpatialReferenceFactory2 pSpatRefFact;

string mUSNG = ” “;

 

// Screen to web adf

 

/// Get transformation parameters from the Map control

ESRI.ArcGIS.ADF.Web.Geometry.TransformationParams transParams = map.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap);

ESRI.ArcGIS.ADF.Web.Geometry.Point pPoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(pargs.ScreenPoint, transParams);

 

/// Convert Web ADF point to USNG point using iconversionmgrs interface

pSpatRefFact = new ESRI.ArcGIS.Geometry.SpatialReferenceEnvironmentClass();

m_GCS = pSpatRefFact.CreateGeographicCoordinateSystem(4269); // Nad 1983

m_PCS = pSpatRefFact.CreateProjectedCoordinateSystem(102008); // North America Albers

/// Change the projection constants based on your geographic or projected coordinate system

ESRI.ArcGIS.Geometry.Point selPoint = new ESRI.ArcGIS.Geometry.Point();

selPoint.SpatialReference = m_GCS;

// selPoint.SpatialReference = m_PCS; // Uncomment for projected cs.

selPoint.PutCoords(pPoint.X, pPoint.Y);

convertPoint = (ESRI.ArcGIS.Geometry.IConversionMGRS)selPoint;

/// Get Current Map scale and set USNG precision (Number of digits)

int sc;

if (map.Scale >= 250000)

{

sc = 2;

}

else if (map.Scale >= 100000)

{

sc = 3;

}

else if (map.Scale >= 25000)

{

sc = 4;

}

else

{

sc = 5;

}

string currentScale = map.Scale.ToString();

// SendBackJS(map, string.Format(“alert(‘Map scale = {0}’);”, currentScale));

mUSNG = convertPoint.CreateMGRS(sc, false, ESRI.ArcGIS.Geometry.esriMGRSModeEnum.esriMGRSMode_USNG);

/*

Text element will be added at click location at the server tier using ArcGIS Server SOAP API

Since we’re going to add custom graphics to the map generated by ArcGIS Server, we need to get the Web ADF functionality associated with drawing map images.

When a Map control consumes a resource, it generates a MapFunctionality, one for each resource. As a result, a Map control can have an array of MapFunctionalities.In this case, there is only one resource, and ArcGIS Server resource. To get the MapFunctionality associated with the first (and in this case only) resource, use the following code.

Since we know it is a type of ArcGIS Server resource, we can cast the functionality to the ArcGIS Server specific MapFunctionality. We’ll need to do this to work with ArcGIS Server specific implementation classes to draw graphics and work with server context.

*/

 

/// ESRI.ArcGIS.ADF.ArcGISServer namespace contains classes for working with ArcObjects on the GIS server

/// Web ADF to ArcGIS Server SOAP

 

ESRI.ArcGIS.ADF.ArcGISServer.PointN ags_map_point;

ags_map_point = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromAdfPoint(pPoint);

ESRI.ArcGIS.ADF.ArcGISServer.TextElement text = new ESRI.ArcGIS.ADF.ArcGISServer.TextElement();

text.TextGeometry = ags_map_point;

ESRI.ArcGIS.ADF.ArcGISServer.TextSymbol textSymbol = new ESRI.ArcGIS.ADF.ArcGISServer.TextSymbol();

ESRI.ArcGIS.ADF.ArcGISServer.RgbColor rgb = new ESRI.ArcGIS.ADF.ArcGISServer.RgbColor();

rgb.Red = 255;

rgb.Green = 0;

rgb.Blue = 0;

rgb.AlphaValue = 255;

textSymbol.Color = rgb;

textSymbol.Size = 10;

textSymbol.FontName = “Tahoma”;

text.Symbol = textSymbol;

text.Scale = true;

System.Web.UI.WebControls.TextBox tbox = (System.Web.UI.WebControls.TextBox)args.Control.Page.FindControl(“ClickedCoord_Textbox”); /// find USNG label textbox

text.Text = mUSNG + “\n” + tbox.Text;

///text.Text = mUSNG;

/// Flip the comments on the above two lines if you do not have/need a usng label

/* Add text, marker and label at same location

The CustomGraphics property on the MapDescription Value object accepts an array of GraphicElement Value objects. Both MarkerElement and PolygonElement derive from the GraphicElement base class. So all we need to do is create a new GraphicElement array and initialize it with the number of elements. Add the MarkerElement and PolygonElement to the array and assign it to the MapDescription.CustomGraphics property.

*/

ESRI.ArcGIS.ADF.ArcGISServer.RgbColor rgb1;

rgb1 = new ESRI.ArcGIS.ADF.ArcGISServer.RgbColor();

rgb1.Red = 255;

rgb1.Green = 0;

rgb1.Blue = 0;

rgb1.AlphaValue = 255;

ESRI.ArcGIS.ADF.ArcGISServer.SimpleMarkerSymbol sms;

sms = new ESRI.ArcGIS.ADF.ArcGISServer.SimpleMarkerSymbol();

sms.Style = ESRI.ArcGIS.ADF.ArcGISServer.esriSimpleMarkerStyle.esriSMSCross;

sms.Color = rgb1;

sms.Size = 5.0;

ESRI.ArcGIS.ADF.ArcGISServer.MarkerElement marker;

marker = new ESRI.ArcGIS.ADF.ArcGISServer.MarkerElement();

marker.Symbol = sms;

marker.Point = ags_map_point;

// Add point and text element at the same time

if (mapDescription.CustomGraphics != null)

{

ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement[] oldges = mapDescription.CustomGraphics;

int cnt = oldges.Length;

ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement[] newges = new ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement[cnt + 2];

oldges.CopyTo(newges, 0);

newges[cnt] = text;

newges[cnt + 1] = marker;

mapDescription.CustomGraphics = newges;

}

else

{

ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement[] ges = new ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement[2];

ges[0] = text;

ges[1] = marker;

mapDescription.CustomGraphics = ges;

}

// Refresh map control

map.Refresh();

 

}

 

private void SendBackJS(Map pMap, string strJS)

{

CallbackResult pCr = new CallbackResult(null, null, “javascript”, strJS);

pMap.CallbackResults.Add(pCr);

}

}