基础应用开发

最后更新时间:2019年8月16日

欢迎屏

3.1.1 示例功能概述

实现功能:启动数据中心应用程序之前将会先显示欢迎屏;

效果预览如下图所示:

在数据中心设计器中加载欢迎屏

图 3-1 在数据中心设计器中加载欢迎屏

3.1.2 实现思路及关键代码

步骤一:打开VS 2010新建一个MapGIS项目,命名为“WelcomeScreenDemo”;在该MapGIS项目中添加一个WelcomeScreen插件项,命名为WelcomScreen1,在属性窗口中设置属性ScreenImage,指定需要在欢迎屏幕上显示的图片,图片类型为“.ICO|.BMP|.PNG”,并设置Result属性值为“Yes”或者“No”,设置完成后点击确定即可;

步骤二:此时的欢迎屏是一张简单的界面图片,可以定义一个对话框并在Show()方法添加代码实现对话框显示图片的功能。在这里我们通过一个定义好的对话框显示图片为例说明该功能的用法。

在MapGIS项目中添加引用,引用文件为“MapGIS.PlugUtility.dll”,打开WelcomeScreen1.cs文件,添加MapGIS.PlugUtility.dll引用代码:

程序代码 3 1 添加引用关键代码

    using MapGIS.PlugUtility;

然后找到Show方法添加如下代码:

程序代码 3 2 显示欢迎屏关键代码

public void Show()
{
    //定义一个欢迎屏显示窗体
    ScreenForm sf = new ScreenForm(this.ScreenImage);
    sf.Show();
}

地图及基本操作

3.2.1 示例功能概述

实现功能:用户可以点击菜单栏下的打开地图,可以实现弹框选择地图文档,并打开该地图文档,自动显示该文档第一个地图,同时还提供了地图的基本操作,如放大,缩小等。

效果预览如下图所示:

初始化界面示意图

图 3-2 初始化界面示意图

点击打开地图后示意图

图 3-3 点击打开地图后示意图

3.2.2 实现思路及关键代码

插件项:MenuBar(菜单栏)、Command(命令按钮)。

步骤一:打开VS 2010新建一个MapGIS项目,命名为“MapBaseOperate”;在该MapGIS插件项目中创建一个MenuBar菜单栏,将Name属性值设为“MapViewMBar”,Caption属性值设为“地图基本操作”;再添加6个Command插件项(命名为OpenMapCmd、MapZoominCmd、MapZoomoutCmd、MapMoveCmd、MapRestoreCmd、MapRefreshCmd)实现的功能分别为打开地图、地图放大、地图缩小、地图移动、地图复位、地图更新;

步骤二:将Command插件项绑定到菜单栏中:在MapViewMBar.cs初始化函数中添加如下代码:

程序代码 1 3 MapViewMBar()关键代码

      public MapViewMBar()
        {
            items = new IItem[6];
            items[0] = new Item();
            items[0].Key = "MapBaseOperate.OpenMapCmd"; //添加打开地图
            items[0].ShowLargeImage = false; //是否显示大图标
            items[0].Group = false; //是否分组

            items[1] = new Item();
            items[1].Key = "MapBaseOperate.MapZoominCmd";//添加地图放大
            items[1].ShowLargeImage = false;
            items[1].Group = false;

            items[2] = new Item();
            items[2].Key = "MapBaseOperate.MapZoomoutCmd"; //添加地图缩小
            items[2].ShowLargeImage = false;
            items[2].Group = false;

            items[3] = new Item();
            items[3].Key = "MapBaseOperate.MapMoveCmd"; //添加地图移动
            items[3].ShowLargeImage = false;
            items[3].Group = false;

            items[4] = new Item();
            items[4].Key = "MapBaseOperate.MapRestoreCmd"; //添加地图复位
            items[4].ShowLargeImage = false;
            items[4].Group = false;

            items[5] = new Item();
            items[5].Key = "MapBaseOperate.MapRefreshCmd"; //添加地图更新
            items[5].ShowLargeImage = false;
            items[5].Group = false;
        }

步骤二:打开地图文档:在OpenMapCmd.cs文件中定义一个应用框架对象全局变量(IApplication)hk,在OnCreate方法中添加如下代码:

程序代码 1 4 OnCreate关键代码

       public void OnCreate(IApplication hook)
        {
            hk = hook;
        }

打开地图文档并显示地图,则可利用已有的地图视图控件显示,调用框架对象hk的工作空间引擎对象的FireMenuItemClickEvent 方法;在OnClick方法体内实现打开地图文档的功能,关键代码如下:

程序代码 1 5 打开地图文档关键代码

       public void OnClick()
        {
            //变量定义
            Map map = null;
            string docuname = null;
            Document doc = null;

            //选择打开的地图文档
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Multiselect = true;
            ofd.Filter = ".mapx(地图XML文档)|*.mapx|.map(地图XML文档)|*.map";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                docuname = ofd.FileName;
            }

            //打开指定的地图文档
            doc = this.hk.Document;
            doc.Open(docuname);
            Maps maps = doc.GetMaps();
            if (maps.Count > 0)
            {
                map = maps.GetMap(0);
                map.get_Layer(0).State = LayerState.Active;
            }
     
            //打开自带的地图视图            hk.WorkSpaceEngine.FireMenuItemClickEvent("MapGIS.WorkSpace.Style.PreviewMap", map);           
        }

步骤三:地图基本操作功能,以地图放大为例:在MapZoominCmd.cs文件中定义一个应用框架对象全局变量(IApplication)hk,在OnCreate方法中添加代码将框架对象赋值给hk,代码参考步骤二;在OnClick方法实现地图放大功能,关键代码如下:

