对空间数据与属性数据的操作

如题所述

( 1) 对空间图层的整体操作

空间图层即 map1. layers. item( i) 对象,是图元空间数据的集合,具有以下几个重要属性:

1) Visible,设置图层是否可见;

2) Selectable,设置图层上的图元是否可选择;

3) Editable,设置是否可编辑;

4) AutoLabel,设置是否自动标注出图元的名称。

每个属性的值都为布尔型,即 True 或者 False。图层的 Selectable 属性设置为 False 时,通过选择工具将不能选择该图元上的图元,在进行图层编辑时,可以将欲编辑的图层设置为 Selectable = True,Editable = True,然后将其他图层设置为 Selectable = False,Editable =False,以起到数据保护的作用。

需要注意的是,要开始修改图层上的空间数据,只需要设置 Editable = True,但是如果要向图层上新增空间数据,还需要设置 map1. layers. InsertionLayer = map1. layers. item( i) ,否则会报错。

要根据空间图层来具体得到某个图元,可以根据 GetFeatureByID 和 GetFeatureByKey方法来实现。

当将某图层的 AutoLabel 设置为 True 时,该图层上的图元旁将会自动标注名称,名称的内容来自该图层的第一个字符类型字段的内容。如果需要更改标注内容的字段来源,则需要在 MapInfo Professional 中更改字段的排列顺序。

( 2) 向空间数据库中动态添加数据

为实现图中图功能,必须动态的在地图上添加矩形框,即动态的向空间库添加数据,如下代码可以实现:

Dim ftr As MapXLib. Feature

Dim ftrs As MapXLib. Features

Dim rctMap As MapXLib. Rectangle

Dim pnts As New MapXLib. Points

Dim pnt1 As New MapXLib. Point

Dim pnt2 As New MapXLib. Point

Dim pnt3 As New MapXLib. Point

Dim pnt4 As New MapXLib. Point

Set rctMap = frmmain. Map1. Bounds

pnt1. Set rctMap. XMin,rctMap. YMax

pnt2. Set rctMap. XMax,rctMap. YMax

pnt3. Set rctMap. XMax,rctMap. YMin

pnt4. Set rctMap. XMin,rctMap. YMin

pnts. Add pnt1

pnts. Add pnt2

pnts. Add pnt3

pnts. Add pnt4

pnts. Add pnt1

Set ftr = Map1. FeatureFactory. CreateLine( pnts,styLine)

Set Map1. Layers. InsertionLayer = Map1. Layers. Item( " eagle" )

Map1. Layers. Item( " eagle" ) . AddFeature ftr

Map1. Refresh

( 3) 更新属性库

首先,需要根据图元 ( 空间数据) 来找到它的属性数据,具体代码实现如下:

Dim ftr As MapXLib. Feature

Set ftr = Map1. Layers( i) . Selection. Item( 1)

Dim mydata As MapXLib. Dataset

Set mydata = Map1. DataSets. Add( miDataSetLayer,lyr)

For j = 1 To mydata. Fields. Count

If VarType( mydata. RowValues( ftr. FeatureID) . Item( j) . value) < > vbNull Then

Grid1. TextMatrix( j + 1,1) = mydata. RowValues( ftr. FeatureID) . Item( j) . value

End If

Next j

这样就列出了该图元的属性值,当对属性值做了修改,需要更新到属性库时,则可通过如下代码:

ftr. Layer. KeyField = Grid1. TextMatrix( i + 1,0)

ftr. KeyValue = Grid1. TextMatrix( i + 1,1)ftr. Update

需要注意的是,如果在属性库字段设计时,将一个或多个字段定义了索引,则必须保证更新的值为唯一,否则将更新错误,但建库时字段值已经有不唯一,则无论如何都会报错,所以建议不要定义索引。

( 4) 实现对空间数据的复制粘贴

空间对象不同于普通的文本或文件等数据,所以复制粘贴也有其特殊性,通过选择工具选择一个或多个图元,然后选择复制后,需要通过中间对象暂时存储,实现代码如下:

Public m_ oExchangeFtrs As MapXLib. Features,必须在公共模块中定义。

Dim oFtr As MapXLib. Feature

Dim oLayer As MapXLib. Layer

Dim mulflag As Integer

mulflag = 0

煤矿安全地理信息系统设计与开发

这时,将空间对象存储在了 oExchangeFtrs 中,当需要粘贴时,则将 oExchangeFtrs 中的对象添加到空间库和属性库中,实现代码如下:

煤矿安全地理信息系统设计与开发

Next oFtr

If iFtrCount = 0 Then Exit Sub

煤矿安全地理信息系统设计与开发

Next oFtr

