Page 1
MapInfo概论
?第一讲 MapInfo简介及基本概念
?第二讲 MapInfo基本操作 —表
?第三讲 MapInfo查询及分析
?第四讲 空间分析及属性信息图形化
?第五讲 OLE 嵌入与 MapBasic 简介
?第六讲 MapInfo集成地图开发
?第七讲 组件式 GIS与 MapX基础
?第八讲 MapX应用开发
Page 2
1,Geosets,Geoset 保存了地图图层的 集合和用户设置 。扩展名是,gst。,gst
文件是 文本文件,它包含若干用来告诉 MapX显示什么表以及如何显示的元数据
键值。 Geoset设置包括投影、默认缩放值、对象的自动标注、缩放范围以及打
开的表是否可见。
2,Map对象:每个 MapX 的对象、属性和方法都衍生于 Map对象。每个在
Map 对象之下的属性和方法都会对生成整个 Map对象有所影响。主要是由
DataSets,Layers 和 Annotations 对象定义每一个 Map对象。
3,GeoDictionary,利用 MapX作数据绑定或创建专题地图时,可以用
GeoDictionary来 匹配数据源与地图图层 。 GeoDictionary是一个保存了关于哪
个地图图层可以匹配、哪个字段可以用作匹配字段的信息文件(一般命名为
geodict.dct)。 如果想运用自动匹配 /自动绑定,则必须在 GeoDictionary中
注册文件 。 MapX GeoDictionary程序允许把新的 MapInfo表注册到
GeoDictionary中。同时,在 MapX GeoDictionary中,单击注册表 … 按钮,然
后选择要注册的表,设置表属性并为其输入描述。如果要想自动地把这张表加
载到 GeoSet中,单击 添加 按钮然后选择要把表添加进的 GeoSet。
上节总结:
Page 3
4,Layers集合与 Layer对象:
图层类型,layer.type
确定图层中图元类型,layer.PredominantFeatureType
图层标注,layer.LabelProperties
注释( Annotations 集合):
栅格图像:使用 MapX可以将栅格图像(位图)作为所创建地图的背景显示。但
是栅格图像必需首先成为 MapInfo表的一部分。然后可以在图像的上方覆盖另
外的数据,如街道地图和客户位置。 图像只能作为背景或衬垫来观看 。
5,Features和 Selections:
地图图层中的所有图元及其所有子集表示为 Features集合。
Selection集合表示当前已选中的 Feature对象。
Feature对象,Feature.attach- 把独立的图元附加到地图上,使得地图的坐标
系适用于该图元。
Page 4
图元编辑,FeatureFactory对象 -在现存图元的基础上创建新的图元
返回的图元不需要再使用 Attach方法。
6、工具:创建自定义工具时,需要控制创建工具的, 类型,,即:就是要选
择此工具是否允许用户单击,或是单击并拖动来画线,或是单击并拖动来画矩
形等等;也可以选择使用自定义工具时显示的光标。
设置插入图层,Map.layers.InsertionLayer属性指定的任一图层上,之后才
可以用 添加点, 添加线、添加折线 和 添加区域等 对象编辑工具 在地图图层中创
建和修改图元。在使图层成为 InsertionLayer之前,一定要设置该图层的可编
辑属性为 True。
创建自定义工具:可首先声明一个全局常量来代表该工具
Const RULERTOOLID = 500
ToolNumber,Type 和 Cursor
MouseDown,MouseMove事件; ToolUsed事件
Page 5
一、数据绑定
1.1 DataSet对象和 DataSets集合
1.2 使用 Fields集合
1.3 将数据显示为点图层( BindLayer)
1.4 使用 GeoDictionary进行数据绑定
1.5 访问远程空间数据及属性数据
?第八讲 MapX应用开发
Page 6
?第八讲 MapX应用开发
二、专题制图
2.1 Themes 集合 及专题地图类型
2.2 操作专题地图
三、逐层细化图层
3.1 准备, 逐层细化, 图层
3.2 创建逐层细化和, 卷起, 工具
四、地图输出及 MapX应用程序发布
4.1 输出、打印地图
4.2 应用程序发布
Page 7
?一、数据绑定
1.1 DataSet对象和 DataSets集合
1、数据绑定的概念:
将数据从 数据源 放入 MapX的处理过程
? 能在地图上以图元浏览数据;
? 可首先向地图绑定属性数据,然后基于这些数据创建专题渲染地图。
数据源可以是 Visual Basic数据控件,或是 ODBC数据源。在 MapX中,数
据由 DataSet对象表示。如果有 Visual Basic的绑定数据控件,就可以在设
计时使用 Map对象的 DataSet属性;或者通过使用 DataSets.Add方法编程来
绑定数据。
结果,创建 DataSet对象
Page 8
2,数据源 DataSource
DataSource参数 (DataSets.Add的第二个参数 )实际上是一个 OLE接口。
MapX 通过接口直接从数据源访问数据。数据并没有真正传给 DataSets.Add。
下面是详细的几种数据源:
?,miDataSetDAO- DAO 数据集 ( Data Access Object Recordset).
DataSets.Add 的 DataSource必须是一个 DAO数据集对象,可以从 Visual
Basic的数据控件, Access窗体, 或是 Visual Basic,Access,C++中创建
一个数据集 。
?,miDataSetODBC- ODBC数据连接 (Open DataBase Connectivity data
source),MapX可以通过 ODBC从任意 ODBC数据源 中获取数据 。 需要指定
连接字符串, 数据源名称, 使用 ODBCQueryInfo执行的 SQL查询语句
(ODBCQueryInfo包含连接 ODBC数据源的信息 )。
?, miDataSetLayer- 如果 Dataset的类型是 miDataSetLayer,那么参考
MapInfo Table表 中的字段创建 Dataset,则 SoureData参数项必须是一个
Layer对象 。
Page 9
?,miDataSetGlobalHandle–引入以 tab制表符 为界的数据块。 Dataset.add
的 SourceData参数必须是一个类型为 VT_I4 的变体设置以及等同于全局内
存句柄的 lVal 。 在全局内存块中每行的数据格式为,field TAB field TAB
field CRLF其中 field是带引号的字符串,或是不带引号的数值,TAB键的值
是 0x09,CRLF 值是 0x0D 0x0A.
?,miDataSetOLEData –这是用于 Powerbuilder这样的控件容器的数据源,
当初始化 MapX控件时,PB将以 miDataGlobalHandle格式存在的数据传输
给 MapX。 之后调用 DataSets.Add方法,数据源类型显 miDataSetOLEData
为先前传入的数据创建 Dataset。
?,miDataSetUnbound–如果不支持前面提到的数据源,MapX 提供一个
,后门, 。 这种类型允许 MapX 通过建立事件循环向 MapX控件容器请求数
据,每次一个单元。 MapX将提供 RequestData 事件以数据单元的行号列号。
这样就可以使用任何方式获取数据同时通过这个事件把它传给 MapX。
RDO,remote data object ADO,ActiveX data object
Page 10
3,DataSet对象和 DataSets集合
DataSet对象是在从数据源向 MapX绑定数据的过程中生成的 。
DataSet包含了数据绑定的地图图层中图元的计算过的值 。 数据源
可能是 DAO 记录集, ODBC 数据源等形式 。
DataSets 集合是代表地图中所有 DataSet的对象。 DataSets集合的
方法和属性用来添加、删除 Dataset 对象,或者在集合中使用现有的
DataSet 对象。
Datasets.Add- 可向 MapX绑定来自数据源的数据,使外部数据源和
地图建立联系。
? DataSets.Add Type,SourceData,[Name],[Geofield],
[SecondaryGeofield],[BindLayer],[Fields],[Dynamic]
? Datasets.Remove
Page 11
( 1) Type参数
此参数用来说明所添加数据集的类型。它获取 DataSetTypeConstants的值。
( 2) SourceData参数
该参数用来引用数据,随 Dataset类型的不同而不同。
( 3) Name参数
该参数为唯一标识数据集的字符串。属于可选参数,如果不指定,则缺省名为
DataSetN,其中, N”为 Datasets集合中的数字 。
( 4) Geofield参数
该参数是数据源中包含地理信息的列名称或索引。如果该参数未指定,则 MapX
搜索所有字段,以决定数据源中哪一列包含了 GeoDictionary中指定的地理信
息。 如果 要 在地图上查看图元数据,那么数据源中的 GeoField列必须是唯一的。
GeoField列用来为新点层的图元命名。
Page 12
( 5) Secondary Geofield 参数
此参数只有当绑定数据集的图层存在不唯一关键列时才需要。
( 6) BindLayer参数
如果正在绑定属性数据,则此参数 指定和数据连接的地图图层 ;匹配
BindLayer时,Geofields必须唯一。
( 7) Fields参数
该参数是 Field对象集合中的 Fields对象。 Field对象用来描述 导入数据源的字
段,以及当匹配特定地图图元的数据源记录多于一个时,使用聚合函数是求和、
求平均值或计数。
( 8) Dynamic参数
该参数的值为布尔型,控制数据绑定是否是动态的。它是可选的,未指定时默
认为 False,即静态绑定数据。
Page 13
?一、数据绑定
1.2 使用 Fields集合
数据源有多个数据列, MapX管理绑定的每一列数据, 因此应当只绑定地
图上所需的数据 ( 例如, 想要进行专题化地图或标注用的数据 ) 。 用
DataSets.Add ( )的 Fields参数来建立要绑定到地图的字段 ( 列 ) 的 Fields集合 。
注意,声明字段变量时使用, MapXLib.Fields”。 这样可防止与 DAO
“Fields”对象发生冲突。 Dim flds As New MapXLib.Fields
可以通过 Dataset.Fields 的属性访问数据集的 Fields 集合。
? Fields.Add方法 将数据源中的一列数据作为字段添加到 Fields集合 中。
Fields集合使用 DataSets.Add方法建立。 Datasets.Add的 Fields参数获取
Fields集合,并使用 Add方法 建立它。一旦数据集已经创建,就不能再将 Add
方法用在数据集的 Fields集合上。
Fields.Add DataSourceCol,Name,[AggregateFunction],[Type]
多匹配情况下的聚合,AggregateFunction参数
Page 14
?一、数据绑定
1.3 将数据显示为点图层( BindLayer)
1,BindLayer对象
用来在由数据指定的位置处创建新的点图层 。
当绑定数据具有 X/Y 坐标或点信息 (例如 Zip Codes)时, 以及想要在新的
或已存在的图层上看到由数据指定位置的点时, 就需要用到 Bindlayer对象 。
使用 BindLayerObject添加数据集时, 这些点会自动显示在地图上 。 如果
没有用 BindLayerObject添加数据集, 则点是不会自动显示的 。 只有
BindLayerObjects才有这种行为 。 BindLayer对象属性
使用 BindLayer对象的 操作步骤 如下:
( 1) 创建 BindLayer对象;
( 2) 当通过 datasets.Add方法中的 BindLayer参数传递此对象来添加数据集
时, 使用它 。
Page 15
2,在地图上将 X/Y数据作为点图层显示
如果数据包含 X/Y坐标, 就可以通过数据绑定创建并显示点图元图层 。 使
用 BindLayer对象, 并设置:
LayerType 属性为 miBindLayerTypeXY;
RefColumn1 属性为包含 X 坐标值的列名或索引 ( one-based) ;
RefColumn2 属性为包含 Y坐标值的列名或索引 ( one-based) 。
使新点图层成为永久图层:
使用 BindLayer.Filespec 属 性 或 者 指 定 文 件 的 名 字 和 位 置, 使得
Datasets.Add方法能够创建永久图层来替代临时图层 。 如果不指定这个属性,
则图层就是临时的 。
Page 16
?一、数据绑定
1.4 使用 GeoDictionary进行数据绑定
MapX使用 GeoDictionary文件 ( 默认名是 GEODICT.DCT) 记录与数据绑定
有关的信息 。 使用 DataSets.Add方法时, MapX能够分析数据, 然后决定怎样
绑定数据到地图上去 。 此方法有以下自动行为:
? 确定数据源中哪一列包含地理信息;
? 确定绑定到哪个图层 。
这两个操作都是可选的 。 有参数用来明确地指定包含地理信息的是数据源
中的哪一列, 或者哪一个地图图层将用来绑定数据 。 如果知道这些值中的任
一个, 就应当明确地指定它们以提高性能 。
为使 MapX 能够绑定数据到地图图层上, 下面的几个条件必须确保为真:
? 此地图的地理关键列需要 被索引 ;
? 此地图和它的关键列必须在 GeoDictionary中指定 。
Page 17
一旦来自数据源的列定义为地理列,并且确定了要绑定的地图图层,就开始
绑定。数据源的一行匹配一个图元,数据置入图元中。如果某行含有不匹配图
元的地理列或地图中没有这样的数据值, 则 DataMismatch事件 被激活来通知容
器。可以忽略 DataMismatch事件,这种情况下 MapX将简单地忽略此行。在自动
数据绑定期间,如果数据有模棱两可的情况,MapX就会调用 ResolveDataBind
事件 。
在使用, 非绑定, 类型数据的数据绑定期间, 使用 RequestData事件建立循
环, 使得容器一次一个单元地向 MapX提供数据 。
因为数据源中的数据被聚合后储存在 MapX中,当数据源的数据更改时,MapX
不能反映该更改。 DataSet.Refresh方法可以用来使 MapX重读数据源,并对数
据重新聚合并保存。但这样会耗费大量时间。
DataSet.Refresh不能在创建新点图层的 DataSets中起作用。
当数据源中有新添加的行时,此方法并不在图层中添加新图元。
Page 18
1.5 访问远程空间数据及属性数据
1,访问空间数据
MapX提供有 空间服务器 访问 功能 。 它允许开发者连结存储在空间服务器内
的动态实时数据, 例如运行在 Oracle,Informix,DB2数据库, 或者 Oracle
8i Spatial数据库上的空间服务器 MapInfo SpatialWare。 空间服务器允许各
公司在其企业数据库中寄存地图数据, 以便于集中管理和确保安全性 。
可使用 Layers.Add方法 用来自 DBMS的数据来添加图层:
? 当需要在运行状态下动态计算查询时, 随 LayerInfo对象 一起使用
Layers.Add方法;
? 当查询在程序设计阶段已知时, 和,tab文件一起使用 Layers.Add方法 。 可
以直接将,tab文件放到 geoset中, 只要确保当任何使用 geoset的程序初始化
时, 都装载了该文件 。
? tab文件和 LayerInfo对象都接受相同的参数 。 LayerInfo参数
?一、数据绑定
Page 19
2,访问属性数据
要访问在查询中所选择的 DBMS图层的空间对象, 以类型为 midatasetlayer
的数据集使用 datasets.add方法 ( 从现有的图层中取得这些属性 ) 。
添加 DBMS图层时, 为优化性能, 在查询中最好只指定在应用中所要使用的
列 。 如果未指定, 则那些空间列, 关键值列, 要用来进行标注的列或是要用
来创建专题的列会自动添加进来 。 而对所有可在地图上表示的表都可使用虚
拟列, OBJECT” 来引用包含空间数据的列 。 这是在带有 X/Y列的表所需要的 。
说明,可以使用任何服务器方表达式 /函数来指定列 。 同样, 要避免在实际
应用中从表中选择所有 。
Page 20
?二、专题制图
2.1 Themes 集合及专题地图类型
专题制图 是按照 特定专题渲染地图 的过程 。 专题通常使用数据集中
的一组或多组数据 。 专题利用颜色渲染, 填充图案, 符号, 直方和饼
图表示数据 。 根据数据中的特定值指派这些颜色, 图案或符号, 可以
创建不同的专题地图 。
专题地图上显示的数据称为 专题变量 。 根据所执行的专题分析类型,
地图可以显示一个或多个专题变量 。 范围, 格网渲染, 等级符号, 点
密度, 独立值 都检查一个变量 。 直方图 和 饼图 一次可以显示多个专题
变量 。
开始应用专题地图前, 需要决定要显示哪些信息以及信息驻留的位
置 。 创建专题所用的数据来自数据集的 Field对象或 FieldS集合 。 这些
字段作为 Themes集合的 Themes.Add 方法的 Fields 参数来传递 。
Page 21
1,Themes集合
每个数据集都有专题集合 。 Themes集合从专题集合中创建, 计数,
添加或删除 Theme 对象 。
? 创建专题 Themes.Add [Type],[Field],[Name]
如,Map1.Datasets(1).Themes.Add miThemeRanges, TotPop”,,My
Ranges Theme”
上面一行代码使用字段, TotPop”为 Datasets 集合中的第一个数据
集创建范围专题 。
参数
专题类型常量
一旦将专题添加到指定集合, 就可以创建 Theme对象, 并且操作对象
的属性 。
Page 22
2,Theme对象:
设置 Themes集合中专题的属性
方 法 属 性 如 下, AutoRecompute,ComputeTheme,DataMax,DataMin、
Fields,Layers,Legend( 专题图例属性 ), Name,ThemeProperties,Type、
Visible
3,专题制图的类型:
独立值地图,显示通过特定数据集字段包含的独立值渲染点, 线或边界,
可以使用数值和名词性值 。
使用名词性数据渲染点, 线或边界时, 只能用独立值进行渲染 。 名词性数
据可以是非数值数据, 也可以是其数字代表非数值数据的数值数据 。 日期被
作为数值数据, 它可以用于范围和独立值地图 。
范围地图, 等级符号地图, 点密度地图, 直方图地图, 饼图地图
双变量专题制图:使用点或线对象表示两个专题变量
Page 23
1,操作专题地图
( 1) Theme.ThemeDlg方法 -此方法显示对话框使用户可以修改专题
Map1.Datasets(1).Themes(1).ThemeDlg
( 2) 专题的 ThemeProperties对象
ThemeProperties对象存储在 Themes集合中, 其属性用于定义专题地图的外
观 ( 颜色, 符号等 ) 。 ThemeProperties对象实际上包含有关专题如何显示的信
息 。
属性如下,AllowEmptyRanges,DataValue,DistMethod,DotSize、
Graduated,IndividualValueCategory,Independent,Size,width、
MultivarCategories,NumRanges,RangeCategories,SpreadBy,SymbolStyle、
ValuePerDot
以上多个属性实际是其它对象 。 这些对象包括 RangeCategory对象,
IndividualValue对象, MultiVar对象和 Style对象 。
2.2 操作专题地图
?二、专题制图
Page 24
2,自定义专题图例
在创建专题地图时, MapX自动创建图例, 解释颜色, 符号或大小
的意义 。
每个专题都有 Legend对象 ( Theme.Legend) 。 Legend对象包含可
以控制图例显示的属性 。
使用 Legend 对象的 LegendDlg方法可以很容易地进行修改 。
Map1.Datasets(1).Themes(1).Legend.LegendDlg
Page 25
逐层细化图层 使用户得以执行 逐层细化 分析和探测 。 如果地图包含逐
层细化图层, 用户就可以通过鼠标指向和单击地图的某个区域得到该区
域更详细的信息 。
1,开发步骤:
( 1) 获取用来建立多层次 逐层细化 图层的多种表 。 可以使用 MapInfo
Professional 创建表;成员表
( 2)使用特殊的 列 和特殊的 元数据 创建新的 空逐层细化表 (.tab文件 )。元数据
为每一张成员表分配层次名,并且标识成员表中的重要列 --ID 列和标题列;
( 3)把 逐层细化 表 加入地图 (例如,把 逐层细化 表加入所使用的 Geoset(s)中,
或者通过象 Layers.Add方法,把 逐层细化 表添加到地图中 );
( 4) 添加 用户接口 元素 ( 例如工具栏按钮 ) 到应用程序中, 以便用户选择逐层
细化工具并单击地图来进行细化 。
3.1 准备“逐层细化”图
层
?三、逐层细化图层
Page 26
向应用程序添加代码来响应用户对逐层细化工具的使用, 此代码需要检测用
户所选择的图元;确定替换图元的子图元;并调用一些方法来展开或者收缩地图
图元 (DrilldownRemoveFeatures,DrilldownAddFeatures) 。
2,准备, 逐层细化, 图层
要创建逐层细化图层, 需要提供由两个或更多 MapInfo表组成的表集合 。
( 1) 逐层细化图层的每一层次的详细信息都需要一张 MapInfo表 。 这些被称为
成员表 。
( 2) 额外会有包含特殊元数据的空表来描述成员表, 它被称为 逐层细化表 。
? 成员表, 逐层细化 图层中的每个图元都必须有 标识关键字, 在单个层次中的
所有关键字必须是 唯一 的;
? 逐层细化表, 逐层细化 表与其它表不同, 它只包含一个文件,filename.tab。
必须定义三个标准列,Key,Level 和 Label。 所有这三列都为字符 ( 字符串 )
列, 32个字符宽度 。
Page 27
逐层细化 表必须包含一系列元数据关键字 。
元数据关键字 语法如下:
? 以关键字 begin_metadata标记,tab文件元数据部分的开始;
? 原数据的每一行都有两个元素:关键字和数值 。 所有的关键字和数值都用
双引号括起来;
? 逐层细化 表必须包含, \ IsDrilldown” 关键字, 且此关键字值必须为
,True”;
? 每一个关键字都以字符, \” ( 反斜线 ) 开始;
? 元数据关键字可以层次化地嵌套 。 层次结构的每一层次用反斜线 (\)符号标
记 。 关键字值限制最多为 239个字符;
? 逐层细化 表包含 \DDMap\ComponentMaps\ 关键字 层次结构 。 在此层次结
构中, 为每一张成员表指定四个元数据关键字:
Page 28
例如,, 逐层细化 表示例, 包含如, \DDMap\ComponentMaps\One\LevelID”
和, \DDMap\ComponentMaps\Twox\LevelID”这样的关键字层次结构 。 注意
DDMap,ComponentMaps 和 LevelID是关键字层次结构标准的, 必需的部分,
而 One和 Twox是可自定义的 。 可使用任何喜欢的关键字名代替 One,Twox、
Twoxx等等;那些关键字名只是用来区分每个成员表的关键字集 。
逐层细化 表示例内容如下 。 如果要创建自己的 逐层细化 表, 可以复制该示例
到一文本文件, 并参照自己的 成员表 进行修改 。
Page 29
1,创建, 细化, 工具,
使用 CreateCustomTool方法 可以实现 逐层细化 工具 。 CursorConstants集包括
两个为 逐层细化 应用程序特别提供的光标,miDrilldownExpandCursor和
miDrilldownContractCursor。 每次使用自定义 逐层细化 工具将触发 ToolUsed 事
件 。 在 ToolUsed事件过程中, 需要执行引起逐层细化动作的代码 。 分四步:
( 1) 使用如 SelectByPoint或 SearchAtPoint这样的方法, 确定用户所单击的地图
图元;
( 2) 确定用来替换用户所单击图元的子图元集 。 例如, 可使用一个或者更多嵌
套的 Case语句来确定用来替换所选父图元的子图元;
( 3) 调用 DrilldownAddFeatures方法添加子图元到地图;
( 4) 调用 DrilldownRemoveFeatures方法从地图上删除父图元 (用户所单击的图
元 )。
并不是, 编辑, 表, 只是 复制图元到当前可视的图元集 。
3.2 创建逐层细化和“卷起”工具
?三、逐层细化图层
Page 30
2,创建, 卷起, 工具,
当实现 逐层细化 工具后, 还可为用户提供 卷起 工具 —与 逐层细化 工具有
相反效果的工具 。 可使用与创建 逐层细化 工具相同的方式来创建 卷起 工具 。
将 会 使 用 同 样 的 方 法 ( DrilldownAddFeatures 和
DrilldownRemoveFeatures) 。 不同的是不是添加子图元和删除父图元, 而
是做相反操作 ——添加父图元和删除子图元 。
3,重置, 逐层细化, 图层:
可以通过调用 DrilldownReset方法重置 逐层细化 图层 。 重置 逐层细化 图
层会清除整个图层, 而且使用一张成员表的图元重新初始化图层 。
Page 31
4,逐层细化图层的限制和要求:
? 逐层细化 图层中每一个图元必须拥有一个 ID,该 ID在所属成员表中是 唯一 的;
? 不能在 逐层细化 图层中使用 栅格图像 衬垫表 。
? 当使 用 Themes.Add 创建专 题时, 将花费一些时间用大量的数据行来计算图
层范围, 例如 逐层细化 或是 服务器 图层 。 Add方法的 ComputeTheme参数 可以
为任意专题类型创建非计算专题 。 非计算专题 可以 创建没有自动计算范围的专
题 。 可以自己创建范围 。 这对 逐层细化 或 服务器 图层来说是比较快的方法 。
? 逐层细化 图层不会, 记录, 各种不同 逐层细化 层次的状态 ( 图元被展开, 等
等 ) 。 如果希望应用程序恢复上一次使用地图时精确的状态, 需要在退出时编
写代码存储地图的 逐层细化 设置, 并在启动时恢复设置 。
? 虽然可以编辑 逐层细化 图层的图元, 但 不会保存编辑, 且 成员表 不受编辑的
影响 。 当编辑 逐层细化 图层中的图元时, 不是修改 成员表, 而是修改从 成员表
的图元的临时副本 。
Page 32
4.1 输出、打印地图
?四、地图输出及 MapX应用程序发布
1,输出地图:
? 要输出地图到图形文件或复制地图的内容到剪贴板, 使用 ExportMap方法 。
Map.ExportMap (Location,Format,[W],[H])
Format常量
Map1.PaperUnit = miUnitCentimeter
Map1.ExportMap "clipboard",miFormatBMP,12,9
2,ExportSelection属性:
? 使用户可以控制是否让选定范围的模式也随地图输出 。
Map1.ExportSelection=True
Map1.ExportMap "c:\temp\map.jpg",miFormatJPEG
Page 33
3,打印地图 ——PrintMap方法
? Map.PrintMap(hDC,x,y,w,h)
Map1.PrintMap Printer.hDC,0,0,Map1.Width*100,Map1.Height*100
说明,所绘制的当前地图要与给出的矩形相适应 。 当保持宽和高的相关比例时,
将获得最佳结果 。 该方法仅打印 MapX地图的内容;它不显示任何图标, 工具栏
或菜单项 。 如果要看到输出的附加控件, 可以打印包含 MapX控件的窗体 。
Page 34
4.2 应用程序发布
?四、地图输出及 MapX应用程序发布
1,MapX 客户安装项目和步骤
? 当把应用交付给客户时, 需要安装以下项目:
( 1) 已创建的软件;
( 2) MapX控件, 以及与它相关的文件;
( 3) 在应用中用到的地图和 Geoset。
? 安装和发布 MapX应用主要有四个步骤:
( 1) 将必需的文件安装到用户计算机上;
( 2) 运行实用工具 ( 例如 regsvr32.exe) 把特定的文件注册到用户的系统中;
( 3) 将特定键值添加到 Windows注册表中;
( 4) 在应用程序运行时接受 MapX许可字符串 。
Page 35
2,安装 MapX文件
? MapX必要文件:
( 1) Windows公用 DLL文件
Mfc42.dll,msvcp60.dll,msvcrt.dll,Olepro32.dll,oleaut32.dll
( 2) MapX程序文件:安装在, C:\Program Files\MapInfo\MapX 5.0”文件夹
之下 。 这些文件无须注册 。
( 3) Mapx50.ocx
( 4) 字体文件
? 可选文件,( 1) NADCON 支持文件; ( 2) 位图符号; ( 3) 栅格图像支持
( 4) ODBC 支持 ; ( 5) Notes 文档支持
Page 36
3,安装地图和 Geoset
? 注册 Geoset是把和此 Geoset有关的每一张 MapInfo表注册到 GeoDictionary中
的简便方法 。 通过把 MapInfo表注册在 GeoDictionary中, 可以用此表来作自动
绑定 。
? 若使用 GeoDictionary,当注册 Geoset时, GeoDictionaryManager50.exe就会
将合适的项添加到 GeoDictionary中 (geodict.dct)。 如 GeoDictionary不存在,
GeoDictionaryManager50.exe会创建它 。
GeoDictionaryManager50.exe <Geoset的完整文件规范 ( 带驱动器号 ) >
? 此步骤必须要在所有的 Geoset和相关表都装在用户机器上后才能执行 。 检
查 Geoset,查看每一张表所期望的路径 。 如果使用硬盘上不同区域的 MapInfo
表创建 Geoset,Geoset将会给不和 Geoset在同一目录下的所有表指明完整路径 。
而如果重新分布此 Geoset,那么将不得不在与最初的 Geoset相同的路径下查找
这些表 。 要避免此问题, 将所有的 MapInfo表复制到同一目录下, 接着创建
Geoset。 然后在同一个目录下创建此 Geoset。
Page 37
欢迎多提宝贵意见!
谢谢!
E-mail,zhjian@mail.hdpu.edu.cn
MapInfo概论
?第一讲 MapInfo简介及基本概念
?第二讲 MapInfo基本操作 —表
?第三讲 MapInfo查询及分析
?第四讲 空间分析及属性信息图形化
?第五讲 OLE 嵌入与 MapBasic 简介
?第六讲 MapInfo集成地图开发
?第七讲 组件式 GIS与 MapX基础
?第八讲 MapX应用开发
Page 2
1,Geosets,Geoset 保存了地图图层的 集合和用户设置 。扩展名是,gst。,gst
文件是 文本文件,它包含若干用来告诉 MapX显示什么表以及如何显示的元数据
键值。 Geoset设置包括投影、默认缩放值、对象的自动标注、缩放范围以及打
开的表是否可见。
2,Map对象:每个 MapX 的对象、属性和方法都衍生于 Map对象。每个在
Map 对象之下的属性和方法都会对生成整个 Map对象有所影响。主要是由
DataSets,Layers 和 Annotations 对象定义每一个 Map对象。
3,GeoDictionary,利用 MapX作数据绑定或创建专题地图时,可以用
GeoDictionary来 匹配数据源与地图图层 。 GeoDictionary是一个保存了关于哪
个地图图层可以匹配、哪个字段可以用作匹配字段的信息文件(一般命名为
geodict.dct)。 如果想运用自动匹配 /自动绑定,则必须在 GeoDictionary中
注册文件 。 MapX GeoDictionary程序允许把新的 MapInfo表注册到
GeoDictionary中。同时,在 MapX GeoDictionary中,单击注册表 … 按钮,然
后选择要注册的表,设置表属性并为其输入描述。如果要想自动地把这张表加
载到 GeoSet中,单击 添加 按钮然后选择要把表添加进的 GeoSet。
上节总结:
Page 3
4,Layers集合与 Layer对象:
图层类型,layer.type
确定图层中图元类型,layer.PredominantFeatureType
图层标注,layer.LabelProperties
注释( Annotations 集合):
栅格图像:使用 MapX可以将栅格图像(位图)作为所创建地图的背景显示。但
是栅格图像必需首先成为 MapInfo表的一部分。然后可以在图像的上方覆盖另
外的数据,如街道地图和客户位置。 图像只能作为背景或衬垫来观看 。
5,Features和 Selections:
地图图层中的所有图元及其所有子集表示为 Features集合。
Selection集合表示当前已选中的 Feature对象。
Feature对象,Feature.attach- 把独立的图元附加到地图上,使得地图的坐标
系适用于该图元。
Page 4
图元编辑,FeatureFactory对象 -在现存图元的基础上创建新的图元
返回的图元不需要再使用 Attach方法。
6、工具:创建自定义工具时,需要控制创建工具的, 类型,,即:就是要选
择此工具是否允许用户单击,或是单击并拖动来画线,或是单击并拖动来画矩
形等等;也可以选择使用自定义工具时显示的光标。
设置插入图层,Map.layers.InsertionLayer属性指定的任一图层上,之后才
可以用 添加点, 添加线、添加折线 和 添加区域等 对象编辑工具 在地图图层中创
建和修改图元。在使图层成为 InsertionLayer之前,一定要设置该图层的可编
辑属性为 True。
创建自定义工具:可首先声明一个全局常量来代表该工具
Const RULERTOOLID = 500
ToolNumber,Type 和 Cursor
MouseDown,MouseMove事件; ToolUsed事件
Page 5
一、数据绑定
1.1 DataSet对象和 DataSets集合
1.2 使用 Fields集合
1.3 将数据显示为点图层( BindLayer)
1.4 使用 GeoDictionary进行数据绑定
1.5 访问远程空间数据及属性数据
?第八讲 MapX应用开发
Page 6
?第八讲 MapX应用开发
二、专题制图
2.1 Themes 集合 及专题地图类型
2.2 操作专题地图
三、逐层细化图层
3.1 准备, 逐层细化, 图层
3.2 创建逐层细化和, 卷起, 工具
四、地图输出及 MapX应用程序发布
4.1 输出、打印地图
4.2 应用程序发布
Page 7
?一、数据绑定
1.1 DataSet对象和 DataSets集合
1、数据绑定的概念:
将数据从 数据源 放入 MapX的处理过程
? 能在地图上以图元浏览数据;
? 可首先向地图绑定属性数据,然后基于这些数据创建专题渲染地图。
数据源可以是 Visual Basic数据控件,或是 ODBC数据源。在 MapX中,数
据由 DataSet对象表示。如果有 Visual Basic的绑定数据控件,就可以在设
计时使用 Map对象的 DataSet属性;或者通过使用 DataSets.Add方法编程来
绑定数据。
结果,创建 DataSet对象
Page 8
2,数据源 DataSource
DataSource参数 (DataSets.Add的第二个参数 )实际上是一个 OLE接口。
MapX 通过接口直接从数据源访问数据。数据并没有真正传给 DataSets.Add。
下面是详细的几种数据源:
?,miDataSetDAO- DAO 数据集 ( Data Access Object Recordset).
DataSets.Add 的 DataSource必须是一个 DAO数据集对象,可以从 Visual
Basic的数据控件, Access窗体, 或是 Visual Basic,Access,C++中创建
一个数据集 。
?,miDataSetODBC- ODBC数据连接 (Open DataBase Connectivity data
source),MapX可以通过 ODBC从任意 ODBC数据源 中获取数据 。 需要指定
连接字符串, 数据源名称, 使用 ODBCQueryInfo执行的 SQL查询语句
(ODBCQueryInfo包含连接 ODBC数据源的信息 )。
?, miDataSetLayer- 如果 Dataset的类型是 miDataSetLayer,那么参考
MapInfo Table表 中的字段创建 Dataset,则 SoureData参数项必须是一个
Layer对象 。
Page 9
?,miDataSetGlobalHandle–引入以 tab制表符 为界的数据块。 Dataset.add
的 SourceData参数必须是一个类型为 VT_I4 的变体设置以及等同于全局内
存句柄的 lVal 。 在全局内存块中每行的数据格式为,field TAB field TAB
field CRLF其中 field是带引号的字符串,或是不带引号的数值,TAB键的值
是 0x09,CRLF 值是 0x0D 0x0A.
?,miDataSetOLEData –这是用于 Powerbuilder这样的控件容器的数据源,
当初始化 MapX控件时,PB将以 miDataGlobalHandle格式存在的数据传输
给 MapX。 之后调用 DataSets.Add方法,数据源类型显 miDataSetOLEData
为先前传入的数据创建 Dataset。
?,miDataSetUnbound–如果不支持前面提到的数据源,MapX 提供一个
,后门, 。 这种类型允许 MapX 通过建立事件循环向 MapX控件容器请求数
据,每次一个单元。 MapX将提供 RequestData 事件以数据单元的行号列号。
这样就可以使用任何方式获取数据同时通过这个事件把它传给 MapX。
RDO,remote data object ADO,ActiveX data object
Page 10
3,DataSet对象和 DataSets集合
DataSet对象是在从数据源向 MapX绑定数据的过程中生成的 。
DataSet包含了数据绑定的地图图层中图元的计算过的值 。 数据源
可能是 DAO 记录集, ODBC 数据源等形式 。
DataSets 集合是代表地图中所有 DataSet的对象。 DataSets集合的
方法和属性用来添加、删除 Dataset 对象,或者在集合中使用现有的
DataSet 对象。
Datasets.Add- 可向 MapX绑定来自数据源的数据,使外部数据源和
地图建立联系。
? DataSets.Add Type,SourceData,[Name],[Geofield],
[SecondaryGeofield],[BindLayer],[Fields],[Dynamic]
? Datasets.Remove
Page 11
( 1) Type参数
此参数用来说明所添加数据集的类型。它获取 DataSetTypeConstants的值。
( 2) SourceData参数
该参数用来引用数据,随 Dataset类型的不同而不同。
( 3) Name参数
该参数为唯一标识数据集的字符串。属于可选参数,如果不指定,则缺省名为
DataSetN,其中, N”为 Datasets集合中的数字 。
( 4) Geofield参数
该参数是数据源中包含地理信息的列名称或索引。如果该参数未指定,则 MapX
搜索所有字段,以决定数据源中哪一列包含了 GeoDictionary中指定的地理信
息。 如果 要 在地图上查看图元数据,那么数据源中的 GeoField列必须是唯一的。
GeoField列用来为新点层的图元命名。
Page 12
( 5) Secondary Geofield 参数
此参数只有当绑定数据集的图层存在不唯一关键列时才需要。
( 6) BindLayer参数
如果正在绑定属性数据,则此参数 指定和数据连接的地图图层 ;匹配
BindLayer时,Geofields必须唯一。
( 7) Fields参数
该参数是 Field对象集合中的 Fields对象。 Field对象用来描述 导入数据源的字
段,以及当匹配特定地图图元的数据源记录多于一个时,使用聚合函数是求和、
求平均值或计数。
( 8) Dynamic参数
该参数的值为布尔型,控制数据绑定是否是动态的。它是可选的,未指定时默
认为 False,即静态绑定数据。
Page 13
?一、数据绑定
1.2 使用 Fields集合
数据源有多个数据列, MapX管理绑定的每一列数据, 因此应当只绑定地
图上所需的数据 ( 例如, 想要进行专题化地图或标注用的数据 ) 。 用
DataSets.Add ( )的 Fields参数来建立要绑定到地图的字段 ( 列 ) 的 Fields集合 。
注意,声明字段变量时使用, MapXLib.Fields”。 这样可防止与 DAO
“Fields”对象发生冲突。 Dim flds As New MapXLib.Fields
可以通过 Dataset.Fields 的属性访问数据集的 Fields 集合。
? Fields.Add方法 将数据源中的一列数据作为字段添加到 Fields集合 中。
Fields集合使用 DataSets.Add方法建立。 Datasets.Add的 Fields参数获取
Fields集合,并使用 Add方法 建立它。一旦数据集已经创建,就不能再将 Add
方法用在数据集的 Fields集合上。
Fields.Add DataSourceCol,Name,[AggregateFunction],[Type]
多匹配情况下的聚合,AggregateFunction参数
Page 14
?一、数据绑定
1.3 将数据显示为点图层( BindLayer)
1,BindLayer对象
用来在由数据指定的位置处创建新的点图层 。
当绑定数据具有 X/Y 坐标或点信息 (例如 Zip Codes)时, 以及想要在新的
或已存在的图层上看到由数据指定位置的点时, 就需要用到 Bindlayer对象 。
使用 BindLayerObject添加数据集时, 这些点会自动显示在地图上 。 如果
没有用 BindLayerObject添加数据集, 则点是不会自动显示的 。 只有
BindLayerObjects才有这种行为 。 BindLayer对象属性
使用 BindLayer对象的 操作步骤 如下:
( 1) 创建 BindLayer对象;
( 2) 当通过 datasets.Add方法中的 BindLayer参数传递此对象来添加数据集
时, 使用它 。
Page 15
2,在地图上将 X/Y数据作为点图层显示
如果数据包含 X/Y坐标, 就可以通过数据绑定创建并显示点图元图层 。 使
用 BindLayer对象, 并设置:
LayerType 属性为 miBindLayerTypeXY;
RefColumn1 属性为包含 X 坐标值的列名或索引 ( one-based) ;
RefColumn2 属性为包含 Y坐标值的列名或索引 ( one-based) 。
使新点图层成为永久图层:
使用 BindLayer.Filespec 属 性 或 者 指 定 文 件 的 名 字 和 位 置, 使得
Datasets.Add方法能够创建永久图层来替代临时图层 。 如果不指定这个属性,
则图层就是临时的 。
Page 16
?一、数据绑定
1.4 使用 GeoDictionary进行数据绑定
MapX使用 GeoDictionary文件 ( 默认名是 GEODICT.DCT) 记录与数据绑定
有关的信息 。 使用 DataSets.Add方法时, MapX能够分析数据, 然后决定怎样
绑定数据到地图上去 。 此方法有以下自动行为:
? 确定数据源中哪一列包含地理信息;
? 确定绑定到哪个图层 。
这两个操作都是可选的 。 有参数用来明确地指定包含地理信息的是数据源
中的哪一列, 或者哪一个地图图层将用来绑定数据 。 如果知道这些值中的任
一个, 就应当明确地指定它们以提高性能 。
为使 MapX 能够绑定数据到地图图层上, 下面的几个条件必须确保为真:
? 此地图的地理关键列需要 被索引 ;
? 此地图和它的关键列必须在 GeoDictionary中指定 。
Page 17
一旦来自数据源的列定义为地理列,并且确定了要绑定的地图图层,就开始
绑定。数据源的一行匹配一个图元,数据置入图元中。如果某行含有不匹配图
元的地理列或地图中没有这样的数据值, 则 DataMismatch事件 被激活来通知容
器。可以忽略 DataMismatch事件,这种情况下 MapX将简单地忽略此行。在自动
数据绑定期间,如果数据有模棱两可的情况,MapX就会调用 ResolveDataBind
事件 。
在使用, 非绑定, 类型数据的数据绑定期间, 使用 RequestData事件建立循
环, 使得容器一次一个单元地向 MapX提供数据 。
因为数据源中的数据被聚合后储存在 MapX中,当数据源的数据更改时,MapX
不能反映该更改。 DataSet.Refresh方法可以用来使 MapX重读数据源,并对数
据重新聚合并保存。但这样会耗费大量时间。
DataSet.Refresh不能在创建新点图层的 DataSets中起作用。
当数据源中有新添加的行时,此方法并不在图层中添加新图元。
Page 18
1.5 访问远程空间数据及属性数据
1,访问空间数据
MapX提供有 空间服务器 访问 功能 。 它允许开发者连结存储在空间服务器内
的动态实时数据, 例如运行在 Oracle,Informix,DB2数据库, 或者 Oracle
8i Spatial数据库上的空间服务器 MapInfo SpatialWare。 空间服务器允许各
公司在其企业数据库中寄存地图数据, 以便于集中管理和确保安全性 。
可使用 Layers.Add方法 用来自 DBMS的数据来添加图层:
? 当需要在运行状态下动态计算查询时, 随 LayerInfo对象 一起使用
Layers.Add方法;
? 当查询在程序设计阶段已知时, 和,tab文件一起使用 Layers.Add方法 。 可
以直接将,tab文件放到 geoset中, 只要确保当任何使用 geoset的程序初始化
时, 都装载了该文件 。
? tab文件和 LayerInfo对象都接受相同的参数 。 LayerInfo参数
?一、数据绑定
Page 19
2,访问属性数据
要访问在查询中所选择的 DBMS图层的空间对象, 以类型为 midatasetlayer
的数据集使用 datasets.add方法 ( 从现有的图层中取得这些属性 ) 。
添加 DBMS图层时, 为优化性能, 在查询中最好只指定在应用中所要使用的
列 。 如果未指定, 则那些空间列, 关键值列, 要用来进行标注的列或是要用
来创建专题的列会自动添加进来 。 而对所有可在地图上表示的表都可使用虚
拟列, OBJECT” 来引用包含空间数据的列 。 这是在带有 X/Y列的表所需要的 。
说明,可以使用任何服务器方表达式 /函数来指定列 。 同样, 要避免在实际
应用中从表中选择所有 。
Page 20
?二、专题制图
2.1 Themes 集合及专题地图类型
专题制图 是按照 特定专题渲染地图 的过程 。 专题通常使用数据集中
的一组或多组数据 。 专题利用颜色渲染, 填充图案, 符号, 直方和饼
图表示数据 。 根据数据中的特定值指派这些颜色, 图案或符号, 可以
创建不同的专题地图 。
专题地图上显示的数据称为 专题变量 。 根据所执行的专题分析类型,
地图可以显示一个或多个专题变量 。 范围, 格网渲染, 等级符号, 点
密度, 独立值 都检查一个变量 。 直方图 和 饼图 一次可以显示多个专题
变量 。
开始应用专题地图前, 需要决定要显示哪些信息以及信息驻留的位
置 。 创建专题所用的数据来自数据集的 Field对象或 FieldS集合 。 这些
字段作为 Themes集合的 Themes.Add 方法的 Fields 参数来传递 。
Page 21
1,Themes集合
每个数据集都有专题集合 。 Themes集合从专题集合中创建, 计数,
添加或删除 Theme 对象 。
? 创建专题 Themes.Add [Type],[Field],[Name]
如,Map1.Datasets(1).Themes.Add miThemeRanges, TotPop”,,My
Ranges Theme”
上面一行代码使用字段, TotPop”为 Datasets 集合中的第一个数据
集创建范围专题 。
参数
专题类型常量
一旦将专题添加到指定集合, 就可以创建 Theme对象, 并且操作对象
的属性 。
Page 22
2,Theme对象:
设置 Themes集合中专题的属性
方 法 属 性 如 下, AutoRecompute,ComputeTheme,DataMax,DataMin、
Fields,Layers,Legend( 专题图例属性 ), Name,ThemeProperties,Type、
Visible
3,专题制图的类型:
独立值地图,显示通过特定数据集字段包含的独立值渲染点, 线或边界,
可以使用数值和名词性值 。
使用名词性数据渲染点, 线或边界时, 只能用独立值进行渲染 。 名词性数
据可以是非数值数据, 也可以是其数字代表非数值数据的数值数据 。 日期被
作为数值数据, 它可以用于范围和独立值地图 。
范围地图, 等级符号地图, 点密度地图, 直方图地图, 饼图地图
双变量专题制图:使用点或线对象表示两个专题变量
Page 23
1,操作专题地图
( 1) Theme.ThemeDlg方法 -此方法显示对话框使用户可以修改专题
Map1.Datasets(1).Themes(1).ThemeDlg
( 2) 专题的 ThemeProperties对象
ThemeProperties对象存储在 Themes集合中, 其属性用于定义专题地图的外
观 ( 颜色, 符号等 ) 。 ThemeProperties对象实际上包含有关专题如何显示的信
息 。
属性如下,AllowEmptyRanges,DataValue,DistMethod,DotSize、
Graduated,IndividualValueCategory,Independent,Size,width、
MultivarCategories,NumRanges,RangeCategories,SpreadBy,SymbolStyle、
ValuePerDot
以上多个属性实际是其它对象 。 这些对象包括 RangeCategory对象,
IndividualValue对象, MultiVar对象和 Style对象 。
2.2 操作专题地图
?二、专题制图
Page 24
2,自定义专题图例
在创建专题地图时, MapX自动创建图例, 解释颜色, 符号或大小
的意义 。
每个专题都有 Legend对象 ( Theme.Legend) 。 Legend对象包含可
以控制图例显示的属性 。
使用 Legend 对象的 LegendDlg方法可以很容易地进行修改 。
Map1.Datasets(1).Themes(1).Legend.LegendDlg
Page 25
逐层细化图层 使用户得以执行 逐层细化 分析和探测 。 如果地图包含逐
层细化图层, 用户就可以通过鼠标指向和单击地图的某个区域得到该区
域更详细的信息 。
1,开发步骤:
( 1) 获取用来建立多层次 逐层细化 图层的多种表 。 可以使用 MapInfo
Professional 创建表;成员表
( 2)使用特殊的 列 和特殊的 元数据 创建新的 空逐层细化表 (.tab文件 )。元数据
为每一张成员表分配层次名,并且标识成员表中的重要列 --ID 列和标题列;
( 3)把 逐层细化 表 加入地图 (例如,把 逐层细化 表加入所使用的 Geoset(s)中,
或者通过象 Layers.Add方法,把 逐层细化 表添加到地图中 );
( 4) 添加 用户接口 元素 ( 例如工具栏按钮 ) 到应用程序中, 以便用户选择逐层
细化工具并单击地图来进行细化 。
3.1 准备“逐层细化”图
层
?三、逐层细化图层
Page 26
向应用程序添加代码来响应用户对逐层细化工具的使用, 此代码需要检测用
户所选择的图元;确定替换图元的子图元;并调用一些方法来展开或者收缩地图
图元 (DrilldownRemoveFeatures,DrilldownAddFeatures) 。
2,准备, 逐层细化, 图层
要创建逐层细化图层, 需要提供由两个或更多 MapInfo表组成的表集合 。
( 1) 逐层细化图层的每一层次的详细信息都需要一张 MapInfo表 。 这些被称为
成员表 。
( 2) 额外会有包含特殊元数据的空表来描述成员表, 它被称为 逐层细化表 。
? 成员表, 逐层细化 图层中的每个图元都必须有 标识关键字, 在单个层次中的
所有关键字必须是 唯一 的;
? 逐层细化表, 逐层细化 表与其它表不同, 它只包含一个文件,filename.tab。
必须定义三个标准列,Key,Level 和 Label。 所有这三列都为字符 ( 字符串 )
列, 32个字符宽度 。
Page 27
逐层细化 表必须包含一系列元数据关键字 。
元数据关键字 语法如下:
? 以关键字 begin_metadata标记,tab文件元数据部分的开始;
? 原数据的每一行都有两个元素:关键字和数值 。 所有的关键字和数值都用
双引号括起来;
? 逐层细化 表必须包含, \ IsDrilldown” 关键字, 且此关键字值必须为
,True”;
? 每一个关键字都以字符, \” ( 反斜线 ) 开始;
? 元数据关键字可以层次化地嵌套 。 层次结构的每一层次用反斜线 (\)符号标
记 。 关键字值限制最多为 239个字符;
? 逐层细化 表包含 \DDMap\ComponentMaps\ 关键字 层次结构 。 在此层次结
构中, 为每一张成员表指定四个元数据关键字:
Page 28
例如,, 逐层细化 表示例, 包含如, \DDMap\ComponentMaps\One\LevelID”
和, \DDMap\ComponentMaps\Twox\LevelID”这样的关键字层次结构 。 注意
DDMap,ComponentMaps 和 LevelID是关键字层次结构标准的, 必需的部分,
而 One和 Twox是可自定义的 。 可使用任何喜欢的关键字名代替 One,Twox、
Twoxx等等;那些关键字名只是用来区分每个成员表的关键字集 。
逐层细化 表示例内容如下 。 如果要创建自己的 逐层细化 表, 可以复制该示例
到一文本文件, 并参照自己的 成员表 进行修改 。
Page 29
1,创建, 细化, 工具,
使用 CreateCustomTool方法 可以实现 逐层细化 工具 。 CursorConstants集包括
两个为 逐层细化 应用程序特别提供的光标,miDrilldownExpandCursor和
miDrilldownContractCursor。 每次使用自定义 逐层细化 工具将触发 ToolUsed 事
件 。 在 ToolUsed事件过程中, 需要执行引起逐层细化动作的代码 。 分四步:
( 1) 使用如 SelectByPoint或 SearchAtPoint这样的方法, 确定用户所单击的地图
图元;
( 2) 确定用来替换用户所单击图元的子图元集 。 例如, 可使用一个或者更多嵌
套的 Case语句来确定用来替换所选父图元的子图元;
( 3) 调用 DrilldownAddFeatures方法添加子图元到地图;
( 4) 调用 DrilldownRemoveFeatures方法从地图上删除父图元 (用户所单击的图
元 )。
并不是, 编辑, 表, 只是 复制图元到当前可视的图元集 。
3.2 创建逐层细化和“卷起”工具
?三、逐层细化图层
Page 30
2,创建, 卷起, 工具,
当实现 逐层细化 工具后, 还可为用户提供 卷起 工具 —与 逐层细化 工具有
相反效果的工具 。 可使用与创建 逐层细化 工具相同的方式来创建 卷起 工具 。
将 会 使 用 同 样 的 方 法 ( DrilldownAddFeatures 和
DrilldownRemoveFeatures) 。 不同的是不是添加子图元和删除父图元, 而
是做相反操作 ——添加父图元和删除子图元 。
3,重置, 逐层细化, 图层:
可以通过调用 DrilldownReset方法重置 逐层细化 图层 。 重置 逐层细化 图
层会清除整个图层, 而且使用一张成员表的图元重新初始化图层 。
Page 31
4,逐层细化图层的限制和要求:
? 逐层细化 图层中每一个图元必须拥有一个 ID,该 ID在所属成员表中是 唯一 的;
? 不能在 逐层细化 图层中使用 栅格图像 衬垫表 。
? 当使 用 Themes.Add 创建专 题时, 将花费一些时间用大量的数据行来计算图
层范围, 例如 逐层细化 或是 服务器 图层 。 Add方法的 ComputeTheme参数 可以
为任意专题类型创建非计算专题 。 非计算专题 可以 创建没有自动计算范围的专
题 。 可以自己创建范围 。 这对 逐层细化 或 服务器 图层来说是比较快的方法 。
? 逐层细化 图层不会, 记录, 各种不同 逐层细化 层次的状态 ( 图元被展开, 等
等 ) 。 如果希望应用程序恢复上一次使用地图时精确的状态, 需要在退出时编
写代码存储地图的 逐层细化 设置, 并在启动时恢复设置 。
? 虽然可以编辑 逐层细化 图层的图元, 但 不会保存编辑, 且 成员表 不受编辑的
影响 。 当编辑 逐层细化 图层中的图元时, 不是修改 成员表, 而是修改从 成员表
的图元的临时副本 。
Page 32
4.1 输出、打印地图
?四、地图输出及 MapX应用程序发布
1,输出地图:
? 要输出地图到图形文件或复制地图的内容到剪贴板, 使用 ExportMap方法 。
Map.ExportMap (Location,Format,[W],[H])
Format常量
Map1.PaperUnit = miUnitCentimeter
Map1.ExportMap "clipboard",miFormatBMP,12,9
2,ExportSelection属性:
? 使用户可以控制是否让选定范围的模式也随地图输出 。
Map1.ExportSelection=True
Map1.ExportMap "c:\temp\map.jpg",miFormatJPEG
Page 33
3,打印地图 ——PrintMap方法
? Map.PrintMap(hDC,x,y,w,h)
Map1.PrintMap Printer.hDC,0,0,Map1.Width*100,Map1.Height*100
说明,所绘制的当前地图要与给出的矩形相适应 。 当保持宽和高的相关比例时,
将获得最佳结果 。 该方法仅打印 MapX地图的内容;它不显示任何图标, 工具栏
或菜单项 。 如果要看到输出的附加控件, 可以打印包含 MapX控件的窗体 。
Page 34
4.2 应用程序发布
?四、地图输出及 MapX应用程序发布
1,MapX 客户安装项目和步骤
? 当把应用交付给客户时, 需要安装以下项目:
( 1) 已创建的软件;
( 2) MapX控件, 以及与它相关的文件;
( 3) 在应用中用到的地图和 Geoset。
? 安装和发布 MapX应用主要有四个步骤:
( 1) 将必需的文件安装到用户计算机上;
( 2) 运行实用工具 ( 例如 regsvr32.exe) 把特定的文件注册到用户的系统中;
( 3) 将特定键值添加到 Windows注册表中;
( 4) 在应用程序运行时接受 MapX许可字符串 。
Page 35
2,安装 MapX文件
? MapX必要文件:
( 1) Windows公用 DLL文件
Mfc42.dll,msvcp60.dll,msvcrt.dll,Olepro32.dll,oleaut32.dll
( 2) MapX程序文件:安装在, C:\Program Files\MapInfo\MapX 5.0”文件夹
之下 。 这些文件无须注册 。
( 3) Mapx50.ocx
( 4) 字体文件
? 可选文件,( 1) NADCON 支持文件; ( 2) 位图符号; ( 3) 栅格图像支持
( 4) ODBC 支持 ; ( 5) Notes 文档支持
Page 36
3,安装地图和 Geoset
? 注册 Geoset是把和此 Geoset有关的每一张 MapInfo表注册到 GeoDictionary中
的简便方法 。 通过把 MapInfo表注册在 GeoDictionary中, 可以用此表来作自动
绑定 。
? 若使用 GeoDictionary,当注册 Geoset时, GeoDictionaryManager50.exe就会
将合适的项添加到 GeoDictionary中 (geodict.dct)。 如 GeoDictionary不存在,
GeoDictionaryManager50.exe会创建它 。
GeoDictionaryManager50.exe <Geoset的完整文件规范 ( 带驱动器号 ) >
? 此步骤必须要在所有的 Geoset和相关表都装在用户机器上后才能执行 。 检
查 Geoset,查看每一张表所期望的路径 。 如果使用硬盘上不同区域的 MapInfo
表创建 Geoset,Geoset将会给不和 Geoset在同一目录下的所有表指明完整路径 。
而如果重新分布此 Geoset,那么将不得不在与最初的 Geoset相同的路径下查找
这些表 。 要避免此问题, 将所有的 MapInfo表复制到同一目录下, 接着创建
Geoset。 然后在同一个目录下创建此 Geoset。
Page 37
欢迎多提宝贵意见!
谢谢!
E-mail,zhjian@mail.hdpu.edu.cn