用MapBasic建立GIS系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第11章用MapBasic建立用户系统
11.l MapBasic程序结构
前一章介绍了MapBasic的基本元素,由它们构成MapBasic的不同种类的语句,再由语句组织成程序。

但是MapBasic程序中的语句必须以一个特定的方式被安排,而不是任意的。

例如:Global语句就不能放在Sub … End Sub结构中,下面给出的是MapBasic程序中不同组件排列顺序的一个典型的格式:
全局级的语句出现在程序的项部
Include “mapbasic.def”
其他的Includc语句
Type … End Type语句
Declare Sub语句
Declare Function语句
Define语句
Global语句
…接下来是主过程定义…
Sub Main
Dim语句
End Sub
....接着是其他的子过程定义
Sub ....
Dim语句
End Sub
......用户函数定义....
Function ....
Dim语句
End Function
11.2 用户界面程序实例
为了能让读者迅速掌握用MapBasic进行应用程序开发的最基本方法,本节将通过剖析一个程序实例来展示MapBasic强大的开发功能。

由于该程序只是一个演示程序,所以它的重点只放在用户界面的创建。

对于其他一些辅助功能,本程序只提供了功能框架,而没有给出具有完整功能的程序模块。

有兴趣的读者可以对本程序的部分或全部进行修改、增加和精简,以便完善该程序的功能。

11.2.1 程序功能简介
一个优秀的应用程序,必须有一个令人赏心悦目的用户界面。

一个设计良好的用户界面不但能够使用户得到视觉上的享受,而且能够提高人机交互的效率。

本程序的最主要部分是生成一个用户界面,其中包括创建一个全用户化的菜单、定制符合用户要求的按钮盒和对话框,并且在必要时能及时打开一个合适的窗口(如地图窗口、浏览窗口或统计窗口
等)。

1。

用户菜单
一般情况下,我们并不需要完全放弃MapInfo的原始菜单,而只要在该菜单系统的基础上,适当地删去一些不需要的菜单或菜单项,再增加一些新的菜单或菜单项就可以制作出符合自己要求的菜单。

但MapBasic同样支持你创建一个全新的菜单系统,本程序就是采用了这种方式。

当运行该演示程序时,屏幕上将出现如图11.1所示的用户界面。

程序
图11-1 演示程序的显示情况
除了显示一个用户菜单及用户按钮盒外,还打开了一个地图窗口,在地图窗口中打开了几个MapInfo表。

其中菜单栏在屏幕的最上方,它包括:系统菜单、演示菜单、对象、旅游查询、旅游统计图及帮助。

·系统菜申.它由“打开表”、“关闭表”、“全部关闭”、“世界地图”和“退出”五个菜单项组成。

主要完成对MapInfo表的打开与关闭操作,并同时将它显示在一个地图窗口中。

其中“打开”是让用户选择并打开一个表,而“世界地图”是直接由MapBasic打开一个事先选定的表(World.tab);“关闭”是让用户选择一个当前打开的表把它关闭,并保存相应工作空间,而“全部关闭”是将当前矽甫打开的表全部关闭;“退出”是退出该演示程序恢复到原来的MapInfo界面。

.演示菜单它包含一个“建介”了菜单。

该子菜单用于生成一个用户菜单、按钮盒或对话柜。

对应于此英申的MapBaslc功能模块就是生成用户界面的最典型方法。

菜单项“工具栏”实质上是一个对话框,只是该对话框只包含四个复选框:主、常用、绘图、用户。

当选中了其中的一个或多个,相应的按钮盒就会在屏幕亡显示,否则就会隐藏按钮盒。

这里按钮盒“主”、“常用”和“绘图”是MapInfo系统自带的,而“用户”按钮盒则是由本演示程序自制的。

另外,你还会看到三个呈现灰色的菜单项“设置更新口令”、“数据备份”和“数据恢复”,由于这些功能在本程序中还没有全部制作进去,所以这里把这些菜单项设置为不可选。

·对象MapBasic可以创建、修改对象,而且可以把一个对象赋给一个表的对象列。

该菜单包括一个“创建对象”子菜单和两个菜单项“折线转换成区域”、“区域转换成折线”。

其中两个菜单项是呈灰色的,表示它们不可选择。

而“创建对象”子菜单是用于创建MapInfo 的图形对象,当用户选择了该子菜单下的一个菜单项时,程序首先将建立一个MapInfo表,并将该表地图化,接着为它追加一条记录,并把创建的对象赋值给该记录的对象列。

最后,程序将在一个地图窗口的一个可编辑图居中显示该对象。

·旅游查询该菜申的所有菜单项都是不可选的。