程序代码 1 6 地图放大功能关键代码

     public void OnClick()
        {
            //判断是否有地图视图存在
            if ((hk.ActiveContentsView as IMapContentsView) == null)
                return;
            //获取当前处于激活状态的地图视图控件
            MapControl  mapctr = (hk.ActiveContentsView as IMapContentsView).MapControl;
            //放大地图
            mapctr.ZoomIn();
        }

注意:地图缩小、地图移动、地图复位和地图更新功能和地图放大功能类似,唯一不同的就是各个功能实现的方法不同,分别调用地图视图MapControl对象的ZoomOut()、Move()、 Restore()和Refresh()方法。

步骤四:在MapGIS.AppLoader.exe上面加载完MapGIS.WorkSpace.Plugin.dll,MapBaseOperate.dll这个2个库后,就可以实现该功能。此加载的所有库的路径应该在VS程序自己设定的输出目录下库的路径,如果没有设置,则在LayerFeatureEdit\bin\Debug中。

图层要素编辑

3.3.1 示例功能及概述

实现功能:自动打开指定地图文档,并在地图视图中显示地图文档中第一个地图,还有一个名为图层要素编辑的菜单栏可以修改当前地图中处于编辑状态第一个图层的几何参数。

效果预览如下图所示:

修改要素图形参数示意图

图 3-4 修改要素图形参数示意图1

修改line线颜色为红色示意图

图 3-5修改line线颜色为红色示意图

3.3.2 实现思路及关键代码

插件项:MenuBar(菜单栏)、Command(命令按钮)。

步骤一:打开VS 2010新建一个MapGIS项目,命名为“LayerFeatureEdit”;在该MapGIS插件项目中创建一个MenuBar菜单栏,将Name属性值设为“LayerMenuBar”,Caption属性值设为“图层操作”;再添加一个Command插件项(命名为ModifyLayerCmd)实现修改图层参数的功能;具体添加代码请参考1.2小节的内容;

步骤二:在ModifyLayerCmd.cs文件中实现修改图层参数功能,步骤如下所述。

(1) 获取当前激活地图视图插件对象(IMapContentsView):调用框架对象hk的ActiveContentsView 属性;

(2) 获取当前激活地图(Map)map:调用IMapContentsView的MapControl属性获取当前地图视图控件对象(MapControl),再调用MapControl 的ActiveMap 属性获取当前激活地图;

(3) 获取图层对应的矢量类(IVectorCls)vecCls:调用map对象的GetEditLayer 方法获取目标图层对象(MapLayer),再调用MapLayer的GetData方法获取目标图层对应的矢量类;

(4) 修改图层关联的要素实体的图形参数:调用vecCls 对象的UpdateInfo 方法;

(5) 在ModifyLayerCmd.cs文件中的OnClick方法中实现该功能,关键代码如下:

程序代码 3 7 修改图层参数功能的关键代码

   public void OnClick()
        {
            //获取当前激活视图的MapControl属性
            IMapContentsView mapContView = null;
            mapContView = hk.ActiveContentsView as IMapContentsView;
            if (mapContView == null) return;

            //地图视图控件
            MapControl mapctr = mapContView.MapControl;
            Map map = mapctr.ActiveMap;

            MessageBox.Show("此操作将修改第一个地图的第一个处于激活状态的图层所有要素为红色!!!");

            List maplayer = map.GetEditLayer(EditLayerType.All, SelectLayerControl.Editable);
            
            if (maplayer == null || maplayer.Count == 0) return;

            //获取激活地图的处于编辑状态的第一个图层对象
            IVectorCls vecCls = (IVectorCls)maplayer[0].GetData();
            if (vecCls == null)
            {
                MessageBox.Show("当前图层不是简单要素类图层,修改失败!!!");
                return;
            }

            //根据图层几何类型来设置几何信息对象
            LinInfo lineinfo = new LinInfo(); //线  
            PntInfo pntinfo = new PntInfo();  //点
            RegInfo reginfo = new RegInfo();  //区

            //图形信息设置
            int[] clr = new int[3];
            clr[0] = 6;
            lineinfo.OutClr = clr;
            pntinfo.OutClr = clr;
            reginfo.FillClr = 6;

            GeomType gtype = (vecCls as SFeatureCls).GeomType;

            //获取类中所有对象的OID
            RecordSet rcdset = null;
            QueryDef querydef = new QueryDef();
            rcdset = vecCls.Select(querydef);

            if (rcdset == null) return;

            //更新对象的图形参数信息
            rcdset.MoveFirst();
            for (int i = 1; i <= rcdset.Count; i++)
            {
                if (gtype == GeomType.Lin)
                    vecCls.UpdateInfo(rcdset.CurrentID, lineinfo);
                if (gtype == GeomType.Pnt)
                    vecCls.UpdateInfo(rcdset.CurrentID, pntinfo);
                if (gtype == GeomType.Reg)
                    vecCls.UpdateInfo(rcdset.CurrentID, reginfo);

                rcdset.MoveNext();
            }
            mapctr.Restore();
        }

步骤三:在MapGIS.AppLoader.exe上面加载完MapGIS.WorkSpace.Plugin.dll,LayerFeatureEdit.dll这个2个库后,就可以实现该功能。此加载的所有库的路径应该在VS程序自己设定的输出目录下库的路径,如没有设置,则是在LayerFeatureEdit\bin\Debug中。