二次开发入门MapBasic--MapInfo教程
- 格式:doc
- 大小:27.00 KB
- 文档页数:5
Mapinfo教程
引言
Mapinfo是一款地理信息系统(GIS)软件,它主要用于地图创建、地理数据分析和空间数据可视化。
它提供了一系列功能强大的工具,使用户能够轻松处理和分析地理数据。
本教程将介绍Mapinfo的基本概念、常用功能和操作步骤,帮助初学者快速上手使用Mapinfo。
目录
1.安装与配置
2.Mapinfo界面介绍
1.工作区
2.菜单栏
3.工具栏
3.创建和编辑地图
1.创建新地图
2.导入地理数据
3.创建图层
4.编辑图层
4.地理数据分析
1.空间查询
2.属性查询
3.空间分析
5.数据可视化
1.创建主题图
2.图表制作
1. 安装与配置
在开始使用Mapinfo之前,您需要先下载和安装Mapinfo 软件。
您可以到Mapinfo官方网站下载安装程序,并按照安装向导进行操作。
一旦安装完成,您可能还需要配置一些软件设置,如选择语言、设置默认地图坐标系等。
2. Mapinfo界面介绍
2.1 工作区
Mapinfo的工作区包括地图窗口、图层列表和信息窗格。
地图窗口是您进行地图浏览和编辑的主要区域,它显示了地理数据的可视化效果。
图层列表用于管理和显示地图中的不同图层,您可以通过勾选或取消勾选图层来控制其可见性。
信息窗格则显示了与地图相关的属性信息和统计数据。
2.2 菜单栏
Mapinfo的菜单栏包含了各种功能命令和工具选项,您可以使用这些选项进行地图创建、数据分析、编辑等操作。
常用的菜单栏选项包括。
MAPINFO和经常使用插件Mapinfo介绍主界面:要紧包括要紧工具栏、画图工具栏和菜单栏。
在主界面左下角显示当前状态:能够依照情形调整为光标位置,地图比例和缩放(窗口宽度)另外能够选定图层进行信息编辑,在图一中该处显示为“无”,那么画图工具栏内图标均显示为灰色,无法进行编辑;选定福州基站参数层后图标显示为黑色,能够进行编辑:图层操纵:咱们通过图层操纵咱们能够方便改变小区的标注,右键点击后会弹出一菜单,选择图层操纵后显现对话窗口:将福州基站参数层后面的第四个框打上钩,图上就会显现对应的标注内容:有时候咱们会发觉图中的一些小区无标注,可能是由于重名或名字重叠致使无法显示,这时咱们能够点击图层操纵框的标注按钮,将“许诺文本重复”和“许诺文本重叠”选中,就能够够看到标注项的所有内容了。
想要在图上显示不同标注项的内容只要在标注框里选择相对应的标注项就能够够了。
创建点:有时候会需要对大量的地理坐标导入电子地图,那个地址就能够够利用MAPINFO 的创建点来实现。
第一在EXCEL表格里面录入需要显示地址的名字、经纬度,切记经纬度的单位是度,不能费用分秒。
再将文件保留成TXT文本文件。
然后在MAPINFO打开文件,打开文件类型选择*.txt在跳出的窗口中文件字符集项选“No character set conversion”,和将以第一行作为题目前打上勾。
导入到MAPINFO后如图:以后就能够够创建点了:点击创建点弹出窗口:能够看到创建点的信息来自与咱们导入的“BOOK1”点击利用符号右边按钮,能够调整创建点的显示属性取得X、Y坐标的列应和经度、纬度所在列对应,确信后就在电子地图上生成了咱们所要的点。
导入地图信息,就能够够看到所选的点在地图上的位置了。
“celltool”插件的利用:“celltool”是一种经常使用的频率计划插件,直接双击“”插件,就会在mapinfo的菜单中增加一个cellmaker的菜单。
' ImportExcel.mbInclude "MapBasic.def"Declare Function XLS_ImportTab (ByVal sXLS As String, ByVal sTab As String) As Logical Declare Function XLS_A1Cell (ByVal nCol As Integer, ByVal nRow As Integer) As String Declare Sub MainSub MainDim sXLS, sTab As StringClose AllsXLS = FileOpenDlg ("", "*.xls", "XLS", "Please select the spreadsheet file to import:") If sXLS = "" ThenExit SubEnd IfsTab = PathToFilename$(sXLS)sTab = Left$(sTab, Len(sTab)-3) & "TAB"sTab = FileSaveAsDlg (PathToDirectory$(sXLS), sTab, "TAB", "Save table as:")If sTab = "" ThenExit SubEnd IfIf NOT XLS_ImportTab (sXLS, sTab) ThenExit SubEnd IfOpen Table sTabBrowse * From TableInfo(0, TAB_INFO_NAME)End SubFunction XLS_ImportTab (ByVal sXLS As String, ' Full path/name of spreadsheet fileByVal sTab As String) ' Full path/name of table fileAs Logical' Imports an Excel spreadsheet as a table assuming that the first' row contains the field names.Dim nRows, nCols As IntegerDim sRange, sCell As StringOnError Goto XitRegister Table sXLS TYPE XLS Into sTabOpen Table sTab As ~XLS' Determine the size of the tablenCols = TableInfo (~XLS, TAB_INFO_NCOLS)nRows = TableInfo (~XLS, TAB_INFO_NROWS)Close Table ~XLS' Convert row and column of end of range to A1-type referencesCell = XLS_A1Cell (nCols, nRows)If sCell = "" ThenNote "Spreadsheet " & PathToTablename$(sTab) & " not imported."Exit FunctionEnd If' Import the spreadsheet as a tablesRange = "A2:" & sCellRegister Table sXLS TYPE XLS Titles Range sRange Into sTabXLS_ImportTab = TRUEExit FunctionXit:Note "XLS_ImportTab error: " & Chr$(10) & Error$()End FunctionFunction XLS_A1Cell (ByVal nCol As Integer, ' Column reference: 0 < n <= 256ByVal nRow As Integer) ' Row reference: 0 < n <= 65536As String ' Returned A1-type cell reference, or NULL if error ' Creates an Excel A1-type reference for a cell from a row and columnDim sCellRange As StringDim i, j As Integer' Error checkIf nCol < 0 OR nCol > 256 ThenNote "XLS_A1Cell Error: Invalid column reference = " & nColExit FunctionEnd IfIf nRow < 0 OR nRow > 65536 ThenNote "XLS_A1Cell Error: Invalid row reference = " & nRowExit FunctionEnd If' Columns are 1=A, 2=B, ... 26=Z, 27=AA, 28=AB, ... 256=IV' Note: they are not regular (i.e 27 is "AA", not "A " or "A0")i = nCol - 1If i > 25 thenj = i \ 26sCellRange = Chr$(64+j)end ifj = i mod 26sCellRange = sCellRange + Chr$(65+j) & nRowXLS_A1Cell = sCellRangeEnd Function。
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对象的数据集属性。