用户可以根据自己的要求编写相应的程
序以完成该项功能。

.旅游统计图这个菜单的功能是将某些MapInfo表中的信息以统计图的形式显示在屏幕上,使得观察更加直观方便,当然你可以通过设置来指定统计图的格式。

.帮助该菜单提供了MapInfo主要功能的在线查询,通过Intemet访问MapInfo 站点,以及有关本演水程序的一些信息。

2.按钮盒
按钮盒是用户界面的重要组成部分。

它以工具箱的形式为用户提供某些常用的功能。

MgpBasic中的按钮盒中的按钮有三种类型:工具按钮、触发式按钮和按压式按钮(或称开关式按钮)。

一般地,当选中一个工具按钮时,应用程序并不立即调用相应的处理程序,而只是作好了一些必要的设置(如改变光标的形状),只有在选中该按钮后,继续在相应的窗口中进行单击或拖拉时应用程序才调用相应处理程序,如MapInfo“绘图”按钮盒中的“画线”、“画椭圆”等按钮就属此类。

触发式按钮是在选中该按钮时就立即调用处理程序,而按压式按钮是在“按压”或“恢复”该按钮时都调用处理程序。

用户可以根据各自的需要选择合适的按钮类型。

本演示程序有两处涉及按钮盒的创建,一个是在程序开始运行时就出现在屏幕上的“用户”按钮盒。

这里选择了一些对地图窗口进行操作的常用工具,如放大、缩小视图等。

该按钮盒是漂浮在整个桌面上的。

