GIS软件开发技术 主讲:蔡忠亮 武汉大学资源与环境科学学院
课程主要内容 第一部分 GIS软件开发技术基础 第二部分 MapInfo环境下的GIS开发技术 第三部分 Arc/Info环境下的GIS开发技术 第四部分 GIS底层开发技术 2
第二部分 MapInfo环境下GIS开发技术 第一章 MapBasic + MapInfo 第二章 VB + MapX 第三章 VC + MapX 3
1.1 MapBasic编程基础 程序设计的一般规则 MapBasic 基础 MapBasic 菜单设计 MapBasic 对话框设计 窗口 4 第一章 MapBasic + MapInfo
程序设计的一般规则 源程序文档化 命名-名副其实 注释-清楚明了 视觉-层次分明 数据说明规范化 语句结构简单、直观 5 第一章 MapBasic + MapInfo
MapBasic 基础 MapBasic 主要特色 MapBasic 开发环境 MapBasic 语言结构 6 第一章 MapBasic + MapInfo
MapBasic主要特色 功能强大,MapBasic提供了380多种函数和命令语句(联机帮助)。 与其他应用程序链接 扩展MapInfo功能,定制MapInfo的界面 具有更强大的数据存取功能 一种类Basic语言,简单易学 MapBasic在线帮助 MapInfo的MapBasic交互命令窗口 7 第一章 MapBasic + MapInfo
MapBasic开发环境 MapBasic程序编辑(编辑器) 生成后缀名为mb的文件,其大小限制为64K。 生成后缀名为mbx的可执行文件 连接多个模块成一个项目(链接器) 联机帮助 8 第一章 MapBasic + MapInfo
MapBasic语言结构 程序结构 变量 Define及Include语句 表达式 流程控制 过程 9 第一章 MapBasic + MapInfo
变 量 变量的概念:在程序运行过程中将要发生变化的量 变量命名规则 变量类型 变量的定义 10 第一章 MapBasic + MapInfo
Define 与Include语句 Define语句让你可以定义一个容易记忆的标识符,在编译时这个标识符被它的实际值所替代。 语法:Define identifier definition Include语句:用以说明某文本文件为MapBasic程序的一部分。程序编译时,该文本文件的全部内容将被全部插入到程序源文件中。 语法:Include "filename" 11 第一章 MapBasic + MapInfo
Mapbasic支持的变量类型 SmallInt 整型(2个字节)(-32767至+32767) Integer 整型(4个字节) (-2147483647 至+2147483647) Float 浮点型(8个字节) String 可变长字符串(最多可有32767个字符) String*length 固定长字符串(最多可有 32767个字符) Logical 逻辑型(TRUE或FALSE) Date 日期型(MM/DD/YYYY) Object 图形对象 12 第一章 MapBasic + MapInfo
MapBasic对各种变量的声明 Global name as string(全局变量) Dim x,y as float(局部变量) n as integer start_date(10) as date Redim(扩充数组变量的长度) Type…End Type(用户数据类型) Undim x,y 13
变量命名规则 每个变量名最多可以包含31个字符,可以包含字母、数字及多种符号 变量名不能含有空格 变量名不可以用数字开头,必须以字母、_、~ 号开头 可以包含$ , % , & , ! , # , and @,但只能作为结束字符 Mapbasic的关键字不能作为变量名:add,alter,call,dim,do,global,get,set…… 14 第一章 MapBasic + MapInfo
表达式 表示若干常量、变量及函数之关系的式子 数学运算符:+、-、*、/、\、mod、^等 字符串运算符+(&)、Like等 日期运算符:+、- 比较运算符=、<>、<、>=、Between…And…等 逻辑运算符And、Or 、Not 等 地理运算符(图形操作符): 15 第一章 MapBasic + MapInfo
图形操作符 Contains 第一个对象包含第二个对象的中心 Contain Part 第一个对象包含第二个对象的一部分 Contain Entire 第一个对象包含整个第二个对象 Within 第一个对象的中心在第二个对象内 Partly Within 第一个对象的一部分在第二个对象内 Entirely Within 第一个对象的完全在第二个对象内 Intersects 两个对象在某处相交 16 第一章 MapBasic + MapInfo
流程控制 循环语句: 1. For…(Exit For)...Next 2. Do…Loop 3. While…Wend 分支语句: 1. If…Then 2. Do Case 3. Goto 其它流程控制语句: 1. End Program 2. Terminate Application 3. End Mapinfo 17 第一章 MapBasic + MapInfo
While…Wend语句 While condition statement_list Wend 18 第一章 MapBasic + MapInfo
Do……Loop语句 语法一 Do statement_list Loop [ { Until | While } condition ] 语法二 Do [ { Until | While } condition ] Loop 19 第一章 MapBasic + MapInfo
过程 定义一个过程 调用过程 退出过程 主过程 Declare sub sub…End Sub Call Exit Sub Main 20 第一章 MapBasic + MapInfo
过程示例 第一章 MapBasic + MapInfo declare sub main declare sub TabToMif Create Menu "格式转换" As "TABT MIF" Calling TabToMif, end sub sub TabToMif ‘Add your code here! 21 第一章 MapBasic + MapInfo
For…Next 与 If…Then 语句 第一章 MapBasic + MapInfo Open Table applpath+"world" as world dim nrows,n as integer dim Max_pop,Min_pop as float Max_pop=0 Min_pop=2000000000 nrows=tableinfo(world,tab_info_nrows) for n=1 to nrows fetch rec n from world if Max_pop<world.pop_1994 then Max_pop=world.pop_1994 else if Min_pop>world.pop_1994 then Min_pop=world.pop_1994 end if next 22 第一章 MapBasic + MapInfo
程序结构 Sub Main Dim var_name As var_type other statements End Sub 主过程定义 程序结构 Sub Main Dim var_name As var_type other statements End Sub Sub sub_proc Dim … Function fname End Function Include "filename“ Declare sub sub_proc Declare Function fname Define identifier definition Global var_name As var_type Dim var_name As var_type 其它 过程定义 全局级声明 23 第一章 MapBasic + MapInfo 自定义函数
Do Case 语句 第一章 MapBasic + MapInfo do case commandinfo(CMD_INFO_MENUITEM) case 1 select * from world where continent="asia"into 亚洲 map from 亚洲 max case 2 select * from world where continent="africa" into 非洲 map from 非洲 max end case 24 第一章 MapBasic + MapInfo
MapBasic 菜单设计 一.事件驱动模式 1.鼠标点击等 —— 产生事件 2.执行事件处理程序 —— 事件被驱动 例:当用户选择了一个菜单项时,我们说用户已经产生了一个菜单选择事件(Menu choose event);而当用户关闭了一个窗口时,我们说用户产生一个窗口关闭事件 2.执行事件处理程序 —— 事件被驱动 例:若用户产生一个菜单选择事件,应用程序可能需要显示一个对话框; 若用户产生一个窗口关闭事件,应用程序可能需要对一个菜单项灰化或隐藏整个菜单。 25 第一章 MapBasic + MapInfo
二.菜单术语 Menu Bar Menu Menu Item 26 第一章 MapBasic + MapInfo
三、编辑菜单条(Menu Bar) 1.创建菜单条 2.在菜单条上添加一个菜单 3.在菜单条上删除菜单 4.恢复MapInfo原菜单条 create menu bar as "分类查询", "条件查询", "分类统计", "统计图", "专题地图" 2.在菜单条上添加一个菜单 Alter Menu bar Add " maps" 3.在菜单条上删除菜单 Alter Menu Bar Remove " help" 4.恢复MapInfo原菜单条 Create Menu Bar as Default 27 第一章 MapBasic + MapInfo
四、菜单(Menu)编辑 1.创建菜单 Create Menu " maps" As "Layer Control" Calling 801 2.添加菜单项 Alter Menu " table" Add "Color Coded Maps " Calling 307 3.删除菜单项 Alter Menu id 1 Remove 104 4.改变菜单项状态 Alter Menu Item 1610 text "目标" 28 第一章 MapBasic + MapInfo
MapBasic 对话框设计 一、MapInfo 对话框形式 二、对话框语法 三、对话框控件类型 四、对话框变量传递 29 第一章 MapBasic + MapInfo
二 、对话框语法 Dialog 语句 Dialog [ Title title ] [ Width w ] [ Height h ] [ Position x , y ] [ Calling handler ] Control control_clause [ Control control_clause . . . ] 30 第一章 MapBasic + MapInfo
二 、对话框语法 第一章 MapBasic + MapInfo Dialog Title "根据地块类型查找" Control StaticText Title "请输入地块类型:" Control EditText Into s_LandType Control OkButton Title "查找" Position 30,30 Control CancelButton Title "取消" Position 90,30 31 第一章 MapBasic + MapInfo
三、对话框控件类型 命令按钮(Button)。包括一般命令按钮和OK按扭、Cancel按钮。它是最普通的对话框控件,每个对话框都至少有一个命令按钮。通过命令按钮可以让完成某一操作。 静态文本框(StaticText)。通常提供一些文字说明,给用户提示,是一个非交互式控件。 编辑文本框(EditText)。让用户直接在此区域输入一些信息。 32 第一章 MapBasic + MapInfo
三、对话框控件类型 单选按钮集(RadioGroup)。用来显示选项,每次只能选择一组选项中的一个,也就是说,当用户选择了某一选项,在该组的其它选项将自动失效。 组合框(GroupBox)。将完成某一功能的按钮用矩形框圈起来,并用文字加以描述,只是起一个分隔的作用。 检查框(CheckBox)。通常用来提供Yes/No或True/False选项,可以用检查框来提供多项选择,从而在其中选择一项或多项。 33 第一章 MapBasic + MapInfo
三、对话框控件类型 列表框(ListBox)和多项列表框 (MultiListBox)。通常提供一组信息,让用 户选择其中的一项或者多项。 弹出式按钮(PopupMenu)。 是一个右边带下箭头的按钮,当用户单击按钮时,将弹出一个文本列表,供用户选择。 线型、填充图案、符号、字体选择按钮。 MapInfo为图形对象专门提供的几个按钮,以便用户选择所需的图文式样(线型、填充图案、符号和字体),供绘图之用。 34 第一章 MapBasic + MapInfo
GroupBox BrushPicker penPicker StaticText CheckBox EditText RadioGroup 35 Button
Popupmenu Listbox 36 第一章 MapBasic + MapInfo
四、对话框变量传递 Into s_LandType ReadControlValue()函数 If CommandInfo(CMD_INFO_DLG_OK) Then Call subSeach(s_LandType) End If Control OkButton Title “查找” Position 30,30 Calling OkHandler 37 第一章 MapBasic + MapInfo
第一章 MapBasic + MapInfo Sub SearchDialog Dim s_LandType As String … Title “根据地块类型查找” Control StaticText Title “请输入地块类型:” Control EditText Into s_LandType ID 12 Control OkButton Title “查找” Position 30,30 Calling OkHandler Control CancelButton Title “取消” Position 90,30 38 第一章 MapBasic + MapInfo
第一章 MapBasic + MapInfo If CommandInfo(CMD_INFO_DLG_OK) Then Call subSeach(s_LandType) End If End Sub Sub OkHandler If ReadControlValue(12)=”” Then Note “请在编辑文本框中输入一地块类型!” Dialog Preserve 39 第一章 MapBasic + MapInfo
MapBasic 按钮条设计 一、 按钮条类型 二、 创建按钮条 三、 改动按钮条 40 第一章 MapBasic + MapInfo
一、按钮条类型 触发式按钮(PushButton),当用户单击一个触发式按钮时,按钮会弹回来,执行相应的处理程序。例如:图层控制按钮。 开关式按钮(ToggleButton),当用户单开关式按钮时,按钮变成两种状态的一种,按下或没按下。例如:图例窗口显示/隐藏按钮。 工具按钮(ToolButton),当用户单击工具按钮时,一个工具将处于激活状态,并将始终保持这种状态直到用户选择了另外一个工具。例如:放大工具处于激活状态,并且用户在地图窗口、浏览窗口或布局窗口单击时,才会作出响应。 41 第一章 MapBasic + MapInfo
二、 创建按钮条 Create ButtonPad "Utils" As PushButton HelpMsg “显示查询对话框” Calling button_sub_proc Icon MI_ICON_ZOOM_QUESTION ToolButton HelpMsg “新画一条路线” Calling tool_sub_proc Icon MI_ICON_CROSSHAIR DrawMode DM_CUSTOM_LINE 42 第一章 MapBasic + MapInfo
HelpMsg “切换开关状态” Calling toggle_prox_check Icon MI_ICON_RULER Check ToggleButton HelpMsg “切换开关状态” Calling toggle_prox_check Icon MI_ICON_RULER Check Title “用户工具” Width 3 Show 43 第一章 MapBasic + MapInfo
三、 改动按钮条 1. 删除按钮条上按钮 Alter ButtonPad ID 4 Remove 101 2. 添加按钮 Alter ButtonPad ID 2 Add ToolButton Calling DrawDoubleLine Icon Cursor DrawMode DM_CUSTOM_LINE HelpMessege "画一条双线\n双线" 44 第一章 MapBasic + MapInfo
三、 改动按钮条 3. 隐藏按钮条 Alter ButtonPad ID 2 Hide 4. 重新显示按钮条 Alter ButtonPad ID 2 Show 45 第一章 MapBasic + MapInfo
窗口设置 Show or hide a window: Open Window, Close Window, Set Window Open a new window: Map, Browse, Graph, Layout, Create Redistricter, Create Legend, Create Cartographic Legend 46 第一章 MapBasic + MapInfo
1.2 MapBasic编程实例 1、MapBasic编程环境 1 2 3 47 第一章 MapBasic + MapInfo
1.2 MapBasic编程实例 注解 = (‘) 包含=Include Include ”mapbasic.def” 2、编程要点 注解 = (‘) 包含=Include Include ”mapbasic.def” Include ”menu.def” -系统菜单功能 定义变量 定长= Dim full_name As String 变长= Dim employee_id As String * 20 数组= Dim start_date(10) As Date 48 第一章 MapBasic + MapInfo
1.2 MapBasic编程实例 2、编程要点 变量的范围 全局/局部 循环控制 函数 主函数Main()=自动调用 定义=Declare Sub Fun() 调用=Call Fun() 函数参数=缺省为引用方式,Fun (I As Integer) 值传递Fun(ByVal I As Integer) 系统事件 ToolHandler… 49 第一章 MapBasic + MapInfo
1.2 MapBasic编程实例 程序组织 2、编程要点 第一章 MapBasic + MapInfo 函数即变量声明 主函数定义 Include ”mapbasic.def” other Include statements Type...End Type statements Declare Sub statements Declare Function statements Define statements Global statements 程序组织 Sub Main Dim statements ... End Sub 函数即变量声明 主函数定义 Function ... Dim statements ... End Function 各子函数定义 Sub ... Dim statements ... End Sub 自定义函数定义 50 第一章 MapBasic + MapInfo
1.2 MapBasic编程实例 3、实例 第一章 MapBasic + MapInfo Convert.mb – Convert Tab to MIF, and Convert MIF to Tab AGGREGAT.MB -- Takes place of agg_sym.mb and agg_line.mb. DIST_OBJ.MB -- Added point to point distances. FINDER.MB -- Locates points within MapInfo, also accesses MapMarker API. FONT_SET.MB -- Set font for all layers. GEOC_REV.MB -- Reverse geocoder. LAYOUT_T.MB -- Now includes mapart.mb, portland.mb. MB_TOOLS.MB -- MapBasic tools that show object styles and toolbar positions. METADATA.MB -- Manipulate metadata in a table. MULTIMED.MB -- Assign pictures & movies to records in table. PROJCTNS.MB -- Now includes utility to import latest mapinfow.prj file. PROPER$.MB -- Make specified columns in a table proper$(). REPARENT.MB -- Reparent a legend in a mapper. SEAMLESS.MB -- Manipulate seamless maps. STRT_ADD.MB -- Add a new street. STR_DISP.MB -- Change street display types based on CFCC classifications. SYMB_CHG.MB -- Change attributes of selection's symbols. TAB_GEOG.MB -- Updates columns in table with lat/long info from map. UTM_MAKE.MB -- Creates a MapInfo table of UTM Zones. 3、实例 51 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 1、集成开发的组成 客户 应用程序 MapInfo应用程序 可选:MapBasic程序 OLE或DDE 可选:MapBasic程序 52 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 2、VB环境下的集成开发方式 (1)声明MapInfo对象 Dim mapinfo As Object 参考实例:FindZip (1)声明MapInfo对象 Dim mapinfo As Object (2)创建并设置MapInfo对象 (3)增加其他功能 Private Sub ZoomIn_Click() mapinfo.RunMenuCommand 1705 End Sub 53 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 (1)建立MFC工程 54 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 App类 55 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 App类 56 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 App类 57 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 DMapInfo类 58 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 MainFrame类 59 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 View类 60 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 View类-Create() 61 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 View类-OnSize() 62 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (2)OLE支持及初始化 View类-OnDestroy() 63 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo View类-MapInfo 接口实现() 64 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (4)支持MapInfo回调 Doc类-增加回调支持函数 65 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (4)支持MapInfo回调 Doc类-MapInfo窗口变化时消息 66 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo (4)支持MapInfo回调 View类-增加回调支持函数 67 第一章 MapBasic + MapInfo
1.3 MapInfo集成式开发 3、VC环境下的集成开发方式 第一章 MapBasic + MapInfo 参考实例:FindZip View类-MapInfo窗口变化时消息 68 第一章 MapBasic + MapInfo