MapGIS 10.2 二维插件式二次开发 手册 武汉中地数码科技有限公司 中国 武汉 2017 年 3 月

Similar documents
// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

ASP.NET实现下拉框二级联动组件

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

untitled

untitled

Microsoft Word - 第3章.doc

基于ECO的UML模型驱动的数据库应用开发1.doc

无类继承.key

untitled

untitled

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

untitled

<4D F736F F D E67696E652B ECFE0B9D8C8FDCEACB9A6C4DCC4A3BFE9BDE9C9DC5FB6FE5F2E646F63>

Microsoft Word - ch04三校.doc

AVEVA .Net 菜单自定义

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

untitled

新・解きながら学ぶJava

Microsoft Word - 01.DOC

INTRODUCTION TO COM.DOC

untitled

untitled

Guava学习之Resources

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

<4D F736F F D E67696E652B ECFE0B9D8C8FDCEACB9A6C4DCC4A3BFE9BDE9C9DC5FC8FD5F2E646F63>

Microsoft Office SharePoint Server MOSS Web SharePoint Web SharePoint 22 Web SharePoint Web Web SharePoint Web Web f Lists.asmx Web Web CAML f

untitled

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

《大话设计模式》第一章

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

CHAPTER VC#

概述

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

Microsoft Word - administrative-law-08.doc

ExcelUtility 类库使用说明 ( 续 ) 开发 / 设计 : 左文俊 第一个新增功能, 列宽自适应, 当超过 30 个字符则将单元格内容设为换行 任意一个无模板的导出方法均支持该功能, 示例代码如下 : /// <summary> /// 测试方法

untitled

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

<4D F736F F F696E74202D DB1D0AE76B77CBEC7ABE4B946B1D0BEC7A4C0A8C928A764A7D3AB69292E >

untitled

<4D F736F F D20A8CFA952A6A12DAED1ADB1B8EAAEC62E646F63>

C 1

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft Word - Learn Objective-C.doc

新版 明解C++入門編

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

LEFT, RIGHT // 左 // 右 (2) 当图片移动后, 按钮的坐标发生改变, 此操作通过 setloca tion() 方法实现 setlocation() 方法是从 Component 类继承的, 其定义如下 : public void setlocation(int x, int y

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

untitled

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

untitled

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F


OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

Strings

EJB-Programming-3.PDF

投影片 1

VB程序设计教程

「西醫基層總額支付委員會《第28次委員會議紀錄

<4D F736F F D20D1F4B9E2B2D3C0C3B5C4C8D5D7D32E646F63>

Microsoft Word - 2B802內文.doc

東區校園中法治教育種子師資教學研習營

閱 讀 素 材 V.S 分 組 方 式 的 差 異 化 教 學 工 具 表 班 級 :( ) 閱 讀 素 材 V.S 分 組 方 式 獨 立 閱 讀 夥 伴 閱 讀 ( 同 質 性 ) 夥 伴 閱 讀 ( 異 質 性 ) 友 善 陪 伴 虛 心 受 教 國 語 日 報 新 聞 生 活 文 藝 兒 童

Microsoft Word - 1HF12序.doc

Microsoft Word - 讀報看科普─人體篇_橫_.doc

鍟嗗搧瑙傚療鈥㈤挗鏉

席 远 杨 一 人 了, 正 当 她 开 枪 时 却 发 现 子 弹 没 了 该 死, 只 能 赤 手 空 拳 了 洛 水 云 与 席 远 杨 交 起 手 来, 洛 水 云 出 手 招 招 致 命 想 那 席 远 杨 也 不 是 泛 泛 之 辈, 很 快 掌 握 了 洛 水 云 出 招 路 数 看

特 别 提 示 一 依 据 中 华 人 们 共 和 国 证 券 法 ( 以 下 简 称 证 券 法 ) 上 市 公 司 收 购 管 理 办 法 ( 以 下 简 称 收 购 办 法 ) 公 开 发 行 证 券 的 公 司 信 息 披 露 内 容 与 格 式 准 则 第 15 号 权 益 变 动 报 告

HK 08/ HK 09/ HK 03/ HK 01/ HK 05/ HK 05/ HK 05/

