MapInfo概论
?第一讲 MapInfo简介及基本概念
?第二讲 MapInfo基本操作 —表
?第三讲 MapInfo查询及分析
?第四讲 空间分析及属性信息图形化
?第五讲 OLE 嵌入与 MapBasic 简介
?第六讲 集成地图开发
?第七讲 组件式 GIS与 MapX基础
?第八讲 MapX二次开发
?第五讲 OLE 嵌入与 MapBasic 简介
一,OLE嵌入
1.1 OLE嵌入和 MapInfo
1.2 嵌入 MapInfo地图
1.3 MapInfo地图特性
二,MapBasic开发环境
2.1 MapBasic概述
2.2 如何创建、编译和运行一个程序
2.3 程序的调试与运行
三,MapBasic基础
3.1 变量
3.2 流程控制语句
3.3 过程
3.4 自定义函数
3.5 输出与显示
3.6 程序组织
?第五讲 OLE 嵌入与 MapBasic 简介
四,地图图层和地图对象
五、表管理与文件控制
?第五讲 OLE 嵌入与 MapBasic 简介
1.1 OLE嵌入和 MapInfo
?一 OLE嵌入
OLE是一个被称为对象链接与嵌入的进程,它通过服务器
应用程序(如 MapInfo)提供信息,并将其储存在能接收 OLE
信息的客户应用程序中(如字处理程序)。
MapInfo的 OLE嵌入功能允许在能接收 OLE对象的任何应用
程序中嵌入地图窗口,并在其中直接使用 MapInfo的部分特性来
创建、显示和编辑地图。
1,OLE术语:
( 1) 对象,通过 OLE嵌入的任何信息(地图窗口)
( 2) 嵌入,把来自服务器的 OLE对象插入容器应用程序中,并
允许在其他信息环境中进行编辑和输出(服务器对象的副本)
( 3) 容器或客户,接收(包含)嵌入 OLE对象的应用程序,如
:文字处理程序、电子表格程序、数据库等
( 4) 服务器,创建用于容器的 OLE对象的源应用程序( MapInfo)
( 5) 活动对象和对象的静态图像,容器必须把嵌入对象作为一个活
动对象接收,否则只是一个静态图片
( 6) 激活,嵌入对象必须被激活才允许进行编辑(服务器程序必须
在后台运行)
2,MapInfo地图对象:
MapInfo OLE嵌入可以直接在 OLE容器应用程序中创建地图,当
容器中的地图窗口被激活后,应用程序的菜单和工具条将有所改变
,以反映可用的 MapInfo特性。该特性子集称为 MapInfo地图 。
MapInfo地图 功能,
( 1)一次打开多个表;
( 2)控制图层属性,如显示和标注;
( 3)创建和修改专题地图;
( 4)对地图窗口视图进行操作;
( 5)查找与某个地图图层相关联的信息;
( 6)控制地图投影和单位。
3、工具和菜单命令:
( 1)工具:
( 2)菜单:
( 3)快捷菜单:
( 4)局限,不是所有的 MapInfo的特性都能在地图嵌入范围内
使用
( 5)在容器中注册 OLE对象,安装 MapInfo后,MapInfo地图
对象 会自动检测,并在接受 OLE对象 的任何容器应用程序的对
话框中作为一个选项列出来
1.2 嵌入 MapInfo地图
?一 OLE嵌入
1、开始:
( 1)插入-对象,可以从列表中选择嵌入对象
( 2)编辑-“复制地图窗口”-粘贴,可把已被复制到剪贴板
的对象嵌入
( 3) 拖放工具 可以将对象从应用程序中拖放至容器
2、在容器中创建一个新的地图窗口
( 1)把光标定位在要放置地图窗口的位置;
( 2)选择“插入”-“对象”,出现对话框;
( 3)突出 MapInfo地图项并单击确定,出现一个缺省的世界地
图窗口和 MapInfo徽标,地图窗口处于激活状态;
( 4)要创建地图,选择“表”-“打开”,打开相应 tab表即
可。
3、把地图窗口带入用户的应用程序
( 1)将地图窗口复制到剪帖板
①在 MapInfo中激活地图窗口,选择“编辑”-“复制地图窗口”
,该对象被复制到剪帖板;
②切换至容器应用程序并在要放置地图的位置定位光标;
③选择“编辑”-“粘贴”,将对象从剪贴板粘贴至用户文档。
要激活地图窗口,必须双击地图
( 2)使用拖放工具将地图对象直接嵌入
①同时运行 MapInfo和容器应用程序,并在屏幕上调整它们的位置
以便能让它们并排出现;
②在 MapInfo中激活地图窗口,在工具条中单击拖放工具,光标变
成一只手和一个手柄;
③将光标拖至容器并单击要放置地图的点,释放地图对象的副本。
要激活地图窗口,必须双击地图
1.3 MapInfo地图特性
?一 OLE嵌入
1、“编辑”菜单,剪切、复制、粘贴
2、“视图”菜单,工具条、图例
3、“表”菜单,打开、关闭、全部关闭
4、“地图”菜单:
5、“窗口”菜单:
6、“帮助”菜单:
7、工具条:
8、调整嵌入地图窗口的大小和位置:,活动”、“非活动

