About the Play back tracking data Sample
[C#]
PlaybackDataButton.cs
using System; using System.Collections.Generic; using System.Text; using System.Timers; using System.IO; using ESRI.ArcGIS.TrackingAnalyst; using ESRI.ArcGIS.Geodatabase; using System.Windows.Forms; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.ADF.Connection.Local; using System.Drawing; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.GeoDatabaseExtensions; namespace TAPlaybackTrackingData { public class PlaybackDataButton : ESRI.ArcGIS.Desktop.AddIns.Button { private System.Timers.Timer m_timer = null; private ITemporalLayer m_temporalLayer = null; private bool m_bIsConnected = false; private IActiveView m_activeView = null; private ITrackingEnvironment3 m_temporalEnv = null; private ITemporalOperator3 m_baseTime = null; bool m_bIsFirst = true; private ITemporalOperator3 m_tempOpIncrement = null; private IDocumentEvents_Event m_docEvent = null; public PlaybackDataButton() { m_timer = new System.Timers.Timer(500); m_timer.Enabled = false; m_timer.Elapsed += new ElapsedEventHandler(OnTimer); } protected override void OnClick() { if (!m_bIsConnected) { try { //open the shapefile with the recorded data IFeatureClass featureClass = openPlaybackData(); if (null == featureClass) return; //get the map container object mapObj = ArcMap.Application; //load the Tracking Analyst extension ITrackingEnvironment3 trackingEnv = setupTrackingEnv(ref mapObj); //set the mode to historic, since you need to do playback trackingEnv.DefaultTemporalReference.TemporalMode = enumTemporalMode.enumHistoric; //set the units of the temporal period to days trackingEnv.DefaultTemporalReference.TemporalPeriodUnits = enumTemporalUnits.enumDays; //set the update mode to manual so that it will be controlled by the application trackingEnv.DisplayManager.ManualUpdate = true; //set the temporal perspective to Aug 03 2000 7PM. trackingEnv.DefaultTemporalReference.TemporalPerspective = "8/3/2000 7:0:00 PM"; // Stop using the map's time to allow the layer to draw based on it's TemporalPerspective ITimeData timeData = m_temporalLayer as ITimeData; timeData.UseTime = false; //create a temporal operator that will serve as a base time for the tracking environment ITemporalOperator3 temporalOpBaseTime = new TemporalOperatorClass() as ITemporalOperator3; //set the base time to 6PM, Aug 3 2000 temporalOpBaseTime.SetDateTime(2000, 8, 3, 18, 0, 0, 0); //create the renderer for the temporal layer ITemporalRenderer temporalRenderer = setRenderer(featureClass, "DATE_TIME", "EVENTID"); //create the temporal layer for the playback data m_temporalLayer = new TemporalFeatureLayerClass(); //assign the featureclass for the layer ((IFeatureLayer)m_temporalLayer).FeatureClass = featureClass; //set the base time to initialize the time window of the layer m_temporalLayer.RelativeTimeOperator = (ITemporalOperator)temporalOpBaseTime; //set the renderer for the temporal layer m_temporalLayer.Renderer = temporalRenderer as IFeatureRenderer; //set the flag in order to display the track of previous locations m_temporalLayer.DisplayOnlyLastKnownEvent = false; //initialize labels for the event name setupLayerLabels(m_temporalLayer, "EVENTID"); m_activeView = ArcMap.Document.ActiveView; m_temporalEnv = trackingEnv; m_baseTime = temporalOpBaseTime; //add the temporal layer to the map ArcMap.Document.FocusMap.AddLayer((ILayer)m_temporalLayer); //enable the timer m_timer.Enabled = true; } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message); } } else { //disable the timer m_timer.Enabled = false; if (null == m_temporalLayer) return; //remove the layer ArcMap.Document.FocusMap.DeleteLayer((ILayer)m_temporalLayer); m_temporalLayer = null; } m_bIsConnected = !m_bIsConnected; m_docEvent = ArcMap.Document as IDocumentEvents_Event; m_docEvent.CloseDocument += new IDocumentEvents_CloseDocumentEventHandler(docEvent_CloseDocument); ArcMap.Application.CurrentTool = null; } void docEvent_CloseDocument() { m_timer.Enabled = false; } private void setupLayerLabels(ITemporalLayer trackingLayer, string labelField) { //cast TrackingLayerLabels from the temporal layer ITrackingLayerLabels layerLabels = (ITrackingLayerLabels)trackingLayer; //set the labels properties layerLabels.LabelFieldName = labelField; layerLabels.LabelFeatures = true; // create text symbol ITextSymbol textSymbol = new TextSymbolClass(); textSymbol.Color = (IColor)Converter.ToRGBColor(Color.Red); textSymbol.Size = 15; textSymbol.Font = Converter.ToStdFont(new Font(new FontFamily("Arial"), 15.0f, FontStyle.Regular)); textSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHARight; textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline; layerLabels.TextSymbol = textSymbol; } private IFeatureClass openPlaybackData() { //set the path to the featureclass string path = @"..\..\..\..\..\data\Time\ProjectData.gdb"; if (!System.IO.Directory.Exists(path)) { MessageBox.Show("Cannot find hurricane data:\n" + path, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } IWorkspaceFactory2 wsFactory = new FileGDBWorkspaceFactoryClass(); IWorkspace workspace = wsFactory.OpenFromFile( path, 0 ); IFeatureClass featureClass = ((IFeatureWorkspace)workspace).OpenFeatureClass( "atlantic_hurricanes_2000" ); return featureClass; } private ITrackingEnvironment3 setupTrackingEnv(ref object mapObj) { IExtensionManager extentionManager = new ExtensionManagerClass(); UID uid = new UIDClass(); uid.Value = "esriTrackingAnalyst.TrackingEngineUtil"; ((IExtensionManagerAdmin)extentionManager).AddExtension(uid, ref mapObj); ITrackingEnvironment3 trackingEnv = new TrackingEnvironmentClass(); try { trackingEnv.Initialize(ref mapObj); } catch (Exception ex) { } trackingEnv.EnableTemporalDisplayManagement = true; return trackingEnv; } private IUniqueValueRenderer CreateUniqueValueRenderer(IFeatureClass featureClass, string fieldName) { IRgbColor color = new RgbColorClass(); color.Red = 255; color.Blue = 0; color.Green = 0; ICharacterMarkerSymbol charMarkersymbol = new CharacterMarkerSymbolClass(); charMarkersymbol.Font = Converter.ToStdFont(new Font(new FontFamily("ESRI Default Marker"), 12.0f, FontStyle.Regular)); charMarkersymbol.CharacterIndex = 96; charMarkersymbol.Size = 12.0; charMarkersymbol.Color = (IColor)color; IRandomColorRamp randomColorRamp = new RandomColorRampClass(); randomColorRamp.MinSaturation = 20; randomColorRamp.MaxSaturation = 40; randomColorRamp.MaxValue = 85; randomColorRamp.MaxValue = 100; randomColorRamp.StartHue = 75; randomColorRamp.EndHue = 190; randomColorRamp.UseSeed = true; randomColorRamp.Seed = 45; IUniqueValueRenderer uniqueRenderer = new UniqueValueRendererClass(); uniqueRenderer.FieldCount = 1; uniqueRenderer.set_Field(0, fieldName); uniqueRenderer.DefaultSymbol = (ISymbol)charMarkersymbol; uniqueRenderer.UseDefaultSymbol = true; Random rand = new Random(); bool bValFound = false; IFeatureCursor featureCursor = featureClass.Search(null, true); IFeature feature = null; string val = string.Empty; int fieldID = featureClass.FindField(fieldName); if (-1 == fieldID) return uniqueRenderer; while ((feature = featureCursor.NextFeature()) != null) { bValFound = false; val = Convert.ToString(feature.get_Value(fieldID)); for (int i = 0; i < uniqueRenderer.ValueCount - 1; i++) { if (uniqueRenderer.get_Value(i) == val) bValFound = true; } if (!bValFound)//need to add the value to the renderer { color.Red = rand.Next(255); color.Blue = rand.Next(255); color.Green = rand.Next(255); charMarkersymbol = new CharacterMarkerSymbolClass(); charMarkersymbol.Font = Converter.ToStdFont(new Font(new FontFamily("ESRI Default Marker"), 10.0f, FontStyle.Regular)); charMarkersymbol.CharacterIndex = rand.Next(40, 118); charMarkersymbol.Size = 20.0; charMarkersymbol.Color = (IColor)color; //add the value to the renderer uniqueRenderer.AddValue(val, "name", (ISymbol)charMarkersymbol); } } //release the featurecursor ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(featureCursor); return uniqueRenderer; } private IUniqueValueRenderer CreateTrackUniqueValueRenderer(IFeatureClass featureClass, string fieldName) { IRgbColor color = new RgbColorClass(); color.Red = 0; color.Blue = 0; color.Green = 255; ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass(); simpleLineSymbol.Color = (IColor)color; simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid; simpleLineSymbol.Width = 1.0; IUniqueValueRenderer uniqueRenderer = new UniqueValueRendererClass(); uniqueRenderer.FieldCount = 1; uniqueRenderer.set_Field(0, fieldName); uniqueRenderer.DefaultSymbol = (ISymbol)simpleLineSymbol; uniqueRenderer.UseDefaultSymbol = true; Random rand = new Random(); bool bValFound = false; IFeatureCursor featureCursor = featureClass.Search(null, true); IFeature feature = null; string val = string.Empty; int fieldID = featureClass.FindField(fieldName); if (-1 == fieldID) return uniqueRenderer; while ((feature = featureCursor.NextFeature()) != null) { bValFound = false; val = Convert.ToString(feature.get_Value(fieldID)); for (int i = 0; i < uniqueRenderer.ValueCount - 1; i++) { if (uniqueRenderer.get_Value(i) == val) bValFound = true; } if (!bValFound)//need to add the value to the renderer { color.Red = rand.Next(255); color.Blue = rand.Next(255); color.Green = rand.Next(255); simpleLineSymbol = new SimpleLineSymbolClass(); simpleLineSymbol.Color = (IColor)color; simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid; simpleLineSymbol.Width = 1.0; //add the value to the renderer uniqueRenderer.AddValue(val, "name", (ISymbol)simpleLineSymbol); } } //release the featurecursor ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(featureCursor); return uniqueRenderer; } private ITemporalRenderer setRenderer(IFeatureClass featureClass, string temporalField, string eventName) { CoTrackSymbologyRenderer trackingRenderer = new CoTrackSymbologyRendererClass(); ITemporalRenderer temporalRenderer = (ITemporalRenderer)trackingRenderer; temporalRenderer.TemporalFieldName = temporalField; temporalRenderer.TemporalObjectColumnName = eventName; temporalRenderer.TimeSymbologyMethod = enumTemporalSymbolizationMethod.enumColor; //this is a desktop only code which requires assemblies CartoUI and Framework //IRendererPropertyPage rendererPropPage = new UniqueValuePropertyPageClass(); //enable the most current renderer IUniqueValueRenderer uniqueValrenderer = CreateUniqueValueRenderer(featureClass, eventName); if (null != uniqueValrenderer) { ((ITemporalRenderer2)temporalRenderer).MostCurrentRenderer = (IFeatureRenderer)uniqueValrenderer; ((ITemporalRenderer2)temporalRenderer).MostCurrentRendererEnabled = true; //this is a desktop only code which requires assemblies CartoUI and Framework //((ITemporalRenderer2)temporalRenderer).PropPageMostCurrentRenderer = rendererPropPage.ClassID; } //set the track renderer uniqueValrenderer = CreateTrackUniqueValueRenderer(featureClass, eventName); if (null != uniqueValrenderer) { ITrackSymbologyRenderer trackSymbolenderer = trackingRenderer as ITrackSymbologyRenderer; trackSymbolenderer.TrackSymbologyRenderer = (IFeatureRenderer)uniqueValrenderer; ((ITemporalRenderer2)temporalRenderer).TrackRendererEnabled = true; ((ITemporalRenderer2)temporalRenderer).SmoothTracks = true; //this is a desktop only code which requires assemblies CartoUI and Framework //((ITemporalRenderer2)temporalRenderer).PropPageTrackRenderer = rendererPropPage.ClassID; } return temporalRenderer; } protected override void OnUpdate() { Enabled = ArcMap.Application != null; } private void OnTimer(object sender, ElapsedEventArgs e) { //increment the time-stamp of the tracking environment in order to do the playback OnIncrement(); } private void OnIncrement() { if (m_bIsFirst) { //create the temporal increment object m_tempOpIncrement = new TemporalOperatorClass(); m_tempOpIncrement.SetInterval(6.0, enumTemporalOperatorUnits.enumTemporalOperatorHours); m_bIsFirst = false; } if (null == m_baseTime) return; //increment the base time to match the 'current' time m_baseTime.Add((ITemporalOperator)m_tempOpIncrement); string date = m_baseTime.get_AsString("%c"); System.Diagnostics.Trace.WriteLine(date); //increment the timestamp m_temporalEnv.DefaultTemporalReference.TemporalPerspective = (object)date; //refresh the display m_activeView.Refresh(); // For better performance, the following line can be used instead of the one above to // do a partial refresh of the screen instead of refreshing the whole display. //m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, m_temporalLayer, new EnvelopeClass()); } } }
[Visual Basic .NET]
PlaybackDataButton.vb
Imports System Imports System.Drawing Imports System.Timers Imports System.Windows.Forms Imports ESRI.ArcGIS.ADF.Connection.Local Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.DataSourcesGDB Imports ESRI.ArcGIS.Display Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.GeoDatabaseExtensions Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.TrackingAnalyst Public Class PlaybackDataButton Inherits ESRI.ArcGIS.Desktop.AddIns.Button Private m_timer As System.Timers.Timer = Nothing Private m_temporalLayer As ITemporalLayer = Nothing Private m_bIsConnected As Boolean = False Private m_tempOpIncrement As ITemporalOperator3 = Nothing Private m_baseTime As ITemporalOperator3 = Nothing Private m_temporalEnv As ITrackingEnvironment3 = Nothing Private m_bIsFirst As Boolean = True Public Sub New() m_timer = New System.Timers.Timer(500) m_timer.Enabled = False AddHandler m_timer.Elapsed, AddressOf OnTimer End Sub Protected Overrides Sub OnClick() If (Not m_bIsConnected) Then Try 'open the shapefile with the recorded data Dim featureClass As IFeatureClass = openPlaybackData() If Nothing Is featureClass Then Return End If 'get the map container Dim mapObj As Object = My.ArcMap.Application 'load the Tracking Analyst extension m_temporalEnv = setupTrackingEnv(mapObj) 'set the mode to historic, since you need to do playback m_temporalEnv.DefaultTemporalReference.TemporalMode = enumTemporalMode.enumHistoric 'set the units of the temporal period to days m_temporalEnv.DefaultTemporalReference.TemporalPeriodUnits = enumTemporalUnits.enumDays 'set the update mode to manual so that it will be controlled by the application m_temporalEnv.DisplayManager.ManualUpdate = True 'set the temporal perspective to Aug 03 2000 7PM. m_temporalEnv.DefaultTemporalReference.TemporalPerspective = "8/3/2000 7:0:00 PM" ' Stop using the map's time to allow the layer to draw based on it's TemporalPerspective CType(m_temporalLayer, ITimeData).UseTime = False 'create a temporal operator that will serve as a base time for the tracking environment m_baseTime = New TemporalOperatorClass() 'set the base time to 6PM, Aug 3 2000 m_baseTime.SetDateTime(2000, 8, 3, 18, 0, 0, 0) 'create the renderer for the temporal layer Dim temporalRenderer As ITemporalRenderer = setRenderer(featureClass, "DATE_TIME", "EVENTID") 'create the temporal layer for the playback data m_temporalLayer = New TemporalFeatureLayerClass() 'assign the featureclass for the layer CType(m_temporalLayer, IFeatureLayer).FeatureClass = featureClass 'set the base time to initialize the time window of the layer m_temporalLayer.RelativeTimeOperator = CType(m_baseTime, ITemporalOperator) 'set the renderer for the temporal layer m_temporalLayer.Renderer = TryCast(temporalRenderer, IFeatureRenderer) 'set the flag in order to display the track of previous locations m_temporalLayer.DisplayOnlyLastKnownEvent = False 'initialize labels for the event name setupLayerLabels(m_temporalLayer, "EVENTID") 'add the temporal layer to the map My.ArcMap.Document.FocusMap.AddLayer(CType(m_temporalLayer, ILayer)) 'enable the timer m_timer.Enabled = True Catch ex As Exception System.Diagnostics.Trace.WriteLine(ex.Message) End Try Else 'disable the timer m_timer.Enabled = False If Nothing Is m_temporalLayer Then Return End If 'remove the layer My.ArcMap.Document.FocusMap.DeleteLayer(CType(m_temporalLayer, ILayer)) m_temporalLayer = Nothing End If m_bIsConnected = Not m_bIsConnected My.ArcMap.Application.CurrentTool = Nothing End Sub Protected Overrides Sub OnUpdate() Enabled = My.ArcMap.Application IsNot Nothing End Sub Private Sub OnTimer(ByVal sender As Object, ByVal e As ElapsedEventArgs) OnIncrement() End Sub Private Sub OnIncrement() If m_bIsFirst Then 'create the temporal increment object m_tempOpIncrement = New TemporalOperatorClass() m_tempOpIncrement.SetInterval(6.0, enumTemporalOperatorUnits.enumTemporalOperatorHours) m_bIsFirst = False End If If Nothing Is m_baseTime Then Return End If 'increment the base time to match the 'current' time m_baseTime.Add(CType(m_tempOpIncrement, ITemporalOperator)) Dim d As String = m_baseTime.AsString("%c") System.Diagnostics.Trace.WriteLine(d) 'increment the timestamp m_temporalEnv.DefaultTemporalReference.TemporalPerspective = d 'refresh the display My.ArcMap.Document.ActiveView.Refresh() 'For improved performance, the line above can be replaces with the line above this comment. The 'lower line of code will only refresh the part of the screen that has changed. 'My.ArcMap.Document.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, m_temporalLayer, Nothing) End Sub ''' <summary> ''' create the renderer used to draw the tracks ''' </summary> ''' <param name="featureClass"></param> ''' <param name="fieldName"></param> ''' <returns></returns> Private Function CreateTrackUniqueValueRenderer(ByVal featureClass As IFeatureClass, ByVal fieldName As String) As IUniqueValueRenderer Dim color As IRgbColor = New RgbColorClass() color.Red = 0 color.Blue = 0 color.Green = 255 Dim simpleLineSymbol As ISimpleLineSymbol = New SimpleLineSymbolClass() simpleLineSymbol.Color = CType(color, IColor) simpleLineSymbol.Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid simpleLineSymbol.Width = 1.0 Dim uniqueRenderer As IUniqueValueRenderer = New UniqueValueRendererClass() uniqueRenderer.FieldCount = 1 uniqueRenderer.Field(0) = fieldName uniqueRenderer.DefaultSymbol = CType(simpleLineSymbol, ISymbol) uniqueRenderer.UseDefaultSymbol = True Dim rand As Random = New Random() Dim bValFound As Boolean = False Dim featureCursor As IFeatureCursor = featureClass.Search(Nothing, True) Dim feature As IFeature = Nothing Dim val As String = String.Empty Dim fieldID As Integer = featureClass.FindField(fieldName) If -1 = fieldID Then Return uniqueRenderer End If feature = featureCursor.NextFeature() Do While Not feature Is Nothing bValFound = False val = Convert.ToString(feature.Value(fieldID)) Dim i As Integer = 0 Do While i < uniqueRenderer.ValueCount - 1 If uniqueRenderer.Value(i) = val Then bValFound = True End If i += 1 Loop If (Not bValFound) Then 'need to add the value to the renderer color.Red = rand.Next(255) color.Blue = rand.Next(255) color.Green = rand.Next(255) simpleLineSymbol = New SimpleLineSymbolClass() simpleLineSymbol.Color = CType(color, IColor) simpleLineSymbol.Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid simpleLineSymbol.Width = 1.0 'add the value to the renderer uniqueRenderer.AddValue(val, "EVENTID", CType(simpleLineSymbol, ISymbol)) End If feature = featureCursor.NextFeature() Loop 'release the featurecursor ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(featureCursor) 'ESRI.ArcGIS.ADF.BaseClasses.ComReleaser.ReleaseCOMObject(featureCursor) Return uniqueRenderer End Function Private Function CreateUniqueValueRenderer(ByVal featureClass As IFeatureClass, ByVal fieldName As String) As IUniqueValueRenderer Dim color As IRgbColor = New RgbColorClass() color.Red = 255 color.Blue = 0 color.Green = 0 Dim charMarkersymbol As ICharacterMarkerSymbol = New CharacterMarkerSymbolClass() charMarkersymbol.Font = Converter.ToStdFont(New Font(New FontFamily("ESRI Default Marker"), 12.0F, FontStyle.Regular)) charMarkersymbol.CharacterIndex = 96 charMarkersymbol.Size = 12.0 charMarkersymbol.Color = CType(color, IColor) Dim randomColorRamp As IRandomColorRamp = New RandomColorRampClass() randomColorRamp.MinSaturation = 20 randomColorRamp.MaxSaturation = 40 randomColorRamp.MaxValue = 85 randomColorRamp.MaxValue = 100 randomColorRamp.StartHue = 75 randomColorRamp.EndHue = 190 randomColorRamp.UseSeed = True randomColorRamp.Seed = 45 Dim uniqueRenderer As IUniqueValueRenderer = New UniqueValueRendererClass() uniqueRenderer.FieldCount = 1 uniqueRenderer.Field(0) = fieldName uniqueRenderer.DefaultSymbol = CType(charMarkersymbol, ISymbol) uniqueRenderer.UseDefaultSymbol = True Dim rand As Random = New Random() Dim bValFound As Boolean = False Dim featureCursor As IFeatureCursor = featureClass.Search(Nothing, True) Dim feature As IFeature = Nothing Dim val As String = String.Empty Dim fieldID As Integer = featureClass.FindField(fieldName) If -1 = fieldID Then Return uniqueRenderer End If feature = featureCursor.NextFeature() Do While Not feature Is Nothing bValFound = False val = Convert.ToString(feature.Value(fieldID)) Dim i As Integer = 0 Do While i < uniqueRenderer.ValueCount - 1 If uniqueRenderer.Value(i) = val Then bValFound = True End If i += 1 Loop If (Not bValFound) Then 'need to add the value to the renderer color.Red = rand.Next(255) color.Blue = rand.Next(255) color.Green = rand.Next(255) charMarkersymbol = New CharacterMarkerSymbolClass() charMarkersymbol.Font = Converter.ToStdFont(New Font(New FontFamily("ESRI Default Marker"), 10.0F, FontStyle.Regular)) charMarkersymbol.CharacterIndex = rand.Next(40, 118) charMarkersymbol.Size = 20.0 charMarkersymbol.Color = CType(color, IColor) 'add the value to the renderer uniqueRenderer.AddValue(val, "name", CType(charMarkersymbol, ISymbol)) End If feature = featureCursor.NextFeature() Loop 'release the featurecursor ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(featureCursor) Return uniqueRenderer End Function Private Sub setupLayerLabels(ByVal trackingLayer As ITemporalLayer, ByVal labelField As String) 'cast TrackingLayerLabels from the temporal layer Dim layerLabels As ITrackingLayerLabels = CType(trackingLayer, ITrackingLayerLabels) 'set the labels properties layerLabels.LabelFieldName = labelField layerLabels.LabelFeatures = True ' create text symbol Dim textSymbol As ITextSymbol = New TextSymbolClass() textSymbol.Color = CType(Converter.ToRGBColor(Color.Red), IColor) 'textSymbol.Color = (IColor)color; textSymbol.Size = 15 textSymbol.Font = Converter.ToStdFont(New Font(New FontFamily("Arial"), 15.0F, FontStyle.Regular)) textSymbol.HorizontalAlignment = ESRI.ArcGIS.Display.esriTextHorizontalAlignment.esriTHARight textSymbol.VerticalAlignment = ESRI.ArcGIS.Display.esriTextVerticalAlignment.esriTVABaseline layerLabels.TextSymbol = textSymbol End Sub Private Function setupTrackingEnv(ByRef mapObj As Object) As ITrackingEnvironment3 Dim extentionManager As IExtensionManager = New ExtensionManagerClass() Dim uid As UID = New UIDClass() uid.Value = "esriTrackingAnalyst.TrackingEngineUtil" CType(extentionManager, IExtensionManagerAdmin).AddExtension(uid, mapObj) Dim trackingEnv As ITrackingEnvironment3 = New TrackingEnvironmentClass() trackingEnv.Initialize(mapObj) trackingEnv.EnableTemporalDisplayManagement = True Return trackingEnv End Function Private Function openPlaybackData() As IFeatureClass 'set the path to the featureclass in the sample data Dim path As String = "..\..\..\..\..\data\Time\ProjectData.gdb" If (Not System.IO.Directory.Exists(path)) Then MessageBox.Show("Cannot find hurricane data:" & Constants.vbLf & path, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Return Nothing End If Dim wsFactory As IWorkspaceFactory2 = New FileGDBWorkspaceFactoryClass() Dim workspace As IWorkspace = wsFactory.OpenFromFile(path, 0) Dim featureClass As IFeatureClass = (CType(workspace, IFeatureWorkspace)).OpenFeatureClass("atlantic_hurricanes_2000") Return featureClass End Function Private Function setRenderer(ByVal featureClass As IFeatureClass, ByVal temporalField As String, ByVal eventName As String) As ITemporalRenderer Dim trackingRenderer As CoTrackSymbologyRenderer = New CoTrackSymbologyRendererClass() Dim temporalRenderer As ITemporalRenderer = CType(trackingRenderer, ITemporalRenderer) temporalRenderer.TemporalFieldName = temporalField temporalRenderer.TemporalObjectColumnName = eventName temporalRenderer.TimeSymbologyMethod = enumTemporalSymbolizationMethod.enumColor 'this is a desktop only code which requires assemblies CartoUI and Framework 'IRendererPropertyPage rendererPropPage = new UniqueValuePropertyPageClass(); 'enable the most current renderer Dim uniqueValrenderer As IUniqueValueRenderer = CreateUniqueValueRenderer(featureClass, eventName) If Not Nothing Is uniqueValrenderer Then CType(temporalRenderer, ITemporalRenderer2).MostCurrentRenderer = CType(uniqueValrenderer, IFeatureRenderer) CType(temporalRenderer, ITemporalRenderer2).MostCurrentRendererEnabled = True 'this is a desktop only code which requires assemblies CartoUI and Framework '((ITemporalRenderer2)temporalRenderer).PropPageMostCurrentRenderer = rendererPropPage.ClassID; End If 'set the track renderer uniqueValrenderer = CreateTrackUniqueValueRenderer(featureClass, eventName) If Not Nothing Is uniqueValrenderer Then Dim trackSymbolenderer As ITrackSymbologyRenderer = TryCast(trackingRenderer, ITrackSymbologyRenderer) trackSymbolenderer.TrackSymbologyRenderer = CType(uniqueValrenderer, IFeatureRenderer) CType(temporalRenderer, ITemporalRenderer2).TrackRendererEnabled = True CType(temporalRenderer, ITemporalRenderer2).SmoothTracks = True 'this is a desktop only code which requires assemblies CartoUI and Framework '((ITemporalRenderer2)temporalRenderer).PropPageTrackRenderer = rendererPropPage.ClassID; End If Return temporalRenderer End Function End Class