HK 05/ HK 08/ HK 11/ HK 03/ HK 09/ HK 03/ HK 09/

HK 11/ HK 01/ HK 07/ HK 07/ HK 08/ HK 03/ HK 11/

1.5招募说明书(草案)

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

01_Service

Microsoft Word - 新1-12.doc

chap07.key

概述

Microsoft PowerPoint - ch6 [相容模式]

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

t08phip

PowerPoint 簡報

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

ex

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Chapter 9: Objects and Classes

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

untitled

X713_CS_Book.book

第一章 章标题-F2 上空24,下空24

建模与图形思考

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

Transcription:

MapGIS 10.2 二维插件式二次开发 手册 武汉中地数码科技有限公司 中国 武汉 2017 年 3 月

MapGIS 开发系列手册 目 录 第 1 章基础应用... 1 1.1 欢迎屏... 1 1.1.1 示例功能概述... 1 1.1.2 实现思路及关键代码... 1 1.2 地图及基本操作... 2 1.2.1 示例功能概述... 2 1.2.2 实现思路及关键代码... 3 1.3 图层要素编辑... 6 1.3.1 示例功能及概述... 6 1.3.2 实现思路及关键代码... 7 第 2 章进阶应用... 10 2.1 自定义地图视图... 10 2.1.1 示例功能概述... 10 2.1.2 实现思路及关键代码... 11 2.2 交互式几何查询... 13 2.2.1 示例功能概述... 13 2.2.2 实现思路及关键代码... 15 2.3 插件间通讯... 20 2.3.1 示例功能概述... 20 2.3.2 实现思路及关键代码... 21 2.4 自定义工作空间... 22 2.4.1 示例功能概述... 22 2.4.2 实现思路及关键代码... 23 2

MapGIS 10.2 二维插件式二次开发手册 第 1 章基础应用 1.1 欢迎屏 1.1.1 示例功能概述 实现功能 : 启动数据中心应用程序之前将会先显示欢迎屏 ; 效果预览如下图所示 : 图 1.1 在数据中心设计器中加载欢迎屏 1.1.2 实现思路及关键代码 步骤一 : 打开 VS 2010 新建一个 MapGIS 项目, 命名为 WelcomeScreenDemo ; 在该 MapGIS 项目中添加一个 WelcomeScreen 插件项, 命名为 WelcomScreen1, 在属性窗口中设置属性 ScreenImage, 指定需要在欢迎屏幕上显示的图片, 图片类型为.ICO.BMP.PNG, 并设置 Result 属性值为 Yes 或者 No, 设置完成后点击确定即可 ; 步骤二 : 此时的欢迎屏是一张简单的界面图片, 可以定义一个对话框并在 Show() 方法添加代码实现对话框显示图片的功能 在这里我们通过一个定义好的对话框显示图片为例说明该功能的用法 1

MapGIS 开发系列手册 在 MapGIS 项目中添加引用, 引用文件为 MapGIS.PlugUtility.dll, 打开 WelcomeScreen1.cs 文件, 添加 MapGIS.PlugUtility.dll 引用代码 : 程序代码 1-1 添加引用关键代码 using MapGIS.PlugUtility; 然后找到 Show 方法添加如下代码 : 程序代码 1-2 显示欢迎屏关键代码 public void Show() // 定义一个欢迎屏显示窗体 ScreenForm sf = new ScreenForm(this.ScreenImage); sf.show(); 1.2 地图及基本操作 1.2.1 示例功能概述 实现功能 : 用户可以点击菜单栏下的打开地图, 可以实现弹框选择地图文档, 并打开该 地图文档, 自动显示该文档第一个地图, 同时还提供了地图的基本操作, 如放大, 缩小等 效果预览如下图所示 : 2

MapGIS 10.2 二维插件式二次开发手册 图 1.2 初始化界面示意图 图 1.3 点击打开地图后示意图 1.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; // 是否分组 3

MapGIS 开发系列手册 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() 4

MapGIS 10.2 二维插件式二次开发手册 // 变量定义 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; // 获取当前处于激活状态的地图视图控件 5