9、保存地图,保存文档即可
2.1 MapBasic概述
?二 MapBasic开发环境
1、功能:
在 MapInfo平台上开发用户定制的应用程序,通过使用
MapBasic进行二次开发,能 扩展 MapInfo功能,实现程序的
自动 重复操作并使 MapInfo与其它应用软件 集成 。
2,MapBasic的软件集成环境:
( 1) 文本编辑器,用于程序的编辑与修改;
( 2) 程序编译器,用于源程序编译,生成可执行程序;
( 3) 程序链接器,用于将若干独立的模块链接成一个应用程
序;
( 4)联机帮助:在线提供 MapBasic 的每条语句或函数的详
细说明资料。
3、主要特点:
( 1)一种类 Basic语言,帮助建立用户 界面 ;
( 2) MapInfo集成,支持 OLE Automation和 DDE通信技术
,易于与其它应用软件相连接;
( 3)扩展 MapInfo 功能,是多平台、过程化、事件驱动、
兼容性强的开发工具,可以 定制 附加功能;
( 4)易于掌握,具有与 Basic同样的函数和语句;
( 5)包含嵌入的 SQL语句,具有更强大的数据 查询 功能;
( 6)地理操作和功能帮助可以 扩展 应用软件的功能。
( 7)是一种可编译语言、具有编辑和连接模块的功能,可
将程序分 模块 编制。
2.2 如何创建、编译和运行一个程序
?二 MapBasic开发环境
1、简单例子:
( 1)选择,File”-” New”,打开一个编辑窗口;
( 2)输入一个 MapBasic程序,如 Note,Hello World !”;
( 3)选择,File”-” Save”,保存文件,如 test.mb;
( 4)选择,Project”-” compile current file”,编译程序,
自动生成一个相应的可执行文件 test.mbx;
( 5)选择,project”-” run”,系统自动启动 MapInfo,执
行可执行文件 test.mbx ;
建立 ——编译 ——运行程序
2,MapBasic程序编辑:
( 1)文本编辑窗口快捷键,Ctrl-N,Ctrl-O,Ctrl-S,Ctrl-
Z,Del,Ctrl-F,Ctrl-G,Ctrl-R,Ctrl-T等;
( 2)其它编辑方式:
①用其它文本编辑器编辑文件,再用 MapBasic的,File”-
” compile from File”来编译该程序;
②把一个大的程序文件(,mb)分成多个较小的文件,然后
用 MapBasic的 Include语句把多个文件组合成一个应用程序;
③将一个大的程序文件(,mb)分成多个较小的文件,然后
通过一个项目文件( Project File),mbp把这些小文件连接成
一个应用程序。 可独立编译每个模块
3,MapBasic程序编译:
( 1)将程序调入到编辑窗口,选择,Project”-” compile current
file”,即可对 MapBasic 程序进行编译;多个编辑窗口,只编译 最
前面的窗口 的程序;
( 2)编译器检查程序的语法,显示错误信息列表,错误信息写到
扩展名为,err的文本文件中;
还可以用,File”-” compile from File”来编译程序。
( 3)编译完成,出现 status确认框,单击 ok完成编译。
4、创建项目文件( Project File ):
将一个大的程序分成多个较小的文件时,建立一个项目文件,
告诉 MapBasic如何将各独立的模块组合成一个可执行文件。
建立项目文件有如下好处:
( 1)可以将程序模块化;
( 2)方便了一个项目由多个程序员进行编写;
( 3)可以更为灵活地进行应用程序的编译。
5、创建一个项目文件的步骤:
( 1)选择,File”-” New”,打开一个编辑窗口,键入关键词
[LINK],作为第一行;
( 2)接着下一行输入,Application=setting
Setting指用户要建立的可执行文件名(,mbx)和路径,如
Application= C:\MapBasic\User\my_map.mbx
( 3)再输入格式如下的语句,Module=settings
Settings代表 MapBasic的目标文件名(,mbo),如
Module= C:\MapBasic\User\part_1.mbo
( 4)重复上一步,直到加完该应用程序的所有模块;
( 5),File”-” Save as”保存文件(,mbp);
( 6), File”-” close”关闭编辑窗口;
5、编译和连接项目文件
( 1)先对项目中会用到的每一个模块进行编译( mb→mbo );
( 2)链接项目文件 mbp,,Project”-” select project file”;
( 3), Project”-” link current file”,链接当前的应用程序 mbo
,生成 可执行文件 mbx。
2.3 程序的调试与运行
?二 MapBasic开发环境
程序错误,( 1) 编译错误 -语法错误引起
( 2) 运行错误 -实际运行应用程序时产生的错误
1、调试 MapBasic程序:
( 1)使用,Note”和,Print”语句来调试程序;
Print,current value of counter”+counter
( 2)专门的调试工具,Stop和 Continue语句;
①将 Stop语句放在程序中可能有错误的那个部分的前面;
②重新编辑并运行程序,执行到 Stop语句,暂停,显示调试信息;
③在 MapBasic窗口中:
Dim?Global?Variable_name? Variable_name=new_value
④ 在完成检查或修改了变量的内容后,可在 MapBasic窗口中输入
Continue,接着执行程序。
不能使用 Stop语句的情况:
① 在 Function…End Function 结构中;
② 对话框控制处理程序中;
③ 进程条处理程序中;
④ 另外一个程序正在运行时。
2、错误的捕捉:
( 1)对运行错误的跟踪和处理叫做错误的捕捉,使用 OnError语句
( 2) OnError语句总是指向一个在同一个过程或函数中的另一个位
置的 标号 。标号后面的语句叫 错误捕获处理程序 。一旦错误发生,
就转而去执行该处理程序,而不是中止程序;
( 3)可调用 Err() 函数获取一个整型的代码,它表明该错误属于
哪一种类型;
( 4)可使用 Error$() 函数返回一个描述错误信息的字符串;
( 5)在程序结束处使用 Resume语句,告诉程序执行结束后接着执
行哪一行程序。 OnError GoTo No_States