另外一个按钮盒是通过选择[演示菜单1>[建立]>[按钮盒]来创建的,该按钮盒是固定在窗口顶部,其中包含三个按钮,它们分别属于三种不同的类型。

3.对话框
该程序创建的一个最典型的对话框是通过选择[演示菜申—1>[建立3>[对话框]建立的。

它包括以下对话框控件:StaticText、EditText、GroupBox、PopupMenu、ListBox、RadioGroup、SymbolPicker、CheckBox、OkButton和CancelButton。

另外,“系统菜单”中的“退出”菜单项、“演示菜单”中的“工具栏”菜单项、“帮助”菜单中的“关于”菜单项都是对话框的例子。

4.窗口
窗口也是用户界面的重要组成部分,Maplnfo包括多种类型的窗口,如地图窗口、浏览窗口、统汁窗口、布局窗口以及普通的信息窗口等。

本演示程序一执行就先打开一个地图窗口,并将窗口标题设置为“一个用户界面程序的演示示例”,另外,还可以用[系统菜单]>[打开]或[系统菜单]>[世界地图]打开一个地图窗口。

通过选择[旅游统计图]>[旅游人口]可以打开一个统计图窗口。

至于其他类型的统计图,本程序没有涉及,用户可以技类似的方法自己建立。

11.2.2源程序及其注解
1. 源程序清单
…一个用户界面演示程序:Ye_Demo.mb
…制作日期:1998.7
…目的:快速掌握MapBasic程序开发.
…内容:生成用户界面的MapBasic程序
…主要语句:
… CreateMenu菜单名as 生成菜单
…子菜单名calling 进程
… Create ButtonPad按钮盒名 As 生成按钮盒
…按钮类型[PushButton、ToolButton、Togg1eButton]
… Dialog 生成对话框
… Title对话框标题
…控制类型
… ***********标准定义文件***********
Include “mapbasic.def”
Include “icons.def”
Include “menu.def”
… **********进程声明**********
Declare Sub Main
Declare Sub Ye_denm
Declare Sub Ye_ButtonPad
Declare Sub Ye_Menu
Declare Sub Ye_Tool
Declare Sub Ye_graph
Declare Sub Ye_Dialog
Declare Sub Menu_Test
Declare Sub Button_Test
Declare Sub Ye_about
Declare Sub Ye_Exit
Declare Sub Ye_Button1
Declare Sub Ye_Buttonn2
Declare Sub Close_all
Declare Sub Close_some
Declare Sub Open_File
Declare Sub Open_world
Declare Sub Make_ellipse
… *************************
…建立主菜单
… *************************
SUB Main
0nerror goto sub_err
Create Menu “风景点” As
“按地区分” Calling Ye_demo,
“按类型分” Calling Ye_demo,
“按最佳旅游季节分” Calling Ye_demo,
“(-“,
“风景点向导” Calling Ye_demo
CREATE MENU “建立” As
“用户菜单“ Calling Ye_menu
“按钮盒 \tCtrl+B/W^B/Mb/XCtrl+b” Calling Ye_Buttonpad
“对话框 \tCtrl+D/W^D/Md/XCtrl+d” Calling Ye_Dialog
Create Menu “创建对象” As
“点” Calling Ye_demo,
“直线” Calling Ye_demo,
“椭圆” Calling Mmake_ellipse,
“折线” Calling Ye_demo,
“矩形” Calling Ye_demo,
“圆角矩形” Calling Ye_demo,
“圆弧” Calling Ye_demo,
“区域” Calling Ye_demo,
“文本” Calling Ye_demo,
“标签” Calling M_TOOLS_LABELER
Create MENU “演示菜单” As … **** 建立用户主菜单 **** “建立” As “建立”,
“工具栏...” Calling Ye_Tool,
“(-“,
“设置更新口令” Calling Ye_demo,
“(-“,
“数据备份” Calling Ye_demo,
“数据恢复” Calling Ye_demo
Create Menu “系统菜单” As
“打开表” ID 111 Calling Open_File,
“关闭表” Calling Close_some,
“全部关闭” Calling Close_all,
“(-“,
“世界地图” ID ll2 Calling Open_world,
“(-“,
“退出” Calling Ye_exit
Create Menu “旅游查询” As
“风景点” As “风景点”,
“风土人情” Calling Ye_demo,
“路线” Calling Ye_demo
Create Menu “旅游统计图” As
“旅游收入” Calling Ye_graph,
“旅游人数” Calling Ye_demo,
“旅游淡旺季” Calling Ye_demo
Create Menu “帮助” As
“主题索引” Calling M_HELP_CONTENTS,
“Web页搜索” Calling M_HELP_CONNECT_MIFORUM,
“(-“,
“关于” Calling Ye_about
Create Menu “对象” As
“创建对象” As “创建对象”,
“(-“,
“折线转换成区域” Caing Ye_demo,
“区域转换成折线” Calling Ye_demo
Alter Menu Item Ye_demo Disable
Create Menu Bar As
“系统菜单”,”演示菜单”,”对象”,”旅游查询”,”旅游统计图”,”帮助”
…‟‟**** 将所建立的用户菜单加入菜单栏 *******
Alter BUTTONPAD “绘图” Hide … ** 将不使用的按钮盒隐藏 **
Alter BUTTONPAD “ODBC” HIDE
ALTER BUITONPAD “主” HIDE
ALTER BUTTONPAD “常用” HIDE
MENU BAR SHOW … **** 显示新菜单栏 ****
Open Table “景点分布” As 景点分布 Interactive
Open Table “省” As 省 Interactive
Open Table “市” As 市 Interactive
Map From 景点分布,市,省
Position(0.0520833, 0.0520833) Units “in”
Width 4.125 Units “in” Height 2.36458 Units “in”
Set Window FrontWindow() Max ScrollBars Off Autoscroll On
Set Map
CoordSys Earth Projection 1,0
Center(119.6263825,29,3124845)
Zoom 86.15402206 Units “mi”
Preserve Zoom Display Zoom
XY Units “degree” Distance Units “mi” Area Units “sq mi”
Set Map
Layer 1
Display Graphic
Label Line Arrow Position Right Font(“Arial”,0,12,0) Pen(1,2,0) With name
Parallel On Auto Off Overlap Off Duplicates On Offset 2
Visibility On
Layer 2
Display Graphic
Label Line Arrow Position Right Font(“Arial”,0,12,0) Pen(1,2,0) With 市
Parallel On Auto Off Overlap Off Duplicates On Offset 2
Visibility On
Layer 3
Display Graphic
Label Line Arrow Position Right Font(“Arial”,0,12,0) Pen(1,2,0) With 省
Parallel On Auto Off Overlap Off Duplicates On Offset 2
Visibility On
Create ButtonPad “用户” As
ToolButton
Icon MI_ICON_ARROW
Calling M_TOOLS_SELECTOR
HelpMsg “Select objects for editing\n选择”
ToolButton
Icon MI_ICON_ZOOM_IN
Calling M_TOOLS_EXPAND
HelpMsg “工具按钮\n放大”
ToolButton
Icon MI_ICON_ZOOM_OUT
Calling M_TOOLS_SHRINK
HelpMsg “工具按钮\n缩小”
ToolButton
Icon MI_ICON_ZOOM_QUESTION
HelpMsg “工具按钮\n问题”
ToolButton
Icon MI_ICON_GRABBER
Calling M_TOOLS_RECENTER
HelpMsg “工具按钮\n平移”
ToolButton
Icon MI_ICON_INFO
Calling M_TOOLS_PNT_QUERY
HelpMsg “工具按钮\n信息”
PushButton
Icon MI_ICON_MISC_15
Calling Ye_Button1
HelpMeg “用户开关按钮\n按压式”
ToggleButton
Icon MI_ICON_MAPSYMB_20
Calling Ye_Button2
HelpMsg “用户触发式按钮\n触发式”
Show
Set window FrontWindow() title “一个用户界面程序的演示示例” Exit Sub
Sub_err:
Note Error$()
Exit Sub
End Sub
…‟****************
…‟建立菜单
…‟****************
SUB Ye_Menu
Onerror goto sub_err
Create menu “新菜单” as
“菜单项一” id 3000 Calling Menu_Test,
“删除菜单” id 3001 Calling Menu_Test
alter menu bar add “新菜单”
menu bar shows
exit sub
sub_err:
note Error$()
exit sub
End Sub
…‟***************
…‟菜单调试
…‟ **************
SUB Menu Test
Do Case lnt(CommandInfo(CMD_INFO_MENUITEM))
Case 3000
Nots “您已经选用了菜单项一”
Case 3001
Note “新菜单将被删除”
Alter menu bar remove “新菜单”
End Case
Menu bar show
End Sub
…‟ **********************
…‟建立按钮盒
…‟ **********************
SUB Ye_buttonPad
Create BUTTONNPAD “用户按钮” As
ToolButton …‟具按钮
Icon MI_ICON_ARROW …图标
Cursor MI_CURSOR_CROSSSHAIR …光标
Calling Button_Test …调用进程
Id 1001 … ID号
HelpMsg “工具按钮\n工具按钮”…帮助信息
PUSHBUTTON …佃发式按钮
ICON MI_ICON_HELP
Calling Button_Test
HelpMsg “触发式按钮\n触发式按钮”
Id 1002
ToggleButton
Icon MI_ICON_MAPSYMB_16
Calling Button_Test
ID 1003
HelpMsg “开关式按钮\n开关式按钮”
SHOW
FIXED
End Sub
…‟ *************
…‟按钮盒测试
…‟ *************
SUB Button_Test
Onerror goto sub_err
DO Case Int(CommandInfo(CMD_INFO_TOOLBTN))
Case 1001
If numwindows()=O Then
NOTE “工具型技钮盒”+CHR$(10)+”请在地图窗口中使用”
Exit sub
Else If WindowInfo(FrontWindow(), WIN_INFO_TYPE) <> WIN_MAPPER Then
NOTE “工具型按钮盒”+CHR$(10)+”请在地图窗口中使用”
exit sub
else
note “当前光标位置”+CHR$(10)+”x:”+str$(CommandInfo(CMD_INFO_X))+ ”y:”+str$(CommandInfo(CMD_I NFO_Y))
End If
Case 1002
Note “触发型按钮盒”
Case 1003
Note “按压型按钮盒”
End Case
Exit sub
Sub_err:
Note Error$()
Exit sub
End Sub
Sub Ye_Button1
Note “按压型按钮盒”
End Sub
Sub Ye_Button2
Note “触发型按钮盒”
End Sub
…‟ **********
…‟建立对话框
…‟ **********
SUB Ye_dialog
Dim filename as String
Dim cntrl_val as Integer
Dialog
Title “一个用户界面演示程序”
Control Static Text
Title “面板文本”
Position 20,5
Control PopupMenu
Title “下拉式菜单选项—1选项—2:”
Position 90,5
Control GroupBox
Title “群组选择框”
Position 10,20
Width 80 Height 40
Control RadioGroup
Title “&R单选一; &R单选二”
Position 20,32
Value l
Into cntrl_val
Control ListBox
Title “列表选择框;选项—1;选项—2;选项—3选项—4;选项—5;选项—6” Width 80 height 40
Position l05,25
Control Static Text
Title “线型:”
Position 20,70
Control PenPicker
Position 60,70
Width 20 Height 20
Control GroupBox
Title “编辑文本将存于:”
Position 10,100
Width 160 Height 40
Control EditText
Value “文件名”
Into filename
Position 20,120
Control CheckBox
Title “功能确认框”
Position lO,150
Control OkButton
Title “确定”
Position 50,180
Control CancelButton
Title “取附”
Position 120,180
printfilename
print cntrl_val
End Sub
…‟ *****************
…‟关于Ye_DEMO.MB
…‟ *****************
SUB Ye_about
Dialog
Title “关于一个用户界面演示程序” Control Static Text
Title “程序名: Ys_demo”
Position 20,10
Control Static Text
Title 生成菜单:”
Position 20,30
Control Static Text
Title “选择演示菜单,建立,用户菜单” Position 20,40
Control Static Text
Title “生成按钮盒:”
Position 20,50
Control Static Text
Title “选择演示菜单,建立>按钮盒”
Position 20,60
Control Static Text
Title “生成对话框:”
Position 20,70
Control Static Text
Title “选择演示菜单,建立,对话框”
Position 20,80
Control Static Text
Title “制作:浙江师范大学计算机系”
Position 30,100
Control Static Text
Title “电话:(0579)2341801—2338”
Position 30,110
Control OkButton
Title “确定”
Width 60 height 15
Position 42,130
End Sub
SUB Close_some
Run Menu Command l103
End Sub
SUB Close_a11
Close all
End Sub
SUB Ye_demo
Note “这只是一个演示程序.谢谢使用”
End Sub
SUB Ye_Tool
Dim check_main, check_usually, check_draw, check_custom As Logical Dialog
Title “工具栏”
Width 55 Height 70 Position 110,110
CONTROL CHECKBOX
Title “主”
Into check_main
Position 10,5
CONTROL CHECKBOX
Title “常用”
Into cheek_usually
Position 10,15
CONTROL CHECKBOX
Title “绘图”
Into check_draw
Position 10,25
CONTROL CHECKBOX
Title “用户”
Into check_custom
Position l0,35
CONTROL OkButton
Title “确定”
WIDTH 20 HEIGHT l0 Position 5,55
CONTROL CancelButton
Title “取消”
WIDTH 20 HEIGHT l0 Position 30,55
If CommandInfo(CMD_INFO_DLG_OK) Then
If Check_main Then
Alter ButtonPad “主” Show
else
Alter ButtonPad “主” Hide
End If
If Check_usually Then
Alter ButtonPad “常用” Show
else
Alter ButtonPad “常用” Hide
End If
If Check_draw Then
Alter ButtonPad “绘图” Show
else
Alter ButtonPad “绘图” Hide
End If
If Check_custom Then
Alter ButtonPad “用户” Show
else
Alter ButtonPad “用户” Hide
End If
Endlf
End Sub
Sub Ye_graph
Open table “旅游收入” As 旅游收入 Interactive Graph 景点名, 95, 96, 97, 98 From 旅游收入
End Sub
Sub Open_File
Dim s_filename As String
s_filename = FileOpenDlg(“c:\MapInfo\data\world”,””,”TAB”,”打开表”) If s_filename <>”” Then
Run Menu Command 104
Open Table s_filename As 选择表
Map From 选择表
Else
Note “没有文件被选择”
End If
End Sub
Sub Open_world
Colse all
Open Table “c:\MapInfo\data\world” As世界地图 Interactive
Map From 世界地图
Set Map Layer 1 Label Object 1
Visibility On
Anchor(0,85)
Text “世界地图”
Position Center
Font(“隶书”,289,20,RED)
End Sub
Sub Make_ellipse
Close all
Dim ellipse_obj As Object
Create Ellipse into Variable ellipse_obj
(5,5) (20,15)
Pen Makepen(1,2,RED)
Brush MakeBrush(15,BLUE,CYAN)
Create Table towns
(townname Char(10))
File “towns”
Type NATIVE
Open Table “towns”
Create Map
From towns
Insert into towns(townname,obj)
Values(“椭圆”, ellipse_obj)
Map From towns
Set Map
Center(12.50, 10.00)
Zoom 2450 Units “mi”
End Sub
SUB Ye_exit
Dialog
Title “MapInfo”
Width 150 Height 60
Control Static Text
Title “是否确定要退出本演示程序?”
Position 20,15
Control 0kButton
Title “确定”
Width 30 Height 15
Position 20,40
Control CancelButton
Title “取消”
Width 30 Height 15
Position 95,40
IF CommandInfo(CMD_INFO_DLG_OK) Then
Create Menu Bar As Default …‟ **恢复Maplnfo菜单
Create ButtonPads As Default …‟ ***恢复Maplnfo按钮盒
Close a11
End Program …‟ ***** 结束MAPBASic应用程序
End If
End SUB
2. 关于本程序的几点说明
程序中涉及到五个表,它们分别是“省.tab”、“市.tab”、“景点分布.tab”、“旅游收入.tab”和“World.tab”。

其中表“景点分布.tab”是在MapInfo中制作的,而其余的四个表都是MapInfo系统自带的。

本程序中用到的个别函数或命令前面章节没有详细讨论,需要了解的读者可以参考《MapBasic参考手册》或使用MapBasic联机帮助。

本程序的部分代码取自北京科瑞讯公司开发的一个关于MapBasic的演示程序:
Cr_Demo.mb。

相关文档
最新文档