GIS中查询功能的实现
- 格式:doc
- 大小:601.50 KB
- 文档页数:10
1
2011-2012 地理科学与旅游学院
GIS设计与开发课程
实验报告
实验二: 单值专题图的生成以及GIS中查询功能的实现
班 级: 095班
姓 名: 陈佩仪
学 号: 2090822136
指导教师: 钟 广 锐
实验时间: 2011年11月
评 阅:
成 绩:
2011年 11 月制表
2 实验二(1) 单值专题图的生成
一.实验项目内容:生成单值专题图并风格化
二.摘要:SuperMap 2003的单值专题图在传统的专题地图中属于精确分区的质底法,将全制图区域按照专题现象的某种指标划分区域或各类型的分布范围,在各界线范围内涂以颜色或填绘晕线、花纹(乃至注记),以显示连续而布满全制图区域的现象质的差别(或各区域间的差别),可用于地质图、地貌图、植被图、土地利用图、政治行政区划图、自然区划图、经济区划图等。
三.基本思路:根据专题要素的取值不同,赋于地图区域不同的风格。通过查找对象结果图以及各类对象的属性、事件、方法作为解决方案。传统的专题地图是利用图例控件→选择图层→单击右键→专题图向导,虽然这种方法制作专题图比较简便,但却显得较为单一、不能控制。本次实验则选择利用SuperMap软件提供的对象,编写代码对其进行制作。
四.实验所用控件的属性、事件、方法,如下表所示:
属性 事件 方法
Commondialog1(打开工作空间控件) .DialogTitle=“打开工作空间控件”、.filter=app.path、.initdir=工作空间控件文件(*.smw)|*.smw Showopen方法
Command 1.Caption="打开"
Click()事件
2.Caption=”退出”
3.Caption=”生成单值专题图”;3.Enabled=False
4.Caption=”放大”;
5.Caption=”缩小”;
6.Caption=”漫游”;
7.Caption=”全幅显示”
8.Caption=”自由缩放”
Superlegend1 Modified事件,ReadyStateChange事件 Connect方法
Disconnect方法
Refresh方法
SuperWorkspace1 .Datasources OpenDatasource()方法、Close方法
SuperMap1 .Action=”放大”、 ”缩小”、”漫游”、”全幅显示”、”自由缩放”; Connect方法、Disconnect方法、Refresh方法
Close方法
Combo 1.Listindex=0 Clear方法 2.AddItem
五.实验过程分析及主要实验步骤:
1)专题图的数据集——图层对象Solayer (图层的选择)
打开数据源,得到数据集集合,图层叠加并生成地图,列出图层以供客户选择,列出所选中图层的字段名。此时程序必然得到一个客户选定的图层。
2)生成单值专题图
3 ①定义专题图对象,并赋值:
Dim objThemeUnique As soThemeUnique //单值专题图对象
设置缺省的单值专题图属性和状态,利用MakeDeault方法。
②设置专题图参数:设定字段,填充颜色参数等。
A.根据客户选择的图层,先将其转成矢量数据集,再转换成记录集,然后在combo2中显示字段信息集,再采用循环循环结构循环数据集:通过矢量数据集的GetFieldInfos方法,列出属性的字段信息。基本流程为:矢量数据集Objlayer.Dataset记录集矢量数据集.Query方法定义赋值SoFieldInfos记录集.GetFieldInfos。规定专题图的专题变量为“SMID”。
B.风格化:为每个不同的单值对象填充不同的颜色,利用objThemeUnique的ValueCount属性,获取专题要素的填充色;利用objcolors的MakeRandomColorset方法,产生一组随机数。
③图例控件的使用:通过对图例控件的使用,从而达到图层的管理和操作。本次实验通过modified()事件使得当图例控件发生改变时,能实现两个控件的刷新。一般我们可以通过属性表来设置图例控件的状态。
六.界面设计及关键代码部分:
1.界面设计:
1.1 界面设计
2.关键代码部分:
1)图层选择:选择图层,先转成矢量数据集,再转换成记录集,然后在combo2中显示字段信息集,再采用循环循环结构循环数据集
Dim objsellayer As soLayer
Set objsellayer = yers.Item(Combo1.ListIndex + 1)
Dim objdv As soDatasetVector
Set objdv = objsellayer.Dataset '如果有栅格图层,会出错!一般有两种解决方案,一是加图层类型的判断,可以用sodataset.vector判断数据集是否是矢量?二是通过一些方法使栅格数据也可以列出,但不影响使用
If objdv.Vector = False Then '判断是否栅格数据
MsgBox "不是矢量数据集"
Combo2.Clear
Else
Dim objrs As soRecordset
Set objrs = objdv.Query("", True)
Dim objfieldinfos As soFieldInfos
Set objfieldinfos = objrs.GetFieldInfos '获得所有字段的属性集
Dim i As Integer
Combo2.Clear
4 For i = 1 To objfieldinfos.Count
Combo2.AddItem objfieldinfos.Item(i).Name '利用循环结构,将字段添加到Combo2组合框中
Next
Combo2.ListIndex = 0 '默认选中第一项
2)打开数据源,列出数据集于组合框中,图层叠加,显示地图
SuperMap1.Close
SuperMap1.Disconnect '如果已有打开数据源,先断开链接,关闭工作空间控件,以防止出错
SuperLegend1.Disconnect
SuperWorkspace1.Close
CommonDialog1.ShowOpen
Dim objdataSource As soDataSource '定义变量、赋值
strAlias = "tempDatasource" '设置数据源别名
Set objdataSource = SuperWorkspace1.OpenDataSource(CommonDialog1.FileName, strAlias,
sceSDB, True) '利用OpenDataSource()方法,返回一个数据源对象
If objdataSource Is Nothing Then
MsgBox "打开失败", vbInformation '判断文件是否成功打开
Else
MsgBox "打开成功", vbInformation '成功选择好数据源后,在列表框中列出数据集
SuperMap1.Connect SuperWorkspace1.Handle '建立Supermap与Superworkspace控件连接
SuperLegend1.Connect SuperMap1 '建立superlegend与SuperMap的连接
Dim objdatasets As soDatasets '定义数据集集合
Set objdatasets = objdataSource.Datasets '获取数据集集合
If objdatasets Is Nothing Then '判断数据源中是否有数据集
Combo1.Clear
MsgBox "没有数据集!", vbInformation
Exit Sub
Else
Combo1.Clear
For i = 1 To objdatasets.Count '将获得的数据集添加到数据集列表中
Set objdataset = objdatasets.Item(i)
Dim objlayer As soLayer
Set objlayer = yers.AddDataset(objdataset, True) '图层叠加,生成地图
If objdatasets.Item(i).Vector = True Then '判断是否为矢量图层
Combo1.AddItem '将获得的图层列出在组合框中
End If
Next
Combo1.ListIndex = 0 '默认选择为第一项
Command3.Enabled = True '当成功打开数据源,并列出数据集,图层叠加,生成地图时,激活生成单值专题图的按钮
SuperMap1.Refresh '刷新地图
End If
End If
Set objdataSource = Nothing '使用完毕,释放对象
5 Set objdatasets = Nothing
Set objlayer = Nothing
3)生成单值专题图,并风格化
Set objThemeUnique = yers.Item((Combo1.ListIndex + 1)).ThemeUnique
Dim themefield As String
themefield = Combo2.List(Combo2.ListIndex)
With objThemeUnique
.Enable = True '启动并显示专题地图
.Field = "SmID" '规定专题变量为SMID
.MakeDefault 'MakeDefault方法,用于制作缺省的单值专题图,否则ValueCount的值为0
SuperMap1.Refresh
nThemeCount = .ValueCount '设置专题图中所包含的分类类别的数目
objColor.MakeRandomColorset nThemeCount '产生一组随机色
For i = 1 To nThemeCount '设置各个专题元素的随机色
.Style(i).BrushColor = objColor(i)
Next i
SuperMap1.Refresh
SuperLegend1.Refresh