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

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

在跟踪层上可以实现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的似乎都不支持。。


目录
相关文章
|
3月前
|
运维 Serverless 数据处理
函数计算产品使用问题之ComfyUI界面没有显示Manager按钮是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
缓存 前端开发
ProFlow 流程编辑器框架问题之创建一个自定义节点如何解决
ProFlow 流程编辑器框架问题之创建一个自定义节点如何解决
41 1
|
4月前
|
Serverless 文件存储 对象存储
函数计算操作报错合集之如何处理安装了ControlNet但无法加载出预览图并报错
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
函数计算操作报错合集之如何处理安装了ControlNet但无法加载出预览图并报错
|
3月前
|
开发框架 自然语言处理 前端开发
在Winform程序中动态绘制系统名称,代替图片硬编码名称
在Winform程序中动态绘制系统名称,代替图片硬编码名称
|
6月前
Qt表格中的自定义编辑组件---------------自定义代理QStyledItemDelegate
Qt表格中的自定义编辑组件---------------自定义代理QStyledItemDelegate
71 5
|
6月前
|
JavaScript 前端开发 Java
若依框架---选中某值 其他值自动回调填充
若依框架---选中某值 其他值自动回调填充
192 0
|
SQL BI
FineReport 下拉列表框作为动态参数的实现方式(不使用参数界面实现参数对数据过滤)
决策报表中,不使用参数界面实现参数对图表的绑定(如:下拉列表框值对条状图数据过滤) 实现方法:下拉列表框的`控件名`是参数名
392 0
FineReport 下拉列表框作为动态参数的实现方式(不使用参数界面实现参数对数据过滤)
|
前端开发 测试技术 数据库
【测试平台开发】十七、接口编辑页面实现下拉级联选择,绑定接口所属模块
【测试平台开发】十七、接口编辑页面实现下拉级联选择,绑定接口所属模块
【测试平台开发】十七、接口编辑页面实现下拉级联选择,绑定接口所属模块
|
关系型数据库 Go 数据库
如何将ABAP透明表的内容导入PostgreSQL数据库
如何将ABAP透明表的内容导入PostgreSQL数据库
168 0
如何将ABAP透明表的内容导入PostgreSQL数据库
|
图形学
Unity Inspector 给组件自动关联引用
通过声明的变量名称,主动关联引用.使用这个关联引用两种方式 给你组件继承 MonoAutoQuote 点击组件inspector 按钮执行 给你组件类添加[AAutoQuote] 特性 通过Plateface/SetSelectGameRef 执行 [AAutoQuote]public cla...
1169 0