Resume after_mapfrom
3.1 变量
?三 MapBasic基础
1、变量类型,smallint,integer,float,string,string*length、
logic,date,object,Alias,pen,brush,font,symbol
2、变量定义,Dim 变量名 As 变量类型
局部变量、模块水平的变量、全局变量( Global As)
3、变量初始化:, =”
4、数组变量, Dim 数组名 As Integer( 10) 一维数组,下标从 1开始
获得当前数组的长度,Ubound()
重新定义数组长度,ReDim
5、用户数据类型:是一个或多个常规变量类型的组
Type 数据类型名
元素名 As 变量类型 […] End Type
对该类型的定义必须出现在程序的全局水平上。 变量名后加,.”
要赋值给用户数据类型,必须单独对其每一个元素赋值。
6、取消变量定义,UnDim 不可用于需要编译的 MapBasic程序
1、循环语句,产生重复操作的语句序列,直到指定条件满足为止
① For 变量名 =起始值 To 终止值 [Step 步长值 ]
语句列表
Next
Exit For 用来强制中断 For … Next 语句的执行
② Do
语句列表
Loop [while/until 循环条件 ] 至少被执行一次
Do [while/until 循环条件 ]
语句列表
Loop 可能一次也不执行
③ While 循环条件
语句列表
Wend
与 Do While…Loop 功能类似,但 Do…Loop 功能更强,可使用 Exit
Do提前结束循环。
3.2 流程控制语句
2、分支语句:
① If 测试条件 Then
语句列表 1
Else
语句列表 2
End If
② Do Case 表达式
Case 表达式 1,表达式 2,…
语句列表
[Case…]
[Case Else
语句列表 ]
End Case
③ GoTo语句:产生一个无条件的转移,GoTo 标号
应尽量避免使用 GoTo语句
3、其他流程控制语句:
① End Program,终止应用程序的执行;
② Terminate Application 应用程序名:可在一个程序中终止另一个程序;
③ End MapInfo:终止应用程序,退出 MapInfo。
3.3 过程
?三 MapBasic基础
包含 主过程 和 子过程,每个过程包含一组完成某一特定任务的语句;
1、子过程定义:
Sub 过程名 [([By Val] 参数名 As 变量类型 [,…])]
语句列表
End Sub
① 在缺省情况下,MapBasic的参数为 形式参数,必须为形参指定一
个 特定变量,可 通过形参把值返回给调用者 ;
② 值参数,定义时前有 By Val关键词,子过程不能通过值参数把值
返回给调用者 。
子过程的参数可以是数组,Sub example(X() As Integer)
Call example(items)
③ 注意,子过程的局部变量使同名的全局变量不起作用;
可将任何类型的变量传递给形式参数;
不能将数组、用户类型变量和 Alias变量传递给值参数。
④ 定义过程之前必须先对过程进行 声明,使用 Declare Sub语句。
对过程 声明,先声明再定义
Declare Sub 过程名 [([By Val] 参数名 As 变量类型 [,…])]
⑤ 定义外部程序:如 C,Pascal编写的程序 存储在 DLL文件中
Declare Sub 过程名 Lib,文件名, [Alias,外部程序初始名” ]
[([By Val] 参数名 As 变量类型 [,…])]
⑥ 调用过程:过程或外部程序( DLL)的调用使用 Call语句
Call 子过程名 [([参数名 ][,…])]
2、主过程定义:
MapBasic程序必须包含的过程,是程序运行时第一个调用的过程。
Declare Sub Main
Sub Main
语句列表
End Sub
3、事件处理程序:
单击鼠标或其他由用户发出的动作称为事件或系统事件;
事件处理程序:是为了响应系统事件的 MapBasic程序的一部分;
子过程可以作为事件处理程序,每一个事件处理程序必须有一个特
殊的名字,不需要使用 Call语句去专门调用,当某一类型的系统事件
发生时,MapBasic自动调用相应的过程。
3.4 自定义函数
?三 MapBasic基础
1、函数的声明:
Declare Function fname ([ [By Val] parameter As var_type] [,[By Val]
parameter As var_type…] ) As return_type
2、函数的定义:
Function name ([ [By Val] parameter As datatype] [,[By Val]
parameter As datatype…] ) As return_type
statement_list
End Function
自定义函数不可以返回数组和自定义类型变量。
3、退出用户函数:
Exit Function
只能在 Function…End Function 语句中定义使用;
一个函数可以调用另一个函数,一个单独的 Exit Function语句只能
推出当前的函数。
3.5 输出与显示
?三 MapBasic基础
1、显示窗口内容:
PrintWin [Window window_id] [Interactive]
window_id:整型的 窗口标志符;
使用 FrontWindow( ),WindowID( ) 函数获取窗口标志符;
默认为当前的活动窗口;
Interactive关键词:显示 Print对话框,否则直接自动显示窗口。
2、重新设置窗口属性:
Set Window window_id
属性包括,Position,width,height,font,min,max,restore、
front,title,help,scrollbar,smart pan,autoscroll,parent、
readonly,table,show|hide,sysmenuclose
window_id是表示窗口标志符的一个整型数,还可以是一个特殊的
窗口名字,如 help等。
3、消息窗口中显示文本信息:
Print message
message是一个字符表达式,是将要在消息窗口中显示的信息。
与 Note语句类似,但 Note语句显示一个对话框,应用程序被暂停直
到用户单击对话框的 OK按钮为止;而 Print语句只是将文本信息显示
到消息窗口,并不暂停应用程序的执行。
Print Chr$(12)
Print,Map Layers:”+ Chr$(10)+” World,Capital”
4、设置布局窗口:
布局窗口可以同时显示多个窗口的内容。
Layout [position (x,y) [units paperunits] ] [width window_width [units
paperunits] ] [height window_height [units paperunits] ] [{min | max}]
为每一个打开的布局窗口指定一个特殊的隐藏的名称,layout1,
layout2,依次类推。
Select * From Layout1
在布局窗口创建新的对象之前,必须先使用,Set Coordsys Layout”
设置单位。
如,Set Coordsys Layout Units,in”
在布局窗口中增添一个新的框架:
Create Frame [into {window layout_win_id | variable var_name}]
(x1,y1) (x2,y2) [pen…] [brush…] [ title title ] [from window
contents_win_id] [fillname {on|off} ]
from window,指定框架中要显示的地图窗口;
title,也可指定框架中的显示内容,当语句中包含了 from window字句
时,Title字句不起作用。
5、保存窗口:
保存窗口到文件中,与“文件”-“另存窗口为”一样
执行时不显示对话框
Save window window_id as filespec type filetype [ width image_width
[units paperunits ] ] [height window_height [units paperunits] ]
[copyright notice [font…] ]
filetype, BMP,WMF,JPEG,PNG,TIFF等格式。
3.6 程序组织
?三 MapBasic基础
主过程+子过程
Type,Declare Sub,Declare Function,Define和 Global语句必
须在任何过程之前定义;
Include语句应定位于一个程序文件开头的任何过程定义之外。
Include,mapbasic.def”
Type … End Type
Declare Sub
Declare function
Define
Global
Sub Main … End Sub 主过程
Sub … End Sub 子过程
Function … End Function 用户自定义函数
?四 地图图层和地图对象
MapBasic最强大的功能在于其查询和控制地图对象的能力,这些
对象包括线、点、折线、矩形和区域等。主要有:
地图图层的处理;
地图对象的创建;
修改地图;
地图对象的查询。
1、地图图层处理:
地图是图层的集合,对地图的控制实际上就是对图层的控制。
① Map From table[,table…]:打开新的地图窗口,第一个表在顶层 ;
② Add Map Layer table[,table…] [Animate]:给地图窗口增加图层 ;
Animate:增加的图层为活动图层,可加速地图窗口的重画 ;
③ Remove Map Layer map_layer[,map_layer …] [Interactive]:从地图
中删除一个或多个图层 ; 不能删除装饰图层
map_layer:可以是大于 0的整数、包含表名的字符串或 Animate;
Interactive:如果图层的删除会引起标注或专题图层的丢失,
MapInfo会显示一个对话框,允许用户保存。
2、标注图层中的对象:
AutoLabel Window window id
Selection|Layer layer_id
Overlap
Duplicates 标注文本对象
3、查询地图图层的标注:
LabelFindById(),LabelFindFirst(),LabelFindNext()、
LabelInfo():返回关于地图中的图层信息。
标注与文本不同。查询文本对象,ObjectInfo(),ObjectGeography()
4、查询地图设置:
MapperInfo(window_id, attribute),返回关于地图窗口的坐标或距
离信息; attribute-返回信息的类型,参数不同,所返回的信息不同。
LayerInfo(map_window_id,layer_number,attribute):返回关于地图
窗口的某标注的信息。 许多设置仅适用于普通地图图层
5、改变地图设置:
可以改变地图的当前视图、图层顺序、改变整幅地图或个别图层的
行为、改变图层外观及改变图层标注等。
Set Map window window_id center clipping zoom preserve display
order pan coordsys area units distance units XY units scale redraw
inflect
6、创建专题图层:
Shade:创建专题图层,加入到已存在的地图窗口中;
Set Shade:修改专题地图图层;
Create Ranges:计算专题范围并保存;
Create Styles:创建样式并保存;
Create Grid:创建栅格图层。
7、创建地图对象:
包括创建语句和创建函数,能创建圆弧、椭圆、框架、直线、折线
、点、矩形、区域、圆角矩形、文本对象以及自动标注对象。
① 创建语句,Create Arc,Create Ellipse,Create Frame,Create
Line,Create Pline,Create Point,Create Rect,Create Region、
Create RoundRect,Create Text,AutoLabel
② 创建函数,CreateCirle(),CreateLine(),CreatePoint()、
CreateText()
③ 高级操作,Create object As {buffer|union|intersect|merge}:通过
执行缓冲区、合并、交叉或联合操作来创建一个或多个区域;
Buffer( inputobject,resolution,width,unit_name):返回一个代表缓
冲区的区域对象。
④ 在表中储存对象,Insert into table [(Columnlist)] {Values(exprlist) |
Select Columnlist From table},添加新建行到一个打开的表;
Update table Set Column=expr[,Column=expr,…]
[Where RowId=idnum]:在表中修改一行或多行。
8、修改地图对象:
修改对象属性,Alter Object
改变对象类型,ConvertToRegion(),ConvertToPline()
设置编辑目标,Set Target{on|off}
擦除对象的一部分,Objects Erase into target; Erase(); Objects
Intersect into target; Overlap()
合并对象,Objects Combine; Combine(); Create Object
分割对象,Objects Split
9、查询地图对象:
返回 计算值 的函数,area(),perimeter(),distance(),objectlen()、
overlap(),areaoverlap(),proportionoverlap()
返回 坐标值 的函数,objectgeography(),MBR(),objectnodeX()、
objectnodeY(), centriod(),centriodX(), centriodY(),
extractnodes(),intersectnodes()
设置 测量单位 的语句和函数,set area units,set distance units,set
paper units,unitabbr$(),unitname$()
设置 坐标系统 的函数,set coordsys(),chooseprojection$()
查询地图图层的表的函数,labelfindbyid(),labelfindfirst(),
labelfindnext(), labelinfo()
对象 样式 的处理:
currentpen(),currentbrush(), currentsymbol(), currentfont();
返回某样式的一部分,Styleattr();
创建 样式 值,makepen(),makefont(),makesymbol()、
makebrush(),penpattern(),set style,RGB()、
makefontsymbol(),makecustomsymbol()
查询对象的样式,objectinfo()
修改对象的样式,alter object
重新装载 符号样式, reload symbols
在表中 保存对象, insert,update
样式字句,pen clause,brush clause, symbol clause, font
clause
?五 表管理与文件控制
1、表操作概述:
Open table
Create table
Alter table
Select * from cosmetic1
Select * from layout1
2、创建和修改表:
创建表,Create table
打开表,Open table
关闭表,Close table [interactive] 对话框
修改表结构,Alter table,add,modify,drop,rename、
order
操作表记录,insert into ; update table set
delete from table
3、表查询:
设置表指针,Fetch {first|last|next|prev|rec|} from table
EOT()函数 指针是否置于最后一行
查询,Select From where into group by order by
查询结果信息的返回,selectioninfo()函数
4、文件的输入输出:
随机 文件,get/put(每一行固定长度)
连续 文件:(每行长度不定)
line input#和 print#; input#和 write#(用逗号隔开)
二进制 文件,get/put
打开或创建一个文件,open file filespec for input output
append random binary
关闭文件,close file [#] filenum
删除文件,kill filespec
更改文件名,rename file as
复制文件,save file as
读取文件信息:
Get [#] filenum,[position],var_name 二进制或随机文件
Seek [#] filenum,position 设置当前文件位置
Input # filenum,var_name[,var_name…] 读取数据并储存在变量中
Line input [#] filenum,var_name 连续文件中读取一行存储在变量中
向打开的文件中写入信息:
Put [#] filenum,[position],var_name
Print # file_num [,expr]
Write # file_num [,expr] 连续模式下打开
文件状态函数:
EOF(filenum):返回一个逻辑值值,是否到达文件末端
LOF(filenum):返回打开文件的字节长度值
Seek (filenum),返回打开文件的当前指针位置
Fileattr(filenum,attribute);返回关于打开文件的情况 input/output
Fileexits(filespec):返回一个逻辑值,用以表示文件是否存在, true
表示存在
欢迎多提宝贵意见!
谢谢!