在跟踪层上可以实现GPS点动态跟踪,路径显示等等功能。总的来说,跟踪层是用来跟踪活动物体的。比如说下面的这个航班模拟图,飞机的运动其实是在跟踪层上实现的。
Engine提供了跟踪层的接口IGraphicTracker,如果要实现好像飞机那样的图标还需要用到IGraphicTrackerSymbol接口。根据Engine提供的例子GraphicTrackerMap,大概介绍下这个东西的实现方法。
首先要定义好相应的接口:
//图标。。
public Dictionary<int, IGraphicTrackerSymbol> m_GTSymbols = null;
//动态展示图层
public IGraphicTracker m_graphicTracker = null;
Dictionary要添加using System.Collections.Generic;命名空间。这里写成这种形式其实是为了方便添加多个symbol。
其次,要初始化跟踪层和定义好图标。可以在formload中写。
//初始化跟踪层
m_graphicTracker = new GraphicTrackerClass();
m_graphicTracker.Initialize(m_mapControl.Map as IBasicMap);
// m_move_dist = m_mapControl.Extent.Width / 500;
//创建符号。。
m_GTSymbols = new Dictionary<int, IGraphicTrackerSymbol>(3);
CreateGTSymbols();
//画图标
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 = 111;//areoplane
characterMarkerSymbol.Size = 20.0;
IGraphicTrackerSymbol gtSymbol1 = m_graphicTracker.CreateSymbol(characterMarkerSymbol as ISymbol, null);
m_GTSymbols.Add(0, gtSymbol1);
//comboSymbolID.Items.Add("Blue Pin");
}
来到这里有个很关键的问题,就是跟踪层的初始化必须还得在MapReplaced事件中再来一次。这里我也不是很明白,不打开地图的时候就已经有了跟踪层,打开之后反而没了,所以必须再初始化一次。
然后的就是把图标写到跟踪层里,这样就显示了出来。
private void 测试按钮4ToolStripMenuItem_Click(object sender, EventArgs e)
{
//获得这个图标
IGraphicTrackerSymbol gtSymbol = this.m_GTSymbols[0]; // get the first one
if (gtSymbol == null)
return;
//添加点和图标到跟踪层
//Add the point and symbol to the GraphicTracker
//This returns an id that you can store in a Dictionary to use later to
//(e.g. select from combo and highlight, change symbol, change label)
int id = m_graphicTracker.Add(vpoint as IGeometry, gtSymbol);
m_graphicTracker.SetLabel(id, "ID " + id.ToString());
//m_GTGeometries.Add(id, point as IGeometry);
timer2.Start();
}
上面定义的timer2是用来控制动态变化的,只要改变位置,调用MoveTo方法即可。
private void timer2_Tick(object sender, EventArgs e)
{
vpoint.X += m_move_dist;
vpoint.Y += m_move_dist;
double x = vpoint.X ;
double y = vpoint.Y ;
m_graphicTracker.MoveTo(0, x, y, 0);
}
就这样,一个能够动的飞机就做出来啦。。运动的轨迹需要根据具体的需要来控制坐标。。我的最终目的是要通过时间点的坐标点来控制。。。下面是样例。。
自定义图标
用的是IPictureMarkerSymbol接口,例子程序里有了一个很好的函数,我稍微改了下参数,做成了可以改变路径的了。返回值是ISymbol。
private ISymbol CreateStandardLogoSymbol(string m_logoPath)
{
IPictureMarkerSymbol pictureMarkerSymbol = new PictureMarkerSymbolClass();
pictureMarkerSymbol.CreateMarkerSymbolFromFile(esriIPictureType.esriIPictureBitmap, m_logoPath);
pictureMarkerSymbol.Size = 100;
//IColor whiteTransparencyColor = ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(255, 255, 255)) as IColor;
//pictureMarkerSymbol.BitmapTransparencyColor = whiteTransparencyColor;
return pictureMarkerSymbol as ISymbol;
}
重新读了一下IGraphicTracker的接口说明,发现IGraphicTracker既能够接受图标,又能够创造图标。。添加用的是add,创造的话用的是CreateSymbol...很幸运的是,CreateSymbol的参数就是ISymble接口的。
于是乎,很简单的几句话就搞定了:
ISymbol mysymbol; //定义一个接口
//调用上面的函数实例化。。
mysymbol = CreateStandardLogoSymbol(@"E:\PROJECT\MyFirstArcEngine\MyFirstArcEngine\Image\refresh.bmp");
//用IGraphicTracker创建IGraphicTrackerSymbol
IGraphicTrackerSymbol gtSymbol1 = m_graphicTracker.CreateSymbol(mysymbol, null);
m_GTSymbols.Add(0, gtSymbol1);
一切就顺理成章了。。不过经过实验,似乎只能支持bmp的图标,png和icon的似乎都不支持。。