利用Mapinfo进行GIS应用开发_李海珍
- 格式:pdf
- 大小:116.43 KB
- 文档页数:2
《地理信息系统原理》上机指导书夏春林编著辽宁工程技术大学测绘与地理科学学院地理信息系统教研室二○○六年三月目录Mapinfo 简介............................................................ .1 上机一GIS软件认识与基本操作.. (2)上机二空间查询操作 (8)上机三扫描矢量化 (14)上机四空间分析与专题图制作 (17)Mapinfo 简介Mapinf o Professional是美国MAPINFO公司开发的面向中小型用户的桌面地理信息系统软件,价位较低。
公司将软件市场定位为一个等式:Mapinfo=Mapping+Information,充分体现了其小型、灵活、简单的特点,非常适合于GIS初学者使用和掌握。
Mapinfo具有内置的关系型数据库,实现了电子地图与属性库的自动链接与双向查询;其电子地图中无拓扑关系定义;在数据接口上,Mapinfo可直接接收DBASE、FOXBASE数据,在图形上还可与AUTOCAD、ARC/INFO等的数据实现共享。
在数据可视化方面,Mapinfo的每一张地图都可以分层存储,并可通过缩放功能观察整体和局部的细节;除了一般的查询、显示、绘图功能外,Mapinfo也具有叠加分析、缓冲区分析、统计计算等空间分析功能。
并具有如下特点:●多种输入方式栅格图像,DBF、EXCEL、ASCII等格式文件,支持各种数字化仪。
●较强的选择查询功能单击、双击查询,选择查询,SQL查询。
●强大的图形编辑功能地图分层管理,每层存为一个Mapinfo表;可对图层自动标注;提供图形编辑工具箱,丰富的地图符号、线型、颜色、填充模式。
●丰富的输出形式地图、浏览表格、统计图,这三种视图动态链接。
●提供二次开发功能可以加装MapBasic语言开发工具和MapX可视化开发工具。
Mapinfo以表的形式组织数据。
图形对象与Mapinfo表中一条记录对应。
地理信息系统在测绘工程中的应用李珍珍发布时间:2021-12-30T07:11:14.773Z 来源:基层建设2021年第28期作者:李珍珍[导读] 本文对地理信息系统在测绘工程中的应用问题进行了探讨浙江中海达空间信息技术有限公司浙江湖州 313200摘要:本文对地理信息系统在测绘工程中的应用问题进行了探讨,文章从阐述地理信息系统及相关技术发展概况入手,进一步分析了它在工程测绘领域的应用优势,最后提出了将地理信息系统充分应用于工程测绘领域的建议。
关键词:地理信息系统;工程测绘;应用优势;应用前言目前,从地理信息科学不同领域的发展中,有许多符合工程测绘实际的新技术可以应用到 GIS 平台中来,进而为工程测绘及其管理提供更加有力的支撑。
正是这些技术的创新发展,使得测绘水平与效率显著提升,测绘数据成果质量高,技术适用范围得到拓展,社会综合效益实现突破。
1.地理信息系统及相关技术发展概述传统的工程测绘工作,不可否认其积淀深厚,但是面对地质勘察、生态环境保护等各类新的社会问题,必须认清新形势,认识到——随着我国科学技术的不断发展与进步,测绘领域已经积累了大量的技术创新成果。
例如,基于地理信息系统(GIS)的工程测绘手段就得到了全面创新发展,与之相关的资料使用与检查、地类信息精确提取、成果质量管理等系列工具与技术,也得到了有效利用。
地理信息系统的建设,综合 GIS 技术、互联网技术、物联网等技术,可以通过场景展示、图层管理、查询统计、三维辅助等功能模块,实现各类自然资源的调查与管理、工程项目运行动态监测预警、城市综合设施网格化巡查养护与全生命周期管理、乡村三维可视化、各部门联合调度、后台数据维护等功能,加强地区管理信息共享利用,提高智慧化管理水平;为国土、林业、草原等多个部门提供更全面的服务。
2.地理信息系统在工程测绘领域的应用优势2.1 测绘水平与效率显著提升综合利用近年来积累的技术创新成果,基于 GIS 等技术的工程测绘手段得到全面创新发展,地理信息系统也在持续升级服务,逐步完善了系统功能,实现了城市空间和工程内容数据的统一动态管理,以灵活、可扩展的系统架构,实现了数据的互通共享,提高了工程测绘与管理业务的水准和效率,进而提高了企业的经济和社会效益。
《地理信息系统实训(习)指导书》前言地理信息系统是一门学科,是描述、存储、分析和输出空间信息的理论和方法的一门新兴的交叉学科;另一方面,地理信息系统是一个技术系统,是以地理空间数据库(Geospatial Database)为基础,采用地理模型分析方法,适时提供多种空间的和动态的地理信息,为地理研究和地理决策服务的计算机技术系统。
本指导书设计了十二个实训项目(其中第十二个是综合实训),每个实训项目都包括实训目的与要求、实训内容、实训问题及实现、实训报告。
目录MapInfo概述 (3)ArcInfo概述.................................................................................................. 错误!未定义书签。
实训一投影的应用使用各种不同的投影方法理解投影.. (4)实训二 MapInfo7.0中表的使用 (4)实训三空间数据的理解 (5)实训四MapInfo7.0工具条的使用 (7)实训五Mapinfo中菜单的使用 (9)实训六使用MapInfo7.0进行数字化 (19)实训七使用MapInfo7.0进行数字化 (21)实训八使用MapInfo7.0对GIS图形使用SQL查询 (22)实训九使用MapInfo7.0制作统计图和专题图 (23)实训十使用MapInfo7.0创建3D地图 (27)实训十一使用MapInfo7.0创建HTML地图 (42)实训十二使用MapInfo7.0和OFFICE关联 (45)MapInfo概述1.1 MapInfo简介MapInfo是美国MapInfo公司的桌面地理信息系统软件,是一种数据可视化、信息地图化的桌面解决方案。
它依据地图及其应用的概念、采用办公自动化的操作、集成多种数据库数据、融合计算机地图方法、使用地理数据库技术、加入了地理信息系统分析功能,形成了极具实用价值的、可以为各行各业所用的大众化小型软件系统。
摘要地理信息系统(Geographic Information System) 是一种基于计算机的工具,它可以对在地球上存在的东西和发生的事件进行成图和分析。
GIS 技术把地图这种独特的视觉化效果和地理分析功能与一般的数据库操作(例如查询和统计分析等)集成在一起。
这种能力使GIS与其他信息系统相区别,从而使其在广泛的公众和个人企事业单位中解释事件、预测结果、规划战略等中具有实用价值。
本设计主要利用Mapinfo制图软件以在网上下载到的成都市地图为依据绘制了成都市电子地图。
最后以Visual C++作为开发工具,采用MapX控件技术,实现了一个成都市的电子地图信息查询系统。
主要功能包括放大工具、缩小缩小、箭头工具、箭头选取工具、手型工具、信息查询、面积查询、距离查询、鹰眼功能、公交查询、美食天地等等。
本文第一章对GIS的概念,历史和发展现状进行了分析,同时介绍了国内外GIS 的软件。
第二章介绍了数字城市的基本信息,概括了城市GIS系统的需求分析以及一些相关技术。
第三章介绍了数字城市的基本信息和基于Mapinfo成都市地图的实现。
最后一章介绍了以Visual C++作为开发工具,采用MapX控件技术实现GIS信息查询系统。
关键词:地理信息系统;Mapinfo;MapX。
AbstractGIS( Geographic Information System) is a computer-based tool. It can map and analyze the existing things and the occurred incidents in the world. GIS technology integrates the unique visual effect and geographic analysis functions of maps with the general operation of the database (for example, inquiry and statistical analysis, etc) This ability of GIS make it differentiate from other information systems, thus in a wide range of public and private enterprises and institutions the ability makes GIS have practical value in explaining incidents, forecasting results and making strategies.We drew the map information system of Chengdu making use of Mapinfo and according as the map of Chengdu from internet. Finally, Choosing VC as the developing tools and adopting MapX as the representation for GIS to do the second development, we have implemented the map information system of Chengdu which includes zoom in query, zoom out query,distance query, area query, bus query, dinning room query and so on.The main emphasis of the first chapter of our article is the conception, historyand development of GIS and introducing the soft of GIS. In the second chapter, we explain basic information of Digital City and recapitulate requirement of GIS. and in the third chapter, we explain how make the map of Chengdu. in the final chapter, we choose VC as the developing tools and adopt MapX as the representation for GIS to do the second development, we have implemented the map information system of Chengdu.key words : Geographic Information System;Mapinfo;MapX;目录摘要 (I)Abstract................................................................................................................................................. I I 第一章绪论 (1)1.1 引言 (1)1.2 GIS发展现状和应用领域 (1)1.2.1 发展现状 (1)1.2.2 应用现状 (2)1.3 GIS系统的发展趋势 (3)1.3.1 组建式GIS(ComGIS)系统 (3)1.3.2 WebGIS系统 (3)1.3.3 OpenGIS系统 (4)1.3.4 3D和4D GIS系统 (4)1.3.5 GIS数据库管理 (4)1.3.6 虚拟实现 (5)1.4 GIS发展历史 (5)1.5 二维GIS与三维GIS (6)1.5.1 二维GIS的应用 (6)1.5.2 三维GIS的应用 (7)1.5.3 二维与三维GIS的比较 (8)1.6 GIS软件介绍 (9)1.6.1 国内 (9)1.6.2 国外 (10)第二章城市GIS系统需求分析 (12)2.1 可行性分析 (13)2.1.1 技术可行性分析 (13)2.1.2 操作可行性分析 (13)2.1.3 经济可行性分析 (13)2.2 系统功能需求分析 (13)第三章基于Mapinfo的地图绘制 (14)3.1 数字城市的概念及应用 (14)3.2 数字城市的相关技术 (15)3.2.1 数据的收集处理技术 (15)3.2.2 3S集体集成技术 (16)3.2.3 空间数据库技术 (16)3.2.4 开放式地理信息系统(OpenGIS)技术 (16)3.3 Mapinfo介绍 (16)3.4 地图的获得 (17)3.5 图层中填加数据信息 (21)第四章GIS查询系统的设计与实现 (22)4.1 MapX介绍 (23)4.2 地图导入 (23)4.2.1 在C++中导入MapX控件 (23)4.2.2 初始化MapX控件 (24)4.3 基本功能 (24)4.4 距离,面积查询功能的实现 (25)4.4.1 MapX中的自定义工具 (25)4.4.2 距离面积查询功能实现过程 (25)4.5 图层内部查询功能 (26)4.6 鹰眼功能 (27)4.6.1 鹰眼介绍 (27)4.6.2 实现步骤 (27)4.7 美食天地的简单实现 (29)4.8 公交查询功能的简单实现 (30)4.8.1 迪杰斯特拉算法 (31)4.8.2 实现的主要过程 (32)结论 (36)致谢 (38)参考文献 (39)第一章绪论1.1引言地理信息系统的定义地理信息系统( GIS) 是采集、存储、管理、检索、分析和描述整个或部分地球表面与空间地理分布数据的空间信息系统。
高级应用篇第十八章 跨平台集成地图建立一个完善的大型应用系统应对各种不同平台博采众长利用其他平台能够调用MapInfo 环境下的数据图形等在Windows 环境下可以通过MapBasic 之外的其他编程语言控制MapInfo 例如可以将MapInfo 的地图窗口集成到用Visual Basic 编程语言开发的应用程序中因为在其他的应用程序中集成了MapInfo 所以将这种应用程序的开发语句称为跨平台集成地图(Integrated Maping)如果已经非常熟悉其他软件开发工具如C Visual Basic 或De1phi 等可以集成MapInfo 窗口到非MapBasic 应用程序中特别是在原有成熟的应用系统中增加地理信息管理功能这种方法是简捷有效的18.1 集成地图的概念应用程序可以控制集成地图的外观生成完全不同于MapInfo界面的应用程序如用VB 编写一个多文档界面MDI 的应用程序其中包括MapInfo 的地图和例览窗口当在VB 程序中集成一张地图时用户看到的是一个真实的MapInfo 地图窗口而不是位图图元文件或者任何其他类型的图形文件在这个地图窗口中用户可以如同使用MapInfo 一样与地图交互如使用缩放工具放大/缩小地图一个集成地图窗口具有MapInfo 中地图窗口的所有功能当用户运行一个集成地图的应用程序时MapInfo 系统实际上是在后台运行生成一个集成地图的应用程序不仅可以采用一种非MapBasic 语言还可以采用多语言混合编程常用的是C 和Visual Basic 两种语言本章的程序例子都是用Visual Basic 编写的通常在应用程序中执行一条启动MapInfo的命令启动后的MapInfo 在后台运行如果是Visual Basic 调用VB 的Create Object()函数启动MapInfo在集成地图应用程序中通过向MapInfo 发送MapBasic 的命令串来操作MapInfo 使用自动OLE OLE Automation 或者DDE 给MapInfo 发送这种命令串MapInfo 就像在MapBasic 交互命令窗口中键入这些命令一样执行相应的操作在MapBasic 中使用Map From 语句打开一个地图窗口在集成地图应用程序中同样使用这条语句打开一个地图窗口但是还必须增加一些语句如Set Next Document Parent 使得地图窗口成为应用程序的一个子窗口这个过程称为重生成Reparent ”可以重生成地图测览布局和图例窗口重生成MapInfo窗口到其他应用程序中时并不能使MapInfo 存取其应用程序的数据在MapInfo 窗口显示数据前还必须在MapInfo数据表中保存这些数据如果已经编写了MapBasic 程序可以作为集成地图应用程序的一部分继续使用然而高级应用篇己编译的MapBasic 程序.MBX 部分是可选的对有些应用程序可能不需要MapBasic 程序18.2 集成地图的技术要求18.2.1 系统要求集成地图需要具备下列条件1. 需要MicrosoftWindows 环境可以使用16位或者32位的Windows2. 需要MapInfo 4.0或更高版本3. 计算机必须有足够的内存空间和系统资源保证同时运行客户程序和MapInfo4. 客户程序如Visual Basic 程序必须能够作为自动OLE 的控制器或DDE 客户程序推荐使用自动OLE 因为自动OLE 比DDE 更稳定同时它还能报告MapInfo 的运行错误如果使用DDE 将不能获取错误代码5. 客户程序必须能够创建用户接口的诸要素如窗口窗体以及控制客户程序同时还必须能够获取接口窗口的窗口号HWND例如在Visual Basic 中在窗体上放置一个PictureBox 控件当发送一个命令给MapInfo 告诉MapInfo 在PictureBox 中打开一幅地图时必须指定PictureBox 的HWND 18.2.2 其他技术说明1. 开发一个集成地图的应用程序必须使用非MapBasic 语言编写程序可以使用各种流行的开发工具编写客户程序如C C++VisuaI Basic 3.0以上版本PowerBuilder 或Delphi2. 储存地图使自动OLE 但不能使用嵌入式OLE 当希望在自己的应用程序中放置一个MapInfo 地图窗口时不能嵌入它而是要发送一系列命令串来重生成一个窗口让MapInfO窗口作为应用程序的子窗口3. 集成地图不含VBX 或OCX控件18.2.3 简单的例程下面的VisuaI Basic 例程说明了在其他的应用程序中集成MapInfo 的一般方法 建立一个新的Visual Basic 工程在工程的General declarations 过程中声明一个Object变量Dim mymap As Object接下来在Form_Load 过程中添加下列语旬Sub Form_Load()Set mymap =CreateObjectMapInfo.applicationmymap.do Set Application Window &From1.hWndmymap.doSet Next Document Parent&Form1.hWnd&Style 1”第十八章 跨平台集成地图mymap.do Open Table”Worle”Inteactive Maap From word” mymap.RunMenuCommand 1702mymap.do Cteate Menu”MapperShortcut”ID 17 As”(-“”End Sub当运行这个VB 程序时它就在后台启动MapInfo 然后建立一个地图窗口该地图窗口会作为VB程序的一个子窗口下面详细说明集成地图过程中的各个细节18.3 集成地图的方法本节介绍如何集成MapInfo 到VB 中阅读本节内容要求读者了解VB 的有关术语和概念并要求有一定的编程经验即使是其他语言的编程经验18.3.1 启动MapInfo要启动MapInfo 调用VB 的CreateObject函数并且赋给一个VB 的对象Object变量特别要注意这个对象变量必须是全局变量否则当退出这个子程序时MapInfo 对象将被释放假设对象变量是MapInfo 则下列语句可以启动MapInfoSet MapInfo=CreateOject(“MapInfo.Application”)要选用以前启动的MapInfo 而不另启动MapInfo 调用GetObject()函数Set MapInfo=GetObject(“MapInfo.Application”)如果运行的是MapInfo CreateOject 和GetObject()函数使用自动OLE 连到MapInfo 如果使用DDE 在VB 中使用Shell()函数启动MapInfo 然后使用LinkMode 建立与MapInfo 的DDE连接在32位Windows 环境下可以运行多个MapInfo 如果已经有一个MapInfo 正在运行运行集成地图的应用时调用CreateOject 又启动一个MapInfo 这时两个MapInfo 将独立运行18.3.2 向MapInfo 发送命令启动MapInfo 后构造表示MapBasic 语句的字符串如想让MapInfo 执行MapBasic 的Open Table语句在VB中构造下列字符串msg "Open Table" "states.tab" "Interactive"如果使用自动OLE 连到MapInfo 使用DO 方法发送这个表示语句的字符串Mapinfo.Do msg当使用DO 方法后MapInfo 执行这条语旬这与在MapBasic 交互窗口中执行该语句相同如果使用DDE 连接使用VB 的LinkExecute 方法向MapInfo发送语句只能向MapInfo 发送能够在MapBasic 窗口中执行的语句例如不能向MapInfo 发送Dialog 语句因为Dia1og 语句不能在MapBasic 窗口中执行一般来讲MapBasic 的流程控制语句不能在MapBasic窗口中执行高级应用篇18.3.3 从MapInfo 返回值要获得MapBasic 表达式的值应该构造一个相应的表达式假设需要检测MapBasic 的WindowID 0函数返回的值构造下列表达式msg="WindowsID(0)"如果是自动OLE连接使用Eval OLE 方法向MapInfo发送信息Dim Result As StringResult=mapinfo. Eval"windowID 0"当使用Eval 方法时MapInfo 解释这个字符串为一个表达式并以字符串的形式返回表达式的值如果表达式是一个逻辑表达式则返回单字符T 或F如果使用DDE连接使用LinkRequest 方法代替Eval18.3.4 重生成MapInfo 窗口启动MapInfo 执行Set application Window 语句后MapInfo 的对话框和错误信息就为客户程序所有Msg="Set application Window"&FormName.hWnd Mapinfo.Do msg如果想集成MapInfo 窗口到应用程序向MapInfo 发送Set Next Document语句紧接着建立一个窗口例如msg=”set Next Document parent& MapFrame.hWndStyle l”MapInfo.Do msgMsg=Map From States Mapinfo. Do msgSet Next Document 语句重新生成一个文档窗口在这条语句中还要指定VB 中控件的句柄HWND 在后面的程序中使用Map Graph Browse Layout 和CreateI Legend 语句建立一个窗口时所建立的窗口是应用程序的子窗口在Set Next Document 语句中有sty1e 从句它控制窗口的类型Siy1e l 表示没有边框的窗口: Sty1e 2表示具有半高标题栏的窗口Sty1e 3表示具有全高标题栏的窗口重生成每一个窗口需要两条语句一个是Set NextDocument Parent 语句另一个是产生窗口的语句产生一个窗口后使用WindowID0函数获取窗口的ID 识别号便于后面的语句使用这个识别号Mapid=Val(Mapinfo.eval(“windowID(0)”))尽管应用程序重生成了这个窗口但是MapInfo 仍然维护这个窗口如果部分窗口需要重画MapInfo 会自动重画因此客户程序可以忽略任何属于这个窗口的删除或重画信息如果是C 语言不能忽略删除信息这时设置父窗口类型时使用WS_CLIPCHILDREN18.3.5 重生成图例和其他特殊窗口MapInfo 有几个非模态的窗口包括信息窗口标尺窗口消息窗口以及统计窗口要重生成这类窗口使用Set Window Parent语句第十八章 跨平台集成地图Mapinfo.Do”set Window Info Parent”&myFrom.hWnd重生成信息窗口不同于重生成地图窗口当重生成信息窗口时不使用Set Next Document语句图例窗口有一个特殊情况一般情况下它和信息窗口一样MapInfo 界面只有一个图例窗口可是MapBasic 语言中有一条Create Legend 语句因此可以产生另外的图例窗口要重生成MapInfo 的标准图例窗口使用Set Window Legend Parent 语句要产生自定义的图例窗口并重生成它使用Set Next Document 语句和Create Legend语句注意在这种情况下自定义的图例窗口只依附于指定的地图或图表窗口与标准的图例窗口不同自定义的图例窗口不会因当前窗口的改变而改变 18.3.6 改变地图窗口的大小地图窗口是否允许重画取决于应用程序的设置在例子FindZip FindZip 是MapInfo 提供的例程在MapInfo 安装目录下的MapBasic Samples VB FindZip子目录中放置在VB 中的PictureBox 控件中的地图窗口是不能改变大小的但是可以重生成一个地图窗口为MDI 方式这样就可以改变窗口的大小了当用户改变地图窗口的大小后MapInfo 并不会自动调整窗口的内容来填满整个新窗口因此必须调用windowsAPI 的MoveWmdow 函数使得地图窗口内容适应窗口的调整如果在32位的VB 下使用Dec1are 语句访问MoveWindow API函数Declare Function MoveWindow Libuser32”_ ByVal hWnd As long _ByVal x As Long ByVal y As long _ ByVal nWidth As Long ByVal nHeighi As LongByVal bRepami As LongAs Long当调整窗口大小后调用MoveWindow 函数在VB 下resize 事件触发Form_Resize 过程可以在这个过程中调用MoveWindow 函数Dim mHwnd As Long MHwnd=Val(mapinfo.Eval(“windowInfo(Front Window()12)”))Move Window mHwndScale windthScaleHeight数字12表示MapBasic 的WIN_INFO_WND Scale Width 和ScaleHeight 表示窗体的当前宽度和高度18.3.7 集成MapInfo 工具按钮在客户应用程序中不能重生成MapInfo工具按钮如果想在客户应用程序中使用MapInfo 工具按钮必须开发该应用程序来完成在VB 中如果要设计仿MapInfo 的标准按钮使用MapInfo 的RunMenuCommand 方法这个方法等价于MapBasic 中的Run Menu Command 语句在FindZip 例子中有Info Tool_Click过程其中有下列语句mapinfo.RunMenuCommand 1707当用户单击这个按钮后FindZip 程序就会调用RunMenuCommand 方法激活MapInfo的信息按钮这里的1707表示MapInfo的信息按钮在定义文件中它还定义为高级应用篇M_TOOLS_PNT_QUERY 标识符因此下面的语句与前面的语句具有同样意义mapinfo.RunMenuCommand M_TOOLS_PNT_QUERY使用标识符可使程序易读但是如果在程序中使用了这些标识符就必须有相应的头文件如VB 的是MapBasic.BAS C 的是MapBasic.H下表列出了MapInfo 标准工具按钮名称ID 号及在MapBasic.BAS(VB)MapBasic.H(C)和MapBasic.def(MapBasic)中的标识符 18.3.8 定义MapInfo 的快捷菜单如果右击MapInfo 的窗口将显示一个快捷菜单这个快捷菜单在集成地图中也能够使用可以根据需要修改这些快捷菜单删除一个或多个快捷菜单使用MapBM 次的A1tlM Menu Remove 语句或者使用Create Menu 语句重新定义一个快捷菜单增加一个菜单项到快捷菜单使用MapBasic 的Alter Menu Add 语句并使用Calling OLE 或Calling DDE 从句消除快捷菜单使用MapBasic 的Create Meou 重定义菜单并使用控制码“(”下列语句消除地图窗口中的快捷菜单Mapinfo.do "Create Menu ""MapperShortcut"" ID 17 As""(-""按钮名称 ID 号标识码Select 1701 M_TOLLS_SELECTORMarquee Select 1722M_TOOLS_SEARCH_RECT Radius Select 1703 M_TOOLS_SEARCH_RADIUSBoundary Select 1704 M_TOOLS_SEARCH_BOUNDARY Zoom In 1705 M_TOOLS_EXPANDZoom Out 1706M_TOOLS_SHRINKGrabber 1702 M_TOOLS_RECENTER Info 1707 M_TOOLS_PNT_QUERY Label 1708 M_TOOLS_LABELER Ruler 1710 M_TOOLS_RULERDrag Window1734M_TOOLS_DRAGWINDOWSymbol 1711 M_TOOLS_POINT Line 1712 M_TOOLS_LINE Polyline 1713 M_TOOLS_POLYLINE Arc 1716 M_TOOLS_ARCPolygon 1714 M_TOOLS_POLYGON Ellipse 1715 M_TOOLS_ELLIPSERectangle 1727 M_TOOLS_RECTANGLE RoundeRect 1718 M_TOOLS_ROUNDEDRECT Text 1709 M_TOOLS_TEXT Frame 1719 M_TOOLS_FRAME第十八章 跨平台集成地图18.3.9 打印集成地图窗口使用MapBasic 的PrintWin 语句可以打印集成地图窗口在VB 中定义一个菜单子程序在于程序中执行"PrintWin"方法Private Sub Menu_PrintMap_Click() Mapinfo.do"printWin" End Sub使用MapBasic 的Save Window语句可以将地图窗口以位图格式输出到一个文件中然后调用VB 的PrintForm方法打印 18.3.10 终止MapInfo在VB 中使用CreateObject 函数启动MapInfo 后当这个对象变量被释放MapInfo 就自行结束所比如果对象变量是局部变量当退出子程序时MapInfo 就自行结束但是如果对象变量是全局变量要终止MapInfo 使用下列方法Set mapinfo Nothing如果是DDE 连接使用LinkExecute 方法向MapInfo 发送End MapInfo 命令注意采用DDE 连接时在结束应用程序时要先断开DDE连接18.3.11 多命令串在应用程序中即可以一条语句一条语句地发送给MapInfo 命令也可以一次发送多条语句Dim msg As String msg "Open Table""States""Interactive" msg msg&"set Mext Document Parent"&Frm.hWndd&"Stvle 1"msg msg "Map From States"Mapinfo.do msg在VB 中用连接多字符串在组成这些字符串时要注意留有空格便于MpaInfo正确解释这些语句18.4 从MapInfo 中获取信息在集成地图应用系统中一般采用回叫(Callback)机制从MapInfo 中获取信息所谓回叫是指当MapInfo 中发生一个事件如地图窗口的改变等它自动地通知客户应用程序使用回叫机制在下列情况下MapInfo 向客户程序发送信息1. 使用自定义工具与MapInfo交互例如在地图窗口中单击并拖动鼠标MapInfo 回叫客户程序传送X Y 坐标2. 选择一个菜单命令如从自定义菜单中选择了一个命令回叫客户程序通知这个菜单事件3. 地图窗口发生改变每当地图窗口发生变化时Mapbhfo 向客户程序发送产生变化高级应用篇的窗口标识号4. 状态栏中的内容改变MapInfo 的状态栏在集成地图应用程序中并不自动显示出来要在应用程序中有类似MapInfo 的状态栏还需要进行必要的设置使用回叫技术客户程序必须能够充当DDE 服务器或自动OLE 服务器VB4.0和C++可以开发自动OLE 服务器程序而VB3.0开发的程序不能作为自动OLE 服务器只能是DDE 方式18.4.1 回叫的一般过程1. 使用VB4.0C++或其他能够产生OLE 服务器的语言创建一个类定义一个或多个OLE 方法2. 如果想模仿MapInfo 的状态栏创建SetStatusText 方法它带一个字符串参数3. 如果想要MapInfo 通知客户程序它的地图窗口的变化创建WindowContentsChanged 方法它带一个整型参数4. 为按钮或菜单创建一个或多个方法这些方法应有一个字符串参数5. 使用定义的类创建一个对象6. 启动MapInfo 后调用MapInfo 的SetCallback 方法并使用前面定义的对象7. 自定义按钮(如向MapInfo 发送Alter ButtonPad Add 语句)然后定义它调用的方法如Calling OLE methodname 这里的methodname 指的是第四步中定义的方法名MapInfo 的自定义按钮和标准按钮一样是隐藏的只有通过客户应用程序界面中的按钮通过调用Run Menu Command ID 语句执行铵钮的操作对用户而言等价于MapInfo 的按钮操作8. 自定义菜单(如向MapInfo 发送Alter Menu Add 语句)然后定义它调用的方法如Calling OLE methodname 这里的methodname 指的是第四步中定义的方法名9. 在定义的方法内处理由MapInfo 传送来的参数 18.4.2 返回数据集成地图应用程序可以创建自定义的菜单命令和按钮使用这些菜单命令或按钮时MapInfo 传回一个由逗号分隔的字符串在MapBasic 程序中每当菜单或按钮事件被触发后调用CommandInfo()函数可以获得多方面的信息下表列举了在MapBasic.DBF 中有关CommandInfo 的参数值及其定义值 菜单事件按钮事件 1 2 3 4 5 6 7 8CMD_info_menutemCMD_INFO_X CMD_INFO_Y CMD_INFO_SHIFTCMD_INFO_CTRL CMD_INFO_X2 CMD_INFO_Y2CMD_INFO_TOOLBTN第十八章跨平台集成地图它们分别表示点击处的X Y坐标是否按下SHIFT和CTRL键释放鼠标处的X Y坐标以及按钮和菜单的ID号MapInfo按下列格式组织信息后发送回应用程序"MI:"+CommandInfo(1) +""+CommandInfo(2) +""CommandInfo(3) +""+CommandInfo(4) +""CommandInfo(5) +""+CommandInfo(6) +MCommandInfo(7) +""+CommandInfo(8)如果在集成应用程序中选择了一个菜单命令MapInfo发送回的只有菜单ID号其余全是空的字符串如"MI:101"如果在集成应用程序中选择了一个按钮MapInfo发送回类似下列格式的字符中MI 73.554842.122F F72.86770243.025202它表示了单击处的坐标是否按下了SHIFT和CTRL键释放鼠标处的坐标以及按钮的ID号18.5 集成地图的语句和函数在集成地图的过程中经常用到下列MapBasic语句和函数语句或函数简要说明Create Legend 产生一个新的图例窗口Map 产生一个地图由口MenuitemInfoByHandler()MenuitemInfoByID()检测菜单的状态Open Table 打开表RemoteQueryHandler 允许MapBasic程序处理DDE客户的请求Run Menu Command 运行菜单或按钮处理程序SearchInfo() 返回SearchPoint()事项SearchRect()结果SearchPoint()SearchRect() 搜索Set Appliction Window 重生成对话框窗口Set Map 设置地图窗口Set Next Document 重生成文档窗口Set Window 设置窗口Shade Set Shade 创建进修改专题地图SystemInfo() 系统信息WindowID()WindowInfo() 返回MapInfo窗口方面的信息高级应用篇18.6 自动OLE 对象下表总结了MapInfo 对象的方法及属性Application 对象是Mapinfo 的实例MBApplications 集合中的各对象表示正在运行的MapBasic 应用程序MBGlobals 集合中的各对象表示MapBasic 程序中的全局变量对象方法 属性ApplicationDo.EvalRunCommandRunMenuCommand. DataObject.SetCallBack Name FullName Application Part.Version ProductLevelVisibleMBApplication对象方法 属性 Collection(集合)Item CountApplication.Parent Object(对象) Do.Eval Name.FullName Application.Parent MBGlobals Collection(集合) Item.CountApplicationParentObject(对象) Type Application.Parent18.6.1 Application 对象象的属性和方法属性下表列出了Application 对象的全部属性除Visible 和LastErrorCode 外所有属性都是只读的属性名 功能 返回对象的名字(MapInfo Professional )FtdlName 返回包含路径的全名 Application 返回Application 对象 返回父对象对Application 是它自己Version 返回版本ProductLevel 表示MapInfo 产品系列VisMe 读/写窗口是否可见LastErrorCode 读/写错误码它比MapBasic 的错误代码大1000LastErrorMessgae错误信息方法下表列出了Application 对象的方法第十八章跨平台集成地图方法名功能Do(String) 解释String为语句并执行它Eval(String) 解释String为表达式返回它的值RunCommand(String) 与Do方法相同RunMenuCommand(menuid) 执行指定的菜单或按钮命令仅对标准命令有效对于自定义菜单或按钮命令用Do方法(Run Menu Command ID) DataObject(windowid) 返回IUnknown接口SetCallBack(Idispatch) 注册CallBACK下面举例说明了一些方法的典型的用法Mapinfo.do"Map From Word"Mapinfo.RunMenuCommand 170218.6.2 MBApplications集台及其对象的属性和方法MBApplications是MapInfo中所有正在运行的MapBasic应用程序的集合MBApplications集合的属性下表列出MBApplications集合的属性这些属性都是只读的属性名功能Item 返回指定程序对象的IdispatchCount 返回对象数Appliction 返回MapInfo的IDispatchParent 返回父对象的IDispatchMBApplications集合中的对象属性在MBApplications集合中的对象就是一个正在运行的MapBasic应用程序对象的属性都是只读的属性名功能Name 返回应用程序名(如mymb.mbx)FullName 返回全名Application 返回应用程序的IDispatchParent 返回父对象的IDispatch下例说明了MBApplications集合的属性的用法Dim appslist As ObjectDim firstname As StringSet applist mapinfo.MBApplicationsIf applist.coun>0 ThenFirstname=applist(1).nameEnd IF高级应用篇MBApplications集合中的对象方法方法名功能Do(String) 将String发送到比RemoteMsgHandler过程Eval(String) 将String发送到RemoteQueryHandler()并返回RemoteQueryHndler()函数的值18.6.3 MBGlobals集合及其对象的属性MBGlobals是指定的MapBasic应用程序的所有全局变量的集合MBGlobals集合的属性下表列出MBGlobals集合的属性这些属性都是只读的属姓名功能Item 返回全局变量的IDispatchCount 返回集合中对象的数量Application 返回MapInfo的IDispatchParent 返回父对象的IdispatchMBGlobals集合中的对象属性MBGlobals集合中的对象是应用程序中的全局变量下表列出了对象的全部属性除Value属性外都是只读N属性名功能Value 返回全局变量的值. 返回变量的名字'Type 返回变量的类型Application 返回应用程序的IDispatch返回父对象的IDispatch下例说明了这些属性用法Dim globinfo As ObjectDim old_value As IntegerSet globinfo=mapinfo.MBAapplication(1).MBGlobalsold_value globinfo("g_status").ValueGlobinfo("g_status")old_value+118.7 MapInfo的命令行参数在使用DDE与Mapinfo进行通信时必须首先启动Mapinfo如在VB中调用Shell()函数在启动MapInfo时可以使用下表所列的命令行参数第十八章 跨平台集成地图命令行参数 作用-nosplash 不显示MapInfo 的徽标但显示Mapinfo 主窗口不显示MapInfo 的徽标也不显示Mapinfo 主窗口将MapInfo作为DDE 后台服务器-automation 或 -embedding 不显示Mapinfo 的徽标也不显示MapInfo 主窗口将Mapinfo 作为OLE 后台服务器-regserverMapinfo 注册它的OLE 权能后退出 -unregserver 取消注册-helpdiag设置按下F1时显示诊断对话框使用命令行参数的格式如下MapInfow.exe -nosplash 也可以用斜杠代替减号即MapInfow.exe /nosplash第十九章 MapBasic 的系统集成和编程技巧19.1 连接多个模块成一个项目项目文件ProjectFile 是一个文本文件它允许MapBasic 把多个相互独立的程序文件连接成一个单一的应用程序如果你正在开发一个大而复杂的应用程序你的程序可能会包含上千条的代码当然你可以把这些代码都输入到一个文件中但大多数程序员不喜欢管理十分庞大的程序文件因为一旦程序超过千行就很难找到程序中你想找的特定部分因此许多程序员把一个大的应用程序分成两个或多个较小的文件这就需要建立一个项目文件项目文件告诉MapBasic连接器如何把那些独立的模块组合成一个可执行的应用程序项目文件是MapBasic 程序设计中的可选部分你完全可以不使用项目文件而完成应用程序的建立编译和运行工作但是如果你计划开发一个大型的应用程序那么项目文件会给你带来一些好处• 项目文件可以模块化你的程序一旦你建立了一个项目文件你就可以把程序分成多个小文件模块化程序使你对程序的维护变得更加简单还可以使你的程序文件变得较小以便可以在MapBasic 的编辑窗口对它们进行编辑• 相目文件使多个程序员同时为一个项目编写程序变得更加容易每个程序员可以各自在独立的模块中工作最后可以用项目文件把这些独立模块连接起来• 项目文件可以减少重新编译应用程序的时间如果多模块项目中的一个模块被修改你只要重新编译该模块然后重新连接这个项目就可以了这比每次都要重新编译所有的源代码要快得多创建项目文件既然有这么多优点那么如何来建立一个自己的项目文件在具体介绍创建项目文件之前让我们来看两个关于项目文件的例子下面是一个用项目文件tbproj.mbp 建立文本框的例子[Link]Application=textbox.mbx Module=textbox.mbo Module=Auto_lib.mbo类似地用项目文件sbproj.mbp 建立的一个刻度条ScaleBar 的例子如下[Link]Application=scalebar.mbx Module=scalebar.mbo Module=Auto_lib.mbo这两个项目文件的最后一行相同它告诉MapBasic 把auto_lib 模块连接到该项目中auto_lib 模块是MapBasic 自带的一个例程第十九章 MapBasic 的系统集成和编程技巧如果你已经写了一个程序并且想为你的程序建立一个项目文件那么可以按照下面的步骤进行1. 选择[File][New]打开一个编辑窗口2.在辑窗口中输入下面这一行[Link]3. 接着输入这样一行文本Application=appFilename(这里appFilename 是指你想建立的可执行文件的文件名)例如Application=C:mbC0DE CUSTOM.mbx4. 接着再输入行文本Module=modulename 这里modulename 是指MapBasic 的目标文件名例如 Module=c:mbCODE CUSTOM.mbo注意文件的扩展名MapBasic 的目标文件的扩展名为.mbo 当多模块项目中的一个单独的模块被编译时MapBasic 就会为它建立一个目标文件任何时候当你选择[project][Compile CurreniFile]时MapBasic 就会试图把当前文件编译成一个可执行文件扩展名为.mbx但是如果该程序文件调用了不在此文件中的函数或过程MapBasic 则不能建立一个.mbx 文件在这种情况下MapBasic 假设它只是一个大项目的一个部分而把它编译成一个目标文件.mbo另外当一个程序没有主过程时MapBasic在编译时也把它编译成一个目标文件5. 重复第(4)步直到包括了你的应用程序的所有模块6. 选择[File]SaveAs 保存项目文件注意在SaveAs 对话框中选择文件类型中的ProjectFile 从对话框左下角的文件类型列表中选择以便使保存的项目文件有扩展名.mbp 冲7. 关闭编辑窗口至此一个项目文件已经建好如果以后你想把更多的模块加入到你的项目中只需在项目文件中加入相应的Module=行项目建好后还需要对它进行编译和链接可以按照下面的步骤编译和链接你的项目 1. 编译在项目中用到的每一个模块为了编译这些模块可以先选择[File][Open]然后选择Project[CompileCurrentFile1或者你可以直接用 [File][CompiIeFromFile] 对选择的文件进行编译 2.选择Project [SelectProjectFile]告诉MapBasic 你想链接哪个项目文件此时显示[SelectprojectFile]对话框选择想要链接的项目文件.mbp 后单击[OK]按钮MapBasic就会链接这个项目文件被选择的项目文件将出现在编辑窗口直到你退出MapBasic 关闭编辑窗口或打开另外一个项目文件任何时候只有一个项目文件可以被选择3.选择高级应用篇[Project][LinkCurrentFile]链接你的应用程序MapBasic 依次读入在项目文件中列出的目标文件.mbo 如果没有链接错误MapBasic 生成一个可执行文件.mbx 否则将显示错误信息也可以用[File][LinkFromFile]对项目进行链接而不需要先把项目文件显示在编辑窗口但要链接的各模块必须先编译成目标文件19.2 系统过程应用技巧19.2.1 系统过程尽量简洁系统事件处理过程往往会被频繁调用因此应用程序中的系统事件处理过程应尽可能简洁假如应用程序中有SelChangedHandler 过程则每次查询表改变时MapInfo 都会调用该过程在MapInfo运行期间查询表通常会被频繁地改变所以应该尽可能地使SelChangedHandler 过程简洁19.2.2 查询时避免调用SelChangedHandler 过程的方法如果使用Select 语句进行查询但又不想同时触发SelChangedHandler 过程可以便用NoSelect 关键字如Select From World EarthQuery NoSelect 使用NoSelect 关键字后该查询语句虽然改变了查询表但并不自动调用SelChangedHandler过程19.2.3 避免死循环调用系统保留过程有时会产生死循环如果在应用程序中使用了SelChangedHandler 过程则无论何时查询表被改变MapInfo 都会调用该过程若在SelChangedHandler 过程中又放置了Select 语句那么Select 语句执行后又会使MapInfo 再次调用SelChangedHandler过程其结果是进入死循环直到应用程序执行到内存溢出时为止Set Handler 语句可以用来避免程序进行入死循环在过程的开始处用Set Handler 0ff 关闭系统过程的自动调用在过程的最后用Set Handler On 语句恢复系统过程的自动调用这样可以避免系统过程的递归调用19.3 巧用MapInfo 环境下的MapBasic 交互命令窗口编程从MapInfo 与MapBasic 的关系上看MapInfo 是MapBasic 的外在表现MapBasic 是MapInfo 自动操作的基础两者是相辅相成的如其他字处理软件如Word 中对宏的记录或录制当操作MapInfo 时在MapBasic 交互命令窗口会对操作语句进行记录再者MapBasic 的语法形式比较烦琐利用此特性可以方便编程具体操作如下在MapInfo 环境下操作 选项>显示MapBasic 窗口出现图19-1显示MapBasic 窗口然后进行相应的操作在操作的过程中会记录操作。
《地理信息系统实训(习)指导书》前言地理信息系统是一门学科,是描述、存储、分析和输出空间信息的理论和方法的一门新兴的交叉学科;另一方面,地理信息系统是一个技术系统,是以地理空间数据库(Geospatial Database)为基础,采用地理模型分析方法,适时提供多种空间的和动态的地理信息,为地理研究和地理决策服务的计算机技术系统。
本指导书设计了十二个实训项目(其中第十二个是综合实训),每个实训项目都包括实训目的与要求、实训内容、实训问题及实现、实训报告。
目录MapInfo概述 (3)ArcInfo概述.................................................................................................. 错误!未定义书签。
实训一投影的应用使用各种不同的投影方法理解投影.. (4)实训二 MapInfo7.0中表的使用 (4)实训三空间数据的理解 (5)实训四MapInfo7.0工具条的使用 (7)实训五Mapinfo中菜单的使用 (9)实训六使用MapInfo7.0进行数字化 (19)实训七使用MapInfo7.0进行数字化 (21)实训八使用MapInfo7.0对GIS图形使用SQL查询 (22)实训九使用MapInfo7.0制作统计图和专题图 (23)实训十使用MapInfo7.0创建3D地图 (27)实训十一使用MapInfo7.0创建HTML地图 (42)实训十二使用MapInfo7.0和OFFICE关联 (45)MapInfo概述1.1 MapInfo简介MapInfo是美国MapInfo公司的桌面地理信息系统软件,是一种数据可视化、信息地图化的桌面解决方案。
它依据地图及其应用的概念、采用办公自动化的操作、集成多种数据库数据、融合计算机地图方法、使用地理数据库技术、加入了地理信息系统分析功能,形成了极具实用价值的、可以为各行各业所用的大众化小型软件系统。
16・北京测绘・2008年第2期MapInfoGIS应用系统二次开发技术吕丽英.耿云峰(河北省第三测绘院,河北石家庄050031)【摘要】对Maplnfo基本产品进行了介绍,系统阐述了三种利用Maplnfo产品进行的二次开发模式:Maplnfo作为独立开发平台,利用MapBasic进行二次开发模式;将Maplnfo作为OLE对象的开发模式;利用基于ActiveX的MapX控件所进行的开发模式。
【关键词】地理信息系统;MapInf0产品;二次开发;M印Basic;0LE对象;MapX控件【中图分类号】P208[文献标识码】A【文章编号】1007—3000(2008)02-4常用的地理信息系统平台产品种类很多,但是由于这类产品具有广泛的适用性,因此用户在进行本行业内的地理信息应用系统建设时,往往需要进行这些系统的二次开发,以适应具体业务的需要。
Maplnfo系列产品具有良好的性价比,在国内外的GIS应用中相当普及,易于进行各种方式的二次开发,根据所积累的实践经验,下面简要介绍如何利用Maplnfo部分产品进行地理信息系统的二次开发。
1Maplnfo基本产品介绍Maplnfo是美国Maplnfo公司1986年推出的桌面地图信息系统,至今已从最初的MaplnfoforDOS1.0发展到了Maplnfoprofessional8.5。
Maplnfo产品定位在桌面地图信息系统上,与Arclnfo等大型GIS系统相比,因Maplnfo图元数据不含拓扑结构,它的制图及空间分析能力相对较弱,但对大众化的PC桌面数据可视及信息地图化应用来说,Maplnfo小巧玲珑,易学易用,价位较低,是一个优选GIS产品。
在Maplnfo的系列产品中,应用最为广泛的是MaplnfoProfessional。
MaplnfoProfessional是一种基于普通Pc微机的通用桌面地理信息系统软件,作为基础的Maplnfo产品模块,其主要技术特点如下:1)快速数据查询,高速屏幕刷新,用户界面具有良好的图形显示效果;2)集成能力强,能够根据数据的地理属性分析信息的应用开发工具,有功能强大的地图数据组织和显示软件包;3)数据可视化和数据分析能力较强,可以直接访问多种数据库的数据,如Oracle、MicrosoftAccess、Informix、SQLServer、Dbase等;4)专题地图制作方便,数据地图化方便;5)同时支持16/32位的应用开发,适用于多种计算机操作系统,如Windows3.1、Windows95、WindowsNT、OS/2等;6)完整的Client/Server体系结构;7)完善的图形无缝连接技术;8)支持OLE2.0标准,使得其它开发语言如VisualBasic、VisualC++、PB、Dephi等能运用IntegratedMapping技术将Maplnfo作为OLE对象进行开发。
收稿日期:2010-01-19
作者简介:李海珍(1977-),女,本科,讲师,研究方向:计算机软件。
利用Mapinfo 进行GIS 应用开发
李海珍
(周口市川汇区教师进修学校,河南周口466000)
摘
要:在深入研究Mapinfo 地理信息系统平台的基础上,结合不同GIS 应用的特点,详细介绍了利用Mapinfo 开发GIS
应用系统的二种方法,并对这二种方法进行深入比较,针对不同的GIS 应用提出不同的开发方案。
关键词:地理信息系统;Mapinfo ;二次开发;OLE 自动化中图分类号:P208
文献标识码:B
文章编码:1672-6251(2010)04-0125-02
Developing GIS Application Using Mapinfo
Li Haizhen
(Zhoukou Chuanhui District Teachers'College for Vocational Studies ,Zhoukou 466000,China)
Abstract:Based on the research on Mapinfo (a GIS develop platform),two methods for developing GIS application using Mapinfo were described and different development resolutions for different GIS application ’s feature through comparing these two developing method were proposed.
Key words:GIS;Mapinfo;secondary development;OLE automation
1前言
地理信息系统
(GIS,Geographic Information Sys -
tem)是利用计算机建立空间地理数据库,将地理环境的各种因素,包括它们的地理空间分布状况和所具有的属性数据进行数字存储,是把地图独特的视觉化效果与关系数据库集成在一起的信息系统。
MapInfo 地理信息系统平台作为一个图形—文字信息完善结合的软件工具,能将所需要的信息资料形象直观的与地理图形紧密地联结起来,以提供大量常用的地图查询分析功能。
Mapinfo 产品定位在桌面地图信息系统上,对大众化的PC 桌面数据可视及信息地图化应用而言,
Mapinfo 小巧玲珑、易学易用、价位较低,是一个优选的GIS 产品。
Mapinfo 提供了自己的二次开发平台,用户可以在平台上开发各自的GIS 应用。
2开发方法
二次开发方法包括基于MapBasic 的开发、基于
OLE 自动化的开发及利用MapX 控件的开发三种。
从早期的MapBasic 到目前的MapX4.5,Mapinfo 上的
GIS 系统开发变得越来越高效、简捷。
以下介绍如何利用MapBasic 和OLE 自动化开发GIS 应用系统。
2.1
利用MapBasic 开发
MapBasic 是Mapinfo 自带的二次开发语言,它是
一种类似Basic 的解释性语言,利用MapBasic 编程生成的*.mbx 文件能在Mapinfo 软件平台上运行,早期的Mapinfo 二次开发都是基于MapBasic 进行的。
Map -
Basic 易学,但使用起来束缚较多,无法实现较复杂的自定义功能,用它来建立用户界面也较麻烦,从现在角度看,MapBasic 比较适合用于扩展Mapinfo 功能。
2.2利用OLE 自动化开发2.2.1
建立Mapinfo 自动化对象
基于OLE 自动化的
开发就是编程人员通过标准化编程工具如VC 、VB 、
Delphi 、PB 等建立自动化控制器,然后通过传送类似MapBasic 语言的宏命令对Mapinfo 进行操作。
实际上是将Mapinfo 用作进程外服务器,它在后台输出OLE 自动化对象,供控制器调用它的属性和方法。
OLE 自动化开发首先是建立Mapinfo 自动化对象,以Delphi 为例(下同),可设定一个Variant 类型的全程变量代表OLE 自动化对象,假设该变量名为
olemapinfo ,那么有:
oleMapinfo:=CreateOleObject('Mapinfo.Applica-tion')
一旦OLE自动化对象建立,即后台Mapinfo成功启动,就可以使用该对象的Do方法向Mapinfo发送命令,如:
oleMapinfo.Do('Set Next Document Parent'+Win-Hand+'Style1')
这一命令使Mapinfo窗口成为应用程序的子窗口,WinHand是地图窗口句柄,style1是没有边框的窗口类型。
也可以使用自动化对象的Eval方法返回Map-Basic表达式的值,如下面语句返回当前所打开的表数:
TablesNum:=olemapinfo.eval('NumTables()')
另外,也可以直接调用Mapinfo菜单或按钮命令对地图窗口进行操作,如地图放大显示:
oleMapinfo.RunMenuCommand(1705)
2.2.2建立客户自动化对象触发CallBack基于OLE 自动化开发的难点在于CallBack,Mapinfo服务器对客户程序地图窗口的反应叫CallBack,假如在地图窗口中移动地图目标,Mapinfo能返回信息告知地图目标当前的坐标位置,这就是CallBack功能。
如果想定制自己的地图操作工具或菜单命令,必须依靠CallBack。
但是想捕获CallBack信息,客户程序必须具备接收CallBack信息的能力,为此需要在客户程序中定义自己的OLE自动化对象,如:
//定义界面
IMyCallback=interface(IDispatch)
['{2F4E1FA1-6BC7-11D4-9632-913682D1E638} ']
function WindowContentsChanged(var WindowID: Integer):SCODE;safecall;
function SetStatusText(var StatusText:WideString): SCODE;safecall;
//定义界面实现
TMyCallback=class(TAutoObject,IMyCallback)
function SetStatusText(var StatusText:WideString): SCODE;safecall;
function WindowContentsChanged(var WindowID: Integer):SCODE;safecall;
其中WindowContentsChanged函数用于返回变化窗口的ID号,即当地图窗口变化时(如放大、缩小),让Mapinfo将地图窗口的ID号返回给客户程序;另一个SetStatusText函数返回Mapinfo状态条变化信息。
编程人员不能随意定义这些函数,因为只有在以下三种情况下Mapinfo服务器的CallBack才会被触发:①地图窗口发生变化,触发函数为WindowCon-tentsChanged;②Mapinfo状态条信息改变,触发函数为SetStatusText;③用户选择自定义工具或菜单命令在地图窗口上操作,如用户定制的画线工具,当用户在地图窗口画线时触发Mapinfo的CallBack返回线的坐标位置。
建立客户自动化对象后,调用MapInfo自动化对象的SetCallback方法将客户自己定义的自动化对象告诉Mapinfo,只要程序一运行,客户自动化对象就会自动在注册表中注册,然后就能收到CallBack信息,如:
My:=MyCallBack.Create;
oleMapInfo.SetCallBack(My);
为有助于理解上述机制,打一个比方,客户程序与Mapinfo之间的交互就像舞台指挥与木偶演员的交流,客户程序中的地图窗口或说Mapinfo子窗口只不过是一个牵线木偶,后台的Mapinfo才是真正操纵木偶的演员,所以客户程序必须与后台Mapinfo建立正向、反向的联系机制,才能操纵地图窗口中的图形目标。
3小结
基于MapBasic的开发简单但受限制较多,比较适合Mapinfo功能扩展编程。
而基于OLE自动化的开发比较繁琐,因为需要来回向后台的Mapinfo发送Map-Basic字符串命令,所建立的应用程序运行速度也相对较慢,但这种开发方法能随心所欲制作出美观友好的界面,将地理操作与非地理操作融为一体,并且能全部实现Mapinfo的功能,这是目前MapX4.5也不能比拟的。
参考文献
[1]李金生,刘岩,等.基于MapInfo的校园GIS查询系统的设计与
实现[J].测绘与空间地理信息,2008,(6)
[2]张萍,陈清国,等.基于MapInfo的住宅小区物业管理信息系统
研究[J].地理空间信息,2008,(6)
[3]汪春鹏,周常森.Mapinfo格式地图解析程序设计[J].测控技术,
2008,(9)
[4]徐星圆,孙杨,等.浅议Mapinfo在图形信息可视化中的应用[J].
计算机与数字工程,2008,(8)。