MapGIS 开发系列手册 MapControl IMapContentsView).MapControl; mapctr = (hk.activecontentsview as // 放大地图 mapctr.zoomin(); 注意 : 地图缩小 地图移动 地图复位和地图更新功能和地图放大功能类似, 唯一不同的就是各个功能实现的方法不同, 分别调用地图视图 MapControl 对象的 ZoomOut() Move() Restore() 和 Refresh() 方法 步骤四 : 在 MapGIS.AppLoader.exe 上面加载完 MapGIS.WorkSpace.Plugin.dll, MapBaseOperate.dll 这个 2 个库后, 就可以实现该功能 此加载的所有库的路径应该在 VS 程序自己设定的输出目录下库的路径, 如果没有设置, 则在 LayerFeatureEdit\bin\Debug 中 1.3 图层要素编辑 1.3.1 示例功能及概述 实现功能 : 自动打开指定地图文档, 并在地图视图中显示地图文档中第一个地图, 还有 一个名为图层要素编辑的菜单栏可以修改当前地图中处于编辑状态第一个图层的几何参数 效果预览如下图所示 : 6

MapGIS 10.2 二维插件式二次开发手册 图 1.4 line 类的示意图 图 1.5 修改 line 线颜色为红色示意图 1.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 方法中实现该功能, 关键代码如下 : 程序代码 1-7 修改图层参数功能的关键代码 public void OnClick() 7

MapGIS 开发系列手册 // 获取当前激活视图的 MapControl 属性 IMapContentsView mapcontview = null; mapcontview = hk.activecontentsview as IMapContentsView; if (mapcontview == null) return; // 地图视图控件 MapControl mapctr = mapcontview.mapcontrol; Map map = mapctr.activemap; 层所有要素为红色!!!"); MessageBox.Show(" 此操作将修改第一个地图的第一个处于激活状态的图 SelectLayerControl.Editable); List<MapLayer> maplayer = map.geteditlayer(editlayertype.all, 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; 8

MapGIS 10.2 二维插件式二次开发手册 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 中 9

MapGIS 开发系列手册 第 2 章进阶应用 2.1 自定义地图视图 2.1.1 示例功能概述 实现功能 : 打开地图文档, 并显示该地图文档里的第一个地图 效果预览如下图所示 : 10

MapGIS 10.2 二维插件式二次开发手册 图 2.1 开始界面 图 2.2 打开地图文档示意图 2.1.2 实现思路及关键代码 插件项 :MenuBar( 菜单栏 ) Command( 命令按钮 ) DockWindow( 停靠窗口 ) MapContentsView( 地图视图 ) 步骤一 : 打开 VS 2010 新建一个 MapGIS 项目, 命名为 CustomMapViewDemo, 在该 MapGIS 插件项目中创建一个 MenuBar 菜单栏, 将 Name 属性值设为 MapOperationMB, Caption 属性值设为 进阶应用 ; 添加一个 Command 插件项 ( 命名为 OpenDocCmd ) 打开地图文档视图功能 ; 添加一个 MapContentsView 插件项 ( 命名为 MapContentsView ) 用于承载地图视图控件 ; 在 VS 2010 中自定义一个用户控件, 命名为 UserControl1, 在控件窗体中拖入一个地图视图 MapControl 控件, 设置其 Modifiers 属性为 public,dock 属性为 Fill; 步骤二 : 将 OpenDocCmd 命令按钮插件项添加到 MapOperationMB 菜单项中, 具体实现代码请参考 1.2 小节的内容 ; 步骤三 : 将 UserControl1 自定义用户控件绑定到 MapContentsView 地图视图插件项中, 具体实现步骤如下 (1) 在 MapContentsView.cs 文件中定义一个自定义用户控件 (UserControl1 对象 ) usercontrol 的全局变量 ; (2) 修改 MapContentsView.cs 文件中的 ObjecthWnd 属性代码如下所示 : 程序代码 2-1 修改 ObjecthWnd 属性代码 public Control ObjecthWnd 11

MapGIS 开发系列手册 get return usercontrol; (3) 修改 MapControl 属性代码如下所示之后就完成了绑定功能 程序代码 2-2 修改 MapControl 属性代码 public MapGIS.GISControl.MapControl MapControl get return usercontrol.mapcontrol1; 步骤四 : 在 OpenDocCmd.cs 文件中实现打开地图文档, 并显示该地图文档里的第一个地图功能, 具体步骤如下 (1) 在 OpenDocCmd.cs 文件中定义一个应用框架 (IApplication 对象 )hk 全局变量, 定义一个地图视图控件 (MapControl 对象 )mapctrl 全局变量, 获取插件容器中的地图视图插件 MapContentsView 对象, 然后根据地图视图插件 MapContentsView 对象来获取对应的 MapContorl 地图视图控件对象, 在 OnCreate 方法中的关键代码如下 : 程序代码 2-3 获取 MapControl 控件关键代码 public void OnCreate(IApplication hook) hk = hook; // 内容视图控件 IContentsView cv = null; // 获取指定的内容视图控件 hk.plugincontainer.contentsviews.trygetvalue("custommapviewdemo.mapcontentsview", out cv); // 获取地图视图插件项 IMapContentsView mapview = cv as IMapContentsView; // 获取该视图的 MapControl 属性 mapctrl = mapview.mapcontrol; (2) 打开地图文档, 将地图文档中的第一个地图显示到 MapControl 中, 在 OnClick 方法中关键代码如下 : 程序代码 2-4 显示地图关键代码 public void OnClick() Map map = null; string docname = null; 12

MapGIS 10.2 二维插件式二次开发手册 if (mapctrl == null) return; Document doc = this.hk.document; // 选择打开地图文档 OpenFileDialog ofd = new OpenFileDialog(); ofd.multiselect = true; ofd.filter = "( 地图文档 mapx) *.mapx ( 地图 map) *.map"; if (ofd.showdialog() == DialogResult.OK) // 获取打开的地图文档的名称 docname = ofd.filename; if (doc == null) return; doc.open(docname); Maps maps = doc.getmaps(); if (maps.count > 0) // 获取当前第一个地图 map = maps.getmap(0); // 设置地图的第一个图层为激活状态 map.get_layer(0).state = LayerState.Active; mapctrl.activemap = map; mapctrl.restore(); 步骤五 : 在 MapGIS.AppLoader.exe 上面加载完 MapGIS.WorkSpace.Plugin.dll 此库后, 用 户单击 打开地图文档, 打开地图文档, 并显示该地图文档里的第一个地图 2.2 交互式几何查询 2.2.1 示例功能概述 实现功能 : 用户在默认地图窗口中拉框查询, 闪烁查询结果, 属性列表中显示当前被查 询中的第一个激活图层中的记录属性 13

MapGIS 开发系列手册 效果预览如下图所示 : 图 2.3 打开一幅地图界面示意图 14

MapGIS 10.2 二维插件式二次开发手册 图 2.4 拉框查询示意图 图 2.5 查询省级行政区结果图 2.2.2 实现思路及关键代码 插件项 :MenuBar( 菜单栏 ) Command( 命令按钮 ) DockWindow( 停靠窗口 ) 步骤一 : 打开 VS 2010 新建一个 MapGIS 项目, 命名为 InterGeomQuery, 在该 MapGIS 插件项目中创建一个 MenuBar 菜单栏, 将 Name 属性值设为 SetBasToolMBar, Caption 属性值设为 查询方式 ; 添加 2 个 Command 插件项 ( 命名为 QueryByRectCmd, QueryByCirCmd ) 分别实现矩形查询和圆查询的功能 ; 添加一个 DockWindow 插件项 ( 命名为 DockWindow ) 用于承载属性视图控件 ; 在 VS 2010 中自定义一个用户控件, 命名为 AttUserControl, 在控件窗体中拖入一个属性视图 AttControl 控件, 设置其 Modifiers 属性为 public,dock 属性为 Fill; 步骤二 : 将 QueryByRectCmd 和 QueryByCirCmd 两个命令按钮插件项添加到 SetBasToolMBar 菜单项中, 具体实现代码请参考 1.2 小节的内容 ; 步骤三 : 将 AttUserControl 自定义用户控件绑定到 DockWindow 停靠窗口插件项中, 具体实现步骤如下 (1) 在 DockWindow.cs 文件中自定义一个属性视图控件 (AttUserControl 对象 )attctrl 全局变量 ; (2) 修改 ChildHWND 属性字段代码如下所示, 即可实现绑定功能 : 程序代码 2-5 修改 ChildHWND 属性字段代码 public Control ChildHWND 15

MapGIS 开发系列手册 get return attctrl; 步骤四 : 创建自定义类, 命名为 SelectToolClass, 该类继承并重写 GISBasTool 类, 在 SelectToolClass 类定义一个选择工具控件 (SelectTool 对象 )seltool 全局变量, 注册 seltool 的选择事件, 并在事件中完成查询功能, 关键代码如下 : 程序代码 2-6 SelectToolClass 类中的全局变量 // 地图视图控件 MapControl mapctrl; // 交互工具 : 选择工具控件 SelectTool seltool; // 选择数据时的数据类型过滤 SelectDataType datatype; // 地理类对象基类接口 IBasCls basclass = null; // 结果集对象 RecordSet rcdset = null; // 属性视图控件 AttControl attctrl = null; // 查询选择方式 : 圆选择 多边形选择 矩形选择 SelectType seltype; 程序代码 2-7 SelectToolClass 类的构造函数代码 /// <summary> /// 实现拉框选择查询 /// </summary> /// <param name="control"> 地图视图控件 </param> /// <param name="datatype"> 选择数据时的数据类型过滤 </param> /// <param name="attctr"> 属性视图控件 </param> /// <param name="seltype"> 查询选择方式 : 矩形选择 </param> public SelectToolClass(MapControl control, SelectDataType datatype, AttControl attctr,selecttype seltype) : base() this.mapctrl = control; this.datatype = datatype; this.attctrl = attctr; this.seltype = seltype; 16

MapGIS 10.2 二维插件式二次开发手册 // 查询选择项 SelectOption selopt = new SelectOption(); selopt.datatype = datatype; // 选择数据时的类型过滤类型 selopt.selmode = SelectMode.Multiply; // 选择模式 selopt.unmode = UnionMode.Copy; // 结果数据合并模式 型 selopt.layerctrl = SelectLayerControl.Editable; // 选择数据时的图层过滤类 // 创建圆交互工具 seltool = new SelectTool(control, seltype, selopt, SpaQueryMode.MBRIntersect, control.transformation); // 注册选择事件 seltool.selected += new SelectTool.SelectHandler(selTool_Selected); 程序代码 2-8 SelectTool 的 Selected 事件响应关键代码 void seltool_selected(object sender, SelectEventArgs e) if (e.selset!= null) this.mapctrl.flashselectset(); int objcount = getselectsetcount(e.selset); MessageBox.Show(" 共选择了 " + objcount + " 个图元 "); 程序代码 2-9 获取选择集中的个数中的关键代码 /// <summary> /// 获取选择集中的个数 /// </summary> /// <param name="set"> 选择集对象 </param> /// <returns> 选择集中的个数 </returns> public int getselectsetcount(selectset set) int count = 0; // 记录符合选择项的 ids ObjectIDs oids = new ObjectIDs(); ObjectID oid = new ObjectID(); 17

MapGIS 开发系列手册 if (set!= null) // 获取选择集列表 List<SelectSetItem> lst = set.get(); foreach (SelectSetItem item in lst) count += item.idlist.count; if (lst == null lst.count == 0) return count; // 获取图层信息 MapLayer maplayer = lst[0].layer; // 获取图层对应的要素类的信息 basclass = maplayer.getdata(); // 获取处于编辑状态第一个图层的要素 ID 列表 List<long> idarr = lst[0].idlist; for (int i = 0; i < idarr.count; i++) oid.int64val = idarr[i]; oids.append(oid); rcdset = new RecordSet(basClass); // 添加结果集 rcdset.addset(oids); attctrl.setxcls((ivectorcls)basclass, rcdset); return count; 步骤四 : 实现查询功能, 以矩形查询为例进行说明, 在 QueryByRectCmd 插件中的 OnCreate 方法中获取当前地图视图控件 MapControl 对象, 以及获取 DockWindow 插件所绑定的属性视图控件 AttControl 对象, 具体代码如下所示 : 程序代码 2-10 OnCreate 方法关键代码 public void OnCreate(IApplication hook) 18

MapGIS 10.2 二维插件式二次开发手册 hk = hook; // 获取 DockWindow 插件 hk.plugincontainer.dockwindows.trygetvalue("intergeomquery.dockwindow", out dw); // 通过停靠窗口来获取用户控件中的属性控件对象 attctrl = (dw.childhwnd as AttUserControl).attControl1; // 获取当前激活视图的 MapControl 属性 IMapContentsView mapconview = null; mapconview = hk.activecontentsview as IMapContentsView; if (mapconview == null) return; mapctrl = mapconview.mapcontrol; mapctrl.restore(); 步骤五 : 在 QueryByRectCmd 插件中的 OnClick 方法中实现矩形查询, 具体代码如下所示 : 程序代码 2-11 OnClick 方法中的关键代码 public void OnClick() // 设置为拉框查询 SelectType seltype = SelectType.Rectangle; IMapContentsView mapconview = null; mapconview = hk.activecontentsview as IMapContentsView; if (mapconview == null) return; // 获取当前激活视图的 MapControl 属性 mapctrl = (hk.activecontentsview as IMapContentsView).MapControl; // 创建拉框选择类对象 SelectToolClass bastool = new SelectToolClass(mapCtrl, SelectDataType.Anyone, attctrl, seltype); mapctrl.setbastool(bastool); if (attctrl == null) return; this.attctrl.attlbuttondown += new AttControl.AttLBtDownEventHandler(attctrl_AttLButtonDown); 19

MapGIS 开发系列手册 步骤六 : 在 MapGIS.AppLoader.exe 上面加载完 MapGIS.WorkSpace.Plugin.dll, InterGeomQuery.dll 这个 2 个库后, 就可以实现查询功能 2.3 插件间通讯 2.3.1 示例功能概述 实现功能 : 插件间通讯, 主要是调用目标插件的资源, 如方法等 ; 本示例功能为通过插 件容器获取 MapGIS.WorkSpace.Plugin 插件中的 CmdOpen 命令按钮插件来打开一个地图文档 效果预览如下图所示 : 20

MapGIS 10.2 二维插件式二次开发手册 图 2.6 插件间通讯示意图 图 2.7 点击命令按钮示意图 2.3.2 实现思路及关键代码 插件项 :MenuBar( 菜单栏 ) Command( 命令按钮 ) 步骤一 : 打开 VS 2010 新建一个 MapGIS 项目, 命名为 PluginInteraction, 在该 MapGIS 插件项目中创建一个 MenuBar 菜单栏, 将 Name 属性值设为 PluginMenuBar, Caption 属性值设为 插件交互 ; 添加 1 个 Command 插件项 ( 命名为 OpenCmd ) 实现打开地图文档的功能 ; 步骤二 : 将 QueryByRectCmd 命令按钮插件项添加到 PluginMenuBar 菜单项中, 具体实现代码请参考 1.2 小节的内容 ; 步骤三 : 定义一个命令按钮插件 ( ICommand 对象 )cmd, 通过插件容器获取 MapGIS.WorkSpace.Plugin 插件中的 CmdOpen 命令按钮插件, 将该插件传给 cmd 对象, 调用 cmd 插件的 OnClick 方法打开地图文档, 关键代码如下所示 : 程序代码 2-12 OnClick 方法实现打开地图文档代码 public void OnClick() // 命名按钮插件对象 ICommand cmd = null; // 通过插件容器获取 MapGIS.WorkSpace.Plugin 插件中的 CmdOpen 命令按钮插件 hk.plugincontainer.commands.trygetvalue("mapgis.workspace.plugin.cmdopen", out cmd); 21

MapGIS 开发系列手册 // 获取成功 if (cmd!= null) // 打开地图文档 cmd.onclick(); // 获取打开的地图文档对象 Document doc = hk.document; // 获取第一个地图 Map map = doc.getmaps().getmap(0); if (map == null) return; // 在地图视图上显示第一个地图 hk.workspaceengine.firemenuitemclickevent("mapgis.workspace.style.previewmap", map); 步骤三 : 在 MapGIS.AppLoader.exe 上面加载完 MapGIS.WorkSpace.Plugin.dll, CustomMapViewDemo.dll 和 MapGIS.MapEditor.Plugin.dll 这个 2 个库后, 就可以实现查询功能 2.4 自定义工作空间 2.4.1 示例功能概述 实现功能 : 自定义工作空间的开发, 涉及停靠窗口 (IDockWindw) 插件的开发, 以及工作空间目录树中地图节点的显示, 目录树右键菜单的维护等 ; 主要借助平台提供的 MapGIS.UI.Controls 程序集里的 MapWorkSpaceTree 类实现目录树的构建 效果预览如下图所示 : 22

MapGIS 10.2 二维插件式二次开发手册 图 2.8 自定义工作空间示意图 2.4.2 实现思路及关键代码 步骤一 : 打开 VS 2010 新建一个 MapGIS 项目, 命名为 CustomWorkspaceTree, 在该 MapGIS 插件项目中创建一个 IMapContentsView 地图视图插件, 将 Name 属性值设为 MapView,Caption 属性值设为 自定义地图视图 ; 添加一个 IDockWindow 插件项将 Name 属性值设为 WorkspaceTree, Caption 属性值设为 自定义工作空间 ; 添加 2 个自定义用户控件, 设置 Name 属性值分别为 MapViewCtrl TreeView ; 在 MapViewCtrl 自定义控件中拖入一个 MapControl 地图视图控件, 设置 MapControl 地图视图控件 Name 属性值为 mapctrl ; 在 TreeView 自定义控件中拖入一个 MapWorkSpackTree 工作空间树控件, 设置 MapWorkSpackTree 工作空间树控件的 Name 属性值为 m_tree ; 步骤二 : 将 MapViewCtrl 自定义控件绑定到 MapView 地图视图插件中, 具体实现步骤如下 : (1) 在 MapView.cs 文件中定义一个自定义用户控件 (MapViewCtrl 对象 )mapviewctrl 的全局变量 ; (2) 修改 MapView.cs 文件中的 ObjecthWnd 属性代码如下所示 : 程序代码 2-13 修改 ObjecthWnd 属性代码 public Control ObjecthWnd get return mapviewctrl; (3) 修改 MapView.cs 文件中的 MapControl 属性代码如下所示之后就完成了绑定功能 23

MapGIS 开发系列手册 程序代码 2-14 修改 MapControl 属性代码 public MapGIS.GISControl.MapControl MapControl get return mapviewctrl. mapctrl; 步骤三 : 将 TreeView 自定义用户控件绑定到 WorkspaceTree 停靠窗口插件项中, 具体实现步骤如下 (1) 在 DockWindow.cs 文件中定义一个自定义控件 (TreeView 对象 )tree 全局变量 ; (2) 修改 ChildHWND 属性字段代码如下所示, 即可实现绑定功能 : 程序代码 2-15 修改 ChildHWND 属性字段代码 public Control ChildHWND get return tree; 步骤四 : 在 TreeView.cs 文件中实现自定义工作空间树的相应功能, 实现自定义工作空间具体步骤为 : (1) 定义一个工作空间树控件 (MapWorkSpackTree 对象 )m_tree, 添加该树的右键菜单事件处理, 关键代码如下 : 程序代码 2-16 TreeView.cs 文件中的全局变量 #region 变量定义 // 工作空间树 MapWorkSpackTree m_tree = null; // 框架对象 IApplication app = null; // 地图视图控件 MapControl mapctrl = null; // 地图集合对象 Maps maps = null; #endregion 程序代码 2-17 TreeView 自定义控件加载事件代码 private void TreeView_Load(object sender, EventArgs e) try // 获取框架对象 app = WorkspaceTree.hk; // 加载树 m_tree = new MapWorkSpackTree(); 24

MapGIS 10.2 二维插件式二次开发手册 m_tree.dock = DockStyle.Fill; // 添加到用户控件 this.controls.add(m_tree); // 注册节点右键菜单单击事件 m_tree.menuitemonclickevent += new MapGIS.WorkSpaceEngine.MenuItemOnClickHandler(m_tree_MenuItemOnClickEvent); m_tree.document.title = " 地图文档 "; catch(exception ex) MessageBox.Show(ex.ToString()); (2) 实现目录树上的地图节点右键菜单预览地图的功能, 在右键菜单单击事件中实现关键代码如下所示 : 程序代码 2-18 m_tree_menuitemonclickevent 关键代码 item) void m_tree_menuitemonclickevent(string typename, MapGIS.GeoMap.DocumentItem try #region 预览地图 if (item is Map) Map map = item as Map; // 内容视图插件 IContentsView icv = null; // 获取地图视图 app.plugincontainer.contentsviews.trygetvalue(map.handle.tostring() + "$MapView", out icv); if (icv == null) // 创建自定义地图视图插件 icv = app.plugincontainer.createcontentsview("customworkspacetree.mapview", map.handle.tostring() + "$MapView"); if (icv!= null && icv is IMapContentsView) 25

MapGIS 开发系列手册 IMapContentsView mv = icv as IMapContentsView; // 获取地图视图控件 mapctrl = mv.mapcontrol; // 激活地图 mv.mapcontrol.activemap = map; // 设置地图显示控件 m_tree.workspace.setmapcontrol(map, mv.mapcontrol); // 获取地图显示范围 Rect rect = map.getviewrange(); if (rect!= null && (rect.xmax - rect.xmin).compareto(0) > 0 && (rect.ymax - rect.ymin).compareto(0) > 0) mv.mapcontrol.transformation.setdisprect(rect); mv.mapcontrol.refresh(); StateEventArgs()); app.statemanager.onstatechanged(this, new else // 如果自定义地图视图插件已经打开 IMapContentsView mv = icv as IMapContentsView; if (mv!= null) // 激活地图视图 app.plugincontainer.activecontentsview(mv); Rect rt = map.getentirerange(); Rect rt1 = map.getviewrange(); mv.mapcontrol.refresh(); #endregion catch(exception ex) MessageBox.Show(ex.ToString()); 26

MapGIS 10.2 二维插件式二次开发手册 步骤五 : 在地图右键菜单中添加一个自定义菜单, 具体步骤为 : (1) 在 TreeView.cs 文件中定义一个自定义菜单类 CustomGloableMenu, 该类继承并实现 ISingleMenuItem 接口, 具体代码如下 : 程序代码 2-19 CustomGloableMenu 类中代码 #region 单选右键菜单项类 class CustomGloableMenu : ISingleMenuItem // 新建地图文档 #region ISingleMenuItem 成员 public bool BeginGroup get return false; public Bitmap Bitmap get return null; public string Caption get return " 自定义菜单 "; public bool Checked get return false; public bool Enabled get return true; public bool Visible get return true; public void OnClick(DocumentItem item) 27

MapGIS 开发系列手册 MessageBox.Show(" 自定义菜单演示!"); public void OnCreate(MapGIS.WorkSpaceEngine.IWorkSpace ws) #endregion #endregion (2) 调用 m_tree 类的 WorkSpace 属性获取工作空间 WorkSpace 对象, 再调用 WorkSpace 对象的 GetMenuExtand 方法获取右键菜单项, 将返回值传给菜单扩展 (IMenuExtander 对象 ) ime; 定义一个 CustomGloableMenu 类对象, 并初始化, 调用 ime 对象的 AddItem 方法将 CustomGloableMenu 类添加到右键菜单栏中, 在 Document_OpenedDocument 打开地图文档事件中实现该功能, 具体代码如下 : 程序代码 2-20 自定义菜单实现具体代码 void Document_OpenedDocument(object sender, EventArgs e) // 为地图节点添加右键菜单项 IMenuExtander ime = this.m_tree.workspace.getmenuextand(typeof(mapgis.geomap.map)); // 自定义菜单对象 CustomGloableMenu menuitem = new CustomGloableMenu(); menuitem.oncreate(this.m_tree.workspace); // 将自定义菜单添加到右键菜单项 ime.additem(menuitem); 效果如下图所示 : 28

MapGIS 10.2 二维插件式二次开发手册 图 2.9 自定义菜单效果图 步骤五 : 在 MapGIS.AppLoader.exe 上面加载完 CustomWorkspaceTree.dll 这个库后, 就可 以实现自定义工作空间功能 29