Engine中的跟踪层使用方法以及自定义图标

在跟踪层上可以实现GPS点动态跟踪,路径显示等等功能。总的来说,跟踪层是用来跟踪活动物体的。比如说下面的这个航班模拟图,飞机的运动其实是在跟踪层上实现的。

Engine中的跟踪层使用方法以及自定义图标

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);
       }
 

就这样,一个能够动的飞机就做出来啦。。运动的轨迹需要根据具体的需要来控制坐标。。我的最终目的是要通过时间点的坐标点来控制。。。下面是样例。。Engine中的跟踪层使用方法以及自定义图标



自定义图标

用的是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的似乎都不支持。。


上一篇:TeamBition 网盘使用感受


下一篇:ArcEngine中动态移动点的效果