About the Geodesy MapControl Sample
[C#]
GeodesyMapControl.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.DefenseSolutions;
namespace GeodesyMapControl
{
public partial class GeodesyMapControl : Form
{
private ESRI.ArcGIS.esriSystem.IAoInitialize m_pAOInitialize;
private ESRI.ArcGIS.DefenseSolutions.IGeoEllipse m_pGeoEllipse;
private ESRI.ArcGIS.DefenseSolutions.IMeasurementTool m_pMeasureTool;
private ESRI.ArcGIS.Geometry.IPolygon m_pKeyPointPoly;
private ESRI.ArcGIS.DefenseSolutions.IGeoPolygon m_pGeoPolygon;
private ESRI.ArcGIS.Geometry.IPoint m_pOrigin;
private ESRI.ArcGIS.DefenseSolutions.IGeoPolyline m_pGeoPolyline;
private ESRI.ArcGIS.Geometry.IPolyline m_pPolyline;
private ESRI.ArcGIS.Carto.IElement m_pKeyPointElement;
private ESRI.ArcGIS.Carto.IElement m_pEllipseElement;
private ESRI.ArcGIS.Carto.IElement m_pLineElement;
private ESRI.ArcGIS.Controls.AxMapControl m_pMapControl;
private ESRI.ArcGIS.Carto.IActiveView m_pActiveView;
private ESRI.ArcGIS.Carto.IGraphicsContainer m_pGraphicsCont;
const string con_strGeo = @"Geodesic";
const string con_strGC = @"Great Circle";
const string con_strRhumb = @"Rhumb Line";
public GeodesyMapControl()
{
InitializeComponent();
m_pAOInitialize = new ESRI.ArcGIS.esriSystem.AoInitialize();
ESRI.ArcGIS.esriSystem.esriLicenseStatus status;
status = m_pAOInitialize.IsProductCodeAvailable(ESRI.ArcGIS.esriSystem.esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
if (status != ESRI.ArcGIS.esriSystem.esriLicenseStatus.esriLicenseAvailable)
{
System.Windows.Forms.MessageBox.Show(@"ERROR: license not available." + Environment.NewLine + status);
this.Dispose();
}
else
{
status = m_pAOInitialize.Initialize(ESRI.ArcGIS.esriSystem.esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
}
m_pMapControl = (ESRI.ArcGIS.Controls.AxMapControl) this.MapControl1;
m_pMapControl.AddLayerFromFile(GetSdkDataPath() + @"World\Continents.lyr");
cboType.Items.Insert(0, con_strGeo);
cboType.Items.Insert(1, con_strGeo);
cboType.Items.Insert(2, con_strRhumb);
cboType.Text = con_strGeo;
}
~GeodesyMapControl()
{
m_pGeoEllipse = null;
m_pMeasureTool = null;
m_pKeyPointPoly = null;
m_pOrigin = null;
m_pGeoPolyline = null;
m_pKeyPointElement = null;
m_pLineElement = null;
m_pMapControl = null;
m_pActiveView = null;
m_pGraphicsCont = null;
}
#region "Form Functions"
private void cmdClearGraphics_Click(object sender, EventArgs e)
{
// Clear all graphic elements from the map control
SetGraphicsContainer();
m_pGraphicsCont.DeleteAllElements();
m_pActiveView.Refresh();
}
private void cmdDrawLine_Click(object sender, EventArgs e)
{
try
{
// Create Geometry
CreateGeoPolyline();
if (m_pGeoPolyline == null)
{
return;
}
// create the IElement to be rendered as a GeoPolylineElement and
// set its geometry to the GeoPolyline geometry defined in the
// CreateGeoPolyline subprocedure
m_pLineElement = (IElement) new ESRI.ArcGIS.DefenseSolutions.GeoPolylineElement();
m_pLineElement.Geometry = (IGeometry) m_pGeoPolyline;
// QI to ILineElement to set the symbology of the GeoPolyline graphic
ESRI.ArcGIS.Carto.ILineElement pLineElement;
pLineElement = (ILineElement) m_pLineElement;
pLineElement.Symbol = (ILineSymbol) GeoLineSymbol();
// Define the graphics container and draw the GeoPolyline graphic. Display the
// distance and azimuth of the GeoPolyline as calculated by the measurement tool.
SetGraphicsContainer();
m_pGraphicsCont.AddElement((IElement) pLineElement, 0);
m_pActiveView.Refresh();
double dDist = Math.Round((m_pMeasureTool.Distance / 1000), 6);
double dAzim = Math.Round(m_pMeasureTool.Angle, 6);
txtDistance.Text = dDist.ToString();
txtAzimuth.Text = dAzim.ToString();
}
catch (Exception error)
{
System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
}
}
private void cmdClearLineFields_Click(object sender, EventArgs e)
{
txtStartX.Text = "";
txtStartY.Text = "";
txtEndX.Text = "";
txtEndY.Text = "";
txtDistance.Text = "";
txtAzimuth.Text = "";
}
private void cmdAddEllipse_Click(object sender, EventArgs e)
{
try
{
// create GeoEllipse geometry
CreateGeoEllipse();
if (m_pGeoEllipse == null)
{
return;
}
// create the IElement to be rendered as a GeoEllipseElement and
// set its geometry to the GeoEllipse geometry defined in the
m_pEllipseElement = (IElement) new ESRI.ArcGIS.DefenseSolutions.GeoEllipseElement();
m_pEllipseElement.Geometry = (IGeometry) m_pGeoEllipse;
// outline color
ESRI.ArcGIS.Display.IRgbColor pColor = new ESRI.ArcGIS.Display.RgbColor();
pColor.Green = 255;
// make fill color null
ESRI.ArcGIS.Display.IColor pNullColor = new ESRI.ArcGIS.Display.RgbColor();
pNullColor.NullColor = true;
// create the line symbol for the polygon outline
ESRI.ArcGIS.Display.ILineSymbol pLineSymbol= new ESRI.ArcGIS.Display.SimpleLineSymbol();
pLineSymbol.Color = pColor;
pLineSymbol.Width = 2;
// create the fill symbol
ESRI.ArcGIS.Display.IFillSymbol pFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbol();
pFillSymbol.Outline = pLineSymbol;
pFillSymbol.Color = pNullColor;
// QI to IFillShapeElement to set the symbology of the GeoEllipse graphic
ESRI.ArcGIS.Carto.IFillShapeElement pFillElement = (IFillShapeElement) m_pEllipseElement;
pFillElement.Symbol = pFillSymbol;
// define the graphics container and draw the GeoEllipse graphic
SetGraphicsContainer();
m_pGraphicsCont.AddElement((IElement) pFillElement, 0);
m_pActiveView.Refresh();
}
catch (Exception error)
{
System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
}
}
private void cmdKeyPoints_Click(object sender, EventArgs e)
{
try
{
// Run the CreateGeoEllipse subprocedure to get the geometry of the
// key points polygon generated from the GeoEllipse.
CreateGeoEllipse();
if ((m_pGeoEllipse == null) || (m_pKeyPointPoly == null))
{
return;
}
// outline color
ESRI.ArcGIS.Display.IRgbColor pColor = new ESRI.ArcGIS.Display.RgbColor();
pColor.Green = 255;
// make fill color null
ESRI.ArcGIS.Display.IColor pNullColor = new ESRI.ArcGIS.Display.RgbColor();
pNullColor.NullColor = true;
// create the outline symbol
ESRI.ArcGIS.Display.ILineSymbol pLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbol();
pLineSymbol.Color = pColor;
pLineSymbol.Width = 1.5;
ESRI.ArcGIS.Display.IHashLineSymbol pHashLineSymbol = new ESRI.ArcGIS.Display.HashLineSymbol();
pHashLineSymbol.HashSymbol = pLineSymbol;
// create the fill symbol for the polygon
ESRI.ArcGIS.Display.IFillSymbol pFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbol();
pFillSymbol.Outline = pHashLineSymbol;
pFillSymbol.Color = pNullColor;
// create the IElement to be rendered as a PolygonElement and
// set its geometry to the key points polygon geometry defined in the
// CreateGeoEllipse subprocedure
m_pKeyPointElement = new ESRI.ArcGIS.Carto.PolygonElement();
m_pKeyPointElement.Geometry = m_pKeyPointPoly;
// QI to IFillShapeElement to set the symbology of the key points polygon graphic
ESRI.ArcGIS.Carto.IFillShapeElement pFillElement;
pFillElement = (IFillShapeElement) m_pKeyPointElement;
pFillElement.Symbol = pFillSymbol;
// define the graphics container and draw the key points polygon graphic
SetGraphicsContainer();
m_pGraphicsCont.AddElement((IElement) pFillElement, 0);
m_pActiveView.Refresh();
}
catch (Exception error)
{
System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
}
}
private void cmdClearEllipseFields_Click(object sender, EventArgs e)
{
txtCenterX.Text = "";
txtCenterY.Text = "";
txtXAxis.Text = "";
txtYAxis.Text = "";
txtRotation.Text = "";
}
private void MapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
try
{
// On a right mouse button click use the TrackPolygon method on the map control
// to define the vertices of an eventual GeoPolygon. Each right mouse button
// click adds a vertex to the polygon; double-clicking the right mouse button
// completes the polygon.
ESRI.ArcGIS.Geometry.IPolygon pTrackPoly;
ESRI.ArcGIS.Carto.IElement pTrackPolyElement;
if (e.button == 2)
{
// Create the polygon from the TrackPolygon method. This polygon will be
// the foundation for a GeoPolygon object.
pTrackPoly = (IPolygon)MapControl1.TrackPolygon();
// Define the GeoPolygon, QI to IGeoPolygon
m_pGeoPolygon = new ESRI.ArcGIS.DefenseSolutions.GeoPolygon();
m_pGeoPolygon.Polygon = pTrackPoly;
// Set the GeoPolyline type to form the segments of the GeoPolygon. In this case
// the segments will be Geodesic lines.
m_pGeoPolygon.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGeodesic;
// Set the GeoPolygon spatial reference.
m_pGeoPolygon.BaseSpatialReference = GetWGS84SpatialRef();
// outline color
ESRI.ArcGIS.Display.IRgbColor pColor = new ESRI.ArcGIS.Display.RgbColor();
pColor.Blue = 255;
// make fill color null
ESRI.ArcGIS.Display.IColor pNullColor = new ESRI.ArcGIS.Display.RgbColor();
pNullColor.NullColor = true;
// create the outline symbol
ESRI.ArcGIS.Display.ILineSymbol pLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbol();
pLineSymbol.Color = pColor;
pLineSymbol.Width = 1.5;
// create the fill symbol for the GeoPolygon
ESRI.ArcGIS.Display.IFillSymbol pFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbol();
pFillSymbol.Outline = pLineSymbol;
pFillSymbol.Color = pNullColor;
// Create the IElement to be rendered as a GeoPolygonElement and
// set its geometry to the GeoPolygon geometry. When a GeoPolygonElement
// graphic is moved from one location to another in the map control
// the GeoPolygon geometry is automatically updated based on the
// geographic location and the graphic is updated accordingly.
pTrackPolyElement = (IElement)new ESRI.ArcGIS.DefenseSolutions.GeoPolygonElement();
pTrackPolyElement.Geometry = (IGeometry)m_pGeoPolygon;
// QI to IFillShapeElement to set the symbology of the GeoPolygon graphic
ESRI.ArcGIS.Carto.IFillShapeElement pFillElement;
pFillElement = (IFillShapeElement)pTrackPolyElement;
pFillElement.Symbol = pFillSymbol;
// define the graphics container and draw the key points polygon graphic
SetGraphicsContainer();
m_pGraphicsCont.AddElement((IElement)pFillElement, 0);
m_pActiveView.Refresh();
}
else
{
pTrackPoly = null;
}
}
catch (Exception error)
{
System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
}
}
//private void MapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
//{
// try
// {
// // On a right mouse button click use the TrackPolygon method on the map control
// // to define the vertices of an eventual GeoPolygon. Each right mouse button
// // click adds a vertex to the polygon; double-clicking the right mouse button
// // completes the polygon.
// ESRI.ArcGIS.Geometry.IPolygon pTrackPoly;
// ESRI.ArcGIS.Carto.IElement pTrackPolyElement;
// if (e.button == 2)
// {
// // Create the polygon from the TrackPolygon method. This polygon will be
// // the foundation for a GeoPolygon object.
// pTrackPoly = (IPolygon)MapControl1.TrackPolygon();
// // Define the GeoPolygon, QI to IGeoPolygon
// m_pGeoPolygon = new ESRI.ArcGIS.DefenseSolutions.GeoPolygon();
// m_pGeoPolygon.Polygon = pTrackPoly;
// // Set the GeoPolyline type to form the segments of the GeoPolygon. In this case
// // the segments will be Geodesic lines.
// m_pGeoPolygon.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGeodesic;
// // Set the GeoPolygon spatial reference.
// m_pGeoPolygon.BaseSpatialReference = GetWGS84SpatialRef();
// // outline color
// ESRI.ArcGIS.Display.IRgbColor pColor = new ESRI.ArcGIS.Display.RgbColor();
// pColor.Blue = 255;
// // make fill color null
// ESRI.ArcGIS.Display.IColor pNullColor = new ESRI.ArcGIS.Display.RgbColor();
// pNullColor.NullColor = true;
// // create the outline symbol
// ESRI.ArcGIS.Display.ILineSymbol pLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbol();
// pLineSymbol.Color = pColor;
// pLineSymbol.Width = 1.5;
// // create the fill symbol for the GeoPolygon
// ESRI.ArcGIS.Display.IFillSymbol pFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbol();
// pFillSymbol.Outline = pLineSymbol;
// pFillSymbol.Color = pNullColor;
// // Create the IElement to be rendered as a GeoPolygonElement and
// // set its geometry to the GeoPolygon geometry. When a GeoPolygonElement
// // graphic is moved from one location to another in the map control
// // the GeoPolygon geometry is automatically updated based on the
// // geographic location and the graphic is updated accordingly.
// pTrackPolyElement = (IElement)new ESRI.ArcGIS.DefenseSolutions.GeoPolygonElement();
// pTrackPolyElement.Geometry = (IGeometry)m_pGeoPolygon;
// // QI to IFillShapeElement to set the symbology of the GeoPolygon graphic
// ESRI.ArcGIS.Carto.IFillShapeElement pFillElement;
// pFillElement = (IFillShapeElement)pTrackPolyElement;
// pFillElement.Symbol = pFillSymbol;
// // define the graphics container and draw the key points polygon graphic
// SetGraphicsContainer();
// m_pGraphicsCont.AddElement((IElement)pFillElement, 0);
// m_pActiveView.Refresh();
// }
// else
// {
// pTrackPoly = null;
// }
// }
// catch (Exception error)
// {
// System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
// }
//}
#endregion
#region "Helper Methods"
public ESRI.ArcGIS.Geometry.ISpatialReference2 GetWGS84SpatialRef()
{
// Define the spatial reference to be used for geopolylines,
// geoellipses, and geopolygons.
ESRI.ArcGIS.Geometry.ISpatialReference2 pSpatRef;
ESRI.ArcGIS.Geometry.ISpatialReferenceFactory2 pSpatRefFact = (ISpatialReferenceFactory2) new ESRI.ArcGIS.Geometry.SpatialReferenceEnvironment();
pSpatRef = (ISpatialReference2) pSpatRefFact.CreateSpatialReference((int) ESRI.ArcGIS.Geometry.esriSRGeoCSType.esriSRGeoCS_WGS1984);
return pSpatRef;
}
public void SetGraphicsContainer()
{
//Define the graphics container to be the map control's active view
m_pMapControl = (ESRI.ArcGIS.Controls.AxMapControl) MapControl1;
m_pActiveView = m_pMapControl.ActiveView;
m_pGraphicsCont = m_pActiveView.GraphicsContainer;
}
public void CreateGeoEllipse()
{
try
{
// reset the geoellipse and key point geometries
m_pGeoEllipse = null;
m_pKeyPointPoly = null;
if (ValidateEllipseValues() == false)
{
return;
}
// define the geoellipse
m_pGeoEllipse = new ESRI.ArcGIS.DefenseSolutions.GeoEllipse();
// define the geoellipse center point coordinates
m_pOrigin = new ESRI.ArcGIS.Geometry.Point();
double dX = System.Convert.ToDouble(txtCenterX.Text);
double dY = System.Convert.ToDouble(txtCenterY.Text);
m_pOrigin.PutCoords(dX, dY);
// define the geoellipse spatial reference
m_pGeoEllipse.BaseSpatialReference = GetWGS84SpatialRef();
// set the lengths of the X and Y axes in kilometers
m_pGeoEllipse.AxisX = (System.Convert.ToDouble(txtXAxis.Text) * 1000);
m_pGeoEllipse.AxisY = (System.Convert.ToDouble(txtYAxis.Text) * 1000);
// set the origin, or center point, of the geoellipse
m_pGeoEllipse.Origin = m_pOrigin;
// if the rotation is not given, use 0 as the default
if (txtRotation.Text == "")
{
txtRotation.Text = "0";
}
// define the amount of rotation, in degrees from
// zero (north), of the geoellipse Y axis
m_pGeoEllipse.Rotation = (System.Convert.ToDouble(txtRotation.Text) % 360);
// set the number of vertices to be used in the creation
// of the polygon representation of the geoellipse
m_pGeoEllipse.GeoEllipsePointCount = 100;
// define the key points polygon, which is a polygon connecting the end
// points of the geoellipse X and Y axes
m_pKeyPointPoly = m_pGeoEllipse.KeyPoints;
}
catch (Exception error)
{
System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
}
}
public void CreateGeoPolyline()
{
try
{
// reset the polyline geometry
m_pGeoPolyline = null;
if (ValidatePolylineValues() == false)
{
return;
}
// Set the measurement tool and the GeoPolyline. The measurement tool
// will be used to calculate the distance and azimuth of the GeoPolyline
// based on the start and end point coordinates of the line
m_pGeoPolyline = new ESRI.ArcGIS.DefenseSolutions.GeoPolyline();
m_pMeasureTool = new ESRI.ArcGIS.DefenseSolutions.MeasurementTool();
// Get the GeoPolyline type from the Type dropdown list and set it as
// the type for both the measurement tool and the GeoPolyline. The options
// are Geodesic, Great Circle, and Rhumb Line.
string strType;
strType = cboType.SelectedItem.ToString();
switch (strType)
{
case con_strGeo:
m_pMeasureTool.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGeodesic;
m_pGeoPolyline.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGeodesic;
break;
case con_strGC:
m_pMeasureTool.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGreatCircle;
m_pGeoPolyline.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGreatCircle;
break;
case con_strRhumb:
m_pMeasureTool.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTRhumbLine;
m_pGeoPolyline.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTRhumbLine;
break;
}
// set the measurement tool spatial reference
m_pMeasureTool.SpecialSpatialReference = GetWGS84SpatialRef();
// Set start and end points for the measurement tool calculation
// and the polyline from which the GeoPolyline is derived. The points
// are created based on the decimal degree coordinates input into
// the Start Point and End Point text boxes
double dStartX = System.Convert.ToDouble(txtStartX.Text);
double dStartY = System.Convert.ToDouble(txtStartY.Text);
double dEndX = System.Convert.ToDouble(txtEndX.Text);
double dEndY = System.Convert.ToDouble(txtEndY.Text);
ESRI.ArcGIS.Geometry.IPoint pStartPoint = new ESRI.ArcGIS.Geometry.Point();
ESRI.ArcGIS.Geometry.IPoint pEndPoint = new ESRI.ArcGIS.Geometry.Point();
pStartPoint.PutCoords(dStartX, dStartY);
pEndPoint.PutCoords(dEndX, dEndY);
// Calculate the distance and azimuth of the GeoPolyline using the
// ConstructByPoints method on the measurement tool. These values
// will be displayed in the Distance and Azimuth text boxes
m_pMeasureTool.ConstructByPoints(pStartPoint, pEndPoint);
// Create the simple polyline which is the basis for the geometry of the GeoPolyline.
m_pPolyline = new ESRI.ArcGIS.Geometry.PolylineClass();
m_pPolyline.FromPoint = pStartPoint;
m_pPolyline.ToPoint = pEndPoint;
m_pPolyline.Project(GetWGS84SpatialRef());
// QI to IGeoPolyLine to define the GeoPolyline. Set the base geometry of the
// geopolyline to the polyline created from the start and end point coordinates
// defined in the X and Y fields. Specify the number of vertices by which to densify
// the GeoPolyline as a percentage of the total distance of the line. In this
// case a vertex will be placed at every 1% of the line's total distance.
m_pGeoPolyline.Polyline = m_pPolyline;
m_pGeoPolyline.MaxPercent = 0.01;
m_pGeoPolyline.UsePercent = true;
}
catch (Exception error)
{
System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
}
}
public ESRI.ArcGIS.Display.ISymbol GeoLineSymbol()
{
try
{
// define the color for the line symbol
ESRI.ArcGIS.Display.IRgbColor pRGB = new ESRI.ArcGIS.Display.RgbColorClass();
pRGB.Red = 255;
// define the properties of the character marker symbol and set it to the marker symbol
ESRI.ArcGIS.Display.IMarkerSymbol pMarkSym;
ESRI.ArcGIS.Display.ICharacterMarkerSymbol pCharMarkSym = new ESRI.ArcGIS.Display.CharacterMarkerSymbolClass();
stdole.IFontDisp pFont;
pFont = (stdole.IFontDisp)new stdole.StdFont();
pFont.Name = @"ESRI Arrowhead";
// pFont.Size = 14
pCharMarkSym.Color = pRGB;
pCharMarkSym.XOffset = 1;
pCharMarkSym.CharacterIndex = 36;
pCharMarkSym.Font = pFont;
pCharMarkSym.Size = 14;
pMarkSym = pCharMarkSym;
// define the simple line decoration element and add the marker symbol to it
ESRI.ArcGIS.Display.ISimpleLineDecorationElement pSimpleLineDeco;
pSimpleLineDeco = new ESRI.ArcGIS.Display.SimpleLineDecorationElement();
pSimpleLineDeco.MarkerSymbol = pMarkSym;
pSimpleLineDeco.AddPosition(1);
// set the simple line decoration element to the line decoration element
ESRI.ArcGIS.Display.ILineDecorationElement pLineDecoElem;
pLineDecoElem = pSimpleLineDeco;
// add the line decoration element to the line decoration
ESRI.ArcGIS.Display.ILineDecoration pLineDeco;
pLineDeco = new ESRI.ArcGIS.Display.LineDecoration();
pLineDeco.AddElement(pLineDecoElem);
// define the cartographic line symbol properties
ESRI.ArcGIS.Display.ICartographicLineSymbol pCartoLineSym;
pCartoLineSym = new ESRI.ArcGIS.Display.CartographicLineSymbol();
pCartoLineSym.Color = pRGB;
pCartoLineSym.Width = 1.5;
// set the cartographic line symbol and the line decoration to the line properties
ESRI.ArcGIS.Display.ILineProperties pLineProps;
pLineProps = (ILineProperties) pCartoLineSym;
pLineProps.LineDecoration = pLineDeco;
return (ISymbol)pLineProps;
}
catch (Exception error)
{
System.Windows.Forms.MessageBox.Show(error.Message, "ERROR");
return null;
}
}
private bool ValidatePolylineValues()
{
// Make sure input text fields are not empty
// or do not contain non-numeric values
// Return false if an input value is invalid
if (txtStartX.Text == "")
{
System.Windows.Forms.MessageBox.Show("A start X value is required.", "Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtStartX.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for start X", "Missing Value");
return false;
}
if (txtStartY.Text == "")
{
System.Windows.Forms.MessageBox.Show("A start Y value is required","Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtStartY.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for start Y", "Missing Value");
return false;
}
if (txtEndX.Text == "")
{
System.Windows.Forms.MessageBox.Show("An end X value is required", "Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtEndX.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for end X", "Missing Value");
return false;
}
if (txtEndY.Text == "")
{
System.Windows.Forms.MessageBox.Show("An end Y value is required", "Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtEndY.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for end Y", "Missing Value");
return false;
}
return true;
}
private bool ValidateEllipseValues()
{
// Make sure input text fields are not empty
// or do not contain non-numeric values
// Return false if an input value is invalid
if (txtCenterX.Text == "")
{
System.Windows.Forms.MessageBox.Show("A center point X value is required", "Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtCenterX.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for center point X", "Missing Value");
return false;
}
if (txtCenterY.Text == "")
{
System.Windows.Forms.MessageBox.Show("A center point Y value is required", "Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtCenterY.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for center point Y", "Missing Value");
return false;
}
if (txtXAxis.Text == "")
{
System.Windows.Forms.MessageBox.Show("An X axis value is required", "Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtXAxis.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for X axis", "Missing Value");
return false;
}
if (txtYAxis.Text == "")
{
System.Windows.Forms.MessageBox.Show("A Y axis value is required", "Missing Value");
return false;
}
if (Microsoft.VisualBasic.Information.IsNumeric(txtYAxis.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for Y axis", "Missing Value");
return false;
}
if (txtRotation.Text != "")
{
if (Microsoft.VisualBasic.Information.IsNumeric(txtRotation.Text) == false)
{
System.Windows.Forms.MessageBox.Show("A numeric value is required for rotation", "Missing Value");
return false;
}
}
return true;
}
private string GetSdkDataPath()
{
//get the ArcGIS path from the registry
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ESRI\ArcGIS_SXS_SDK");
string path = Convert.ToString(key.GetValue("InstallDir"));
//set the of the logo
string str = System.IO.Path.Combine(path, @"Samples\data\");
if (!System.IO.Directory.Exists(str))
{
MessageBox.Show("Path :" + str + " does not exist!");
return string.Empty;
}
return str;
}
#endregion
}
}
[Visual Basic .NET]
GeodesyMapControl.vb
Public Class frmGeodesyMapControl
Private m_pAOInitialize As ESRI.ArcGIS.esriSystem.IAoInitialize
Private m_pGeoEllipse As ESRI.ArcGIS.DefenseSolutions.IGeoEllipse
Private m_pMeasureTool As ESRI.ArcGIS.DefenseSolutions.IMeasurementTool
Private m_pEllipsePolygon As ESRI.ArcGIS.Geometry.IPolygon
Private m_pKeyPointPoly As ESRI.ArcGIS.Geometry.IPolygon
Private m_pGeoPolygon As ESRI.ArcGIS.DefenseSolutions.IGeoPolygon
Private m_pTrackPoly As ESRI.ArcGIS.Geometry.IPolygon
Private m_pOrigin As ESRI.ArcGIS.Geometry.IPoint
Private m_pGeoPolyline As ESRI.ArcGIS.DefenseSolutions.IGeoPolyline
Private m_pPolyline As ESRI.ArcGIS.Geometry.IPolyline
Private m_pKeyPointElement As ESRI.ArcGIS.Carto.IElement
Private m_pEllipseElement As ESRI.ArcGIS.Carto.IElement
Private m_pLineElement As ESRI.ArcGIS.Carto.IElement
Private m_pMapControl As ESRI.ArcGIS.Controls.IMapControl2
Private m_pActiveView As ESRI.ArcGIS.Carto.IActiveView
Private m_pActiveViewEvents As ESRI.ArcGIS.Carto.IMap
Private m_pMap As ESRI.ArcGIS.Carto.IMap
Private m_pGraphicsCont As ESRI.ArcGIS.Carto.IGraphicsContainer
Private m_dXAxis As Double
Private m_dYAxis As Double
Private m_lPointCount As Long
Private m_dRotation As Double
Const con_strGeo As String = "Geodesic"
Const con_strGC As String = "Great Circle"
Const con_strRhumb As String = "Rhumb Line"
#Region "Form Functions"
Public Sub New()
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine)
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
m_pAOInitialize = New ESRI.ArcGIS.esriSystem.AoInitialize
Dim status As ESRI.ArcGIS.esriSystem.esriLicenseStatus
status = m_pAOInitialize.IsProductCodeAvailable(ESRI.ArcGIS.esriSystem.esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB)
If (status <> ESRI.ArcGIS.esriSystem.esriLicenseStatus.esriLicenseAvailable) Then
MsgBox("ERROR: license not available." & vbCrLf & status)
Me.Finalize()
Else
status = m_pAOInitialize.Initialize(ESRI.ArcGIS.esriSystem.esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB)
End If
m_pMapControl = MapControl1.Object
m_pMapControl.AddLayerFromFile(GetSdkDataPath() + "World\Continents.lyr")
cboType.Items.Insert(0, con_strGeo)
cboType.Items.Insert(1, con_strGeo)
cboType.Items.Insert(2, con_strRhumb)
cboType.Text = con_strGeo
End Sub
Protected Overrides Sub Finalize()
m_pGeoEllipse = Nothing
m_pMeasureTool = Nothing
m_pEllipsePolygon = Nothing
m_pKeyPointPoly = Nothing
m_pOrigin = Nothing
m_pGeoPolyline = Nothing
m_pKeyPointElement = Nothing
m_pLineElement = Nothing
m_pMapControl = Nothing
m_pActiveView = Nothing
m_pActiveViewEvents = Nothing
m_pMap = Nothing
m_pGraphicsCont = Nothing
MyBase.Finalize()
End Sub
Private Sub cmdAddEllipse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAddEllipse.Click
On Error GoTo EH
'create GeoEllipse geometry
Call CreateGeoEllipse()
If m_pGeoEllipse Is Nothing Then
Exit Sub
End If
'create the IElement to be rendered as a GeoEllipseElement and
'set its geometry to the GeoEllipse geometry defined in the
m_pEllipseElement = New ESRI.ArcGIS.DefenseSolutions.GeoEllipseElement
m_pEllipseElement.Geometry = m_pGeoEllipse
'outline color
Dim pColor As ESRI.ArcGIS.Display.IRgbColor
pColor = New ESRI.ArcGIS.Display.RgbColor
pColor.Green = 255
'make fill color null
Dim pNullColor As ESRI.ArcGIS.Display.IColor
pNullColor = New ESRI.ArcGIS.Display.RgbColor
pNullColor.NullColor = True
'create the line symbol for the polygon outline
Dim pLineSymbol As ESRI.ArcGIS.Display.ILineSymbol
pLineSymbol = New ESRI.ArcGIS.Display.SimpleLineSymbol
pLineSymbol.Color = pColor
pLineSymbol.Width = 2
'create the fill symbol
Dim pFillSymbol As ESRI.ArcGIS.Display.IFillSymbol
pFillSymbol = New ESRI.ArcGIS.Display.SimpleFillSymbol
pFillSymbol.Outline = pLineSymbol
pFillSymbol.Color = pNullColor
'QI to IFillShapeElement to set the symbology of the GeoEllipse graphic
Dim pFillElement As ESRI.ArcGIS.Carto.IFillShapeElement
pFillElement = m_pEllipseElement
pFillElement.Symbol = pFillSymbol
'define the graphics container and draw the GeoEllipse graphic
Call SetGraphicsContainer()
m_pGraphicsCont.AddElement(pFillElement, 0)
m_pActiveView.Refresh()
Exit Sub
EH:
MsgBox(Err.Number & " " & Err.Description, vbCritical, "Error")
End Sub
Private Sub cmdClearEllipseFields_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClearEllipseFields.Click
txtCenterX.Text = ""
txtCenterY.Text = ""
txtXAxis.Text = ""
txtYAxis.Text = ""
txtRotation.Text = ""
End Sub
Private Sub cmdClearGraphics_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClearGraphics.Click
'Clear all graphic elements from the map control
Call SetGraphicsContainer()
m_pGraphicsCont.DeleteAllElements()
m_pActiveView.Refresh()
End Sub
Private Sub cmdClearLineFields_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClearLineFields.Click
txtStartX.Text = ""
txtStartY.Text = ""
txtEndX.Text = ""
txtEndY.Text = ""
txtDistance.Text = ""
txtAzimuth.Text = ""
End Sub
Private Sub cmdDrawLine_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDrawLine.Click
On Error GoTo EH
'call CreateGeoPolyline subprocedure to create geometry
Call CreateGeoPolyline()
If m_pGeoPolyline Is Nothing Then
Exit Sub
End If
'create the IElement to be rendered as a GeoPolylineElement and
'set its geometry to the GeoPolyline geometry defined in the
'CreateGeoPolyline subprocedure
m_pLineElement = New ESRI.ArcGIS.DefenseSolutions.GeoPolylineElement
m_pLineElement.Geometry = m_pGeoPolyline
'QI to ILineElement to set the symbology of the GeoPolyline graphic
Dim pLineElement As ESRI.ArcGIS.Carto.ILineElement
pLineElement = m_pLineElement
pLineElement.Symbol = GeoLineSymbol()
'Define the graphics container and draw the GeoPolyline graphic. Display the
'distance and azimuth of the GeoPolyline as calculated by the measurement tool.
Call SetGraphicsContainer()
m_pGraphicsCont.AddElement(pLineElement, 0)
m_pActiveView.Refresh()
txtDistance.Text = Math.Round((m_pMeasureTool.Distance / 1000), 6)
txtAzimuth.Text = Math.Round(m_pMeasureTool.Angle, 6)
Exit Sub
EH:
MsgBox(Err.Number & " " & Err.Description, vbCritical, "Error")
End Sub
Private Sub cmdKeyPoints_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdKeyPoints.Click
On Error GoTo EH
'Run the CreateGeoEllipse subprocedure to get the geometry of the
'key points polygon generated from the GeoEllipse.
Call CreateGeoEllipse()
If m_pGeoEllipse Is Nothing Then
Exit Sub
End If
If m_pKeyPointPoly Is Nothing Then
Exit Sub
End If
'outline color
Dim pColor As ESRI.ArcGIS.Display.IRgbColor
pColor = New ESRI.ArcGIS.Display.RgbColor
pColor.Green = 255
'make fill color null
Dim pNullColor As ESRI.ArcGIS.Display.IColor
pNullColor = New ESRI.ArcGIS.Display.RgbColor
pNullColor.NullColor = True
'create the outline symbol
Dim pLineSymbol As ESRI.ArcGIS.Display.ILineSymbol
pLineSymbol = New ESRI.ArcGIS.Display.SimpleLineSymbol
pLineSymbol.Color = pColor
pLineSymbol.Width = 1.5
Dim pHashLineSymbol As ESRI.ArcGIS.Display.IHashLineSymbol
pHashLineSymbol = New ESRI.ArcGIS.Display.HashLineSymbol
pHashLineSymbol.HashSymbol = pLineSymbol
'create the fill symbol for the polygon
Dim pFillSymbol As ESRI.ArcGIS.Display.IFillSymbol
pFillSymbol = New ESRI.ArcGIS.Display.SimpleFillSymbol
pFillSymbol.Outline = pHashLineSymbol
pFillSymbol.Color = pNullColor
'create the IElement to be rendered as a PolygonElement and
'set its geometry to the key points polygon geometry defined in the
'CreateGeoEllipse subprocedure
m_pKeyPointElement = New ESRI.ArcGIS.Carto.PolygonElement
m_pKeyPointElement.Geometry = m_pKeyPointPoly
'QI to IFillShapeElement to set the symbology of the key points polygon graphic
Dim pFillElement As ESRI.ArcGIS.Carto.IFillShapeElement
pFillElement = m_pKeyPointElement
pFillElement.Symbol = pFillSymbol
'define the graphics container and draw the key points polygon graphic
Call SetGraphicsContainer()
m_pGraphicsCont.AddElement(pFillElement, 0)
m_pActiveView.Refresh()
Exit Sub
EH:
MsgBox(Err.Number & " " & Err.Description, vbCritical, "Error")
End Sub
Private Sub MapControl1_OnMouseDown(ByVal sender As Object, ByVal e As ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent) Handles MapControl1.OnMouseDown
On Error GoTo EH
'On a right mouse button click use the TrackPolygon method on the map control
'to define the vertices of an eventual GeoPolygon. Each right mouse button
'click adds a vertex to the polygon; double-clicking the right mouse button
'completes the polygon.
Dim pTrackPoly As ESRI.ArcGIS.Geometry.IPolygon
Dim pTrackPolyElement As ESRI.ArcGIS.Carto.IElement
If e.button = 2 Then
'Create the polygon from the TrackPolygon method. This polygon will be
'the foundation for a GeoPolygon object.
pTrackPoly = MapControl1.TrackPolygon
'Define the GeoPolygon, QI to IGeoPolygon
m_pGeoPolygon = New ESRI.ArcGIS.DefenseSolutions.GeoPolygon
m_pGeoPolygon.Polygon = pTrackPoly
'Set the GeoPolyline type to form the segments of the GeoPolygon. In this case
'the segments will be Geodesic lines.
m_pGeoPolygon.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGeodesic
'Set the GeoPolygon spatial reference.
m_pGeoPolygon.BaseSpatialReference = GetWGS84SpatialRef()
'outline color
Dim pColor As ESRI.ArcGIS.Display.IRgbColor
pColor = New ESRI.ArcGIS.Display.RgbColor
pColor.Blue = 255
'make fill color null
Dim pNullColor As ESRI.ArcGIS.Display.IColor
pNullColor = New ESRI.ArcGIS.Display.RgbColor
pNullColor.NullColor = True
'create the outline symbol
Dim pLineSymbol As ESRI.ArcGIS.Display.ILineSymbol
pLineSymbol = New ESRI.ArcGIS.Display.SimpleLineSymbol
pLineSymbol.Color = pColor
pLineSymbol.Width = 1.5
'create the fill symbol for the GeoPolygon
Dim pFillSymbol As ESRI.ArcGIS.Display.IFillSymbol
pFillSymbol = New ESRI.ArcGIS.Display.SimpleFillSymbol
pFillSymbol.Outline = pLineSymbol
pFillSymbol.Color = pNullColor
'Create the IElement to be rendered as a GeoPolygonElement and
'set its geometry to the GeoPolygon geometry. When a GeoPolygonElement
'graphic is moved from one location to another in the map control
'the GeoPolygon geometry is automatically updated based on the
'geographic location and the graphic is updated accordingly.
pTrackPolyElement = New ESRI.ArcGIS.DefenseSolutions.GeoPolygonElement
pTrackPolyElement.Geometry = m_pGeoPolygon
'QI to IFillShapeElement to set the symbology of the GeoPolygon graphic
Dim pFillElement As ESRI.ArcGIS.Carto.IFillShapeElement
pFillElement = pTrackPolyElement
pFillElement.Symbol = pFillSymbol
'define the graphics container and draw the key points polygon graphic
Call SetGraphicsContainer()
m_pGraphicsCont.AddElement(pFillElement, 0)
m_pActiveView.Refresh()
Else
pTrackPoly = Nothing
End If
Exit Sub
EH:
MsgBox(Err.Number & " " & Err.Description, vbCritical, "Error")
End Sub
#End Region
#Region "Helper Methods"
Public Sub SetGraphicsContainer()
'Define the graphics container to be the map control's active view
m_pMapControl = MapControl1.Object
m_pActiveView = m_pMapControl.ActiveView
m_pGraphicsCont = m_pActiveView.GraphicsContainer
End Sub
Public Sub CreateGeoEllipse()
On Error GoTo EH
'reset geoellipse and key point geometries
m_pGeoEllipse = Nothing
m_pKeyPointPoly = Nothing
If ValidateEllipseValues() = False Then
Exit Sub
End If
'define the geoellipse
m_pGeoEllipse = New ESRI.ArcGIS.DefenseSolutions.GeoEllipse
'define the geoellipse center point coordinates
m_pOrigin = New ESRI.ArcGIS.Geometry.Point
Dim dX As Double
Dim dY As Double
dX = txtCenterX.Text
dY = txtCenterY.Text
m_pOrigin.PutCoords(dX, dY)
'define the geoellipse spatial reference
m_pGeoEllipse.BaseSpatialReference = GetWGS84SpatialRef()
'set the lengths of the X and Y axes in kilometers
m_pGeoEllipse.AxisX = CDbl(txtXAxis.Text) * 1000
m_pGeoEllipse.AxisY = CDbl(txtYAxis.Text) * 1000
'set the origin, or center point, of the geoellipse
m_pGeoEllipse.Origin = m_pOrigin
'if the rotation is not given, use 0 as default
If txtRotation.Text = "" Then
txtRotation.Text = "0"
End If
'define the amount of rotation, in degrees from
'zero (north), of the geoellipse Y axis
m_pGeoEllipse.Rotation = CDbl(txtRotation.Text) Mod 360
'set the number of vertices to be used in the creation
'of the polygon representation of the geoellipse
m_pGeoEllipse.GeoEllipsePointCount = 100
'define the key points polygon, which is a polygon connecting the end
'points of the geoellipse X and Y axes
m_pKeyPointPoly = m_pGeoEllipse.KeyPoints
Exit Sub
EH:
MsgBox(Err.Number & " " & Err.Description, vbCritical, "Error")
End Sub
Public Sub CreateGeoPolyline()
On Error GoTo EH
'reset the polyline geometry
m_pGeoPolyline = Nothing
If ValidatePolylineValues() = False Then
Exit Sub
End If
'Set the measurement tool and the GeoPolyline. The measurement tool
'will be used to calculate the distance and azimuth of the GeoPolyline
'based on the start and end point coordinates of the line
m_pGeoPolyline = New ESRI.ArcGIS.DefenseSolutions.GeoPolyline
m_pMeasureTool = New ESRI.ArcGIS.DefenseSolutions.MeasurementTool
'Get the GeoPolyline type from the Type dropdown list and set it as
'the type for both the measurement tool and the GeoPolyline. The options
'are Geodesic, Great Circle, and Rhumb Line.
Dim strType As String
strType = cboType.Items(cboType.SelectedIndex).ToString
If strType = con_strGeo Then
m_pMeasureTool.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGeodesic
m_pGeoPolyline.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGeodesic
ElseIf strType = con_strGC Then
m_pMeasureTool.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGreatCircle
m_pGeoPolyline.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTGreatCircle
ElseIf strType = con_strRhumb Then
m_pMeasureTool.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTRhumbLine
m_pGeoPolyline.SpecialGeolineType = ESRI.ArcGIS.DefenseSolutions.cjmtkSGType.cjmtkSGTRhumbLine
End If
'set the measurement tool spatial reference
m_pMeasureTool.SpecialSpatialReference = GetWGS84SpatialRef()
'Set start and end points for the measurement tool calculation
'and the polyline from which the GeoPolyline is derived. The points
'are created based on the decimal degree coordinates input into
'the Start Point and End Point text boxes
Dim dStartX As Double
Dim dStartY As Double
Dim dEndX As Double
Dim dEndY As Double
Dim pStartPoint As ESRI.ArcGIS.Geometry.IPoint
Dim pEndPoint As ESRI.ArcGIS.Geometry.IPoint
dStartX = txtStartX.Text
dStartY = txtStartY.Text
pStartPoint = New ESRI.ArcGIS.Geometry.Point
pStartPoint.PutCoords(dStartX, dStartY)
dEndX = txtEndX.Text
dEndY = txtEndY.Text
pEndPoint = New ESRI.ArcGIS.Geometry.Point
pEndPoint.PutCoords(dEndX, dEndY)
'Calculate the distance and azimuth of the GeoPolyline using the
'ConstructByPoints method on the measurement tool. These values
'will be displayed in the Distance and Azimuth text boxes
m_pMeasureTool.ConstructByPoints(pStartPoint, pEndPoint)
'Create the simple polyline which is the basis for the geometry of the GeoPolyline.
m_pPolyline = New ESRI.ArcGIS.Geometry.Polyline
m_pPolyline.FromPoint = pStartPoint
m_pPolyline.ToPoint = pEndPoint
m_pPolyline.Project(GetWGS84SpatialRef)
'QI to IGeoPolyLine to define the GeoPolyline. Set the base geometry of the
'geopolyline to the polyline created from the start and end point coordinates
'defined in the X and Y fields. Specify the number of vertices by which to densify
'the GeoPolyline as a percentage of the total distance of the line. In this
'case a vertex will be placed at every 1% of the line's total distance.
m_pGeoPolyline.Polyline = m_pPolyline
m_pGeoPolyline.MaxPercent = 0.01
m_pGeoPolyline.UsePercent = True
Exit Sub
EH:
MsgBox(Err.Number & " " & Err.Description, vbCritical, "Error")
End Sub
Public Function GeoLineSymbol() As ESRI.ArcGIS.Display.ISymbol
On Error GoTo EH
'define the color for the line symbol
Dim pRGB As ESRI.ArcGIS.Display.IRgbColor
pRGB = New ESRI.ArcGIS.Display.RgbColor
pRGB.Red = 255
'define the properties of the character marker symbol and set it to the marker symbol
Dim pMarkSym As ESRI.ArcGIS.Display.IMarkerSymbol
Dim pCharMarkSym As ESRI.ArcGIS.Display.ICharacterMarkerSymbol
pCharMarkSym = New ESRI.ArcGIS.Display.CharacterMarkerSymbol
Dim pFont As stdole.IFontDisp
pFont = New stdole.StdFont
pFont.Name = "ESRI Arrowhead"
' pFont.Size = 14
With pCharMarkSym
.Color = pRGB
.XOffset = 1
.CharacterIndex = 36
.Font = pFont
.Size = 14
End With
pMarkSym = pCharMarkSym
'define the simple line decoration element and add the marker symbol to it
Dim pSimpleLineDeco As ESRI.ArcGIS.Display.ISimpleLineDecorationElement
pSimpleLineDeco = New ESRI.ArcGIS.Display.SimpleLineDecorationElement
pSimpleLineDeco.MarkerSymbol = pMarkSym
pSimpleLineDeco.AddPosition(1)
'set the simple line decoration element to the line decoration element
Dim pLineDecoElem As ESRI.ArcGIS.Display.ILineDecorationElement
pLineDecoElem = pSimpleLineDeco
'add the line decoration element to the line decoration
Dim pLineDeco As ESRI.ArcGIS.Display.ILineDecoration
pLineDeco = New ESRI.ArcGIS.Display.LineDecoration
pLineDeco.AddElement(pLineDecoElem)
'define the cartographic line symbol properties
Dim pCartoLineSym As ESRI.ArcGIS.Display.ICartographicLineSymbol
pCartoLineSym = New ESRI.ArcGIS.Display.CartographicLineSymbol
pCartoLineSym.Color = pRGB
pCartoLineSym.Width = 1.5
'set the cartographic line symbol and the line decoration to the line properties
Dim pLineProps As ESRI.ArcGIS.Display.ILineProperties
pLineProps = pCartoLineSym
pLineProps.LineDecoration = pLineDeco
'set the line properties to the symbol
GeoLineSymbol = pLineProps
Exit Function
EH:
GeoLineSymbol = Nothing
End Function
Private Function ValidatePolylineValues() As Boolean
'Make sure input text fields are not empty
'or do not contain non-numeric values
'Return false if an input value is invalid
If txtStartX.Text = "" Then
MsgBox("A start X value is required", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
If Not IsNumeric(txtStartX.Text) Then
MsgBox("A numeric value is required for start X", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
If txtStartY.Text = "" Then
MsgBox("A start Y value is required", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
If Not IsNumeric(txtStartY.Text) Then
MsgBox("A numeric value is required for start Y", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
If txtEndX.Text = "" Then
MsgBox("An end X value is required", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
If Not IsNumeric(txtEndX.Text) Then
MsgBox("A numeric value is required for end X", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
If txtEndY.Text = "" Then
MsgBox("An end Y value is required", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
If Not IsNumeric(txtEndY.Text) Then
MsgBox("A numeric value is required for end Y", vbCritical, "Missing Value")
ValidatePolylineValues = False
Exit Function
End If
ValidatePolylineValues = True
End Function
Private Function ValidateEllipseValues() As Boolean
'Make sure input text fields are not empty
'or do not contain non-numeric values
'Return false if an input value is invalid
If txtCenterX.Text = "" Then
MsgBox("A center point X value is required", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If Not IsNumeric(txtCenterX.Text) Then
MsgBox("A numeric value is required for center point X", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If txtCenterY.Text = "" Then
MsgBox("A center point Y value is required", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If Not IsNumeric(txtCenterY.Text) Then
MsgBox("A numeric value is required for center point Y", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If txtXAxis.Text = "" Then
MsgBox("An X axis value is required", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If Not IsNumeric(txtXAxis.Text) Then
MsgBox("A numeric value is required for X axis", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If txtYAxis.Text = "" Then
MsgBox("A Y axis value is required", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If Not IsNumeric(txtYAxis.Text) Then
MsgBox("A numeric value is required for Y axis", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
If Not txtRotation.Text = "" Then
If Not IsNumeric(txtRotation.Text) Then
MsgBox("A numeric value is required for rotation", vbCritical, "Missing Value")
ValidateEllipseValues = False
Exit Function
End If
End If
ValidateEllipseValues = True
End Function
Private Function GetWGS84SpatialRef() As ESRI.ArcGIS.Geometry.ISpatialReference2
'Define the spatial reference to be used for geopolylines,
'geoellipses, and geopolygons.
Dim pSpatRef As ESRI.ArcGIS.Geometry.ISpatialReference2
Dim pSpatRefFact As ESRI.ArcGIS.Geometry.ISpatialReferenceFactory2
pSpatRefFact = New ESRI.ArcGIS.Geometry.SpatialReferenceEnvironment
pSpatRef = pSpatRefFact.CreateSpatialReference(ESRI.ArcGIS.Geometry.esriSRGeoCSType.esriSRGeoCS_WGS1984)
GetWGS84SpatialRef = pSpatRef
End Function
Private Function GetSdkDataPath() As String
'get the ArcGIS path from the registry
Dim key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\ESRI\ArcGIS_SXS_SDK")
Dim path As String = Convert.ToString(key.GetValue("InstallDir"))
'set the of the logo
Dim str As String = System.IO.Path.Combine(path, "Samples\data\")
If (Not System.IO.Directory.Exists(str)) Then
MessageBox.Show("Path :" & str & " does not exist!")
Return String.Empty
End If
Return str
End Function
#End Region
End Class