oLayer. Refresh

Set m_oExchangeFtrs = oLayer. Selection

( 5) 属性库导出到 Microsoft Excel

Microsoft Excel 具有强大的表格功能,将属性库中的数据输出到 Microsoft Excel 后,可以进一步执行很多操作,具体实现代码如下:

先在窗体中预览各属性值:

For Each ftr In lyr. AllFeatures

If VarType( mydata. value( ftr. FeatureID,nameid) ) < > vbNull And VarType( mydata. value( ftr. FeatureID,nameid) ) < > vbEmpty Then

For i = 1 To UBound( selecti)

DoEvents

If VarType( mydata. value( ftr. FeatureID,selecti( i) ) ) < > vbNull Then

Flex1. TextMatrix( j,i) = mydata. value( ftr. FeatureID,selecti( i) )

End If

Next i

Flex1. TextMatrix( j,0) = j

j = j + 1

Flex1. Rows = Flex1. Rows + 1

End If

Next

然后与 Microsoft Excel 通信,进行数据交换:

Dim objexcel As excel. Application

Dim i As Long

Dim j As Long

If Flex1. Rows = 0 Then

MsgBox " 没有查询结果可以导出! " ,vbInformation

Exit Sub

Else

If MsgBox( " 确实要将结果集导出到 Excel 吗" ,vbYesNo + vbInformation) < > vbYesThen

Exit Sub

End If

Set objexcel = New excel. Application

objexcel. Workbooks. Add

For j = 0 To Flex1. Cols - 1

For i = 0 To Flex1. Rows - 1

objexcel. Cells( i + 1,j + 1) = Flex1. TextMatrix( i,j)

Next i

Next j

objexcel. Visible = True

objexcel. DisplayAlerts = True

End If

主题地图 ( 又称专题地图) 的绘制是根据特定的主题遮蔽地图的过程。主题通常是数据的某个部分或某些部分,可以从数据集获取。主题利用颜色阴影、填充图案、符号或柱状图和饼状图,以可视化的形式显示数据。根据数据中的特定值将这些颜色、图案或符号分配给地图对象,可以创建不同的主题地图。柱状图和饼状图可以对数据集中的每个记录进行数据比较。

主题地图可以使用许多方法来图解数据。最常用的一种主题地图就是气象图。如果显示红色,表示天气很热 ( 气温高) ; 如果显示蓝色,表示天气很冷 ( 气温低) 。通过主题地图绘制还可以发现通过表格数据很难看出来的数据趋势。

在 Themes 集合、Theme 对象和 ThemeProperties 对象中使用属性和方法,可以创建并定义自己的主题遮蔽。Legend 对象存储主题的关键字,说明主题的颜色、形状和大小代表的含义。

MapX 提供了 9 种主题地图,其参数与注释如下:

miThemeRanged: 范围主题;

miThemeBarChart: 柱状图主题;

miThemePieChart: 饼状图主题;

miThemeGradSymbol: 分级符号主题;

miThemeDotDensity: 点密度主题;

miThemeIndividualValue: 个别值主题;

miThemeAuto MapX: “最佳猜测” 主题;

miLabelRangedTheme: 范围标签主题;

miLabelIndividualValuesTheme: 个别标签值主题。

每个主题有自己的用途和唯一的属性。例如,使用 miThemeRanged,可以根据人口密度按主题遮蔽世界地图。可以使用红色的分级阴影遮蔽国家,最深的红色代表人口密度最大的国家,最浅的红色代表人口密度最小的国家,您可以很容易看出世界人口的分布。

使用主题地图绘制并不仅限于显示数字值。标称值也可以按主题遮蔽。例如,若有地下电缆数据集,过去6 个月内尚未使用过的地下电缆将标记为优先状态,使用 miThemeIn-dividualValue 可以根据修复状态遮蔽这些电缆,值相同的所有记录将使用相同颜色遮蔽。

具体的代码实现如下:

Dim ds As MapXLib. Dataset

Dim mylayer As MapXLib. layer

Set mylayer = frmmain. Map1. Layers( Combo1. Text)

Set ds = frmmain. Map1. DataSets. Add( miDataSetLayer,mylayer," themedata" )

Map1. DataSets. Item( " themedata" ) . Themes. Add themetype,fieldname

'Map1. DataSets. Item( " themedata" ) . Themes. Item( 1) . ThemeProperties. NumRanges = 12

主题加入指定集合后,将创建 Theme 对象,可以处理对象的各个属性。对巷道图层,可以做瓦斯大小范围图和人员分布范围图,对通风系统图,可做风量大小范围图等。

温馨提示:答案为网友推荐,仅供参考
相似回答