1、专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185基于.NET 框架的 COM 回调机制在开发 GIS 中的应用马奎 李宏伟 毛彪(信息工程大学测绘学院,郑州,450052)摘要:MapInfo 软件是应用十分广泛的主流 GIS 软件之一,Microsoft.NET 是微软公司推出的新平台,具有强大的全方位技术兼容性,而 COM 技术作为 OLE 技术的延伸,可以实现几乎所有组件的通信操作。基于这些方面,本文利用.NET 框架下的 COM 组件包装技术与经该技术打包后的 COM 回调机制实现了更具简便性与灵活性的 GIS 开发,详细探讨了该机制在
2、MapInfo 二次开发中的实现思路及其关键技术点,取得了较为满意的应用效果。关键词 .NET Framework COM MapInfo 回调机制 地理信息系统The CallBack Mechanism of COM Based on .NETFramework in Development of GISMA Kui, LI Hong-wei, MAO Biao(Institute of Surveying and Mapping, Information Engineering University, Zhengzhou Henan, 450052, China)Abstract Map
3、Info is one of the main software of GIS which is used broadly. Microsoft.NET, a new platform of the Microsoft, which has an excellent power of technic compatibility. And COM is the advanced technic of OLE, accomplishes almost all the communication between components of different softwares. Then base
4、d on the .NET component packing technic to COM and CallBack Mechanism of the packed COM, it can be more simple and flexible to exploder the GIS. This article will give you a deep discussion of the CallBack Mechanism about its thoughts and technologies in secondary exploration of MapInfo, and finally
5、 get a satisfaction to its application.Key Words .NET Framework COM MapInfo CallBack Mechanism GIS1、引言通用的地理信息系统主要是用来执行各类空间数据的输入和编辑、存储和管理、分析和处理、显示和制图的空间数据管理系统。针对其不能完全满足专业领域 GIS 的需求,也就产生了许多 GIS 的二次开发工具,或者相关人员直接从底层开发专业的 GIS 系统。显然两种方式各具其自身特点及应用需求,前者适合快速开发,专业应用中会受到通用 GIS 的限制,后者适于开发具有自主知识产权的专业 GIS 系统,但这种方
6、式耗时、费力,需要投入大量的人力与智力。本文就是本着快速便捷的原则,同时又不失时代性地选择了.NET 框架作为开发平台,以当今主流最新通用桌面 GIS 软件 MapInfo Professional 8.0 作为二次开发对象,利用两者均支持 Oracle 远程数据库的特性,开发了一套可支持网络的地区级电力管理GIS。本文主要探讨该系统单机部分 MapInfo 二次开发的关键技术基于.NET 的 COM 组件回调机制的实现与应用,该技术具有一定的技术创新性且整合的效果较好。本文开发的系统自有其特点:系统兼具 MapInfo 系统高效图形化管理、强大分析功能的优点,也能充分利用.NET 框架下一系
7、列快速高效的可视化开发工具,开发具备界面交互性良好且拥有高效数据分析、处理能力的应用系统。简单的讲,系统等于是运行了两个应用程序:后台 MapInfo 程序侧重于地图显示与数据储备,前台客户程序侧重于用户界面交互与数据分析处理。显然在上述开发过程中,用户对后台 MapInfo 操作不透明,即“用户无法通过普通方法来获取专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185MapInfo 中的地理信息与状态变化” 1,为此可以利用 MapInfo 提供的一种客户程序消息反馈机制,简称回调(callback) 1。.NET 之前的 MapInfo 回调利用
8、的是 OLE(对象链接与嵌入)技术结合相关开发平台(如 VC+/VB/Delphi 等)实现的,类似的原理:但在.NET 开发方式中并不是单纯的 OLE 对象嵌入,而是通过.NET 提供的 COM 组件包装器(wrapper),将 MapInfo 提供的 COM 回调接口进行.NET 封装,使之成为具备.NET 特性的组件,然后再实现其与其他.NET 组件的相互通信。下面本文就这一转换进行专门的论述。2、MapInfo 回调技术的开发平台相关特性.NET Framework 是一种在 Windows 平台上编程的新架构一种新的 API,包含通用语言运行时(CLR) 和框架类库( FCL)。微软
9、公司主要是为了实现“向后兼容” 2以方便支持今后出现和扩展的新技术,以使开发人员可以轻松编写优秀软件而推行的新平台,是一种新开端。但.NET 并没有推翻之前的软件,它仍然支持现有的软件,即实现向前兼容。另外,现有的软件组件“在 Windows 上的软件通信,几乎都是使用COM 实现的” 2。因此,.NET 提供了支持现有 COM 组件的包装器(wrapper),以便.NET 组件与之通信。2.1 OLE 支持的回调如引言中所言,.NET 之前的 MapInfo 回调其实是 OLE 技术结合非.NET 开发平台实现的。OLE 技术,举例描述,它在很大程度上仅是把不同类型的办公文档链接在一起,所以
10、利用它可以把一个小 Excel 电子表格放在 Word 文档中。相关的开发平台如 Delphi 可以通过编程的方式实现回调这一过程。具体实现的过程,请参见 1,3 ,此类技术文章在相关技术网站或论坛上较多,因不是本文重点就不再赘述。2.2 .NET 支持的 COM 回调COM(组件对象模型)是作为 OLE 开发出来的,之后,它逐步演化为 COM、DCOM(分布式组件对象模型)和最终的 COM+。COM+是一种复杂的技术,它是几乎所有组件通信方式的基础,实现了事务处理、消息传输服务和对象池。随着新功能的加入,它就会比以前更加复杂,这也是导致.NET Framework 产生的直接原因。而.NET
11、 要实现 MapInfo 回调,必须将 MapInfo 的 COM 回调接口进行包装,这个过程已经脱离了 OLE二次开发的技术范畴,经过包装的 COM 组件已经具备.NET 组件的一切特性,因而说.NET 实现 MapInfo 回调过程其实是基于.NET 组件通信技术的具体实例,因而该回调技术已经不同于前期相关开发平台的 OLE开发方式,因而在继续探讨之前必须探讨一下这个所谓“回调技术的开发平台相关特性” 。3、回调机制的实现机理在介绍回调机制原理之前,先讨论一下“回调机制”与“回调”两个概念。前面提到的回调(callback)是 MapInfo 提供的一种向客户程序反馈消息的过程,单纯的理解
12、它是单向的,即从后台到前台的过程。对于这种开发方式,单向且前台与后台没有交互的话,系统很难实现稍复杂的 GIS 操作。因而,出于系统考虑,本文将客户到后台、后台到客户以及两者交互的整个过程统称为“回调机制” ,统称这种二次开发方式为“回调机制”的实现。.NET 的 COM 组件包装器 wrapper 封装的过程相当复杂,而且是在.NET 内部实现的,要了解该过程的理论实现请参见 2。在 Visual Studio 2005 中打开或新建一个工程后,打开“添加引用”在“COM”项中找到“MapInfo 8.0 OLE Automation Type Library”,单击“确定”之后,该 COM
13、 组件就被加载到工程中了。另外,.NET 会在工程文件中创建程序集文件“Interop.MapInfo.dll” (如图 1,中上部方框) ,它是带有.NET 包装器类的.NET 程序集。打开“对象浏览器”找到该程序集就可以浏览其内部的类及相关专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185接口。使用时,在相关程序文件中加载语句“Using MapInfo”(“MapInfo”是.NET 所谓的“命名空间” ,并不等于程序集名称)。在本文所述的系统中,按照软件内部各部分之间的关系,进行了宏观上的抽象,大体可以分成三大部分:(如图 1)客户组件、回
14、调组件以及后台服务端组件。程序运行后,外在的窗体就相当于客户组件,它主要负责与用户交互,调出并显示后台 MapInfo 地图窗口显示地图,打开并链接数据库、属性数据处理等相关操作;所谓“后台服务端”组件,就相当于一个 MapInfo 服务器程序,抽象地说,它其实就做一项工作:接受外来指令并将处理后的结果返还客户程序;回调组件,已经不是上面所提到的 COM 对象引用(“Interop.MapInfo.dll” ) ,在本系统中,它被二次封装,封装后的结果相当于一个纯.NET 组件,即这里所指的“回调组件” (具体封装见文章第四部分) ,其作用主要是负责后台的启动、关闭、控制等等复杂操作,用来协调
15、客户程序与后台程序的交互问题,这部分是系统成败的关键。4、实现回调机制的关键技术点在第三部分中可了解,宏观上的回调机制由三部分组成。但在具体实现中必须按照功能将各个部分进行进一步的抽象与细化,而在本文中将重点讲述回调组件的抽象与封装。本文将从两个方面进行讲述:交互封装,callback 封装。callback 封装指后台到客户过程的封装。交互封装多数情况下为客户到后台的封装包,在一定情况下交互封装还要与 callback 封装进行通信,因而它还要实现一定的客户与后台交互的工作,所以叫交户封装。紧随各自之后,分别以本系统的两个具体实现难点加以举例详述。4.1 交互封装在本系统中,后台的驱动主要是
16、后台 MapInfo 执行相关 MapBasic 语言命令的结果。交互封装组件中主要是将所要使用到的 MapBasic 语言命令按照基本功能单元进行封装,以实现地图的开关、显示、编辑、存储、制图与控制等基本 GIS 的地图操作功能。该交互封装组件的内核被定义为一个类:CSMapInfo,其成员变量以及方法构成了多数回调组件的核心。下面具体讲述: 后台程序的化身:mapInfoAppClass。它是 MapInfo 命名空间中类 MapInfoApplicationClass 的对象,当实例化之后,它代表的就是后台 MapInfo 应用程序。这里需要注意,后台 MapInfo 一般情况下只能是一
17、个,所以在定义该对象的时候要使用 Static 标识符,目的就是使创建的后台 MapInfo 程序唯一。 创建 callback 封装组件 MyCallBack 的对象 myCallBack。该对象代表所有后台回调客户端的处理代码,其实是一个消息处理集合。它也是唯一的,因而也要使用 Static 标识符,该封装还会在 2.3 中具专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185体讲述。以上两步定义与实例化代码如下:private static MapInfo.MapInfoApplicationClass mapInfoAppClass;priv
18、ate static MyCallBack myCallBack;public CSMapInfo()this.mapInfoAppClass = new MapInfoApplicationClass();this.myCallBack = new MyCallBack();this.mapInfoAppClass.SetCallback(myCallBack); /在后台程序中注册回调对象 相关功能命令的集成。它们是一个方法集,其中封装了几乎所有的 MapBasic 语句,当客户端需要时,会直接调用并作用于后台程序。具体方法及 MapBasic 命令语句这里不再赘述,详见 4。下面以系统中
19、实现图层与注记的动态控制来具体察看这部分的工作原理。4.2 图层与注记的动态控制在通用 GIS 平台 MapInfo 软件上,地图均以图层的方式进行存储与显示 5。当打开的图层较多后,地图显示刷新速度会受到极大影响,因而不利于地图的界面交互。如果还要显示注记那么地图响应速度将大大放慢。于是当务之急就是要解决这个关乎 GIS 应用前景的问题。通常情况下,二次开发解决这个问题较为复杂,而从底层开发的方式工作量更大且难度高。本系统的解决方法主要是:在图层打开之后通过设置其显示比例尺的条件,这样对应不同的比例尺显示不同的图层,从而达到动态控制图层显示的问题。类似的处理方式,对于注记标注的动态显示也可以
20、采用这种方式加以解决。仅就图层动态控制的解决思路大体步骤如下:调用交互封装组件中读取地图的方法打开某个图层;获取该图层显示条件;继续调用交互封装组件中设置图层状态的命令方法集设置该图层的显示参数(如图图 3,图层控制中红色打勾的图层与注记即在非显示状态) 。该实现仅是回调过程中最简单的客户端向后台服务器发送指令的过程,随后的图层或注记动态显示的问题就是后台服务器自发的实现。4.3 callback 封装在 2.1中提到的 callback 封装组件 MyCallBack,其实是一个消息集合,即后台回调客户程序的入口,所有回调消息先要经过该组件的识别与筛选,然后再将进一步的处理交给相应的客户端处
21、理区。该消息集中罗列的消息处理函数有两种情况:MapBasic 内部事件,直接提供给用户编写消息处理代码而无需再定义,比如:对状态条变化的反应 SetStatusText,对地图窗口变化的反应WindowContentsChanged 等等 4;另外,就是自定义消息,它们可以依据用户不同的需求编写不同的消息处理代码。专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185MapBasic 内部事件。以状态条变化消息 SetStatusText 为例,说明地图窗口变化后,后台是如何回调客户程序的。在 MyCallBack 中的 SetStatusText(
22、string str)方法里添加处理消息的代码:分解后台传出的字符串 str 为三部分,分别代表比例尺、正在编辑的图层名称、鼠标选择的对象,然后再将它们传递给客户端自己的状态栏里从而显示地图的状态(如图 4:客户程序模仿 MapInfo 的状态栏) 。 自定义消息。以系统实现属性查询中较为困难的由图形查找属性为例,下面简要介绍自定义的回调消息:鼠标单击选点 GetStatusXyPoint 的处理机制。4.4 图形到属性的查询callback 封装组件的具体应用定义消息:使用 MapBasic 语句,“Create ButtonPad “CallBack_Point“ As ToolButto
23、n ID 2005 Calling OLE “GetStatusXyPoint“ Cursor 138 DrawMode 34“,此语句的目的是在后台程序中创建工具按钮 CallBack_Point,使之产生 GetStatusXyPoint 的回调消息,此时鼠标为十字形状且等待单击选择的状态,代表后台 MapInfo 程序在时刻监视鼠标的状态,直到确认鼠标单击选择。识别消息:后台响应鼠标单击,将单击处的坐标及后台其他状态信息,排列为一个固定格式的字符串,然后回调 GetStatusXyPoint 方法,并将该字符串传递给该方法。对于不同的消息类型会有不同的回调方法与其对应,因而这个过程就实现
24、了回调消息的筛选。处理字符串:现在由回调 GetStatusXyPoint 方法处理得到的字符串。这个字符串格式固定,可以将其分解来获取需要的字段。而 MapBasic 另外提供了直接获取该字符串相应字段的函数 CommandInfo(a),a 取 1 到 8,分别代表鼠标点击处的 X 及 Y 坐标、点击时是否按下 SHIFT 和 CTRL 键、释放鼠标处的 X 及Y 坐标、发送消息按钮的 ID 号和发送消息菜单的 ID 号。分解后的字段作为参数传递给客户程序相应处理代码。仅就鼠标单击选点这个处理过程,如图 5 所示:首先客户端发送点击消息,经过交互组件传递给后台程序,后台程序处理这些指令并将
25、处理结果回调给 callback 组件相应处理代码,最后再交由客户端进一步处理这个消息。客户程序处理消息:客户程序将所得到的坐标点传递给交互组件进一步查询坐标点处的空间对象,从而查找该对象的属性信息。该过程到此结束,后台继续等待单击消息,直到属性查询状态被其他操作更改。5、结论回顾本文,通过把基于 MapInfo 回调这种相对较老的二次开发方式,结合当前最新.NET 技术平台进行重新规划与实践,开发的系统具有运行稳定、交互性好且数据处理能力强等特点,充分继承了基于通用 GIS 平台进行二次开发的特色。在当前工具型二次开发一统二次开发天下的形势下,有一定的独到之处,且具有一定的工程应用与参考价值
26、。专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185参考文献: 1 赫晓峰,鲜明等, MapInfo 二次开发中回叫机制的运用,微计算机信息,2002 年 18 期.2 Christian Nagel 等著,李敏波译, C#高级编程(第 4 版), 清华大学出版社 , 2006.3阮于洲,Delphi、MapInfo 集成开发环境下 CallBack 的实现,测绘与空间地理信息,2005 年 2 期.4 MapBasic 帮助文档,MapInfo 公司,2002.5刘广著,地理信息系统基础篇,中国电力出版社,2004.作者简介:马奎(1982-)
27、,男,汉族,江苏邳州人,硕士研究生,主要研究方向:地理信息系统的应用(e-mail:,tel:0371-63535624)更多测绘论文请登录测绘网论文频道查询:http:/ 专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185Editors note: Judson Jones is a meteorologist, journalist and photographer. He has freelanced with CNN for four years, covering severe weather from tornadoes to typh
28、oons. Follow him on Twitter: jnjonesjr (CNN) - I will always wonder what it was like to huddle around a shortwave radio and through the crackling static from space hear the faint beeps of the worlds first satellite - Sputnik. I also missed watching Neil Armstrong step foot on the moon and the first
29、space shuttle take off for the stars. Those events were way before my time.As a kid, I was fascinated with what goes on in the sky, and when NASA pulled the plug on the shuttle program I was heartbroken. Yet the privatized space race has renewed my childhood dreams to reach for the stars.As a meteor
30、ologist, Ive still seen many important weather and space events, but right now, if you were sitting next to me, youd hear my foot tapping rapidly under my desk. Im anxious for the next one: a space capsule hanging from a crane in the New Mexico desert.Its like the set for a George Lucas movie floati
31、ng to the edge of space.You and I will have the chance to watch a man take a leap into an unimaginable free fall from the edge of space - live.The (lack of) air up there Watch man jump from 96,000 feet Tuesday, I sat at work glued to the live stream of the Red Bull Stratos Mission. I watched the bal
32、loons positioned at different altitudes in the sky to test the winds, knowing that if they would just line up in a vertical straight line “we“ would be go for launch.I feel this mission was created for me because I am also a journalist and a photographer, but above all I live for taking a leap of fa
33、ith - the feeling of pushing the envelope into uncharted territory.The guy who is going to do this, Felix Baumgartner, must have that same feeling, at a level I will never reach. However, it did not stop me from feeling his pain when a gust of swirling wind kicked up and twisted the partially filled
34、 balloon that would take him to the upper end of our atmosphere. As soon as the 40-acre balloon, with skin no thicker than a dry cleaning bag, scraped the ground I knew it was over.How claustrophobia almost grounded supersonic skydiver专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-52775185With each twist,
35、you could see the wrinkles of disappointment on the face of the current record holder and “capcom“ (capsule communications), Col. Joe Kittinger. He hung his head low in mission control as he told Baumgartner the disappointing news: Mission aborted.The supersonic descent could happen as early as Sund
36、ay.The weather plays an important role in this mission. Starting at the ground, conditions have to be very calm - winds less than 2 mph, with no precipitation or humidity and limited cloud cover. The balloon, with capsule attached, will move through the lower level of the atmosphere (the troposphere
37、) where our day-to-day weather lives. It will climb higher than the tip of Mount Everest (5.5 miles/8.85 kilometers), drifting even higher than the cruising altitude of commercial airliners (5.6 miles/9.17 kilometers) and into the stratosphere. As he crosses the boundary layer (called the tropopause
38、), he can expect a lot of turbulence.The balloon will slowly drift to the edge of space at 120,000 feet (22.7 miles/36.53 kilometers). Here, “Fearless Felix“ will unclip. He will roll back the door.Then, I would assume, he will slowly step out onto something resembling an Olympic diving platform.Bel
39、ow, the Earth becomes the concrete bottom of a swimming pool that he wants to land on, but not too hard. Still, hell be traveling fast, so despite the distance, it will not be like diving into the deep end of a pool. It will be like he is diving into the shallow end.Skydiver preps for the big jumpWh
40、en he jumps, he is expected to reach the speed of sound - 690 mph (1,110 kph) - in less than 40 seconds. Like hitting the top of the water, he will begin to slow as he approaches the more dense air closer to Earth. But this will not be enough to stop him completely.If he goes too fast or spins out o
41、f control, he has a stabilization parachute that can be deployed to slow him down. His team hopes its not needed. Instead, he plans to deploy his 270-square-foot (25-square-meter) main chute at an altitude of around 5,000 feet (1,524 meters).In order to deploy this chute successfully, he will have t
42、o slow to 172 mph (277 kph). He will have a reserve parachute that will open automatically if he loses consciousness at mach speeds.Even if everything goes as planned, it wont. Baumgartner still will free fall at a speed that would cause you and me to pass out, and no parachute is guaranteed to work
43、 higher than 25,000 feet (7,620 meters).It might not be the moon, but Kittinger free fell from 102,800 feet in 1960 - at the dawn of an infamous space race that captured the hearts of many. Baumgartner will attempt to break that record, a feat that boggles the mind. This is one of those monumental m
44、oments I will always remember, because there is no way Id miss this.序号 名称 规格型号 单位 数量 备注一 制冷系统1 压缩机组 4AV10 台 42 冷凝器 LN-70 台 13 贮氨器 ZA-1.5 台 14 桶泵组合 ZWB-1.5 台 15 氨液分离器 AF-65 台 1专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-527751856 集油器 JY-219 台 17 空气分离器 KF-32 台 18 紧急泄氨器 JX-108 台 19 冷风机 KLL-250 台 810 冷风机 KL
45、D-150 台 411 冷风机 KLD-100 台 212 阀门 套 8613 电磁阀 套 614 管道及支架 吨 18.615 管道及设备保温 m3 2216 管道保温包扎 镀锌板 吨 1.617 附件 套 1二 气调系统1 中空纤维制氮机 CA-30B 台 12 二氧化碳洗涤器 GA-15 台 13 气动电磁阀 D100 台 144 电脑控制系统 CNJK-406 台 15 信号转换器 8 线 台 16 果心温度探头 台 77 库气平衡袋 5 m3 个 78 库气安全阀 液封式 个 79 小活塞空压机 0.05/7 台 110 PVC 管 套 111 附件 套 1三 水冷系统1 冷却塔 DBNL3-100 台 22 水泵 SBL80-160I 台 23 水泵 SBL50-160I 台 24 阀门 套 305 管道及支架 吨 2.86 附件 套 1四 电仪控系统1 电器控制柜 套 12 照明系统 套 13 电线电缆 套 14 桥架管线 套 15 附件 套 1专业好文档更多测绘论文请登录测绘网论文频道查询:http:/ 客服热线:010-527751851.1.1