About the Temporal statistics Sample
[C#]
MainForm.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.TrackingAnalyst;
using ESRI.ArcGIS.Geodatabase;
using TemporalStatistics2008;
using ESRI.ArcGIS.GeoDatabaseExtensions;
namespace TemporalStatistics
{
public sealed partial class MainForm : Form
{
#region class private members
private IMapControl3 m_mapControl = null;
private string m_mapDocumentName = string.Empty;
#endregion
IWorkspaceFactory m_amsWorkspaceFactory = null;
bool m_bTAInitialized = false;
private const string TEMPORALLAYERCLSID = "{78C7430C-17CF-11D5-B7CF-00010265ADC5}"; //CLSID for ITemporalLayer
#region class constructor
public MainForm()
{
InitializeComponent();
}
#endregion
private void MainForm_Load(object sender, EventArgs e)
{
//get the MapControl
m_mapControl = (IMapControl3)axMapControl1.Object;
//disable the Save menu (since there is no document yet)
menuSaveDoc.Enabled = false;
timerStats.Start();
}
#region Main Menu event handlers
private void menuNewDoc_Click(object sender, EventArgs e)
{
//execute New Document command
ICommand command = new CreateNewDocument();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
private void menuOpenDoc_Click(object sender, EventArgs e)
{
//execute Open Document command
ICommand command = new ControlsOpenDocCommandClass();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
private void menuSaveDoc_Click(object sender, EventArgs e)
{
//execute Save Document command
if (m_mapControl.CheckMxFile(m_mapDocumentName))
{
//create a new instance of a MapDocument
IMapDocument mapDoc = new MapDocumentClass();
mapDoc.Open(m_mapDocumentName, string.Empty);
//Make sure that the MapDocument is not readonly
if (mapDoc.get_IsReadOnly(m_mapDocumentName))
{
MessageBox.Show("Map document is read only!");
mapDoc.Close();
return;
}
//Replace its contents with the current map
mapDoc.ReplaceContents((IMxdContents)m_mapControl.Map);
//save the MapDocument in order to persist it
mapDoc.Save(mapDoc.UsesRelativePaths, false);
//close the MapDocument
mapDoc.Close();
}
}
private void menuSaveAs_Click(object sender, EventArgs e)
{
//execute SaveAs Document command
ICommand command = new ControlsSaveAsDocCommandClass();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
private void menuExitApp_Click(object sender, EventArgs e)
{
//exit the application
Application.Exit();
}
#endregion
//listen to MapReplaced event in order to update the status bar and the Save menu
private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
//get the current document name from the MapControl
m_mapDocumentName = m_mapControl.DocumentFilename;
//if there is no MapDocument, disable the Save menu and clear the status bar
if (m_mapDocumentName == string.Empty)
{
menuSaveDoc.Enabled = false;
statusBarXY.Text = string.Empty;
}
else
{
//enable the Save menu and write the doc name to the status bar
menuSaveDoc.Enabled = true;
statusBarXY.Text = Path.GetFileName(m_mapDocumentName);
}
//Update combo list of tracking services
PopulateTrackingServices();
}
private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
statusBarXY.Text = string.Format("{0}, {1} {2}", e.mapX.ToString("#######.##"), e.mapY.ToString("#######.##"), axMapControl1.MapUnits.ToString().Substring(4));
}
//Initialize the Tracking Analyst Environment
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();
trackingEnv.Initialize(ref mapObj);
trackingEnv.EnableTemporalDisplayManagement = true;
return trackingEnv;
}
//Periodically update the statistics information
private void timerStats_Tick(object sender, EventArgs e)
{
//Initialize TA if there is hasn't been already and there are Tracking layers in the map
if (!m_bTAInitialized &&
GetAllTrackingLayers() != null)
{
object oMapControl = m_mapControl;
ITrackingEnvironment3 taEnv = setupTrackingEnv(ref oMapControl);
//ITrackingEnvironment3 taEnv = setupTrackingEnv(ref oMapControl);
if (taEnv != null)
{
m_bTAInitialized = true;
}
//Need to refresh the map once to get the tracks moving
m_mapControl.Refresh(esriViewDrawPhase.esriViewGeography, null, null);
}
RefreshStatistics();
}
private void RefreshStatistics()
{
try
{
ITemporalLayer temporalLayer = GetSelectedTemporalLayer();
//If a temporal layer is selected in the combo box only update that layer's stats
if (temporalLayer == null)
{
RefreshAllStatistics();
}
else
{
RefreshLayerStatistics(temporalLayer.Name,
(ITemporalFeatureClassStatistics)((IFeatureLayer)temporalLayer).FeatureClass);
}
}
catch (Exception ex)
{
statusBarXY.Text = ex.Message;
}
}
//Refresh the statistics for all tracking layers in the map
//The AMSWorkspaceFactory provides easy access to query the statistics for every layer at once
private void RefreshAllStatistics()
{
try
{
object oNames, oValues;
string[] sNames;
if (m_amsWorkspaceFactory == null)
{
m_amsWorkspaceFactory = new AMSWorkspaceFactoryClass();
}
//Get the AMS Workspace Factory Statistics interface
ITemporalWorkspaceStatistics temporalWsfStatistics = (ITemporalWorkspaceStatistics)m_amsWorkspaceFactory;
//Get the message rates for all the tracking connections in the map
IPropertySet psMessageRates = temporalWsfStatistics.AllMessageRates;
psMessageRates.GetAllProperties(out oNames, out oValues);
sNames = (string[])oNames;
object[] oaMessageRates = (object[])oValues;
//Get the feature counts for all the tracking connections in the map
IPropertySet psTotalFeatureCounts = temporalWsfStatistics.AllTotalFeatureCounts;
psTotalFeatureCounts.GetAllProperties(out oNames, out oValues);
object[] oaFeatureCounts = (object[])oValues;
//Get the connection status for all the tracking connections in the map
IPropertySet psConnectionStatus = temporalWsfStatistics.ConnectionStatus;
psConnectionStatus.GetAllProperties(out oNames, out oValues);
string[] sConnectionNames = (string[])oNames;
object[] oaConnectionStatus = (object[])oValues;
Hashtable htConnectionStatus = new Hashtable(sConnectionNames.Length);
for (int i = 0; i < sConnectionNames.Length; ++i)
{
htConnectionStatus.Add(sConnectionNames[i], oaConnectionStatus[i]);
}
//Get the track counts for all the tracking connections in the map
IPropertySet psTrackCounts = temporalWsfStatistics.AllTrackCounts;
psTrackCounts.GetAllProperties(out oNames, out oValues);
object[] oaTrackCounts = (object[])oValues;
//Get the sample sizes for all the tracking connections in the map
IPropertySet psSampleSizes = temporalWsfStatistics.AllSampleSizes;
psSampleSizes.GetAllProperties(out oNames, out oValues);
object[] oaSampleSizes = (object[])oValues;
//Clear the existing list view items and repopulate from the collection
lvStatistics.BeginUpdate();
lvStatistics.Items.Clear();
//Create list view items from statistics' IPropertySets
for (int i = 0; i < sNames.Length; ++i)
{
ListViewItem lvItem = new ListViewItem(sNames[i]);
lvItem.SubItems.Add(Convert.ToString(oaMessageRates[i]));
lvItem.SubItems.Add(Convert.ToString(oaFeatureCounts[i]));
string sConnName = sNames[i].Split(new Char[] { '/' })[0];
esriWorkspaceConnectionStatus eWCS = (esriWorkspaceConnectionStatus)Convert.ToInt32(htConnectionStatus[sConnName]);
lvItem.SubItems.Add(eWCS.ToString());
lvItem.SubItems.Add(Convert.ToString(oaTrackCounts[i]));
lvItem.SubItems.Add(Convert.ToString(oaSampleSizes[i]));
lvStatistics.Items.Add(lvItem);
}
lvStatistics.EndUpdate();
}
catch (System.Exception ex)
{
statusBarXY.Text = ex.Message;
}
}
//Refresh the statistics for a single layer using the ITemporalFeatureClassStatistics
private void RefreshLayerStatistics(string sLayerName, ITemporalFeatureClassStatistics temporalFCStats)
{
ListViewItem lvItem = new ListViewItem(sLayerName);
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.MessageRate));
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.TotalFeatureCount));
lvItem.SubItems.Add("Not Available");
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.TrackCount));
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.SampleSize));
lvStatistics.Items.Clear();
lvStatistics.Items.Add(lvItem);
}
//Cause a manual refresh of the statistics, also update the timer interval
private void btnRefresh_Click(object sender, EventArgs e)
{
try
{
timerStats.Stop();
SetSampleSize();
RefreshStatistics();
double dTimerRate = Convert.ToDouble(txtRate.Text);
timerStats.Interval = Convert.ToInt32(dTimerRate * 1000);
timerStats.Start();
}
catch (Exception ex)
{
statusBarXY.Text = ex.Message;
}
}
//Populate the combo box with the tracking services in the map
private void PopulateTrackingServices()
{
ILayer lyr = null;
IEnumLayer temporalLayers = GetAllTrackingLayers();
cbTrackingServices.Items.Clear();
cbTrackingServices.Items.Add("All");
if (temporalLayers != null)
{
while ((lyr = temporalLayers.Next()) != null)
{
cbTrackingServices.Items.Add(lyr.Name);
}
}
cbTrackingServices.SelectedIndex = 0;
}
//Query the map for all the tracking layers in it
private IEnumLayer GetAllTrackingLayers()
{
try
{
IUID uidTemoralLayer = new UIDClass();
uidTemoralLayer.Value = TEMPORALLAYERCLSID;
//This call throws an E_FAIL exception if the map has no layers, caught below
return m_mapControl.ActiveView.FocusMap.get_Layers((UID)uidTemoralLayer, true);
}
catch
{
return null;
}
}
//Get the tracking layer that is selected in the combo box according to its name
private ITemporalLayer GetSelectedTemporalLayer()
{
ITemporalLayer temporalLayer = null;
if (cbTrackingServices.SelectedIndex > 0)
{
ILayer lyr = null;
IEnumLayer temporalLayers = GetAllTrackingLayers();
string selectedLayerName = cbTrackingServices.Text;
while ((lyr = temporalLayers.Next()) != null)
{
if (lyr.Name == selectedLayerName)
{
temporalLayer = (ITemporalLayer)lyr;
}
}
}
return temporalLayer;
}
//Reset the statistic's feature count for one or all of the layers in the map
private void btnResetFC_Click(object sender, EventArgs e)
{
try
{
ITemporalLayer temporalLayer = GetSelectedTemporalLayer();
if (temporalLayer == null)
{
if (m_amsWorkspaceFactory == null)
{
m_amsWorkspaceFactory = new AMSWorkspaceFactoryClass();
}
//Get the AMS Workspace Factory Statistics interface
ITemporalWorkspaceStatistics temporalWsfStatistics = (ITemporalWorkspaceStatistics)m_amsWorkspaceFactory;
temporalWsfStatistics.ResetAllFeatureCounts();
}
else
{
ITemporalFeatureClassStatistics temporalFCStats =
(ITemporalFeatureClassStatistics)((IFeatureLayer)temporalLayer).FeatureClass;
temporalFCStats.ResetFeatureCount();
}
}
catch (Exception ex)
{
statusBarXY.Text = ex.Message;
}
}
//Reset the statistic's message rate for one or all of the layers in the map
private void btnResetMsgRate_Click(object sender, EventArgs e)
{
try
{
ITemporalLayer temporalLayer = GetSelectedTemporalLayer();
if (temporalLayer == null)
{
if (m_amsWorkspaceFactory == null)
{
m_amsWorkspaceFactory = new AMSWorkspaceFactoryClass();
}
//Get the AMS Workspace Factory Statistics interface
ITemporalWorkspaceStatistics temporalWsfStatistics = (ITemporalWorkspaceStatistics)m_amsWorkspaceFactory;
temporalWsfStatistics.ResetAllMessageRates();
}
else
{
ITemporalFeatureClassStatistics temporalFCStats =
(ITemporalFeatureClassStatistics)((IFeatureLayer)temporalLayer).FeatureClass;
temporalFCStats.ResetMessageRate();
}
}
catch (Exception ex)
{
statusBarXY.Text = ex.Message;
}
}
//Set the sampling size for one or all of the layers in the map
//The sampling size determines how many messages are factored into the message rate calculation.
//For instance a sampling size of 500 will store the times the last 500 messages were received.
//The message rate is calculated as the (oldest timestamp - current time) / number of messages
private void SetSampleSize()
{
try
{
int samplingSize = Convert.ToInt32(txtSampleSize.Text);
ITemporalLayer temporalLayer = GetSelectedTemporalLayer();
if (temporalLayer == null)
{
if (m_amsWorkspaceFactory == null)
{
m_amsWorkspaceFactory = new AMSWorkspaceFactoryClass();
}
//Get the AMS Workspace Factory Statistics interface
ITemporalWorkspaceStatistics temporalWsfStatistics = (ITemporalWorkspaceStatistics)m_amsWorkspaceFactory;
temporalWsfStatistics.SetAllSampleSizes(samplingSize);
}
else
{
ITemporalFeatureClassStatistics temporalFCStats =
(ITemporalFeatureClassStatistics)((IFeatureLayer)temporalLayer).FeatureClass;
temporalFCStats.SampleSize = samplingSize;
}
}
catch (Exception ex)
{
statusBarXY.Text = ex.Message;
}
}
private void cbTrackingServices_SelectionChangeCommitted(object sender, EventArgs e)
{
RefreshStatistics();
}
}
}
[Visual Basic .NET]
MainForm.vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports System.IO
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.ADF
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.TrackingAnalyst
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.GeoDatabaseExtensions
Namespace TemporalStatistics
Public NotInheritable Partial Class MainForm : Inherits Form
#Region "class private members"
Private m_mapControl As IMapControl3 = Nothing
Private m_mapDocumentName As String = String.Empty
#End Region
Private m_amsWorkspaceFactory As IWorkspaceFactory = Nothing
Private m_bTAInitialized As Boolean = False
Private Const TEMPORALLAYERCLSID As String = "{78C7430C-17CF-11D5-B7CF-00010265ADC5}" 'CLSID for ITemporalLayer
#Region "class constructor"
Public Sub New()
InitializeComponent()
End Sub
#End Region
Private Sub MainForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
'get the MapControl
m_mapControl = CType(axMapControl1.Object, IMapControl3)
'disable the Save menu (since there is no document yet)
menuSaveDoc.Enabled = False
timerStats.Start()
End Sub
#Region "Main Menu event handlers"
Private Sub menuNewDoc_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuNewDoc.Click
'execute New Document command
Dim command As ICommand = New CreateNewDocument()
command.OnCreate(m_mapControl.Object)
command.OnClick()
End Sub
Private Sub menuOpenDoc_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuOpenDoc.Click
'execute Open Document command
Dim command As ICommand = New ControlsOpenDocCommandClass()
command.OnCreate(m_mapControl.Object)
command.OnClick()
End Sub
Private Sub menuSaveDoc_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuSaveDoc.Click
'execute Save Document command
If m_mapControl.CheckMxFile(m_mapDocumentName) Then
'create a new instance of a MapDocument
Dim mapDoc As IMapDocument = New MapDocumentClass()
mapDoc.Open(m_mapDocumentName, String.Empty)
'Make sure that the MapDocument is not readonly
If mapDoc.IsReadOnly(m_mapDocumentName) Then
MessageBox.Show("Map document is read only!")
mapDoc.Close()
Return
End If
'Replace its contents with the current map
mapDoc.ReplaceContents(CType(m_mapControl.Map, IMxdContents))
'save the MapDocument in order to persist it
mapDoc.Save(mapDoc.UsesRelativePaths, False)
'close the MapDocument
mapDoc.Close()
End If
End Sub
Private Sub menuSaveAs_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuSaveAs.Click
'execute SaveAs Document command
Dim command As ICommand = New ControlsSaveAsDocCommandClass()
command.OnCreate(m_mapControl.Object)
command.OnClick()
End Sub
Private Sub menuExitApp_Click(ByVal sender As Object, ByVal e As EventArgs) Handles menuExitApp.Click
'exit the application
Application.Exit()
End Sub
#End Region
'listen to MapReplaced event in order to update the status bar and the Save menu
Private Sub axMapControl1_OnMapReplaced(ByVal sender As Object, ByVal e As IMapControlEvents2_OnMapReplacedEvent) Handles axMapControl1.OnMapReplaced
'get the current document name from the MapControl
m_mapDocumentName = m_mapControl.DocumentFilename
'if there is no MapDocument, disable the Save menu and clear the status bar
If m_mapDocumentName = String.Empty Then
menuSaveDoc.Enabled = False
statusBarXY.Text = String.Empty
Else
'enable the Save menu and write the doc name to the status bar
menuSaveDoc.Enabled = True
statusBarXY.Text = Path.GetFileName(m_mapDocumentName)
End If
'Update combo list of tracking services
PopulateTrackingServices()
End Sub
Private Sub axMapControl1_OnMouseMove(ByVal sender As Object, ByVal e As IMapControlEvents2_OnMouseMoveEvent) Handles axMapControl1.OnMouseMove
statusBarXY.Text = String.Format("{0}, {1} {2}", e.mapX.ToString("#######.##"), e.mapY.ToString("#######.##"), axMapControl1.MapUnits.ToString().Substring(4))
End Sub
'Initialize the Tracking Analyst Environment
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()
'mapObj = m_mapControl
Dim oMapControl As Object = m_mapControl.Object
trackingEnv.Initialize(oMapControl)
trackingEnv.EnableTemporalDisplayManagement = True
Return trackingEnv
End Function
'Periodically update the statistics information
Private Sub timerStats_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles timerStats.Tick
'Initialize TA if there is hasn't been already and there are Tracking layers in the map
If (Not m_bTAInitialized) AndAlso Not GetAllTrackingLayers() Is Nothing Then
Dim oMapControl As Object = m_mapControl
Dim taEnv As ITrackingEnvironment3 = setupTrackingEnv(oMapControl)
If Not taEnv Is Nothing Then
m_bTAInitialized = True
End If
'Need to refresh the map once to get the tracks moving
m_mapControl.Refresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing)
End If
RefreshStatistics()
End Sub
Private Sub RefreshStatistics()
Try
Dim temporalLayer As ITemporalLayer = GetSelectedTemporalLayer()
'If a temporal layer is selected in the combo box only update that layer's stats
If temporalLayer Is Nothing Then
RefreshAllStatistics()
Else
RefreshLayerStatistics(temporalLayer.Name, CType((CType(temporalLayer, IFeatureLayer)).FeatureClass, ITemporalFeatureClassStatistics))
End If
Catch ex As Exception
statusBarXY.Text = ex.Message
End Try
End Sub
'Refresh the statistics for all tracking layers in the map
'The AMSWorkspaceFactory provides easy access to query the statistics for every layer at once
Private Sub RefreshAllStatistics()
Try
Dim oValues As Object = Nothing
Dim oNames As Object = Nothing
Dim sNames As String()
If m_amsWorkspaceFactory Is Nothing Then
m_amsWorkspaceFactory = New AMSWorkspaceFactoryClass()
End If
'Get the AMS Workspace Factory Statistics interface
Dim temporalWsfStatistics As ITemporalWorkspaceStatistics = CType(m_amsWorkspaceFactory, ITemporalWorkspaceStatistics)
'Get the message rates for all the tracking connections in the map
Dim psMessageRates As IPropertySet = temporalWsfStatistics.AllMessageRates
psMessageRates.GetAllProperties(oNames, oValues)
sNames = CType(oNames, String())
Dim oaMessageRates As Object() = CType(oValues, Object())
'Get the feature counts for all the tracking connections in the map
Dim psTotalFeatureCounts As IPropertySet = temporalWsfStatistics.AllTotalFeatureCounts
psTotalFeatureCounts.GetAllProperties(oNames, oValues)
Dim oaFeatureCounts As Object() = CType(oValues, Object())
'Get the connection status for all the tracking connections in the map
Dim psConnectionStatus As IPropertySet = temporalWsfStatistics.ConnectionStatus
psConnectionStatus.GetAllProperties(oNames, oValues)
Dim sConnectionNames As String() = CType(oNames, String())
Dim oaConnectionStatus As Object() = CType(oValues, Object())
Dim htConnectionStatus As Hashtable = New Hashtable(sConnectionNames.Length)
Dim i As Integer = 0
Do While i < sConnectionNames.Length
htConnectionStatus.Add(sConnectionNames(i), oaConnectionStatus(i))
i += 1
Loop
'Get the track counts for all the tracking connections in the map
Dim psTrackCounts As IPropertySet = temporalWsfStatistics.AllTrackCounts
psTrackCounts.GetAllProperties(oNames, oValues)
Dim oaTrackCounts As Object() = CType(oValues, Object())
'Get the sample sizes for all the tracking connections in the map
Dim psSampleSizes As IPropertySet = temporalWsfStatistics.AllSampleSizes
psSampleSizes.GetAllProperties(oNames, oValues)
Dim oaSampleSizes As Object() = CType(oValues, Object())
'Clear the existing list view items and repopulate from the collection
lvStatistics.BeginUpdate()
lvStatistics.Items.Clear()
'Create list view items from statistics' IPropertySets
i = 0
Do While i < sNames.Length
Dim lvItem As ListViewItem = New ListViewItem(sNames(i))
lvItem.SubItems.Add(Convert.ToString(oaMessageRates(i)))
lvItem.SubItems.Add(Convert.ToString(oaFeatureCounts(i)))
Dim sConnName As String = sNames(i).Split(New Char() { "/"c })(0)
Dim eWCS As esriWorkspaceConnectionStatus = CType(Convert.ToInt32(htConnectionStatus(sConnName)), esriWorkspaceConnectionStatus)
lvItem.SubItems.Add(eWCS.ToString())
lvItem.SubItems.Add(Convert.ToString(oaTrackCounts(i)))
lvItem.SubItems.Add(Convert.ToString(oaSampleSizes(i)))
lvStatistics.Items.Add(lvItem)
i += 1
Loop
lvStatistics.EndUpdate()
Catch ex As System.Exception
statusBarXY.Text = ex.Message
End Try
End Sub
'Refresh the statistics for a single layer using the ITemporalFeatureClassStatistics
Private Sub RefreshLayerStatistics(ByVal sLayerName As String, ByVal temporalFCStats As ITemporalFeatureClassStatistics)
Dim lvItem As ListViewItem = New ListViewItem(sLayerName)
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.MessageRate))
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.TotalFeatureCount))
lvItem.SubItems.Add("Not Available")
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.TrackCount))
lvItem.SubItems.Add(Convert.ToString(temporalFCStats.SampleSize))
lvStatistics.Items.Clear()
lvStatistics.Items.Add(lvItem)
End Sub
'Cause a manual refresh of the statistics, also update the timer interval
Private Sub btnRefresh_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRefresh.Click
Try
timerStats.Stop()
SetSampleSize()
RefreshStatistics()
Dim dTimerRate As Double = Convert.ToDouble(txtRate.Text)
timerStats.Interval = Convert.ToInt32(dTimerRate * 1000)
timerStats.Start()
Catch ex As Exception
statusBarXY.Text = ex.Message
End Try
End Sub
'Populate the combo box with the tracking services in the map
Private Sub PopulateTrackingServices()
Dim lyr As ILayer = Nothing
Dim temporalLayers As IEnumLayer = GetAllTrackingLayers()
cbTrackingServices.Items.Clear()
cbTrackingServices.Items.Add("All")
If Not temporalLayers Is Nothing Then
lyr = temporalLayers.Next()
Do While Not (lyr) Is Nothing
cbTrackingServices.Items.Add(lyr.Name)
lyr = temporalLayers.Next()
Loop
End If
cbTrackingServices.SelectedIndex = 0
End Sub
'Query the map for all the tracking layers in it
Private Function GetAllTrackingLayers() As IEnumLayer
Try
Dim uidTemoralLayer As IUID = New UIDClass()
uidTemoralLayer.Value = TEMPORALLAYERCLSID
'This call throws an E_FAIL exception if the map has no layers, caught below
Return m_mapControl.ActiveView.FocusMap.Layers(CType(uidTemoralLayer, UID), True)
Catch
Return Nothing
End Try
End Function
'Get the tracking layer that is selected in the combo box according to its name
Private Function GetSelectedTemporalLayer() As ITemporalLayer
Dim temporalLayer As ITemporalLayer = Nothing
If cbTrackingServices.SelectedIndex > 0 Then
Dim lyr As ILayer = Nothing
Dim temporalLayers As IEnumLayer = GetAllTrackingLayers()
Dim selectedLayerName As String = cbTrackingServices.Text
lyr = temporalLayers.Next()
Do While Not lyr Is Nothing
If lyr.Name = selectedLayerName Then
temporalLayer = CType(lyr, ITemporalLayer)
End If
lyr = temporalLayers.Next()
Loop
End If
Return temporalLayer
End Function
'Reset the statistic's feature count for one or all of the layers in the map
Private Sub btnResetFC_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnResetFC.Click
Try
Dim temporalLayer As ITemporalLayer = GetSelectedTemporalLayer()
If temporalLayer Is Nothing Then
If m_amsWorkspaceFactory Is Nothing Then
m_amsWorkspaceFactory = New AMSWorkspaceFactoryClass()
End If
'Get the AMS Workspace Factory Statistics interface
Dim temporalWsfStatistics As ITemporalWorkspaceStatistics = CType(m_amsWorkspaceFactory, ITemporalWorkspaceStatistics)
temporalWsfStatistics.ResetAllFeatureCounts()
Else
Dim temporalFCStats As ITemporalFeatureClassStatistics = CType((CType(temporalLayer, IFeatureLayer)).FeatureClass, ITemporalFeatureClassStatistics)
temporalFCStats.ResetFeatureCount()
End If
Catch ex As Exception
statusBarXY.Text = ex.Message
End Try
End Sub
'Reset the statistic's message rate for one or all of the layers in the map
Private Sub btnResetMsgRate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnResetMsgRate.Click
Try
Dim temporalLayer As ITemporalLayer = GetSelectedTemporalLayer()
If temporalLayer Is Nothing Then
If m_amsWorkspaceFactory Is Nothing Then
m_amsWorkspaceFactory = New AMSWorkspaceFactoryClass()
End If
'Get the AMS Workspace Factory Statistics interface
Dim temporalWsfStatistics As ITemporalWorkspaceStatistics = CType(m_amsWorkspaceFactory, ITemporalWorkspaceStatistics)
temporalWsfStatistics.ResetAllMessageRates()
Else
Dim temporalFCStats As ITemporalFeatureClassStatistics = CType((CType(temporalLayer, IFeatureLayer)).FeatureClass, ITemporalFeatureClassStatistics)
temporalFCStats.ResetMessageRate()
End If
Catch ex As Exception
statusBarXY.Text = ex.Message
End Try
End Sub
'Set the sampling size for one or all of the layers in the map
'The sampling size determines how many messages are factored into the message rate calculation.
'For instance a sampling size of 500 will store the times the last 500 messages were received.
'The message rate is calculated as the (oldest timestamp - current time) / number of messages
Private Sub SetSampleSize()
Try
Dim samplingSize As Integer = Convert.ToInt32(txtSampleSize.Text)
Dim temporalLayer As ITemporalLayer = GetSelectedTemporalLayer()
If temporalLayer Is Nothing Then
If m_amsWorkspaceFactory Is Nothing Then
m_amsWorkspaceFactory = New AMSWorkspaceFactoryClass()
End If
'Get the AMS Workspace Factory Statistics interface
Dim temporalWsfStatistics As ITemporalWorkspaceStatistics = CType(m_amsWorkspaceFactory, ITemporalWorkspaceStatistics)
temporalWsfStatistics.SetAllSampleSizes(samplingSize)
Else
Dim temporalFCStats As ITemporalFeatureClassStatistics = CType((CType(temporalLayer, IFeatureLayer)).FeatureClass, ITemporalFeatureClassStatistics)
temporalFCStats.SampleSize = samplingSize
End If
Catch ex As Exception
statusBarXY.Text = ex.Message
End Try
End Sub
Private Sub cbTrackingServices_SelectionChangeCommitted(ByVal sender As Object, ByVal e As EventArgs) Handles cbTrackingServices.SelectionChangeCommitted
RefreshStatistics()
End Sub
End Class
End Namespace