地图动态标绘–C/S应用


** 作者:小诗 **

      动态标绘广泛应用于电力、通信和应急等多个行业和领域。它可以用形象生动的矢量符号描述各种业务对象,表示各种资源,还可以动态渲染业务进度和流程。SuperMap iObjects.NET产品提供了一套完整的态势推演解决方案,我们来具体看看如何能够在动态标绘产品基础上轻松完成二次开发和态势推演展现。

1、完成动态标绘二次开发需要两个关键要素:
      (1)标号库,可分为两类库:模型库(后缀为:.sym)和标号库(后缀为:.plot)。
      (2)工作空间和地图,并且地图中需要一个可编辑的CAD图层,因为标绘对象是存储在CAD数据集中的。

2、具备两个关键要素后接下来就可以着手进行二次开发了:
      1、构建地图控件,打开工作空间打开地图;这一步是iObjects.NET基础入门操作,就不详细讲了。
      2、打开标号库文件,添加动态标绘所需要用到的类库头文件using SuperMap.Plot,实现代码如下:

      3、为了清晰的将标号库中的标号展示出来,添加了一个TreeView来显示标号库节点。一个ListView来展示对应标号库节点下面存储的标号符号,可以借鉴引用,代码如下:

private void ShowSymbolItems()
        {
            if (this.treeView1.SelectedNode == null)
                return;

            this.listView1.Clear();
            this.imageList1.Images.Clear();

            this.Cursor = Cursors.WaitCursor;

            MySymbolInfo selectMsi = (MySymbolInfo)this.treeView1.SelectedNode.Tag;
            Int32 libId = selectMsi.libID;
            SymbolInfo node = selectMsi.symbolInfo;

            this.listView1.LargeImageList = this.imageList1;
            this.listView1.View = View.LargeIcon;
            this.imageList1.ImageSize = new Size(64, 64);

            if (node.ChildSymbolCount != 0)
            {
                for (int i = 0; i < node.ChildSymbolCount; i++)
                {
                    SymbolInfo geoSI = node.ChildSymbolList[i];
                    if (geoSI.SymbolType == SymbolInfoType.SYMBOL_NODE)
                    {                      
                        if (geoSI.SymbolCategory == 1)
                        {
                            if (geoSI.SymbolName == "")
                                continue;

                            string nameText = geoSI.SymbolName + "_" + geoSI.Code;
                            string filePath = GetDirNameAndCreate(this.treeView1.SelectedNode) + geoSI.Code + ".png";                        
                            Bitmap image = new Bitmap(filePath, false);
                            this.imageList1.Images.Add(image);

                            ListViewItem item = new ListViewItem();
                            item.ImageIndex = this.imageList1.Images.Count - 1;
                            ParamInfo pi = new ParamInfo();
                            pi.libID = libId;
                            pi.code = geoSI.Code;
                            item.Tag = pi;
                            item.Text = nameText;
                            this.listView1.Items.Add(item);
                        }
                        else
                        {
                            ParamInfo pi = new ParamInfo();
                            pi.libID = libId;
                            pi.code = geoSI.Code;

                            string nameText = geoSI.SymbolName + "_" + geoSI.Code;

                            ListViewItem item = new ListViewItem();
                            item.Tag = pi;
                            string filePath = GetDirNameAndCreate(this.treeView1.SelectedNode) + geoSI.Code + ".png";
                       
                            if (File.Exists(@filePath))
                            {
                                Bitmap image = new Bitmap(filePath, false);
                                this.imageList1.Images.Add(image);
                                item.ImageIndex = this.imageList1.Images.Count - 1;
                            }

                            item.Text = nameText;
                            this.listView1.Items.Add(item);
                        }
                    }
                }
            }
            this.Cursor = Cursors.Arrow;
        }

实现效果如下:

      4、添加完标号库后做好编辑准备,除了要保证地图中有一个可编辑的CAD图层外,编辑之前还需要先构造一个二维图形标绘类,然后给二维图形标绘类设置二维地图的控件器。具体代码如下 :

PlotMapping plt = new SuperMap.Plot.PlotMapping();
plt.SetMapControl(mapcontrol);

      5、做好准备后就可以进行编辑标号对象了,以指挥所、折线、贝塞尔箭头的绘制为例,代码如下:

//绘制指挥所
SuperMap.Plot.ActionGraphicObject ago = new SuperMap.Plot.ActionGraphicObject();
ago.Parma1 = 100;
ago.Parma2 = 2800;
plt.ActionGraphicObject = ago;

//绘制折线
SuperMap.Plot.ActionGraphicObject ago = new SuperMap.Plot.ActionGraphicObject();
ago.Parma1 = 0;
ago.Parma2 = 24;
plt.ActionGraphicObject = ago;

//绘制贝塞尔箭头
SuperMap.Plot.ActionGraphicObject ago = new SuperMap.Plot.ActionGraphicObject();
ago.Parma1 = 22;
ago.Parma2 = 1004;
plt.ActionGraphicObject = ago;

(ago.Parma1为标号库编号,ago.Parma2为标号对象编号);

      6、编辑好对象就可以来进行态势推演了,态势推演由态势推演组和态势推演动画构成,态势推演组之间是顺序播放的关系,态势推演组内是以时间为序的播放关系,态势推演由一个唯一的管理类来进行管理,态势推演组的创建等都依赖于这个管理类。

String groupName = GetAvailableGroupName();
animationGroup = am.AddAnimationGroup(groupName);

animation = am.CreateAnimation(AnimationType.BlinkAnimation);
animation.SetName(GetAvailableGroupName(Animationtype, animationGroup));
GeoGraphicObject pgeo = geo as GeoGraphicObject;
animation.SetGeometry(pgeo, mapcontrol);
animationGroup.AddAnimation(animation);

      7、需要注意的一点是,态势推演的计时器触发是由外部来提供,以适应不同平台的要求,因此,要开发者自己创建一个计时器,并在计时器的触发事件里触发态势推演执行,代码如下:

 void timer1_Tick(object sender, EventArgs e)
{
  am.Excute();
}

      8、态势推演播放、暂停、重置也都是由这个动画管理类来控制的:

am.Play();
am.Pause();
am.Reset();

可以参考一下源码:https://pan.baidu.com/share/init?shareid=63508671&uk=1997594217, key:jno6

转载自:https://blog.csdn.net/supermapsupport/article/details/52702850

You may also like...

退出移动版