国学参考      
首页 | 地理资讯 | 地理文摘 | 环境气象 | 学习园地 | 地理百科 | 地域行政 | 地理资源 | geography | 专题 | 参考文库 | 参考论坛
  当前位置:首页>地理文摘>技术应用>文章内容
MapInfo上的GIS系统开发
来源: 作者:国学 发布时间:1969-12-31  






Mapinfo是美国Mapinfo公司1986年推出的桌面地图信息系统,至今已从最初的Mapinfo for Dos 1.0 发展到了Mapinfo Professional 6.0。 Mapinfo产品定位在桌面地图信息系统上,与Arc/Info等大型GIS系统相比,因Mapinfo图元数据不含拓扑结构,它的制图及空间分析能力相对较弱,但对大众化的PC桌面数据可视及信息地图化应用来说,Mapinfo小巧玲珑,易学易用,价位较低,是一个优选GIS产品。Mapinfo提供了自己的二次开发平台,用户可以在平台上开发各自的GIS应用。二次开发方法归结起来有三种,它们是基于MapBasic的开发、基于OLE自动化的开发及利用MapX控件的开发。从早期的MapBasic到目前的MapX4.5,Mapinfo上的GIS系统开发变得越来越高效、简捷,下面介绍如何利用MapBasic、OLE自动化和MapX开发GIS应用系统。

一、利用MapBasic开发

 MapBasic是Mapinfo自带的二次开发语言,它是一种类似Basic的解释性语言,利用MapBasic编程生成的*.mbx文件能在Mapinfo软件平台上运行,早期的Mapinfo二次开发都是基于MapBasic进行的。MapBasic学起来容易,用起来却束缚多多,无法实现较复杂的自定义功能,用它来建立用户界面也很麻烦,从现在角度看,MapBasic比较适合用于扩展Mapinfo功能。       
zgwww.net


二、利用OLE自动化开发

1. 建立Mapinfo自动化对象

 基于OLE自动化的开发就是编程人员通过标准化编程工具如VC、VB、Delphi、PB等建立自动化控制器,然后通过传送类似MapBasic语言的宏命令对Mapinfo进行操作。实际上是将Mapinfo用作进程外服务器,它在后台输出OLE自动化对象,供控制器调用它的属性和方法。

OLE自动化开发的首要一步就是建立Mapinfo自动化对象,以Delphi为例(后面都是如此),你可设定一个Variant类型的全程变量代表OLE自动化对象,假设该变量名为olemapinfo,那么有:

  oleMapinfo := CreateOleObject('Mapinfo.Application')  

一旦OLE自动化对象建立,也就是后台Mapinfo成功启动,你就可以使用该对象的Do方法向Mapinfo发送命令,如:

   oleMapinfo.Do('Set Next Document Parent' WinHand 'Style 1')

这一命令使Mapinfo窗口成为应用程序的子窗口,WinHand是地图窗口句柄,style 1 是没有边框的窗口类型。你还可以使用自动化对象的Eval方法返回MapBasic表达式的值,如下面语句返回当前所打开的表数:

CHINAGEOG.COM



   TablesNum:=olemapinfo.eval('NumTables()')

你也可以直接调用Mapinfo菜单或按钮命令对地图窗口进行操作,如地图放大显示:

   oleMapinfo.RunMenuCommand(1705)

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; CHINAGEOG.COM

  //定义界面实现 

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才会被触发:(1)地图窗口发生变化,触发函数为WindowContentsChanged;(2)Mapinfo状态条信息改变,触发函数为SetStatusText;(3)用户选择自定义工具或菜单命令在地图窗口上操作,如用户定制的画线工具,当用户在地图窗口画线时触发Mapinfo的CallBack返回线的坐标位置。

建立客户自动化对象后,调用MapInfo自动化对象的SetCallback方法将客户自己定义的自动化对象告诉Mapinfo,只要程序一运行,客户自动化对象就会自动在注册表中注册,然后就能收到CallBack信息了,如: CHINAGEOG.COM

   My:=MyCallBack.Create

 oleMapInfo.SetCallBack(My)

 这里打一个比方我想会有助于理解上述机制,客户程序与Mapinfo之间的交互就像舞台指挥与木偶演员的交流,客户程序中的地图窗口或说Mapinfo子窗口只不过是一个牵线木偶,后台的Mapinfo才是真正操纵木偶的演员,所以客户程序必须与后台Mapinfo建立正向、反向的联系机制,才能操纵地图窗口中的图形目标。

三、利用MapX开发

1. 掌握使用MapX

MapX是Mapinfo公司最新推出的ActiveX控件产品,目前已经发展到MapX4.5。由于MapX是基于Windows操作系统的标准控件,因而能支持VC、VB、Delphi、PB等标准化编程工具,使用时只需将控件装入开发环境,装入控件后,开发环境ActiveX工具条上会增加一个控件按钮Map,把它拖放到窗体上就可建立一个TMap类型的ActiveX地图对象Map,通过设置或访问该Map对象的属性、调用该Map对象的方法及事件,便能快捷地将地图操作功能溶入到你的应用程序中。
共3页: 上一页 1 [2] [3] 下一页
 
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·激光雷达技术
·3DGIS在城市规划中的应用
·机载激光雷达LiDAR技术介绍
·Mapbasic(中文)参考手册
·扬州市数字化城市管理系统
·令人震撼!!摄影师眼中的镜头[1
·激光雷达特点、分类及其发展
·国家坐标系
·常见遥感卫星基本参数大全
·ArcGIS
·GIS在交通行业的应用
·VirtuoZo全数字摄影测量系统数字
  相关文章
·数字正射影像图
·城市地理信息系统标准指南基本术
·数字栅格地图(DRG)
·基于J2EE
·手持GPS坐标系统转换参数的求解
·GIS应届本科毕业生求职
·数字线化地图(DLG)
·实现“数字长江”宏伟构想
·数字高程模型(DEM)
·求职
·美国GPS介绍
·让我们每一个中国人气愤的事情发
Copyright © 2006 国学参考  All Rights Reserved Power by:HeadWind