About the GraphicTracker with the map Sample
[C#]
GTMapForm.cs
#region using statements using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.EngineCore; using ESRI.ArcGIS.SystemUI; #endregion namespace GraphicTrackerMap { public partial class GTMapForm : Form { #region class private members private IMapControl3 m_mapControl = null; private string m_mapDocumentName = string.Empty; public IGraphicTracker m_graphicTracker = null; public Dictionary<int, IGraphicTrackerSymbol> m_GTSymbols = null; public Dictionary<int, IGeometry> m_GTGeometries = null; private Boolean m_move = false; private Boolean m_move_all = false; private double m_move_dist = 1; #endregion public GTMapForm() { InitializeComponent(); } private void GTMapForm_Load(object sender, EventArgs e) { //Get the MapControl m_mapControl = (IMapControl3)axMapControl1.Object; //Initialize the GraphicTracker with the Map m_graphicTracker = new GraphicTrackerClass(); m_graphicTracker.Initialize(m_mapControl.Map as IBasicMap); Calculate_Move_Distance(); //Create dictionaries and store the 3 GraphicTracker Symbols m_GTGeometries = new Dictionary<int, IGeometry>(20); m_GTSymbols = new Dictionary<int, IGraphicTrackerSymbol>(3); CreateGTSymbols(); //Add the custom Addgraphic and Selectgraphic tools to a ToolbarControl axToolbarControl2.AddItem(new AddGT()); axToolbarControl2.AddItem(new SelectGT()); //Form controls initialize radioButton1.Checked = true; GTUpdateTimer.Enabled = true; m_mapControl.CustomProperty = this as object; } private void btnHighlight_Click(object sender, EventArgs e) { if (comboTrackerID.SelectedIndex != -1 && m_graphicTracker != null) m_graphicTracker.Highlight(comboTrackerID.SelectedIndex, true); } private void btnUnHighlight_Click(object sender, EventArgs e) { if (comboTrackerID.SelectedIndex != -1 && m_graphicTracker != null) m_graphicTracker.Highlight(comboTrackerID.SelectedIndex, false); } private void comboSymbolID_SelectedIndexChanged(object sender, EventArgs e) { if (comboTrackerID.SelectedIndex != -1 && comboSymbolID.SelectedIndex != -1 && m_graphicTracker != null) { int id = comboTrackerID.SelectedIndex; if (m_GTGeometries.ContainsKey(id)) { m_graphicTracker.Replace(id, m_GTGeometries[id], m_GTSymbols[comboSymbolID.SelectedIndex]); } } } private void textLabel_TextChanged(object sender, EventArgs e) { if (comboTrackerID.SelectedIndex != -1 && m_graphicTracker != null) { int id = comboTrackerID.SelectedIndex; if (m_GTGeometries.ContainsKey(id)) { m_graphicTracker.SetLabel(id, textLabel.Text); } } } private void radioButton1_CheckedChanged(object sender, EventArgs e) { m_move = false; m_move_all = false; } private void radioButton3_CheckedChanged(object sender, EventArgs e) { m_move = false; if (m_move_all == false) m_move_all = true; else m_move_all = false; } private void radioButton2_CheckedChanged(object sender, EventArgs e) { m_move_all = false; if (m_move == false) m_move = true; else m_move = false; } private void CreateGTSymbols() { if (m_graphicTracker == null) return; //1st point symbol IColor color = new RgbColorClass() { Red = 0, Green = 0, Blue = 255 }; stdole.IFontDisp symbolFont = new stdole.StdFontClass() as stdole.IFontDisp; symbolFont.Name = "ESRI Default Marker"; ICharacterMarkerSymbol characterMarkerSymbol = new CharacterMarkerSymbolClass(); characterMarkerSymbol.Font = symbolFont; characterMarkerSymbol.Color = color; characterMarkerSymbol.CharacterIndex = 98;//pin characterMarkerSymbol.Size = 20.0; IGraphicTrackerSymbol gtSymbol1 = m_graphicTracker.CreateSymbol(characterMarkerSymbol as ISymbol, null); m_GTSymbols.Add(0, gtSymbol1); comboSymbolID.Items.Add("Blue Pin"); //2nd point symbol color = new RgbColorClass() { Red = 244, Green = 0, Blue = 0 }; symbolFont.Name = "ESRI Default Marker"; ICharacterMarkerSymbol characterMarkerSymbol2 = new CharacterMarkerSymbolClass(); characterMarkerSymbol2.Font = symbolFont; characterMarkerSymbol2.Color = color; characterMarkerSymbol2.CharacterIndex = 111;//aeroplane characterMarkerSymbol2.Size = 70.0; IGraphicTrackerSymbol gtSymbol2 = m_graphicTracker.CreateSymbol(characterMarkerSymbol2 as ISymbol, null); m_GTSymbols.Add(1, gtSymbol2); comboSymbolID.Items.Add("Red Plane"); //3rd point symbol color = new RgbColorClass() { Red = 244, Green = 255, Blue = 0 }; ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass(); simpleMarkerSymbol.Color = color; simpleMarkerSymbol.Size = 40; simpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle; IGraphicTrackerSymbol gtSymbol3 = m_graphicTracker.CreateSymbol(simpleMarkerSymbol as ISymbol, null); m_GTSymbols.Add(2, gtSymbol3); comboSymbolID.Items.Add("Yellow Circle"); } private void GTUpdateTimer_Tick(object sender, EventArgs e) { //To control the rate that the data is updated by setting the GTUpdateTimer.Interval property //This timer is used to artificially replicate changing data (e.g. GPS Feed) //Instead of using a timer you could provide an event that triggers an update if (m_graphicTracker == null) return; //Move the selected graphic if (m_move) { if (comboTrackerID.SelectedIndex != -1 && m_graphicTracker != null) { int id = comboTrackerID.SelectedIndex; if (m_GTGeometries.ContainsKey(id)) { IPoint pnt = (IPoint)m_GTGeometries[id]; double x = pnt.X + m_move_dist; double y = pnt.Y + m_move_dist; m_graphicTracker.MoveTo(id, x, y, 0); m_GTGeometries.Remove(id); IPoint point = new PointClass(); point.PutCoords(x, y); m_GTGeometries.Add(id, point); } } } //Move all graphics if (m_move_all) { if (m_graphicTracker != null) { for (int i = 0; i < m_graphicTracker.Count; ++i) { int id = i; if (m_GTGeometries.ContainsKey(id)) { IPoint pnt = (IPoint)m_GTGeometries[id]; double x = pnt.X + m_move_dist; double y = pnt.Y + m_move_dist; m_graphicTracker.MoveTo(id, x, y, 0); m_GTGeometries.Remove(id); IPoint point = new PointClass(); point.PutCoords(x, y); m_GTGeometries.Add(id, point); } } } } if (m_graphicTracker.Count == comboTrackerID.Items.Count) return; comboTrackerID.Items.Clear(); for (int i = 0; i < m_graphicTracker.Count; ++i) comboTrackerID.Items.Add(i); } private void Calculate_Move_Distance() { //Call this every time the map document is replaced //This move distance is set to simulate changing data location //Change the divisor to change the distance that the graphic moves //You may need to call this every time you zoom in/out but that will depend on your application m_move_dist = m_mapControl.Extent.Width / 500; } private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) { //Every time you change the map document don't forget to initialize the GraphicTracker with //the Map. In this sample you must calculate the move distance again. m_graphicTracker.Initialize(m_mapControl.Map as IBasicMap); Calculate_Move_Distance(); } } }
[Visual Basic .NET]
GTMapForm.vb
#Region "using statements" Imports System.Collections.Generic Imports System.ComponentModel Imports System.Data Imports System.Drawing Imports System.Text Imports System.Windows.Forms Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.Controls Imports ESRI.ArcGIS.Display Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.EngineCore Imports ESRI.ArcGIS.SystemUI #End Region Public Partial Class GTMapForm Inherits Form #Region "class private members" Private m_mapControl As IMapControl3 = Nothing Private m_mapDocumentName As String = String.Empty Public m_graphicTracker As IGraphicTracker = Nothing Public m_GTSymbols As Dictionary(Of Integer, IGraphicTrackerSymbol) = Nothing Public m_GTGeometries As Dictionary(Of Integer, IGeometry) = Nothing Private m_move As [Boolean] = False Private m_move_all As [Boolean] = False Private m_move_dist As Double = 1 #End Region Public Sub New() InitializeComponent() End Sub Private Sub GTMapForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load 'Get the MapControl m_mapControl = DirectCast(axMapControl1.[Object], IMapControl3) 'Initialize the GraphicTracker with the Map m_graphicTracker = New GraphicTrackerClass() m_graphicTracker.Initialize(TryCast(m_mapControl.Map, IBasicMap)) Calculate_Move_Distance() 'Create dictionaries and store the 3 GraphicTracker Symbols m_GTGeometries = New Dictionary(Of Integer, IGeometry)(20) m_GTSymbols = New Dictionary(Of Integer, IGraphicTrackerSymbol)(3) CreateGTSymbols() 'Add the custom Addgraphic and Selectgraphic tools to a ToolbarControl axToolbarControl2.AddItem(New AddGT()) axToolbarControl2.AddItem(New SelectGT()) 'Form controls initialize radioButton1.Checked = True GTUpdateTimer.Enabled = True m_mapControl.CustomProperty = TryCast(Me, Object) End Sub Private Sub btnHighlight_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnHighlight.Click If comboTrackerID.SelectedIndex <> -1 AndAlso m_graphicTracker IsNot Nothing Then m_graphicTracker.Highlight(comboTrackerID.SelectedIndex, True) End If End Sub Private Sub btnUnHighlight_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnUnHighlight.Click If comboTrackerID.SelectedIndex <> -1 AndAlso m_graphicTracker IsNot Nothing Then m_graphicTracker.Highlight(comboTrackerID.SelectedIndex, False) End If End Sub Private Sub comboSymbolID_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles comboSymbolID.SelectedIndexChanged If comboTrackerID.SelectedIndex <> -1 AndAlso comboSymbolID.SelectedIndex <> -1 AndAlso m_graphicTracker IsNot Nothing Then Dim id As Integer = comboTrackerID.SelectedIndex If m_GTGeometries.ContainsKey(id) Then m_graphicTracker.Replace(id, m_GTGeometries(id), m_GTSymbols(comboSymbolID.SelectedIndex)) End If End If End Sub Private Sub textLabel_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles textLabel.TextChanged If comboTrackerID.SelectedIndex <> -1 AndAlso m_graphicTracker IsNot Nothing Then Dim id As Integer = comboTrackerID.SelectedIndex If m_GTGeometries.ContainsKey(id) Then m_graphicTracker.SetLabel(id, textLabel.Text) End If End If End Sub Private Sub radioButton1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles radioButton1.CheckedChanged m_move = False m_move_all = False End Sub Private Sub radioButton3_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles radioButton3.CheckedChanged m_move = False If m_move_all = False Then m_move_all = True Else m_move_all = False End If End Sub Private Sub radioButton2_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles radioButton2.CheckedChanged m_move_all = False If m_move = False Then m_move = True Else m_move = False End If End Sub Private Sub CreateGTSymbols() If m_graphicTracker Is Nothing Then Return End If '1st point symbol Dim color As IColor = New RgbColorClass() With { _ .Red = 0, _ .Green = 0, _ .Blue = 255 _ } Dim symbolFont As stdole.IFontDisp = TryCast(New stdole.StdFontClass(), stdole.IFontDisp) symbolFont.Name = "ESRI Default Marker" Dim characterMarkerSymbol As ICharacterMarkerSymbol = New CharacterMarkerSymbolClass() characterMarkerSymbol.Font = symbolFont characterMarkerSymbol.Color = color characterMarkerSymbol.CharacterIndex = 98 'pin characterMarkerSymbol.Size = 20.0 Dim gtSymbol1 As IGraphicTrackerSymbol = m_graphicTracker.CreateSymbol(TryCast(characterMarkerSymbol, ISymbol), Nothing) m_GTSymbols.Add(0, gtSymbol1) comboSymbolID.Items.Add("Blue Pin") '2nd point symbol color = New RgbColorClass() With { _ .Red = 244, _ .Green = 0, _ .Blue = 0 _ } symbolFont.Name = "ESRI Default Marker" Dim characterMarkerSymbol2 As ICharacterMarkerSymbol = New CharacterMarkerSymbolClass() characterMarkerSymbol2.Font = symbolFont characterMarkerSymbol2.Color = color characterMarkerSymbol2.CharacterIndex = 111 'aeroplane characterMarkerSymbol2.Size = 70.0 Dim gtSymbol2 As IGraphicTrackerSymbol = m_graphicTracker.CreateSymbol(TryCast(characterMarkerSymbol2, ISymbol), Nothing) m_GTSymbols.Add(1, gtSymbol2) comboSymbolID.Items.Add("Red Plane") '3rd point symbol color = New RgbColorClass() With { _ .Red = 244, _ .Green = 255, _ .Blue = 0 _ } Dim simpleMarkerSymbol As ISimpleMarkerSymbol = New SimpleMarkerSymbolClass() simpleMarkerSymbol.Color = color simpleMarkerSymbol.Size = 40 simpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle Dim gtSymbol3 As IGraphicTrackerSymbol = m_graphicTracker.CreateSymbol(TryCast(simpleMarkerSymbol, ISymbol), Nothing) m_GTSymbols.Add(2, gtSymbol3) comboSymbolID.Items.Add("Yellow Circle") End Sub Private Sub GTUpdateTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles GTUpdateTimer.Tick 'To control the rate that the data is updated by setting the GTUpdateTimer.Interval property 'This timer is used to artificially replicate changing data (e.g. GPS Feed) 'Instead of using a timer you could provide an event that triggers an update If m_graphicTracker Is Nothing Then Return End If 'Move the selected graphic If m_move Then If comboTrackerID.SelectedIndex <> -1 AndAlso m_graphicTracker IsNot Nothing Then Dim id As Integer = comboTrackerID.SelectedIndex If m_GTGeometries.ContainsKey(id) Then Dim pnt As IPoint = DirectCast(m_GTGeometries(id), IPoint) Dim x As Double = pnt.X + m_move_dist Dim y As Double = pnt.Y + m_move_dist m_graphicTracker.MoveTo(id, x, y, 0) m_GTGeometries.Remove(id) Dim point As IPoint = New PointClass() point.PutCoords(x, y) m_GTGeometries.Add(id, point) End If End If End If 'Move all graphics If m_move_all Then If m_graphicTracker IsNot Nothing Then For i As Integer = 0 To m_graphicTracker.Count - 1 Dim id As Integer = i If m_GTGeometries.ContainsKey(id) Then Dim pnt As IPoint = DirectCast(m_GTGeometries(id), IPoint) Dim x As Double = pnt.X + m_move_dist Dim y As Double = pnt.Y + m_move_dist m_graphicTracker.MoveTo(id, x, y, 0) m_GTGeometries.Remove(id) Dim point As IPoint = New PointClass() point.PutCoords(x, y) m_GTGeometries.Add(id, point) End If Next End If End If If m_graphicTracker.Count = comboTrackerID.Items.Count Then Return End If comboTrackerID.Items.Clear() For i As Integer = 0 To m_graphicTracker.Count - 1 comboTrackerID.Items.Add(i) Next End Sub Private Sub Calculate_Move_Distance() 'Call this every time the map document is replaced 'This move distance is set to simulate changing data location 'Change the divisor to change the distance that the graphic moves 'You may need to call this every time you zoom in/out but that will depend on your application m_move_dist = m_mapControl.Extent.Width / 500 End Sub Private Sub axMapControl1_OnMapReplaced(ByVal sender As Object, ByVal e As IMapControlEvents2_OnMapReplacedEvent) Handles axMapControl1.OnMapReplaced 'Every time you change the map document don't forget to initialize the GraphicTracker with 'the Map. In this sample you must calculate the move distance again. m_graphicTracker.Initialize(TryCast(m_mapControl.Map, IBasicMap)) Calculate_Move_Distance() End Sub End Class