当前位置:文档之家› 二次开发入门MapBasic--MapInfo教程

二次开发入门MapBasic--MapInfo教程

MapInfo教程--二次开发入门摘要:MapBasic是Mapinfo自带的二次开发语言,它是一种类似Basic的解释性语言,利用MapBasic编程生成的*.mbx文件能在Mapinfo软件平台上运行,早期的Mapinfo二次开发都是基于MapBasic进行的。

MapBasic学起来容易,用起来却束缚多多,无法实现较复杂的自定义功能,用它来建立用户界面也很麻烦,从现在角度看,MapBasic比较适合用于扩展Mapinfo功能。

一、利用MapBasic开发MapBasic是Mapinfo自带的二次开发语言,它是一种类似Basic的解释性语言,利用MapBasic编程生成的*.mbx文件能在Mapinfo软件平台上运行,早期的Mapinfo二次开发都是基于MapBasic进行的。

MapBasic学起来容易,用起来却束缚多多,无法实现较复杂的自定义功能,用它来建立用户界面也很麻烦,从现在角度看,MapBasic比较适合用于扩展Mapinfo功能。

二、利用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表达式的值,如下面语句返回当前所打开的表数: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;//定义界面实现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信息了,如:My:=MyCallBack.CreateoleMapInfo.SetCallBack(My)这里打一个比方我想会有助于理解上述机制,客户程序与Mapinfo之间的交互就像舞台指挥与木偶演员的交流,客户程序中的地图窗口或说Mapinfo子窗口只不过是一个牵线木偶,后台的Mapinfo才是真正操纵木偶的演员,所以客户程序必须与后台Mapinfo建立正向、反向的联系机制,才能操纵地图窗口中的图形目标。

三、利用MapX开发1. 掌握使用MapXMapX是Mapinfo公司最新推出的ActiveX控件产品,目前已经发展到MapX4.5。

由于MapX 是基于Windows操作系统的标准控件,因而能支持VC、VB、Delphi、PB等标准化编程工具,使用时只需将控件装入开发环境,装入控件后,开发环境ActiveX工具条上会增加一个控件按钮Map,把它拖放到窗体上就可建立一个TMap类型的ActiveX地图对象Map,通过设置或访问该Map对象的属性、调用该Map对象的方法及事件,便能快捷地将地图操作功能溶入到你的应用程序中。

MapX由一系列Object(对象)和Collection(对象集合)组成,Map是最基本的对象,每个Map 由Layer(层)、Dataset(数据集)和Annotation(标注)这三个对象及对象集合(Layers、Datasets、Annotations)来定义,其中Layer用于操作地图图层,Dataset用于访问空间对象的属性数据,Annotation用于在地图上添加文本、符号等标注,掌握上述三个主要对象的特征后,再顺藤摸瓜掌握下一级对象的特征,如每个Layer又由Feature(点、线、面、文本图形目标)对象及对象集合(Features)定义,每个Dataset由Field(属性数据域)对象及对象集合(Fields)定义......,这样很快就能把MapX学到手。

2. 定义地图坐标系在MapX开发中需要特别注意地图坐标系问题,MapX地图坐标系分为地图显示坐标系和内部计算坐标系,两者互为独立,在GIS应用开发中根据应用需要设置好这两种坐标系非常重要,因为坐标系一方面影响软件系统的内部坐标处理,另一方面影响地图的外观显示。

Map对象的坐标系及投影通过CoordSys对象的Set方法定义:Set(Type, [Datum], [Units], [OriginLongitude], [OriginLatitude],[StandardParallelOne], [StandardParallelTwo], [Azimuth], [ScaleFactor],[FalseEasting], [FalseNorthing], [Range], [Bounds], [AffineTransform])其中主要参数:Type表示投影类型,Type为1时地图坐标以经纬度表示,后面都为可选参数,其中Datum为地球基准面;Units为坐标单位,如Units为7表示以米为单位;OriginLongitude、OriginLatitude分别为起始经度和纬度;StandardParallelOne、StandardParallelTwo为第一、第二标准纬线,该参数与地图投影相关。

通过设置Map对象的DisplayCoordSys和NumericCoordSys属性返回的CoordSys对象,就可设定地图显示坐标系和内部计算坐标系。

举例如下:procedure TMain.DefineMapParam();varMapDatum: Variant;//地球基准面begintryMapDatum := CreateOleObject('MapX.Datum.4'); //建立基准面对象//定义北京54坐标系基准面// (Ellipsoid, ShiftX, ShiftY, ShiftZ, RotateX, RotateY, RotateZ, ScaleAdjust, PrimeMeridian) MapDatum.set(3, 24, -123, -94, -0.02, 0.25, 0.13, 1.1, 0);//定义北京54坐标系经纬度作为内部计算坐标系Map1.NumericCoordSys.Set_(1, MapDatum);//定义北京54坐标系30度标准纬线麦卡托投影作为显示坐标系,单位为米Map1.DisplayCoordSys.Set_(26,MapDatum,7,0,0,30);finallyVarClear(MapDatum);end;坐标系是GIS系统的基石,正确设置坐标系是系统成败的关键。

3. 操纵地图对象你可以简单地加载一个GeoSet文件,给Layers对象集合赋予具体的内容,随之在Map对象中就能看到地图显示,GeoSet文件类似MapInfo中的工作空间,MapX中带有Geoset文件的编辑器GeosetMangater.exe,用户可在编辑器中组合及设置图层,然后保存生成一个*.gst 文件直接调入Map对象,这样可以节省时间。

你也可以通过Layers对象的Add 或Remove 方法添加或移走地图图层,如:yers.Add(FileName); // 添加图层,FileName为文件全路径名yers.Remove(3); // 移走地图第三层Layers对象由一组Layer对象组成,通过Layer对象的Features和Selection对象集合你可以操纵和选择图层上的图形目标,如:yers.Item(1).AddFeature(Newobj); //将新建对象Newobj添加到图层一4. 地图数据捆绑数据捆绑是将不同来源的数据对应到地图层的过程,捆绑结果会产生一个Dataset对象,Dataset对象的集合组成Datasets Collection,它定义了Map对象的数据集属性。

相关主题