1、第 1 页 (共 19 页) VB6.0 环境下基于 MO 的 太阳位置参数查询系统的开发 摘要: 本文旨在基于 Visual Basic( VB) 环境下的 Map Objects( MO) 地理信息系统控件 , 利用 MO 的一系列对象开发嵌入式的地理信息系统 。 以研究开发的 太阳位置参数查询 系统为例 充分说明 MO 在进行信息系统开发时的优缺点 。 同时 , 通过对 太阳位置参数查询系统 的研究 ,为太阳能利用、楼层采光等现实问题以及遥感辐射定标 、遥感影像的辐射校正、地表辐射能量平衡计算 等科研问题提供方便的查询工具 。 关键词 : Visual Basic; Map Object
2、s;太阳位置参数;太阳高度角 1 引言 1.1 太阳位置参数 对于地球上的某个地点,太阳高度是指太阳光的入射方向和地平面之间的夹角,专业上讲太阳高度角是指某地太阳光线与该地作垂直于地心的地表切线的夹角。我们用 h 来表示这个角度,它在数值上等于太阳在天球地平坐标系中的地平高度。 房地产产业的迅猛发展,楼层建设得越来越高,随之高层和超高层建筑所导致的室内日照不足的现象也日益突出,因此建筑采光问题也越来越受到更多人的关注。适宜的日照时间,不仅能起到消灭室内细菌和干燥房间的作用,而且在冬季能使房间获得太阳辐射 热而提高室温。而日照时间与太阳高度和方位角有十分密切的关系。根据本 文提出的查询系统,可以
3、查询太阳高度角,因此该 系统 具有一定的社会效益和经济效益。在科学研究中,太阳高度角是极为常用的参数,比如进行遥感辐射定标、遥感影像的辐射校正、地表辐射能量平衡计算等。 1.2 Map Objects 简介 第 2 页 (共 19 页) Map Objects(简称 MO)包括一个 ActiveX 控件 (OCX)也就是 Map 控件,还包括 45 个 ActiveX 自动对象。 通过这些对象 , 可以使用任何支持 ActiveX 的程序开发环境 (如 Visual Basic、 Delphi、 PowerBuilder等 ),开发嵌入式 GIS 应用系统。根据功能的不同可将这些 Active
4、X对象分为 9 类: ( 1)视图窗口控制对象 该类对象定义了控件视图窗口的环境,如当前图层、前景颜色、背景颜色、滚动条、鼠标指针等属性,并定义了视图刷新、视图窗口图形的放大、缩小、漫游等成员函数。 ( 2)视图窗口事件对象 该 类对象定义了控件视图窗口的消息响应函数 , 如各类鼠标事件 , 利用 该类对象可以实现热区查询、 坐标显示等软件功能 。 ( 3) 图层对象 控件视图窗口的空间图形数据是分层组织的 ,它们可以是 Arc/Info Coverage、 SDE、 Shape 等图形数据层 , 也可以是 Erdas、 TIFF、 BMP 等图像数据层 , 分层组织的方法使空间数据叠加成为可
5、能 。 ( 4) 空间数据对象 Map Objects 中提供了点、线、面三类空间数据对象 , 其中面状对象又分为 Rectangle、 Ellipse、 Polygon 三类 。 ( 5) 空间数据库访问对象 提供了对 Arc/ Info、 SDE、 ArcView、 Shape 等空间图形数据以及多种图像数据的访问支持 , 借助空间数据库访问对象 , 用户程序可成为客户端的空间数据浏览器 。 ( 6) 外部数据库连接访问对象 提供了对多种数据库 (如 Dbase、FoxBase、 FoxPro、 ODBC 等 ) 的连接访问 , 这使得基于 Map Objects的应用程序成为关系数据库的
6、前端应用工具。 ( 7)符号对象 定义了空间数据对象的符号、线型、颜色、标注的字体、尺寸等属性 , 使得空间数据对象能以规定的属性在控件视图窗口显示出来。 ( 8)制图对象 通过对属性字段的信息提取、统计及简单分类,生成各类专题地图。 ( 9)地址对象 提供了对地址的模糊查找、图形定位、地址匹配等功能,利用这些对象能创建交通道路管 理一类的应用系统。 但 MO 不能执行某些高级功能,如高质量地图输出、地图坐标系第 3 页 (共 19 页) 投影、表面模型或网络分析等高级空间分析、拓扑编辑,应用者可利用 ESRI 的其他产品如 Arc/Info、 ArcView 来实现高级功能。 2 系统设计
7、2.1 系统设计原则 系统设计遵循以下原则: ( 1)系统实用,可操作性强,界面友好;( 2)具有良好的可扩充性,便于更新换代不断发展;( 3) 系统开发要标准化、规范化,并且安全可靠,在实用的基础上力求以最小的投入获得最大的产出。 2.2 系统结构设计 太阳位置参数查询系统的设计, 一方面 是为普通用户,在太阳能安置、楼层采光等现实问题上提供方便 的查询相关参数 的工具。为用户提供购房、太阳能利用等方面的信息,为决策提供信息支撑。另一方面是为科研工作人员 进行 遥感辐射定标、遥感影像的辐射校正、地表辐射能量平衡计算 等科研问题提供方便的技术参数 。因而要求 系统能方便 灵活 的提供所需要的太
8、阳高度角信息, 及与之紧密相关的 太阳位置,太阳方位 等相关信息,能够为 用户 提供 灵活的查询手法。 考虑到 不同用户对于要查询的地方的信息(如经纬度等)的了解程度不同,以及需要获取的城市的等级的不同(如省级、地市级、县级)。 因此,系统设 计了包括 输入坐标式和用户交互式(通过 GUI 界面) 2 个一级菜单, 另外用户交互式一级菜单下又有 3 个不等 的二级子菜单,系统结构 图 1 所示 : 2.3 基本算法 式中 :太阳高度角以 h 表示;太阳赤纬(与太阳直射点纬度相等)以表示 ;观测地地理纬度用表示;地方时 (时角 )以 t 表示; 项目涉及主要公式如下: s in h s in s
9、 in c o s c o s c o s0 . 3 7 2 3 2 3 . 2 5 6 7 s in 0 . 1 1 4 9 s in 2 0 . 1 7 1 2 s in 30 . 7 5 8 c o s 0 . 3 6 5 6 c o s 2 0 . 0 2 0 1 c o s 3t 第 4 页 (共 19 页) 式中:太阳赤纬(与太阳直射点纬度相等)以表示 ;式中称日角;地方时 (时角 )以 t 表示。 图 1 系统结构图 2.4 图层数据设计 系统以 GIS 图层来组织 数据。以县级为例,采用全国行政区划图作为底图,国家测绘与地理信息局普查结果作为属性数据源,利用Arcmap 软件进
10、行地图数字化、编辑属性表。数据分为行政区,道路,河流,居民点等 4 个图层。属性数据包括行政区、道路、湖泊、河流、居民点等的名称及名称的拼音,经纬度坐标,面积、周长,类别编码,级别,类别(点、 线、面) 等,属性数据与空间数据通过其关键字ID 相联。 用户交互式 中省级、市级、县级查询系统的实现,通过在类模块中设置一个公有变量,在点击省级、市级、县级时对此公有变量赋予不同的值(此值是存放省级、市级、县级图层 数据的文件夹名),并将此值传递到下一级中。 省级、市级、县级切换代码 如下: Private Sub Command1_Click() 选择省级的按钮代码 Dim ZHshengji As
11、 String FindDoc = “ZHshengji“ 将文件夹 ZHshengji 字符串传递给公有变量 FindDoc Text2.Text = FindDoc Form4.Show 1 显示用户交互式界面 Form5.Hide 隐藏查询类别窗体 End Sub Private Sub Command2_Click() 选择市级的按钮代码 Dim ZHdishiji As String FindDoc = “ZHdishiji“ 将文件夹 ZHdishiji 字符串传递给公有变量 FindDoc 第 5 页 (共 19 页) Text2.Text = FindDoc Form4.Sho
12、w 1 显示用户交互式界面 Form5.Hide 隐藏查询类别窗体 End Sub Private Sub Command3_Click() 选择县级的按钮代码 Dim ZHxianji As String FindDoc = “ZHxianji“ 将文件夹 ZHxianji 字符串传递给公有变量 FindDoc Text2.Text = FindDoc Form4.Show 1 显示用户交互式界面 Form5.Hide 隐藏查询类别窗体 End Sub 2.5 系统功能设计 针对前述的系统设计的目标,本系统的 功能设计为以县级、市级、省级 政区 划 为底图,把 县级、市级、省级 内的 道路、
13、河流、湖泊、居民点 等内容在图上表示出来,其空间位置通过地图的位置来表示,各要素 ( 道路、河流、湖泊、居民点 )的属性(如名称、级别、 经纬度等)通过 列 表框( ListBox)、组合框( ComboBox)、标签( Label)和文本框( TextBox)等 控件 的组合的 形式来实 现。与 地图控制 相关 的操作 等 可以通过图例( Legend)、指示图( Locator map)等控件 相结合的形式向用户提供。因此,系统的功能包括地图显示功能、地图缩放、漫游功能、 图层数据控制功能、要素 查找功能(从图到属性和从名称到图两种方式) 等。 2.6 系统界面设计 以用户交互界面为例,
14、根据 不同 行政区域 大小不一(特别是县级区划比较多) 的特点,本系统改变大多数系统把主窗口放在系统右部,导航图和图层控制器放在左部的做法。 本系统 把主窗口放在系统 左边大 部,把导航图和图层控制器放在 中右部,右侧 部在系统运行过程中,根据不同的运行过程会有不同的情 况,如操作提示、 选中的 要素 个 数及列表 、 要素的属性、要素的位置、要素的个数、 要素的 类型(点、线、面) 等。 另外,考虑到不同用户的知识水平及经验不同,为用户提供了方便灵活的查询界面。 各主要界面如下所示: 第 6 页 (共 19 页) 图 2 用户交互式 -县级 图 3 用户交互式 -市级 图 4 用户交互式 -
15、省级 图 5 欢迎界面 图 6 查询方式的选择 图 7 查询类别的选择 第 7 页 (共 19 页) 3 系统实现 本系统 利用面向对象编程语言,通过在编程语言中嵌入能完成地图显示功能 的组件即可实现,编程语言和功能组件有很大的选择空间,不同的语言和组件在编程时会有一定的差异,下面就本系统所做的基于 VB+MO 的实践作简要介绍。 3.1 开发环境的选择 Visual Basic 是一种可视化编程语言,它继承了 Basic 语言简单易学的优点,采用面向对象程序设计思想,使编程变得更加方便和快捷,使用它可以方便地开发各种应用软件。 Map Objects(简称 MO)是 ESRI 开发的提供制图
16、与空间分析功能的组件,它可以直接插入到许多标准开发环境中进行二次开发。它具有低成本、易开发、不需要其它 GIS 平台、使用环境广、通用性好、易于推广等优点,是目前国际上最通用的地理信息系统开发工具,也是目前国内开发人员的主要选择。 基于上述 Visual Basic 和 Map Objects 的优点,根据本系统的应用性要求较强的特点,太阳高度查询系统以这两者的结合作为开发环境进行系统开发。 3.2 太阳位置参数 查询功能的实现 本 查询 系统从 2 个方面实现了 太阳位置参数 查询:第一是在 主程序 中通过单击 “输入坐标式” :在弹出的窗体中,选择要查询的日期、时间,并在“输入要查询的纬度
17、”一项输入查询地点的纬度,然后单击“计算”,即可在下 面的标签上显示出太阳高度角;另外,单击返回按钮,可以返回到查询方式的界面; 第二是在 主程序中单击“ 用户交互 式”, 在弹出的窗体上分“省级”、“市级”、“县级”三类:如果选择省级,则显示的地图上,城市为各省省会 和直辖市,河流为三级河流,行政区划为省级;如果 选择市级,则显 示的地图上,城市为地级市,河流为四级河流,行政区划为省级;如果 选择县级,则显示的地图上:城市为县级,河流为五级河流,行政区划为县级。 用户点击相关项目会弹出装载有相应类别的道路、河流、湖泊、居民点的窗口,第 8 页 (共 19 页) 用户在该窗口中选中感兴趣的地点
18、后,地图上相应要 素会闪烁,同时会在右侧的列表框、组合框和标签上显示相关属性,如上图 2、 3、 4 所示。然后单击“计算太阳 高度角”按钮,在弹出的窗体中,“输入地理纬度”一栏已经自动复制用户点击 地点的纬度,并且此栏不可编辑 ,用户 只能选择日期和时间进行交互。 2 种方式的查询界面如图 8、图 9 所示: 图 8 输入坐标式 -查询 图 9 用户交互式 -查询 第 9 页 (共 19 页) 4 系统代码 限于篇幅,本文仅节选了该系统的主要代码 。 4.1 查询方式的实现 Private Sub Command1_Click() 输入坐标式 按钮代码 Unload Form2 卸载 查询方
19、式窗体 Form3.Show 显示计算太阳高度角窗体 End Sub Private Sub Command2_Click() 用户交互式 按钮代码 Form2.Hide 卸载查询方式窗体 Form5.Show 显示查询类型窗体 End Sub Private Sub Command3_Click() 帮助 按钮代码 Text1.Left = 1680 文本框的位置及内容 Text1.Top = 1800 Text1.Height = 3735 Text1.Width = 5175 Text1.Visible = True Text1.Text = “帮助: “ & vbCrLf & vbCr
20、Lf & “一、在已知 要查询的地理坐标的情况下,请单击输入坐标式; “ & vbCrLf & vbCrLf & “二、如果不知道地理坐标,可以单击用户交互式,并用鼠标选择 所要查询的地方,同 样可以获 得 所要的结果。 “ & vbCrLf & vbCrLf & “南阳师范学院环境科学与旅游学院 “ & vbCrLf & “yuyanchao,2012/3/29“ Command1.Enabled = False Command2.Enabled = False Command4.Left = Command3.Left Command3.Visible = False Command4.V
21、isible = True End Sub Private Sub Command4_Click() 返回 按钮代码 Text1.Visible = False Command4.Visible = False Command3.Visible = True Command1.Enabled = True Command2.Enabled = True End Sub Private Sub Form_Load() 加载 代码 Text1.Visible = False Command4.Visible = False 第 10 页 (共 19 页) End Sub 4.2 计算太阳高度角 的
22、实现 Private Sub Command1_Click() 计算 按钮代码 Const PI = 3.14159265358979 Dim D As Date Text5.Text = Year(DTPicker1.Value) 查询日期的年数 D = Text5.Text + “/01/01“ 查 询的当年的元旦 Text8.Text = 79.6764 + 0.2422 * (Year(DTPicker1.Value) - 1985) - Int(Year(DTPicker1.Value) - 1985) / 4) 计算 n1 Text9.Text = -DateDiff(“y“, C
23、Date(Format(DTPicker1.Value, “YYYY-MM-DD“), CDate(Format(D, “yyyy-mm-dd“) + 1 计算积日 Text10.Text=(2*PI*(Text9.Text-Text8.Text)/365.2422 计算日角 Text11.Text=0.3723+23.2567*Sin(Text10.Text)+0.1149*Sin(2 *(Text10.Text)-0.1712*Sin(3*(Text10.Text)-0.758*Cos(Text10.Text)+0.3656*Cos(2*(Text10.Text)+0.0201*Cos(3
24、*(Text10.Text) 计算太阳赤纬 Dim E As Long Text12.Text= CDate(Format(Combo1.Text + “:“ + Combo2.Text + “:“ + Combo3.Text, “h:mm:ss“) 需要查询的时间 E=Abs(Combo1.Text*3600+Combo2.Text*60+Combo3.Text-43200) 相差的时间的秒数 Text19.Text=(Int(E/3600)*15+(Int(E-(Int(E/3600)*3600)/60) +(E-(Int(E/3600)*3600-(Int(E-(Int(E/3600)*
25、3600)/60)*60)/60)*PI/180 地方时 Dim A, B, C As Single A=Text11.Text*PI/180 太阳赤纬角 If Text2.Text = “ Then MsgBox “请输入 1360 之间的数字 “ End Else B=Text2.Text*PI/180 观测的地理纬度 End If C=Format(Sin(A)*Sin(B)+Cos(A)*Cos(B)*Cos(Text19.Text),“#.#“) 太阳高度角的正弦 Label1.Caption=Format(Atn(C/Sqr(-C*C+1)*(180/PI),“#.#“) Select Case C 最后结果的处理 Case 1 Label26.Caption = 1 Case 0 To 1 Label26.Caption = “0“ + Str(C) Case -1 To 0 Label26.Caption = “-0“ + Str(Abs(C) Case Else MsgBox “注意:你输入的数据不正确 “, 0+ vbExclamation, “错误提示 “ End Select End Sub