MapInfo MapX 培训教程


MapX 培训教程 MapInfo 培训中心标准教材 目录 MapInfo MapX 培训教材 i 目 录 第一章 MAPX 入门...............................................................................................................................1 第一节 MAPX 入门.............................................................................................................................1 第二节 MAPX 的功能概述 .................................................................................................................2 第三节 安装 MAPX.............................................................................................................................3 第四节 添加 MAP 控件 ..................................................................................................................3 第五节 VISUAL BASIC 入门 ...........................................................................................................4 第六节 地图化概念........................................................................................................................5 第二章 MAPX 基础...............................................................................................................................7 第一节 MAP 对象................................................................................................................................7 第二节 属性页 ....................................................................................................................................8 第三节 图层.....................................................................................................................................9 第四节 GEOSETS ........................................................................................................................9 第五节 DATASETS ..................................................................................................................... 11 第六节 ANNOTATIONS................................................................................................................ 11 第七节 创建对象...........................................................................................................................12 第三章 按图层地图化..........................................................................................................................14 第一节 用图层来组织地图 ..............................................................................................................14 第二节 LAYERS 集合的属性.....................................................................................................14 第三节 LAYERS 集合的方法.....................................................................................................15 第四节 LAYER 对象...........................................................................................................................17 第五节 图层顺序...........................................................................................................................19 第六节 检查图层类型 ...................................................................................................................19 第七节 检查图层的图元类型 .......................................................................................................20 第八节 图层缩放...........................................................................................................................20 第九节 为图层生成标注 ...............................................................................................................21 第十节 注释...................................................................................................................................24 第十一节 栅格图像.......................................................................................................................24 第十二节 动态图层.......................................................................................................................25 第十三节 绘制图层 ..........................................................................................................................25 第四章 FEATURES 和 SELECTIONS..............................................................................................27 第一节 基本概念...........................................................................................................................27 第二节 使用 FEATURES 集合.......................................................................................................27 第三节 使用 SELECTION 集合......................................................................................................30 第四节 图元编辑 ..............................................................................................................................31 第五章 在地图中查找图元..................................................................................................................36 第一节 FIND 对象.............................................................................................................................36 第二节 FINDFEATURE 对象..............................................................................................................37 第六章 工具..........................................................................................................................................39 第一节 MAPX 工具概述 ...................................................................................................................39 第二节 创建自定义工具 ..................................................................................................................40 第三节 创建多边形绘制工具(POLYTOOLS)............................................................................43 第七章 数据绑定..................................................................................................................................45 目录 MapInfo MapX 培训教材 ii 第一节 数据绑定的概念 ...............................................................................................................45 第二节 怎样向地图添加数据 .......................................................................................................45 第三节 DATASET 对象和 DATASETS 集合................................................................................45 第四节 使用 FIELDS 集合 ............................................................................................................49 第五节 将数据显示为点图层(BINDLAYER)................................................................................51 第六节 使用 GEODICTIONARY 进行数据绑定 ............................................................................53 第七节 数据绑定使用的 MAPX 事件..........................................................................................53 第八章 从 DBMS 中访问数据...........................................................................................................54 第一节 访问远程空间数据 ...........................................................................................................54 第二节 ORACLE8I 支持.............................................................................................................55 第三节 DBMS LAYERINFO 参数......................................................................................................56 第四节 访问属性数据 ......................................................................................................................57 第五节 MAPINFO MAP CATALOG ......................................................................................................58 第六节 地图化 DBMS 表.............................................................................................................59 第九章 专题制图和分析......................................................................................................................62 第一节 什么是专题制图 ...............................................................................................................62 第二节 规划专题地图 ...................................................................................................................62 第三节 THEMES 集合................................................................................................................63 第四节 专题制图的类型 ...............................................................................................................65 第五节 操作专题地图 ...................................................................................................................69 第六节 自定义专题图例 ...............................................................................................................70 第十章 逐层细化图层..........................................................................................................................71 第一节 “逐层细化”应用程序开发步骤 ...................................................................................71 第二节 准备“逐层细化”图层 ...................................................................................................71 第三节 创建逐层细化和卷起工具 ...............................................................................................74 第四节 “逐层细化”图层的限制和要求 ...................................................................................77 第十一章 输出地图..............................................................................................................................78 第一节 输出地图...........................................................................................................................78 第二节 EXPORTSELECTION 属性 .............................................................................................79 第三节 打印地图...........................................................................................................................79 第十二章 发布 MAPX 应用程序 ........................................................................................................80 第一节 MAPX 客户安装项目和步骤概览 ...............................................................................80 第二节 安装 MAPX OCX..............................................................................................................80 第三节 安装地图和 GEOSET ........................................................................................................82 MapInfo MapX 培训教程 1 第一章 MapX 入门 概述 MapInfo MapX 是一个用来做地图化工作的 OCX 控件,它可以很容易地在您的应用程 序中加入强大的制图功能。它可以把您的数据用地图的形式显示出来,更易于理解。地图形 式可以比简单的图表、图形提供更多的信息,而且描述地图比描述数据表更加简单迅速。本 章主要对 mapx 的安装和在编程语言中的使用进行讲解。 第一节 MapX 入门 MapX 是一个提供给应用程序开发人员的工具。它提供了一个最简单和最节约成本的方 法,用来将地图化功能嵌入到新的和现有的应用中。MapX 是一个 OCX 组件,可以被快速集 成到使用 Visual Basic、PowerBuilder、Delphi、Visual C++或其他面向对象的语言的客 户端应用程序以及使用 Lotus Script 的 Lotus Notes (v4.5)中。开发人员可以在他们熟 悉的环境中工作,最终用户可以通过他们熟悉的应用程序来访问地图数据。 通过 MapX,可以完全按照您的意愿在应用程序中加入强大的制图功能。您可以按点、按专 题渲染区域、按饼图或直方图等等来显示数据。启用 MapX 的分析功能,可以分组和组织数 据、执行搜索或在一个指定的半径、矩形区域或指定的点的周围选择地图图元。 例如,MapX 能够显示哪一分店最接近您最大的客户,可以计算客户和商店之间的距离;还 可以显示去年花销最大的客户;并按销售额给表示商店的符号进行颜色编码。所有这些结合 在一起就是您的数据在地图上的直观显示。 MapInfo MapX 培训教程 2 第二节 MapX 的功能概述 MapX 不仅仅是一个“地图浏览器”。通过 MapX,可以分析并直观地显示业务数据,创建 或编辑地图图元,并按地理位置显示数据结果。MapX 的主要功能如下: y 专题制图 — 使用专题制图显现数据。联合数据和地图中的每个图元,并在地图中用颜色编 码(或其他样式)来表示数据。可使用六种不同的样式来观察数据(色彩范围、点密度、独 立值、等级符号、饼图、直方图)。 y 逐层细化制图 — 可以通过简单的定点和单击来浏览数据,在 OLAP/DSS 环境下,可以允 许用户通过定点和单击逐层细化地图的某个区域。 y 数据绑定 — 地图可合并来自嵌套 OCX 的容器、ODBC 或 DAO 数据源(例如 MSAccess) 的数据。MapX 提供多种不同类型数据的绑定,包括邮政编码级别的地理编码。 y 注释 — 可以提供定位、高亮显示特定数据的功能,通过添加文本、符号和标注来使您的地 图信息变得更加丰富。 y 图层化 — 显示和控制地图图层的显示,让它只在地图的缩放比例符合事先调整的距离时才 显示。还可以使用或创建无缝地图图层,它可以把一组基表看作一个整体。特殊图层类型可 以支持特殊类型的应用,如动态图层(用于实时跟踪)和用户描绘图层(用于描绘特殊的地 图元素,如地图上方的标志)。 y 栅格图像 — 用一幅放在底层的栅格图像作为地图背景,使您的地图更生动、更详细。 y 自动标注 — 自动向地图添加标注,同时控制其属性及显示。 y 选择 — 通过分组和组织数据,发挥 MapX 的分析特性。即在一个指定的半径、矩形区域或 指定点的范围内选择地图图元。 y 图元工厂 — FeatureFactory 对象使您得以创建、合并和缓冲区或擦除点、线和区域图元。 y 工具 — 用户可以通过单击和拖动直接与地图交互。通过 MapX 内置的导航、选择和标注工 具或自定义工具来对地图进行操作。 y 地图编辑 — 可以让用户在地图上添加、修改或删除图元。 y 投影和坐标系 — MapX 对地图坐标系和投影的完全支持使您可以更精确地调整地图的显示 并在自己的坐标系中处理 X-Y 数据。 y 远程空间服务器连接 — 可以连接运行在 Oracle8.0.5、Informix 或其他所支持的数据库上的 Oracle8i Spatial 和 MapInfo SpatialWare 上存储的真实数据。为集中管理和安全起见,空间服 务器允许公司在企业数据库中主持他们的地图数据。象 SpatialWare 和 Oracle8i Spatial 之类 的空间服务器还提供高级查询处理功能,并增加了用于处理组织机构的空间数据的服务器性 能。在一个 RDBMS 中存储空间数据对于需要进行大量地图编辑和处理大型数据集的应用程 序也是必要的。 MapInfo MapX 培训教程 3 第三节 安装 MapX 系统要求 因为MapX 是32 位OCX,所以它需要一个 32 位版本的 Windows (Windows 95/98 或 Windows NT 4.0)。MapX 应用程序不能在 Windows 3.1 中运行。 MapX 使用面向对象的程序设计语言(例如 Visual Basic、Visual C++、PowerBuilder 或 Delphi)或者是使用 Lotus Script 的 Lotus Notes。 MapX 安装过程描述如下: 要安装 MapX: 1. 将 MapX CD 放置在 CD 驱动器中(例如 D:)。单击 Windows 开始按钮并选择运 行。 2. 在 打 开 下 拉 列 表 框 中 键 入 或 选 择 [CD 驱 动 器 符 ]\Setup.exe ( 例 如 , D:\Setup.exe)并单击确定。 出现欢迎显示屏。选择下一步继续安装过程。 3. 软件许可协议屏出现。选择是以接受协议的条款并继续安装过程。 4. 显示选择目标位置屏。指定要安装 MapX 的目录。如果还没有安装 MapX,缺省 位置是:Program Files\MapInfo MapX 4.0\。如果已经了安装 MapX,缺省位 置就是现有的安装目录。 说明:强烈建议在开始安装之前,卸载 MapX 所有的早期版本并关闭所有 Windows 程序。要指定一个不同的位置,选择浏览按钮并指定目标。单击 下一步继续安装过程。 5. 指定要安装的产品组件。显示出所选组件所需要的磁盘空间。当选择某个组件, 其相关描述也显示出来。如果更改按钮可用,说明此组件有子组件。单击更改 按钮以显示那些组件的列表以及安装所需的磁盘空间。选择要安装的子组件。 例如,如果选择 Exporting/Importing Formats 组件,显示五个子组件(GIF、 JPG、TIF、PSD 和 PNG)以及每个组件所需的磁盘空间。可以选择安装这些子 组件中的一个或全部。如果要安装对 Lotus Notes 数据库的支持,确信在安装 MapX 时已选中 Lotus Notes 选项(Lotus Notes 选项是 Data Drivers 选项的 子组件)。请参阅本章后面介绍的为 LotusNotes 安装和设置 Visual Basic 驱 动程序。 6. 选择程序文件夹屏出现;指定程序文件夹。 7. 开始复制文件屏出现。检查现在设置的信息。如果正确无误,选择下一步安装 MapX。进度条会显示安装的状态。如果要更改信息,选择返回回到上一屏幕。 第四节 添加 Map 控件 安装 MapX 之后,就可以按需要添加 Map 控件了。 MapInfo MapX 培训教程 4 Visual Basic 用户 在 Visual Basic 工具箱上放置 Map 控件 。在一个打开的 Visual Basic 工程中执行如下操 作: 如果使用的是 Visual Basic 5 或更新的版本: 1. 右键单击 Visual Basic 工具箱,从快捷方式菜单中选择部件。 2. 在部件对话框中,单击控件选项卡,寻找列表中的“MapInfo MapX V4”。如 果该项未选中,请选中它。单击确定。 Map 控件出现在工具箱上。要在 Visual Basic 窗体上放置地图,请选择 Map 控件并在窗体上 绘制一个方框。 如果保存工程,在下一次重新加载工程时,Map 图标将自动出现在工具箱中。 第五节 Visual Basic 入门 创建一个简单的地图 使用 MapX,可以很容易把地图添加到应用程序。事实上,不必写一行代码就可以向 Visual Basic 窗体添加工作地图。 1. 从 Visual Basic 工具箱选择 Map 控件 。 2. 在窗体中绘制一个方框,这表示将显示地图的区域。MapX 显示地图的预览。 3. 右键单击 Map 控件,从快捷方式菜单中选择属性。MapInfo MapX 属性对话 框出现。 1. 找到常规选项卡底部的当前工具选项。将当前工具设置为“1003-Zoom In”并 单击确定。 2. 运行程序以查看地图。请注意只要指针位于地图上,将变为带加号的放大镜 MapInfo MapX 培训教程 5 4. 单击地图。MapX 在单击的位置放大地图。可以反复单击,使得它放得越来越 大。也可以绘制一个选取框以指定要放大的准确区域。 当地图放大到越来越近,将发现更多的地图元素变为可见的。这是因为单 独的地图图层已经设置了缩放图层(在预先缩放范围内自动显示地图图层 的功能)。 学习 MapX 的一个方法是研究示例应用程序。在下列文件夹中寻找示例应用程序: \\MapInfo MapX 4.0\Samples40 第六节 地图化概念 组织数据和地图:表概述 要使用 MapX,需要有您的记录和 MapInfo 地图文件。MapX 以 MapInfo 表的形式组织所有 潜在信息。每个表都是一组用来在地图中创建图层的 MapInfo 文件。 文件如何组成表 所有的 MapInfo 表都会拥有下列文件: y <文件名>.tab:描述 MapInfo 表的结构。它是描述包含数据的文件的格式的小文本文件。 y <文件名>.dat:(.mdb、.aid 或 .dbf):这些文件含有表格格式数据。 y <文件名>.map:描述图形对象(如果表没有地图对象则不存在该文件)。 y <文件名>.id:是链接对象和数据的交叉引用文件(如果表没有地图对象则不存在该文件)。 y <文件名>.ind:索引文件。索引文件允许使用 Find 对象来查找地图对象。 MapInfo 表和 MapX 图层 每个可用地图表示的 MapInfo 表都能在地图上作为图层显示。例如,您可以显示客户表、 街道表以及县边界表。 想象图层是透明的,而每一层都包含了地图的不同部分。这些图层是一层层叠加,这样您就 可以看到整个地图信息。 MapInfo MapX 培训教程 6 什么是 GeoSets? Geoset 保存了地图图层的集合以及一些对您来说简单易用的设置。其名称的由来是因为 Geosets 是由一些表示同一地理区域的以标准 MapInfo 格式出现的地图文件(.tab)组成的 数据集。当您希望将多个图层作为示例地图使用时,会发现单独打开和显示多个图层是件多 么费时的工作,Geoset 使您避免这样的情况。Geoset 的扩展名是 .gst。.gst 文件是文本 文件,它包含若干用来告诉 MapX 显示什么表以及如何显示的元数据键值。 当打开 Geoset 时,它自动打开所有包括在 Geoset 中的文件并默认显示。开发者可以更改 “默认显示”来迎合自己的需要。Geoset 设置包括投影、默认缩放值,对象的自动标注, 缩放范围以及打开的表是否可见。MapX 也可以打开开发者指定的任意单个(.tab)地图文 件。使用 Geoset 非常方便,无需 MapX 就能运行。MapX 将不会打开 MapInfo 工作空间 (.wor 文件类型)。 地图图元 在 MapX 中通过 Feature 对象来访问这些地图对象。有四个基本的图元样式: y 区域对象:覆盖给出地区的封闭对象。包括多边形、椭圆形以及矩形。例如,国家的边界、 邮政编码划分区的边界、销售区域等等。 y 点对象:表示单个数据位置。例如,客户位置、餐馆、停车计价器等等。 y 线对象:覆盖给定距离的开放对象。包括线、折线和弧线。示例是街道,河流,能源线路。 y 文本对象:描述地图或其他对象的文本,例如标注和标题。 在单独图层里使用同一类的对象(最普遍),也可以在同一图层里把多个对象联合起来。MapX 使您得以创建、编辑、自定义和显示这些对象,从而使地图符合您的需要。 MapInfo MapX 培训教程 7 第二章 MapX 基础 概述 本章是对应用程序中用来创建和操作 MapX 地图的主要组件的概述。在后面的各章中将对 这些选出的主题做详细讨论。 第一节 Map 对象 下列图表是 MapX 对象体系的局部,您可以看到 Map 对象存在于最顶端。每个 MapX 的 对象、属性和方法都衍生于 Map 对象。每个在 Map 对象之下的属性和方法都会对生成整个 Map 对象有所影响。主要是由 DataSets、Layers 和 Annotations 对象定义每一个 Map 对象。 MapX 对象模型局部 说明:这不是一个完整的 MapX 对象模型。 下表显示了一些由数值表示的 Map 对象属性。可以在“设计时”改变这些属性,也可以在 “运行时”使用以下代码示例来更改。 属性 描述 代码示例 Zoom 设置在地图中显示的英里(默认的距离单位) 数。 Map1.Zoom = 500 Rotation 对地图旋转指定的度数 Map1.Rotation = 179 CenterX 设置 x 和 y 坐标,它们可能代表经纬度。 这是由地图的投影来决定的。 Map1.CenterX = -79.4458 MapInfo MapX 培训教程 8 属性 描述 代码示例 CenterY 设置 x 和 y 坐标,它们可能代表经纬度。 这是由地图的投影来决定的。 Map1.CenterY = 44.9932 用 Map 对象,可以通过操纵地图的几个方法和属性来控制地图如何来显示。有一些属性是 由其他对象来表示的。例如,当您看到 MapX 地图时,也就是看到单独图层的集合,它是由 Layers 集合来表示的。Layers 集合是 Map 对象的属性。 现在让我们来看一看如何改变地图的属性。属性页允许我们操作 Map 对象的多个属性。 第二节 属性页 当设计和测试应用程序时属性页对于修改地图属性非常有用。我们 以 Visual Basic 工程中访问属性页为例,相应的步骤如下: 方法一:如右图 1. 从属性窗口中单击自定义。 2. 单击 自定义行上的按钮。 方法二:在设计时可以通过右键单击窗体内的 Map 对象并选择属 性来访问属性页,见下图 方法三:运行时查看属性页 也可以在运行时查看属性页。为此,请把下列代码添加到 Map.Mouse_Up 事件中去。 If Button = 2 Then Map1.PropertyPage 这段代码将检测用户是否在运行时单击鼠标右键,然后显示属性页。使用鼠标右键,是 因为不会影响工具(左键)的正常使用。 说明:您应该仅在设计和测试时使用这段代码,因为它给用户太多权限来控 制整个地图。然而,如果希望完成的产品要为最终用户显示对话框的话, 可能就需要使用 Layers.LayersDlg 方法来代替 PropertyPage 方法,因为 LayersDlg 对话框对用户更友好一些。此方法将在下一章中讨论。 MapInfo MapX 培训教程 9 第三节 图层 如下图所示,点图层本身并不是非常有用,但当把这样的由点类型构成的地图覆盖在线 状地图和区域地图上时,就得到了一幅非常有用的地图。每一幅单独的地图是一个图层, MapX 把地图存储为图层的集合。 在“设计时”通过 MapX 属性对话框或是在“运行时”通过编程可以对图层进行改变。 在上述部分,属性对话框允许设计者通过简单地更改设置来操作图层。我们也可以在程序中 随时更改图层属性和方法的代码。新建图层,删除图层以及更改图层的可见性和样式都是一 些能在图层上完成的操作。 图层集合对象(Layers Object) 图层集合(Layers)是由 0 到 n 个 Layer 对象组成的。图层对象(Layer)是由特性集合 (Features)组成的,且每一个特性(Feature)都有其自己的属性和样式。特性集合(Features)由 Feature 对象组成,它对应地图中的图元,例如点、线或区域。可以创建独立的 Feature 对 象,也可以取得 Feature 对象的集合。 第四节 GeoSets GeoSet 是地图图层及其设置的集合。可以在“设计时”指定 GeoSet 。如果在“运行 时”设置,则先要删除所有已加载的图层和数据集,然后加载新的 GeoSet。 如前所述,在运行时指定要加载的其他 GeoSet、给地图对象添加图层,或是操作图层 的外观等操作都可以通过属性页来实现,或者可以通过与 MapX 一起装载的 MapX Geoset 区域地图 线状地图 MapInfo MapX 培训教程 10 Manager 程序 来实现(此程序可以在 MapX 程序组中找到)。 右图为 GeoSetManager 的用 户界面,可以利用此管理工具更改 图层设置,当认为满意时,就可以 保存地图。这将把 GeoSet 文件 (*.GST)写到驱动器中。当打开 该 GeoSet 文件时,将返回所有的 地图图层和设置。Geoset Manager 使您可以修改图层、管理缩放等 级、标注,以及其他属性。 GeoDictionary 利用 MapXz 作数据绑定或创建专题地图时,可以用 GeoDictionary 来匹配数据源与地 图图层。GeoDictionary 是一个保存了关于哪个地图图层可以匹配、哪个字段可以用作匹配 字段的信息文件(一般命名为 geodict.dct)。如果想运用自动匹配/自动绑定,则必须在 GeoDictionary 中注册文件。例如,如果拥有按州划分的销售额的数据,那么 GeoDictionary 就可以确定此数据和“USA”地图图层相匹配。 可以编程或者明确指定图层中要匹配的列与数据文件/表中的哪些列匹配,也可以让 MapX 参考 GeoDictionary 尝试找到匹配。 修改 GeoDictionary 如果在做数据绑定时要利用自动匹配,则在 GeoDictionary 里注册 MapInfo 表是必要 的。在 MapX GeoSet Manager 的工具菜单下有执行 GeoDictionary 程序的选项。MapX GeoDictionary 程序允许把新的 MapInfo 表注册到 GeoDictionary 中。同时,在 MapX GeoDictionary 中,单击注册表……按钮,然后选择要注册的表,设置表属性并为其输入描 述。如果要想自动地把这张表加载到 GeoSet 中,请单击添加按钮然后选择要把表添加进的 GeoSet 。 GeoDictionary 管理器的用户界面如下图所示: MapInfo MapX 培训教程 11 第五节 DataSets DataSets 使您可以将数据绑定到地图。例如,如果您有一个按县划分的关于销售额的 MS Access 数据库和一幅县地图,您就可以把数据绑定在这幅县地图上,并可以发现这个按 县划分的销售额趋势图,而以表格数据的形式则不容易突出显示该趋势。如上所示,当 MapX 需要在数据和地图之间指定某个匹配时,该匹配是通过称为自动匹配/自动绑定的处理过程 来确定的。如要利用自动匹配/自动绑定,首先必须在 GeoDictionary 中注册地图。一旦将 数据和地图绑定,就可以看到相关的地理化信息。数据的直观表示使得专题地图的创建变得 可行。专题就是以颜色划分的地图,以该方式来表现数据的变化趋势。我们将在以后章节中 详细的讲解专题图的制作。 第六节 Annotations Annotations 集合是把文本和符号放在地图上的简单方法。注释放在所有其他图层的最 顶端,并且不和任何数据链接。如果您熟悉 MapInfo,Annotations 的概念在目的上与地图 的装饰图层比较相似。 下表列出了 Annotations 集合对象的方法和属性: Annotations 集合方法 方法 描述 代码示例 AddSymbol 向 Annotation 集合添加符号。使用默 认样式(由 Map.DefaultStyle 指定)。 Map1.Annotations.AddSymb ol X, Y AddText 向 Annotation 集合添加文本。第四个 参数表示文本在指定坐标系中的初始 位置。 Map1.Annotations.AddText _ “Developer Services”, _ 79.44, 46.8889, _ miPositionTL MapInfo MapX 培训教程 12 方法 描述 代码示例 Remove 从集合中删除指定的 Annotation。 Map1.Annotations.Remove 1 RemoveAll 从集合中删除所有的 Annotation。 Map1. Annotations.RemoveAll Annotation 集合属性 属性 描述 代码示例 Editable 指定注释是否能够编辑。 Map1.Annotations.Editable _ = True Type 指定 Annotation 对象类型。 If Map1.Annotations(2).Type_ Graphic 包含了拥有 Annotation 属性的 Graphic 对象。请参阅联机帮助中的 Graphic 对象描述。 请注意在注释对象中没有关于位置、符号样式或是注释的属性。注释的图形属性包含了该信 息的图形对象。要修改注释,可修改注释的图形对象。 下列代码在指定位置添加符号: 'Add a symbol at location Map1.Annotations.AddSymbol X1, Y1 第七节 创建对象 在 MapX 对象模型中,可以使用下列对象类来创建独立对象。 BindLayer ODBCQueryInfo BitmapSymbols 点集的集合 Feature Point Fields Points NotesQueryInfo Rectangle NotesViewInfo Style 下列代码显示了如何创建独立样式对象,显示样式选择对话框并使用新样式设置图层的替代 样式。请注意在 Delphi 和 PowerBuilder 中需要在对象名后指定 MapX 版本号(如 “MapX.Style.4”)。这样的安排使您在计算机中可同时安装多个版本的 MapX。如果已开发 了 MapX 版本 4 的应用程序,而后又在同一台计算机上安装了更新的版本,那么新版本的 MapX 将不会影响版本 4 的应用程序。 Visual Basic 示例 Dim s as new MapXLib.Style s.PickRegion set Map1.Layers(1).Style = s MapInfo MapX 培训教程 13 C++ 示例 CMapXStyle style; style.CreateDispatch(style.GetClsid()); // can also use style.CreateDispatch("MapX.Style.4"), // but above is more portable between versions of MapX style.PickRegion(); m_ctrlMapX.GetLayers().Item(1).SetStyle(style); Delphi 示例 Var s : variant; begin s := CreateOleObject('MapX.Style.4'); s.PickRegion; MapObject.Layers.Item(1).Style := s; End PowerBuilder 示例 OLEObject s long oleStatus s = CREATE OLEObject oleStatus = s.ConnectToNewObject("MapX.Style.4") ole_1.Object.Layers.Item(1).Style = s MapInfo MapX 培训教程 14 第三章 按图层地图化 概述 本章讨论了表和地图之间的关系,以及如何分层以创建所需的详细程度的图层。 第一节 用图层来组织地图 经过前几个章节的学习,我们已经明白作为多个图层集合的计算机地图的概念。在地图 窗口中,每个含有图形对象的数据表都可以显示为一个图层。例如,您可以在显示一个客户 表、街道表以及县界表。 设想这些图层是透明的,每一图层包含地图的一个不同的部分。这些图层叠加在一起, 使您同时可以看到地图的所有方面。例如,第一个图层包含国家边界,第二个图层有代表首 都的符号,第三个图层包含高速公路。将这些透明的图层叠加在一起就组织起一个完整的地 图。 第二节 Layers 集合的属性 每个 Map 都有图层的集合。Layers 集合由 Layer 对象组成。Layers 集合具有用来从 集合添加和删除 Layer 对象的方法和属性。Layers 集合方法和属性的完整列表请参见 《 MapX 参考指南》和联机帮助。 Count——获得集合中的图层数量 所有集合都有 Count 属性,该属性非常有用,可得到图层的数目,遍历 Layers 集合的 每一图层,就可以用到此属性: Dim x as integer For x = 1 to Map1.Layers.Count Print Map1.Layers(x).Name MapInfo MapX 培训教程 15 Next Item——从集合中获取图层 Item 属性从集合中获得特定的 Layer 对象。Item 属性返回一个图层作为对象,它是 Layers 集合的默认方法。 可以通过索引值,如 1、2 等等,来引用图层,也可以通过它们 的名称引用,例如 Highways 或者 Cities: Dim lyr as Layer Set lyr = Map1.Layers.Item(“Highways”) -或者- Dim lyr as Layer Set lyr = Map1.Layers.Item(3) Bounds——获得集合的地理范围 Bounds 属性返回代表集合中所有地图图层的地理范围(除了 UserDraw 图层)的 Rectangle 对象。当需要将地图缩放到足够大以显示所有图层中的所有对象时,该属性将很 有用: Set Map1.Bounds = Map1.Layers.Bounds 第三节 Layers 集合的方法 Layers 集合有一些方法来控制集合包含哪些图层以及它们如何显示。还有一个方法使 用户能打开图层控制对话框来操作图层的方法和属性。方法也可在设计时使用属性页设置, 如本章前面所述。 使用“图层控制”对话框 LayersDlg 方法显示可让用户添加图层、删除图层、更改图层顺序和更改图层属性的对话框。 MapInfo MapX 培训教程 16 如果用户单击确定,在对话框中所做的更改将立即对地图生效。 Map1.Layers.LayersDlg 显示选项对话框 显示选项对话框使得用户可以自定义地图窗口中每个图层的显示。在图层控制中,用户 可以选择图层并单击显示按钮以显示显示属性对话框。然后,用户可以更改图层的缺省样式 并设置图层显示的缩放范围。 当用户第一次打开地图时,边界、线、点和文本都使用在地图的 Geoset 文件中的默认 值来显示。用户可以通过使用显示选项对话框的显示模式部分更改对象显示的方式。 例如,用户想要将街道的显示变成红色虚线。在图层控制对话框中用户可以选择街道图层并 单击显示按钮。将出现显示选项对话框。选中样式替换框以激活样式替换按钮(大的灰色按 钮)。MapX 显示适合于图层中对象类型的替换按钮。例如,如果图层包含街道,将显示一 个线替换按钮。单击该按钮进入线样式对话框,在此用户可以改变街道的宽度、样式和颜色。 对于边界图层,样式替换按钮将引出区域样式对话框,可改变边界的填充和边框。当要为包 含符号或点的图层替换样式时,将显示符号样式对话框。和其他显示设置一样,样式替换只 在当前的工作期间有效。如果要使其永久有效,必须修改 geoset。 创建图层 可以创建新的临时或永久的 MapInfo 表图层。该方法返回 Layer 对象——即添加到集 合的 Layer 对象。 dim lyr as layer set lyr = Map1.Layers.CreateLayer (“Temporary”) MapInfo MapX 培训教程 17 添加图层 添加现有的图层到集合中并在地图上显示。 当添加图层时,可以使用可选的 Position 参数指定图层在集合中的位置。如果没有指 定 Position 参数,图层将根据地图中的其它图层自动放置。例如,点图层将置于区域图层 之上。 Map1.Layers.Add “C:\Data\Counties.tab” -或者- Private Sub mnuAddLayers_Click() Dim sFile As String With dlgCommonDialog .DialogTitle = "Add Layer" .Filter = "MapInfo Tables (*.tab)|*.tab" .ShowOpen If Len(.filename) = 0 Then Exit Sub End If sFile = .filename End With On Error Resume Next Map1.Layers.Add sFile End Sub 删除图层 Remove 方法将指定的图层从地图删除。 Map1.Layers.Remove 3 删除所有图层 RemoveAll 方法将所有图层从地图中删除。 重定位图层 Move 方法重确定图层在 Layers 集合中的顺序。第一个参数是原来的顺序(顶端图层 为 1),第二个参数是要移动到的顺序。 Map1.Layers.Move 1,2 第四节 Layer 对象 Layer 对象代表具有主要的图元类型(如区域、线条和符号)的地图图元集合的窗体中 的矢量地图化数据。通常 Layer 对象对应于一张 MapInfo 表中的地理对象。Layer 集合中 的每一个 Layer 对象的行为独立于其他对象。它们的样式更改、图层缩放的更改都基于单 个图层,而不会影响其他图层。 可以在任何时候在程序中操作图层对象。也可以使用属性页对话框在设计时设置图层属 MapInfo MapX 培训教程 18 性,如上面所讨论的一样。Layer 对象有许多属性和方法。用来从 Layer 中获得图元的方 法后面的章节中讨论。 Layer 的属性 说明:《MapX 参考指南》和联机帮助中有 Layer 对象方法和属性的完整列表。 Name 图层的名称。 MsgBox Map1.Layers(4).Name Visible 图层是否可见。 Map1.Layers.Item(2).Visible = False OverrideStyle 是否替代该图层的默认显示特性。 Map1.Layers(9).OverrideStyle = True Style 如果 OverrideStyle 为真时图层样式将应用。 Map1.Layers(9).Style = newstyleobject ZoomLayer 设置图层缩放打开或关闭。 Map1.Layers(“States”).ZoomLayer = True ZoomMin 设置图层可见的最小缩放级别。 Map1.Layers(“States”).ZoomMin = 45 ZoomMax 设置图层可见的最大缩放级别。 Map1.Layers(“States”).ZoomMin = 580 MapInfo MapX 培训教程 19 Selectable 当用户单击该图层时设置 MapX 是否认可。 Map1.Layers(“States”).Selectable = True AutoLabel 控制图层是否自动标注。 Map1.Layers(“States”).AutoLabel = True 第五节 图层顺序 Layers 集合中的地图图层按递增的索引顺序显示(例如,Layers(1) 是最上面的图层, Layers(2) 是 Layer(1) 下面的图层,等等),底部的图层首先绘制,顶部的图层最后绘制。 正确地排列图层很重要。 例如,假设有一个客户点图层和人口普查区图层。如果图层在 Layers 集合中的顺序不 正确,MapX 将首先绘制客户点图层,然后显示人口普查区图层。则点图层将被人口普查区 图层所遮掩。 可以在设计时重新调整图层在 Map 中显示的顺序。如前所述,在属性页的图层选项卡 中使用向上和向下按钮。选择要重新排序的图层并选择向上或向下按钮移动图层到它当前位 置的上方或下方。要使得用户在运行时可以调整图层的顺序,使用 LayersDlg 方法显示图 层控制对话框,如前所述。 图层顺序在使用选择工具时也很重要。选择工具从最上面的可选图层选择对象。如果在 相同位置有几个对象,就很难精确选择所要的那一个。可以重新调整图层的顺序使得要选择 的图层是新的最顶端的图层。 第六节 检查图层类型 有很多实例表明可能要检查集合中的图层。下面是一个简单的代码段,它在 Layers 集 合中循环以确定现有的图层是什么类型,并在对话框中显示消息指出图层类型。 Dim lyr as Layer For Each lyr in Map1.Layers Select Case lyr.Type Case miLayerTypeNormal MsgBox “Layer ” & lyr.Name & “ is a normal layer” Case miLayerTypeRaster MsgBox “Layer ” & lyr.Name & “ is a raster layer” Case miLayerTypeSeamless MsgBox “Layer ” & lyr.Name & “ is a seamless layer” Case miLayerTypeUnknown MsgBox “Layer ” & lyr.Name & “ is an unknown layer” Case miLayerTypeUserDraw MapInfo MapX 培训教程 20 MsgBox “Layer ” & lyr.Name & “ is a user draw layer” Case miLayerTypeDrilldown MsgBox “Layer ” & lyr.Name & “ is a drilldown layer” Next 在代码段中对所有图层类型使用了 MapX 定义的常量。这些常量通称为 LayerTypeConstants。所有的 MapX 常量都列出在 MapX 联机帮助和《MapX 参考指南》中。 第七节 检查图层的图元类型 该代码段在 Layers 集合中按索引循环。检查集合中的每个 Layer 对象并确定图层中显 示的图元的类型。 Dim i as Integer For i = 1 To Map1.Layers.Count Select Case Map1.Layers(i).PredominantFeatureType Case miFeatureTypeRegion MsgBox “Layer ” & lyr.Name & “ contains regions” Case miFeatureTypeLine MsgBox “Layer ” & lyr.Name & “ contains lines” Case miFeatureTypeSymbol MsgBox “Layer ” & lyr.Name & “ contains symbols” Case miFeatureTypeMixed MsgBox “Layer ” & lyr.Name & “ contains mixed _ features” Case miFeatureTypeUnknown MsgBox “Layer ” & lyr.Name & “ contains unknown _ features” Case miFeatureTypeText MsgBox “Layer ” & lyr.Name & “contains text features” Next Layers 集合有一个基本的索引,所以可以引述来自 Layers 集合的数量之一的索引值。同时 也对集合中每个图层的 PredominantFeatureType 属性进行评估,使用 FeatureType 常量来评 估 PredominantFeatureType。 第八节 图层缩放 有时您想使一个地图图层仅在某些缩放级别显示。图层缩放控制地图图层的显示,使它 仅当地图缩放水平在预先设置的距离内时才显示。可为每个图层设置不同的图层缩放级别。 例如,如果地图包括街道地图图层,当用户过于缩小地图时,可能发现街道变得难以辨 认。使用图层缩放可以建立当用户缩小地图以显示大于 5 英里的区域时,MapX 可自动隐 藏街道的地图。 MapInfo MapX 培训教程 21 未设置缩放级别的图层集合 对街道图层设置了缩放级别的图层集合 下列范例代码使用 Layers 集合的 Add 方法向地图添加图层并通过修改 Layer 对象 的属性而建立图层缩放。 Dim lyrStreets As Layer `Creates the layer object `Sets the Streets table as the layer object and orders the layer in `the map as number 3. Set lyrStreets = Map1.Layers.Add(“Streets.tab”, 3) lyrStreets.ZoomLayer = True `Sets zoom layering to true lyrStreets.ZoomMin = 0 `Sets minimum zoom to 0 miles lyrStreets.ZoomMax = 5 `Sets maximum zoom to 5 miles 一旦为图层设置了图层缩放,当地图在最小缩放级别和最大缩放级别之间缩放时,图层 将在地图上显示。例如: Map1.ZoomTo 3, -70.26, 44.05 因为 3 英里的缩放值在最小缩放级别和最大缩放级别之间,Streets 图层将中心点定在 -70.26,44.05,并显示涵盖地图控件 3 英里的地图区域。 相同 Map 窗口中的不同图层可以以不同的缩放级别显示。例如,地图上有街道图层, 县边界图层,以及州边界图层。想要使街道图层只在缩放级别小于八英里时才可见。而县边 界图层在缩放级别处于 20 到 200 英里时显示。州边界图层则只在缩放级别大于 100 英里 时才可见。可以为地图中的每一个图层设置不同的缩放级别。 第九节 为图层生成标注 概述 MapX 提供了多种方法来标注地图图层中地理对象的属性。它们的绘图位置是基于地理 对象中心的位置以及其他的一些信息,如定位点和偏移量。 MapInfo MapX 培训教程 22 作为属性,标注是动态连接到关于它们的地图对象上的。如果图层被关闭或不可见,则标注 不再显示。如果数据或地理信息改变,则标注也改变。如果为标注创建了表达式,并对该表 达式进行更改,则当前标注会被新的表达式动态取代。无论是自动标注地图,还是交互地使 用 Label 工具或 LabelAtPoint 方法,标注的内容都由与地理对象相关联的数据来确定。 除了标注内容,还可以使用 LabelProperties 对象中的属性来控制自动标注的位置、显示和 外观。可以为标注显示设置条件,如显示的样式和图层中所有对象的位置。 控制标注显示 要为图层自动生成标注,可以设置图层的 AutoLabel 属性为 True。 每一个图层对象都有 LabelProperties 对象,用来控制标注的许多方面。例如,为了隐 藏图层的所有标注,可设置 LabelProperties.Visible 属性为 False。若要指定想在地图上显 示的标注的最大数量,可以设置 LabelMax 属性。Duplicate 属性控制同名的图元是否可以 同时在地图上分开标注。Overlap 属性控制是否允许标注叠加;设置 Overlap 为 True 可以 使更多图元被标注,但叠加的标注很难识别。 缩放图层标注 可以设置标注只在特定的缩放范围中显示,方法类似于在一定的缩放范围中显示地图图 层。要对标注指定缩放范围,可设置图层的 LabelProperties 对象的 LabelZoom、 LabelZoomMax 和 LabelZoomMin 属性。 标注位置 要控制标注的位置,可设置 Position 属性(控制标注是在图元中心的上方、下方还是 旁边)和 Offset 属性(控制标注对于图元的偏移量)。 默认的锚点取决于图层的主要图元类型。例如,区域图元的图层默认为在区域中心有相 MapInfo MapX 培训教程 23 关标注。 对于线/折线图元(如街道地图),可以使标注平行于线对象,方法是设置 Parallel 属性 为 True。 创建引注 引注是指用线指向所标注对象的一种标注。当在一块相对较小的区域中有很多标注时, 则引注就非常有用。例如为亚洲地图作标注。有很多小国家靠得相当近。如果试图标注所有 这些国家,那么这些标注将互相叠加而难以辨认。 要创建引注,可为想要标注的图层设置 LabelProperties.LineType 属性为 miLineTypeSimple (1) 或 miLineTypeArrow (2)。 标注样式 要更改所有标注的样式,可设置 Style。 也可以设置合适的样式选项。对样式进行所要的更改。当返回地图时,所选的标注就会 以指定的样式显示。 同时还有背景选项。设置合适的选项以产生无背景的效果,或设置轮廓以产生在文字周 围的轮廓效果。这样使文本在它所覆盖的地方(例如,区域的一部分或一条街等等)上突出 显示。 交互式标注 尽管大部分标注可能会自动完成,但某些情况下可能要使用 Label 工具创建标注。 Label 工具是 MapX 内置的标准工具。要激活该工具,可设置 Map.CurrentTool 属性为 miLabelTool (1010);用户将可通过单击图元进行标注。 删除图层中所有标注的最简单的方法是使用 Visibility 设置。它将禁止该图层中所有标 注的显示,包括自动和自定义标注。要只清除自定义标注(使用 Label 工具制作的标注), 请使用 ClearCustomLabels 方法。 如下的示例程序使用外部 Mapstats.mdb 库中”USA”表的”GEONAME”字段值作为标注 Dim DS As Object Dim DB As Object Dim RS As Object Dim Temp As Object Set DB = Workspaces(0).OpenDatabase("Mapstats.mdb") Set RS = DB.OpenRecordset("USA") Set DS = Map1.Datasets.Add(miDataSetDAO, RS) Set Map1.Layers("usa").LabelProperties.Dataset = DS Set Temp = DS.Fields("GEONAME") Set Map1.Layers("usa").LabelProperties.DataField = Tem MapInfo MapX 培训教程 24 第十节 注释 尽管标注图元可以解决大部分的文本注释需要,可能仍然需要创建文本对象来对地图进 行注释。 不同于标注的是,文本注释不与数据连接——可以将它放在地图上的任何地方, 即便那个位置没有任何图元。 要添加文本或符号注释到地图,请使用 Annotations 集合和对象中的方法和属性。 每个 Map 对象都有 Annotations 的集合(Map.Annotations 属性)。注释可以是符号或 文本对象,且绘制在地图的顶层。 注释通常用于为地图添加文本消息,或者是添加符号。在对地图进行缩放时这些注释会相应 地调整大小。注释不固定于某个特定的地图图层。注释总是在地图的顶层。 请注意 Annotation 对象没有任何属性来设置位置、符号样式或文本。要控制注释的这 些方面,可使用 Annotation.Graphic 属性来获得 Graphic 对象,然后修改该 Graphic 对象。 第十一节 栅格图像 栅格图像是计算机化的图片类型,由多行点(像素)构成。栅格图像有时被称为位图。 航空照片和卫星图像是 GIS 中的栅格数据的常见类型。 将栅格图像作为地图图层显示 使用 MapX 可以将栅格图像(位图)作为所创建地图的背景显示。但是栅格图像必需 首先成为 MapInfo 表的一部分。然后可以在图像的上方覆盖另外的数据,如街道地图和客 户位置。 尽管栅格图像可以成为地图图片,但图像不能有附加数据。图像只能作为背景或衬垫来观看。 如何显示栅格图像 每幅栅格图像都必须有相应的‘TAB’文件来存储图像的地理坐标。TAB 文件通过使 用 MapInfo Professional 来创建并‘注册’相应的图像。 说明:将栅格图像作为地图图层显示时,MapX 会自动设置所有的矢量地图图层的旋转和投 影,以便使它们与栅格图像的旋转和投影相配。 MapInfo MapX 培训教程 25 第十二节 动态图层 Animation 图层在地图图元需要经常更新(例如在实时应用时)时很有用。例如,可以 开发一套舰队管理应用程序,将每一艘舰船用一个点对象来代表。 可以通过使用 GPS(全 球卫星定位)技术获取舰船的当前位置,然后更新点对象以显示舰船在地图上的更新位置。 在这类应用程序中,如果被更新的对象存储在动态图层而不是常规图层,那么在地图对象经 常改变的地方,地图可以更快地重新绘制。 最初,AnimationLayer 设置为 null。可以向 Layer 对象分派属性以使图层成为动态图 层(它可以是常规图层或是用户绘制图层)。当图层被分派了 AnimationLayer 属性,它就 会绘制在所有图层的上方,包括 Annotations 图层和选择结果。该图层仍然在 Layers 集合 中的同样位置。浮动对象如图标符号仍然显示在动态图层的顶端,尽管它们因为被省略了而 不必每次重新绘制。如果普通的图层被用作动态图层,其选择结果和标注会依然有效。 示例 Set Map.Layers.AnimationLayer = Layers(3) for each lyr in Map.Layers if Map.Layers.AnimationLayer = lyr then ... end if next 要关闭动态图层,给它赋予空值: Set Map.Layers.AnimationLayer = nothing 这样使该图层变回普通图层,且其在图层列表中的位置不变。 第十三节 绘制图层 Layers 集合的 AddUserDraw Layer 方法使开发人员在地图上绘制图层。当需要绘制 图层时,它与激活的 DrawUserLayer 事件结合在一起使用。该方法返回新创建的 Layer 对 象。用户可以绘制任意数量的图层。 如何工作 首先,添加用户绘制图层到图层集合: Dim lyr as Layer Set lyr = Map1.Layers.AddUserDrawLayer("My Layer", 1) 然后,设置 DrawUser Layer 事件中的代码以绘制图层。当应用程序使用 Layers 集合 的 AddUserDrawLayer 方法创建了 UserDraw 图层,在窗口需要更新时,应用程序就会激 活该事件。 下面是完整的示例。 ' API DEFS should be declared in a separate module Declare Function MoveToEx Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As MapInfo MapX 培训教程 26 Long) As Long Declare Function SetMapMode Lib "gdi32" Alias "SetMapMode" (ByVal hdc As Long, ByVal nMapMode As Long) As Long Type POINTAPI x As Long y As Long End Type Public Const MM_TWIPS = 6 ' this sets the UserDraw Layer to “My Layer” Dim lyr as Layer Set lyr = Map1.Layers.AddUserDrawLayer("My Layer", 1) ' this example draws a line between the corners of Wyoming Private Sub Map1_DrawUserLayer(ByVal Layer As Object, ByVal hDC As stdole.OLE_HANDLE, ByVal hAttributeDC As stdole.OLE_HANDLE, ByVal RectFull As Object, ByVal RectInvalid As Object) Dim pt As POINTAPI SetMapMode hDC, MM_TWIPS dim PX as single dim PY as single Dim X1 As Double, Y1 As Double, X2 As Double, Y2 As Double X1 = -111.0542 Y1 = 45.0009 X2 = -104.0528 Y2 = 41.0018 if map1.ClipLine(X1,Y1,X2,Y2) then mp1.ConvertCoord X, PY, X1,Y1, miMapToScreen MoveToEx hDC, PX, -PY, pt ' win api call map1.ConvertCoord PX, PY, X2,Y2, miMapToScreen LineTo hDC, PX, -PY ' win api call end if End Sub MapInfo MapX 培训教程 27 第四章 Features 和 Selections 概述 Selections 和 Features 对象的方法使您得以“标记”或选择符合特定条件的图元。地图 上表示纽约市的点就是一个 Feature 对象的示例。假设您需要查找所有在 Sheep’s Head Bay, Brooklyn 周围 5 英里内的潜在客户。一旦创建此数据集合,就可以通过收集的数据来完成 一组操作,如打印数据、取平均值、计算有多少符合条件的数据、并将它们保存到文件中, 或者执行其它任务。在本章中将详细介绍图元和选择。 第一节 基本概念 什么是地图图元? 地图图元是地图上的地理对象,例如点、线或区域。例如,在美国地图中区域表示州、 线表示公路、点表示城市。在 MapX 中,地图图元表示为 Feature 对象。 什么是 Features 集合? 在 MapX 中,组成地图的不同图层中的每个图层通常具有相同类型的图元。例如,“US States”图层使用区域图元表示每个州,“US Highways”图层使用线图元表示主要的美国公 路,“US Capitols”图层使用点图元表示每个州的首府城市。在 MapX 中,地图图层中的所 有图元及其所有子集表示为 Features 集合。许多 Layer 对象方法都返回图层的 Features 集合。 一般说来在地图上不突出显示 Features 集合中的图元。要想突出显示,那么使用 Selection 集合。 什么是 Selection 集合? 和 Features 集合类似,Selection 集合也是 Feature 对象的集合。但是,Selection 集合 表示当前已选中的 Feature 对象。每个图层对象都有自己的 Selection 集合 (Layer.Selection)。根据那些已选中的图元,MapX 自动高亮显示在 Selection 集合中的所 有图元。 第二节 使用 Features 集合 Features 集合类似于 Selection 集合,因为两个集合都是 Feature 对象的集合。但是, Features 集合与 Selection 集合各有一组不同的方法和属性集,而且两个集合类型的行为也 不同。在 Selections 集合中自动高亮显示选中的图元,而在 Features 集合中不会突出显示 图元。 MapInfo MapX 培训教程 28 取得图层中的图元 在使用 Features 集合前必须先创建集合。可以用 Layer 对象方法创建 Feature 对象的 集合。 以下 Layers 集合的方法提供了多种途径来取得 Features 集合。 方法 描述 代码示例(Dim fs as Features 创建 Features 集合) AllFeatures 返回图层中包括所有图元的 Features 集合。 Set fs = Map1.Layers(2).AllFeatures NoFeatures 返回图层的空 Features 集合。 Set fs = Map1.Layers(9).NoFeatures SearchWithinDistance 返回在指定点对象周围的某个 范围内图元的 Features 集合。 Set fs = Map1.Layers(3). SearchWithinDistance (objPoint, _ 36.5, miUnitMile, miSearchTypeCentroidWithin) SearchWithinFeature 返回由另一指定区域图元中图 元组成的图元对象。 Set fs = Map1.Layers(3). SearchWithinFeature _ (ftr, miUnitMile, miSearchTypeCentroidWithin) SearchWithinRectangle 返回在指定矩形边界中的图元 集合。 Set fs = Map1.Layers(3). SearchWithinRectangle(miRect, _ miUnitMile, miSearchTypePartiallyWithin) SearchAtPoint 返回由指定点处图元组成的图 元集合。 Set fs = Map1.Layers(3) .SearchAtPoint(objPoint) 搜索类型常数 MiSearchTypeCentroidWithin 如果图元的中心位于区域中,则在搜索中包含该常数。 MiSearchTypeEntirelyWithin 如果区域包含此图元,则在搜索中包含该常数。 MiSearchTypePartiallyWithin 如果图元的任意部分位于区域中,则在搜索中包含该常数。 以下代码是工具使用的事件,它为用户单击点处的图元创建集合。 Private Sub Map1_ToolUsed(ByVal ToolNum As Integer, ByVal X1 As Double, ByVal Y1 As Double, ByVal X2 As Double, ByVal Y2 As Double, ByVal Distance As Double, ByVal Shift As Boolean, ByVal Ctrl As Boolean, EnableDefault As Boolean) Dim ftr As Feature 'creates a Feature object Dim fs As Features 'creates a collection of features Dim pt As New Point 'creates a new point 'the new point created has coordinate values set when the user clicks on a feature pt.Set X1, Y1 'If the tool used is the custom info tool then create a collection of features from the States ‘layer and print the State Name feature into a message box. If ToolNum = InfoTool Then 'create the collecton of features at the point the user clicked Set fs = Map1.Layers("USA").SearchAtPoint(pt) 'print the State Name feature into a message box. For Each ftr In fs MsgBox ftr.Name Next MapInfo MapX 培训教程 29 End If 操纵 Features 集合 以下方法使您得以通过在集合中添加、删除、复制图元对象来操作 Features 集合: 方法 描述 Add 将 Feature 对象或整个 Features 集合添加到集合。 Clone 将集合复制为另一个 Features 集合对象。 Common 将此集合与另一个 Features 集合相结合,这样该集合将仅包含二者 中均包含的图元(INTERSECT 集合操作)。 Remove 从该集合的 Features 集合中删除 Feature 对象或所有图元 (SUBTRACT 集合操作)。 Replace 将集合内容替换为 Feature 对象或 Selection 集合对象的所有图元。 Feature 对象 Features 集合由 Feature 对象集合组成。Feature 对象对应于地图上的图元,例如符号、 线或区域。 Feature 对象方法使您可以创建和操作独立图元对象。在创建独立图元对象后,必须将 该图元对象附加到地图上后才能引用对象的所有方法和属性。把图元附加到地图时地图的坐 标系与图元相关联。 以下 Visual Basic 示例显示如何创建独立的 Text 图元,然后修改其标题。 Dim f As New Feature Dim fNew As Feature ' Add a new text object to layer 1 f.Attach Map1 f.Type = miFeatureTypeText f.Point.Set Map1.CenterX, Map1.CenterY f.Caption = "This is a text object" Set fNew = Map1.Layers(1).AddFeature(f) ' Change the text caption fNew.Caption = "Changed Text" fNew.Update 图元对象属性 以下属性定义图元对象: 属性 描述 代码示例 CenterX 包含图元在 X 轴方向的中心。 Print ftr.CenterX CenterY 包含图元在 Y 轴方向的中心。 MsgBox ftr.CenterY FeatureID 包含图元 ID。图层中的每个图元在每 个图层中包含唯一 ID。为整数值。 IVar = ftr.FeatureID MapInfo MapX 培训教程 30 属性 描述 代码示例 Length 包含图元长度( 限于线形图元)。 Print ftr.Length Perimeter 长度指图元的周长(限于区域图元)。 Print ftr.Perimeter Name 包含图元名称。 MsgBox ftr.name Type 包含图元(点、线等)类型。 ftr.Type = miFeatureTypeSymbol 第三节 使用 Selection 集合 MapX 的一个基本功能是在地图上选择图元,这样您就可以在图元上执行其它任务。用 户可以单击地图选择一个或多个图元(点、区域等)。MapX 高亮显示所有选中的图元。 要检查所选图元列表,请使用 Selection 集合,它是 Feature 对象的集合。Selection 集 合还提供了不同方法(例如 SelectByRadius)使您得以完成不同类型的选择,例如,选择以 某城市为圆心的一定半径范围内的所有图元。所选图元将在地图上高亮显示出来。每个图层 都有所选图元对象的集合(Layer.Selection)。 Selection 集合具有在集合中添加和删除图元的方法。同时,如果已经具有 Selection 或 Features 集合,那么可以追加、删除、复制或查找两个集合的交集。 下表列出了一些 Selection 集合方法。有关完整清单,请参阅《MapX 参考指南》或联机帮 助: 方法 描述 代码示例 ClearSelection 取消选择该图层中的所有图元。使用 Layers.ClearSelection 从所有图层中清 除选择。 Map1.Layers(“SalesReps1997”). Selection.ClearSelection Clone 将集合复制为另一个 Selection 集合对 象。 Map1.Layers(2).Selection.Clone ftrs Common 结合该集合与另一个 Selection 对象, 使该集合仅包含二者都有的图元 (INTERSECT 集合图元)。 Map1.Layers(2).Selection.Comm on Map1.Layers(4).Selection Remove 从该集合的 Selection 对象中删除 Feature 对象或所有图元(SUBTRACT 集合操作)。 Map1.Layers(2).Selection.Remove fs Replace 将集合内容替换为某个 Feature 对象或 某个 Selection 集合对象中的所有图 元。 Map1.Layers(“Boston”).Selection. Replace lyr.AllFeatures SelectAll 选择图层中的所有图元。 Map1.Layers(“Cargo”).Selection .Se lectAll SelectByPoint 选择图层中指定点处的图元。 Map1.Layers(5).Selection.Select ByPoint 75.14, 42.9, miSelectionAppend SelectByRadius 从图层中选择某点周围指定半径内的图 元。 Map1.Layers(4). Selection.SelectByRadius X, Y, Radius, miSelectionnew MapInfo MapX 培训教程 31 方法 描述 代码示例 SelectByRectangle 选择矩形中的图层图元。 Map1.Layers(5).Selection.Select ByRectangle 98.7, 31.56, -75.14, 42.9, miSelectionRemove SelectByRegion 选择区域内的图层图元。 Selection.SelectByRegion Layer, FeatureID, Flag 搜索类型常数 MiSelectionNew 创建新的选择。 MiSelectionAppend 添加到当前选择。 MiSelectionRemove 从当前选择中删除。 以下代码在指定点创建新的选择: Private Sub Command1_Click() Map1.Layers(5).Selection.SelectByPoint -98, 31.56, miSelectionNew End Sub SelectionChanged 事件 当更改选择时调用该事件。该事件使容器可以重新与建立在地图上的选择发生作用。使 用选择工具或使用 Layer 对象的某一 Selection 方法可以将选择更改为用户结果。 Private Sub Map1_SelectionChanged() 'Any time the selection changes, update the listbox with the currently selected records Dim ftr As Feature 'Create a feature object Dim lyr As Layer 'Create a layer object 'Within the current layer the user is selecting from, print out a message For Each lyr In Map1.Layers For Each ftr in lyr.Selection MsgBox (“found: ") ftr.name Next Next End Sub 第四节 图元编辑 MapX 使您得以创建、修改或删除组成地图图层的图元(点、线、区域等)。基于普通 MapInfo 表 (.tab) 文件的所有图层都可以编辑。 说明:MapX 不提供事务处理支持。或者说,在更新图元时,在添加、删除、更改图元之后 将立刻生效而不需要在以后保存所作的更改,且无法取消操作。 如何创建新地图图元 有两种方法可创建新地图图元。通过分配新 Feature 对象创建图元,或者使用 Map 对 MapInfo MapX 培训教程 32 象 的 FeatureFactory 属性方法对现有图元执行操作(例如缓冲区)来创建图元。这些图元 类型称为独立图元。独立图元受到一些限制:独立图元不能被添加到任何集合中,只有用于 定义图元的方法和属性可被使用。例如,不能使用独立图元的 Area 属性,而且独立图元没 有用于 Feature.Layer 属性的值。 图层的图元不是独立图元,所有的属性和方法都可以在图层图元上使用。 分配新的图元对象示例 Dim newobj as new MapXLib.Feature 'stand-alone object Dim obj as MapXLib.Feature 'to hold feature added to layer newobj.Type = miFeatureTypeSymbol 'Use the map's default symbol style newobj.Style = map1.DefaultStyle ' specify the x- and y-coordinates (long, lat) newobj.Point.Set -104.3452, 34.91234 'now add the object to a laye ' obj will be the newly added object ' you can still use newobj to add more objects set obj = map1.Layers(1).AddFeature(newobj) 要创建其它图元类型,只要将类型设为 miFeatureTypeRegion、miFeatureTypeLine 或 miFeatureTypeText,然后设置应用到该图元类型的属性。 FeatureFactory 方法 FeatureFactory 对象的方法使您可以创建新的地图图元,也可通过对现有图元执行操作 (例如缓冲区)来创建图元。 以下是 FeatureFactory 对象的方法: y BufferFeatures y CombineFeatures y CreateArc y CreateCircularRegion y CreateEllipticalRegion y CreateLine y CreateRegion y CreateSymbol y CreateText y EraseFeature y IntersectFeatures y IntersectionPoints y IntersectionTest 多数这些对象返回独立图元对象。这些图元对象自动附加到地图上(即,它们已经具有 相关坐标系)。或者说,由这些方法返回的图元不需要再使用 Attach 方法。 要取得 FeatureFactory 对象,请引用 Map.FeatureFactory 属性。 MapInfo MapX 培训教程 33 Dim f As MapXLib.Feature Dim p As New MapXLib.Point ' Use the map's current center as the point coordinates p.Set Map1.CenterX, Map1.CenterY ' Create a text feature and add it to layer 1 Set f = Map1.Layers(1).AddFeature(Map1.FeatureFactory.CreateText(p, "Some Text")) 联机帮助和《MapX 参考指南》提供有关如何使用各种 FeatureFactory 方法的详尽指导。 如何修改现有图元 当出现指向 Feature 对象的指针时,它表示图层中的真实图元;图层图元不是独立图元, 所有的属性和方法都可以在图层图元上使用。读取的所有属性和方法都反映了图层中的图元 值。 一旦通过设置样式、点或位置开始修改图元后,必须“更新”图元才能使更改生效。这样您 就可以对图元进行大量更改,而不需要等待每次更改后更新数据库和重画屏幕。其负面影响 是必须更新图元,MBR、面积、长度等才会更改。 要更新图元,请执行以下操作之一: y 如果已经修改图元并且希望提交更改,请使用 Feature.Update 方法。 y 如果希望将图元替换为另一图元,请使用 Layer.UpdateFeature 方法。 y 在更新图元时,原有 MBR 和新 MBR 都失效,使屏幕可正确重画。 Visual Basic 中的 Feature.Update 示例 ' Shift all selected objects by 1 degree Dim obj as MapXLib.Feature for each obj in map1.layers(1).selection obj.Offset(1.0, 0.0) obj.Update() next -或者- for each obj in map1.layers(1).selection obj.Offset(1.0, 0.0) map1.layers(1).UpdateFeature(obj, obj) next 如果选择不调用 Update 并释放对象,那么下次从图层中检索图元时,它仍将使用最初值。 如何删除现有图元 要删除图元,请使用 Layer.DeleteFeature 方法。图元及表示它的行将立即从 MapInfo MapInfo MapX 培训教程 34 表中删除。 ' delete all selected features from the USA layer Dim obj As MapXLib.Feature Dim selectedFtrs As MapXLib.Features Dim lyr As MapXLib.Layer Set lyr = Map1.Layers("USA") Set selectedFtrs = lyr.Selection For Each obj In selectedFtrs lyr.DeleteFeature (obj) Next 如何取得要编辑的图元 可以允许用户单击选择图元。此后,程序可以使用图层的 Selection 集合访问选择。 Selection 集合也提供各种方法(例如 SelectByPoint)使您可以将图元添加到集合。 图层对象有(如上所述)多种方法(例如 SearchAtPoint)使您可以取得 Features 集合。 可以使用 Find.Search 方法执行能够返回 FindFeature 对象(Feature 对象的超类)的查询。 检查区域或线的局部 MapX 中的线图元或区域图元包含许多 Point 对象的集合。可以通过图元的 Feature.Parts 集合访问这些 Points 集合的集合。 创建折线图元 此 Visual Basic 示例显示了如何使用 Point 对象、Points 集合和 Parts 对象一次一个 节点地创建 polyline 图元。 ' create a polyline feature with 3 points Dim newobj as new MapXLib.Feature 'stand-alone object Dim obj as MapXLib.Feature 'to hold object added to layer Dim pts as new Points Dim pt as new Point newobj.Type = miFeatureTypeLine 'Use the map's default symbol style newobj.Style = map1.DefaultStyle 'set the lines 3 points pt.Set -101.023, 45.0452 pts.Add pt pt.Set -102.023, 49.0452 pts.Add pt pt.Set -100.0, 34.2564 pts.Add pt MapInfo MapX 培训教程 35 newobj.Parts.Add pts 'now add the object to a layer ' obj will be the newly added object set obj = map1.Layers(1).AddFeature(newobj) 检查组成图元的节点 此 Visual Basic 示例显示 Parts 集合和 Points 集合如何循环显示所选图元中的所有点。 Dim obj as MapXLib.Feature Dim pts as new Points Dim pt as new Point set obj = map1.layers(1).selection(1) for each pts in obj.parts for each pt in pts debug.print pt.x, pt.y next next MapInfo MapX 培训教程 36 第五章 在地图中查找图元 概述 Layer 对象的 Find 方法使您可以搜索地图对象中的图层并定位该图层中的特定图元。 第一节 Find 对象 Find 对象使您可以定位地图中的图元。可以查找到线、符号或区域图元。为了能使用 Find 方法,所搜索的图层应包含索引字段。 例如,如果希望定位 NewYork 州内的 Albany 市,就可使用 Find 对象的 Search 方法 搜索城市图层和州图层来获得指定图元。 Find 对象方法。 方法 描述 代码示例 Search 执行搜索。 Set Found = Map1.Layers(“US _ Cities”).Find.Search(“Albany”, “NY”) SearchEx 向搜索函数返回“精确匹配”来扩展搜 索功能。 Find 对象属性可指定查找参数。 属性 描述 FindDataset 相匹配字段的数据集。如未指定,将使用图层的主关键词。 FindField 相匹配的数据集字段。和 FindDataset 属性一起使用。 RefineDataset 通过指定数据集和字段进行替代使用。 RefineField 精确搜索的字段。接受 Field 对象。 RefineLayer 用于精确搜索的图层。接受 Layer 对象。 Abbreviations 是否使用缩写字典(布尔型)。 ClosestAddr 使用在最精确地址处查找到的匹配(布尔型)。 OtherBoundary 使用在指定之外于边界处查找到的匹配(布尔型)。 精确搜索边界 Find.Search 的精确搜索边界用于区分具有相同名称的多个图元。例如,如果去 Albany 旅行,可能会在 New York、California 或 Georgia 结束旅程。当指出“Albany, New York” 时,State 就成为精确搜索边界。 以下示例代码显示了在装载窗体后将 USA 图层设置为精确搜索边界。 MapInfo MapX 培训教程 37 Private Sub Form_Load() '*********************************************************** 'Set the USA to be the refining layer when doing the find '*********************************************************** Dim fdObject As MapXLib.FindFeature 'Set the Refining Layer Set frmSelects.Map1.Layers("US Top 20 Cities”).Find.RefineLayer _ = frmSelects.Map1.Layers("USA") 第二节 FindFeature 对象 Find.Search 方法返回其在拥有 FindFeature 对象的窗体中查找到的图元。FindFeature 对象把查找到的 Feature 对象的属性存储起来作为自身的属性。此外,FindFeature 包含 FindRC 属性,该属性存储 Find 操作的结果代码。 FindFeature 对象是返回的匹配了最精确字符串的 Feature 对象的超类。 属性 描述 代码示例 FindRC 查找操作的结果代码。 MsgBox FoundObj.FindRC FindRC 属性是表明因何查找到或未查找到图元的原因的数字值。 结果代码 返回关于 Find 对象的信息,诸如因何查找到或未查找到等。这是一个数字结果代码。以下 图表描述了数字结果代码。 数字值 含义 **个位** xx1 精确匹配。 xx2 使用了来自缩写文件的替换。 xx3 ( - ) 未查找到精确匹配。 xx4 ( - ) 未指定对象名称;未查找到匹配。 **十位** x1x 街道一侧未确定。 x2x ( + / - ) 地址号码在最小/最大范围内。 x3x ( + / - ) 地址号码不在最小/最大范围内。 x4x ( + / - ) 地址号码未指定。 x5x ( - ) 街道不交叉。 x6x ( - ) 匹配的行没有地图对象。 **百位** 1xx ( + / - ) 除指定区域外,只在一个区域内查找到的名称。 2xx ( - ) 除指定区域外,在多个区域查找到的名称。 3xx ( + / - ) 未指定精确搜索区域,查找到一个匹配。 MapInfo MapX 培训教程 38 数字值 含义 4xx ( - ) 未指定精确搜索区域,查找到多个匹配。 5xx ( + ) 指定区域里多次查找到该名称。 一旦结果代码确定,您就能像以下示例所示,对选中事例使用该结果。用户在文本框中 输入要定位的城市和州。此输入被传送给 Find.Search 方法。一旦在主要的或次要的城市 表中定位了该城市,就将向地图添加注释并且在查找到此图元的位置重新居中并刷新该地 图。 'The code for a find command button Private Sub cmdFind_Click() 'Create a MapXLib for the feature found Dim FindCityObject As MapXLib.FindFeature 'Sets the find feature object to the city the user types in Set FindCityObject = Map1.Layers("US Top 20 _ Cities").Find.Search(txtCityName.Text, txtStateName.Text) 'Use result codes to determine if a city is found If (FindCityObject.FindRC Mod 10 = 1) Then 'Recenter the map to the city location Map1.ZoomTo 200, FindCityObject.CenterX, FindCityObject.CenterY Else 'Print out message box indicating city was not found MsgBox ("City not found") End If End Sub MapInfo MapX 培训教程 39 第六章 工具 概述 多数的地图化应用都提供一类工具来帮助完成普通的绘制任务(如在地图上画线)和导 航任务(如放大)。MapX 提供了几个常用的地图化工具,此外也可以创建自定义工具。 第一节 MapX 工具概述 内置工具 使用 MapX,你能够轻松地把普通的工具栏按钮应用到你的应用中。MapX 为多个常用 地图化工具提供了内置支持,其中包括: y 用户更改地图的比例和/或位置的导航工具(放大、缩小、漫游、居中)。 y 用户单击地图图元来进行标注的标注工具。 y 给予用户不同的方式来选择地图图元的选择工具集合。 对象创建工具,可创建地图图元。 选择工具为修改键(SHIFT 键、CTRL 键)提供内置支持:按住 SHIFT 键同时使用 选择工具,不选中图元;按住 CTRL 键同时使用选择工具,则把图元添加到选择结果中。 只要按下修改键,MapX 就会自动地显示不同的光标(加号或减号出现光标旁边),以便用 户理解该键的作用。 自定义工具 如果需要一种 MapX 没有提供的工具栏按钮,可以使用 Map.CreateCustomTool 方法 来创建自定义工具。 创建自定义工具时,需要控制创建工具的“类型”,即:就是要选择此工具是否允许用 户单击,或是单击并拖动来画线,或是单击并拖动来画矩形等等。也可以选择使用自定义工 具时显示的光标。 控制当前工具 要设定当前使用的工具,请设置 Map 对象的 CurrentTool 属性. 要激活一个标准工具,请把该属性设为某个 ToolConstants 常量。例如,转到放大工具: Map1.CurrentTool = miZoomInTool 如要激活自定义工具,请使用在运用 CreateCustomTool 方法时指定的 ToolNumber 值。 Map1.CurrentTool = 99 对象编辑工具 对象编辑工具使用户能在地图图层中创建和修改图元。有四种标准的对象创建工具:添 MapInfo MapX 培训教程 40 加点、 添加线、添加折线和 添加区域。这些工具把新的图元添加到那些用 Map.layers.InsertionLayer 属性指定的任一图层上。仅只能有一个插入图层,缺省值是无。 当没有插入图层而把当前工具设置成对象创建工具时将会导致错误。 MapX 也支持修改现存的地图图元。对于任何要更改的图层,若要编辑图元,必须把 Layer.Editable 属性设为 True。这样,内置的箭头工具就能用于在当前的选择结果中移动图 元或者调整其大小。若要移动选中的图元,只要简单地单击并拖动。若要改变选中的图元的 大小,请用编辑手柄拖动。若要删除选中的图元,请按 Delete 键。 可用的标准工具 不同的工具将会使鼠标能够完成多种任务。例如,如果当前的工具设成 miLabelTool, 那么当单击鼠标时,会在此特指的地图对象上放置标签。鼠标光标将根据正使用的工具更改 形状。 这些是 MapX 可用的标准工具: 工具 常量 描述 Add Line MiAddLineTool 向插入图层添加线图元 Add Point MiAddPointTool 单击从而向插入图层添加点图元。 Add Polyline MiAddPolyLineTool 添加折线图元到插入图层。 Add Region MiAddRegionTool 添加区域图元到插入图层。 Arrow MiArrowTool 单击标题或注释。并且,它也可用在可 编辑的图层中移动选中的图元或者改变 其大小。 Center MiCenterTool 单击鼠标使地图居中显示。 Label miLabelTool 单击图元进行标注。 Pan MiPanTool 拖动地图并重定位地图的中心。 Polygon Select MiPolygonSelectTool 单击鼠标画多边形;在多边形内的对象 被选中。 Radius Select MiRadiusSelectTool 拖动鼠标并选中在拖动半径内的图元。 Rect Select MiRectSelectTool 拖动鼠标选中在矩形内的图元。 Select Tool miSelectTool 单击选择图元。 Symbol miSymbolTool 放置符号注释。 Text miTextTool 放置文本注释。 Zoom In miZoomInTool 放大。 Zoom Out miZoomOutTool 缩小。 第二节 创建自定义工具 为任何应用创建自定义工具时,通常有三个常用步骤: 1. 创建工具。 2. 编写工具的处理过程(反映工具实际上所做的代码)。 3. 使用工具(把工具交付给用户)。 MapInfo MapX 培训教程 41 创建工具 若创建自定义工具,请调用 CreateCustomTool 方法。 以下示例创建了自定义 Ruler 工具。Ruler 工具的用途是确定地图上两点之间的距离。 首先我们声明一个等于 500 的常量 RULERTOOLID 来代表我们的自定义工具。然后,当 装载该应用的主窗体时,创建该工具。 Const RULERTOOLID = 500 ‘This goes in the General declarations. Private Sub Form_Load() Map1.CreateCustomTool RULERTOOLID, miToolTypeLine, miSizeCursor End Sub 在以上 CreateCustomTool 的调用中,指定了三个必选参数:ToolNumber、Type 和 Cursor。ToolNumber 是创建来代表该工具的 RULERTOOLID 常量。Type 是决定工具行为 的 ToolTypeConstants 值。在这里,指定为使用户可以用该工具拖动鼠标来画直线的 miToolTypeLine 常量。Cursor 指定为 miSizeCursor 常量,这意味着当工具被选中时,它会 以方向光标的形式出现。 CreateCustomTool 有两个可选的参数,它们也取 CursorConstants 常量值。 CursorConstants 指定在自定义工具中可使用的光标。当自定义工具是 CurrentTool 时,由它 们定义光标的形状。 说明:请参阅《MapX 参考指南》或联机帮助上关于 CursorConstants 的完整列表。 ShiftCursor 指定当 键按下时工具的光标形状。CtrlCursor 指定当 键按下时光标的形状。如果想让工具行为与这些键相联系时,这两个参数是有用的。 若要使自定义工具成为活动工具,请设置 CurrentTool 属性。例如,可以在 Visual Basic 窗 体中放置一个按钮,当用户单击这个按钮,就可以设置 CurrentTool 属性。 可用的自定义工具类型 ToolTypeConstants 描述当创建一个自定义工具时可使用的工具类型。它们描述工具的 行为(例如,miToolTypeLine 使用户可以画线;miToolTypeCircle 使用户可以画圆等)。 常量 行为 miToolTypePoint 在指定位置显示点。 miToolTypeLine 画线。 miToolTypeCircle 画圆。 miToolTypeMarquee 画选取框,并选在此框中选择地图对象。 miToolTypePoly 画折线。 miToolTypePolygon 画多边形。 Ruler 自定义工具创建以后,需要为该工具实际要做的编写代码。 编写工具处理过程 工具的代码在两个不同的时刻执行:在工具使用过程中,或者使用工具之后。对于自定 义的 Ruler 工具,要在工具使用时执行代码,因为此时正是需工作的时候。 自定义的 Ruler 工具的操作方式为:当用户使用它单击在一个地图位置时,工具的距 离测量的开始点被标记。用户按下鼠标按钮并且在地图上移动鼠标,然后把鼠标停在另一个 MapInfo MapX 培训教程 42 位置。这样标记工具距离测量的终点。然后 Ruler 工具计算两点间的距离。要做到这样, 需要在用户按下鼠标按钮时,在地图上移动鼠标时和把鼠标停在另一点时执行 Ruler 工具 的代码。要在用户按下鼠标时捕获起始点,需要在 MouseDown 事件中写如下代码: Dim XDown As Double Dim YDown As Double Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Map1.CurrentTool = RULERTOOLID And Button = vbLeftButton Then Map1.ConvertCoord X, Y, XDown, YDown, miScreenToMap End If End Sub 当用户单击按下鼠标,MouseDown 事件被激活。在 MouseDown 事件中的代码获取用 户所单击点的 X,Y 坐标,然后把它从屏幕坐标转化为地图坐标,并储存在全局变量 Xdown 和 Ydown 中。Xdown 和 Ydown 代表距离测量的起始点。 要捕获当用户移动鼠标在另一点停下时得到的终止点,需要在 MouseMove 事件中编写代 码。 Private Sub Map1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Map1.CurrentTool = RULERTOOLID And Button = vbLeftButton Then Dim MapCoordX As Double, MapCoordY As Double Map1.MapUnit = miUnitMile Map1.ConvertCoord X, Y, MapCoordX, MapCoordY, miScreenToMap fMainForm.sbStatusBar.SimpleText = Map1.Distance(XDown, _ YDown, MapCoordX, MapCoordY) & " miles" End If End Sub 这段代码将持续执行直到用户停止移动鼠标并释放鼠标按钮。代码执行的最后一次是鼠 标停止移动之前在地图上经过的最后一点,也正是距离测量的终止点。把点从屏幕坐标转化 到地图坐标,然后使用 Map 对象的 Distance 方法计算两点之间的距离。结果则显示在表 状态栏里。 ToolUsed 事件 在许多时候可能都需要在工具使用后再执行工具代码。比如用户画圆,并在鼠标按钮被 释放以后,计算在该圆半径内的客户数量。如果这是工具需要的功能,则要使用 Map 对象 的 ToolUsed 事件来放置代码。 此示例说明: y 使用 Map.CreateCustomTool 方法创建自定义“line”工具(使用户能拖动鼠标来画线的工 具)。 y 当用户使用自定义工具时用 ToolUsed 事件实现操作。 ' The following code in the Form_Load event of a form with ' a Map Object (Map1) creates a Custom Tool that is a ' "line-type" tool (it lets the user click and drag). Private Sub Form_Load() Map1.CreateCustomTool 1, miToolTypeLine, miIconCursor MapInfo MapX 培训教程 43 End Sub ' The following code (ToolUsed event)is called whenever any ' tool is used on the map. ' If the Current Tool is #1 (created above) then the code ' within the If-Then statement will be true, and we will set the caption of a label "lblDistance" equal to ‘the Distance passed in with the "line-type" tool. Private Sub Map1_ToolUsed(ByVal ToolNum As Integer, ByVal X1 As Double, ByVal Y1 As Double, ByVal X2 As Double, ByVal Y2 As Double, ByVal Distance As Double, ByVal Shift As Boolean, ByVal Ctrl As Boolean, EnableDefault As Boolean) If ToolNum = 1 then lblDistance.Caption = Str$(Distance) End If End Sub 把工具交付至用户 若要“把工具交付至用户”,请把 Map 对象的 CurrentTool 属性值设置成该工具: Map1.CurrentTool = miZoomInTool -或者- Map1.CurrentTool = 99 第三节 创建多边形绘制工具(Polytools) polytool 是可使用户重复单击的工具例如,画多边形或者折线。 标准的 Polytools MapX 提供了标准的多边形选择工具。该工具允许用户画多边形,然后选择所有质心落 于该多边形内的图元。只有可选图层才能够被搜索,无缝图层、栅格以及用户自定义的图层 被忽略。 若要激活该工具,请把 CurrentTool 属性设置为 miPolygonSelectTool(值为 1010)。 当使用这个工具时,PolyToolUsed 事件被激活。若用户双击、按空格或者回车结束多边形 (miPolyToolEnd)时,则执行搜索,并且 miPolyToolEnd(1)将传递给 PolyToolUsed 事 件。如果用户是用 ESC 键结束的多边形,则取消查询; miPolyToolEndEscaped(2)传递给 PolyToolUsed 事件。用户可以删除线上所有的节(退格键删除)。当最后一个节被删除后, 会发送一个(2)标志。 自定义 Polytools 若要创建自定义 polytool,请调用 CreateCustomTool 方法,并指定 ToolTypeConstants 的值为 miToolTypePoly。 若要激活自定义 polytool,请设置 CurrentTool 属性。 MapInfo MapX 培训教程 44 无论何时用户选择你的自定义 polytool 并在地图上使用它,MapX 都会调用 PolyToolUsed 事件。因此,需要把代码添加在 PolyToolUsed 事件过程中,以使你的工具生 效。 使用自定义 Polytools 示例 一旦已经使用了 CreateCustomTool 方法创建 polytool 工具,就可以看看以下的示例是 如何处理 PolyToolUsed 事件的。这个示例让用户在图层1上绘制区域或是线。此示例使用 了图元对象。它也用到了 Parts 对象,在联机帮助和《MapX 参考指南》中会对该对象给出 解释。 Private Sub map1_PolyToolUsed(ByVal ToolNum As Integer, ByVal Flags As Long, ByVal pts As Object, ByVal Shift As Boolean, ByVal Ctrl As Boolean, EnableDef As Boolean) If Flags = miPolyToolBegin Then 'Someone's beginning the use of a PolyTool... ElseIf Flags = miPolyToolEnd Then ' The user finished using a PolyTool by double clicking If ToolNum = MY_SUPER_POLYGON_TOOL Then ' They used MY_POLYGON_TOOL! Make a new ' region feature and add it to the first layer dim f As New Feature set f = map1.FeatureFactory.CreateRegion (pts, map1.defaultstyle) map1.Layers(1).AddFeature f ElseIf ToolNum = MY_SUPER_POLYLINE_TOOL Then dim f As New Feature map1.Layers(1).AddFeature f End If ElseIf Flags = miPolyToolEndEscaped Then ' The user hit 'Esc' or backspaced all the nodes ' away... don't add anything in. End If End Sub MapInfo MapX 培训教程 45 第七章数据绑定 概述 数据集使您可以在地图绑定用户数据。例如,如果现在有关于县市销售的 Microsoft Access 数据库以及反映推销人员位置的 Lotus Notes 数据库,那么就可以把这些数据绑定到 地图上,并且可以在两套数据集之间标注趋势或显示数据的相关性。 第一节 数据绑定的概念 所谓数据绑定,就是将数据从数据源放入 MapX 的处理过程。 现今的商业中有许多不同类型的数据库,因此,MapX 使您得以对几种不同类型的数据源进 行绑定。 将自己的数据绑定到地图上有两个主要优点: y 能在地图上以图元浏览数据。 y 可首先向地图绑定属性数据,然后基于这些数据创建专题渲染地图。 第二节 怎样向地图添加数据 有两种方法进行数据绑定: y 如果有 Visual Basic 的绑定数据控件,就可以在设计时使用 Map 对象的 DataSet 属性。 y 通过使用 DataSets.Add 方法编程来绑定数据。 此数据绑定过程会创建 DataSet 对象。这个添加到 DataSets 集合中的 DataSet 对象, 包含了数据绑定到地图图层中的图元的计算值。例如,如果数据已绑定到美国的州地图上, 那么每个州将会有新的数据值用来控制各州的绘制。如果在数据源中某个州有多条记录,则 这些值会被求和,求平均值或计数。DataSet 的 Value 属性可用来访问地图中每行(即图元) 的计算过的数值。 对于大多数数据绑定类型,DataSource(DataSets.Add 的第二个参数)其实是一种 OLE 接 口。MapX 通过这个接口直接从数据源中访问数据。数据并没有真正传递给 DataSets.Add。 第三节 DataSet 对象和 DataSets 集合 DataSet 对象是在从数据源向 MapX 绑定数据的过程中生成的。 DataSet 包含了数据绑定的地图图层中图元的计算过的值。数据源可能是 DAO 记录 集,ODBC 数据源等形式。 DataSets 集合是代表地图中所有 DataSets 的对象。DataSets 集合的方法和属性用来添 加,删除 Dataset 对象,或者在集合中使用现有的 DataSet 对象。 MapInfo MapX 培训教程 46 下表中列出了从指定的集合中添加或删除 DataSet 对象的方法: 方法 描述 代码示例 添加 创建特定数据集并将它添加到 该集合中。 Set ds = Map1.Datasets.Add _ (miDataSetDAO, rs) 删除 从 Datasets 集合中删除指定的 DataSet 对象。 Map1.Datasets.Remove 2 DataSets.Add 方法 使用 DataSets.Add 方法,可向 MapX 绑定来自数据源的数据。使外部数据源和地图建 立联系。语法如下: DataSets.Add Type, SourceData, [Name], [Geofield], [SecondaryGeofield], [BindLayer], [Fields], [Dynamic] Type 参数 此参数用来说明所添加数据集的类型。它获取 DataSetTypeConstants 的值。下面列出的是 DataSet 类型常量: Type 参数 描述 miDataSetADO ADO miDataSetDAO Data Access Object miDataSetDelphi Delphi Native miDataSetDelphi4 Delphi4 miDataSetGlobalHandle 以 Tab 键分隔的数据 miDataSetLayer MapInfo 表 miDataSetNotesQuery Lotus Notes Query miDataSetNotesView Lotus Notes View miDataSetODBC ODBC 数据库 miDataSetOEO Oracle express Objects miDataSetOLEData OLE datasource miDataSetRDO RDO miDataSetSafeArray Safe Array miDataSetUnbound MapX 从容器中请求数据 SourceData 参数 该参数用来引用数据,随 Dataset 类型的不同而不同。 下面是每一种数据集类型的有效数据源: Dataset 类型 有效源数据 miDataSetADO ADO 表 miDataSetDAO DAORecordset 对象. MapInfo MapX 培训教程 47 Dataset 类型 有效源数据 miDataSetDelphi Delphi Native miDataSetDelphi4 Delphi4 记录集 miDataSetGlobalHandle VT_I4 类型的变量且 lVal 相当于全局内存句柄. miDataSetLayer MapInfo 表 miDataSetNotesQuery Lotus Notes Query miDataSetNotesView Lotus Notes View miDataSetODBC ODBCQueryInfo 对象 miDataSetOEO Oracle express 对象 miDataSetOLEData 被 Datasets.Add 忽略 miDataSetRDO RDO 表格 miDataSetSafeArray Safe Array miDataSetUnbound 无类型(对应地,使用 RequestData 事件访问只有程序员知道的数据 格式)。 Name 参数 该参数为唯一标识数据集的字符串。属于可选参数,如果不指定,则缺省名为 DataSetN, 其中“N”为 Datasets 集合中的数字。 Geofield 参数 该参数是数据源中包含地理信息的列名称或索引。如果该参数未指定,则 MapX 搜索 所有字段,以决定数据源中哪一列包含了 GeoDictionary 中指定的地理信息。此字段不必是 地理数据字段,因为它可能是诸如邮政编码之类的唯一关键列。但是,如果已经知道数据源 中的哪一列包含了地理信息,则应当指定它。 如果打算在地图上查看图元数据,那么数据源中的 GeoField 列必须是唯一的。GeoField 列用来为新点层的图元命名。若值不唯一,则将导致在新点层中添加的只是单个点,该点是 在多个重复关键值中首次遇到的,并且将会聚合重复行中的数据值。 如果指定了 Fields 集合,Geofield 参数引用 Fields 集合的列,而不是数据源的列。请 参阅下面的 Fields 参数。 Secondary Geofield 参数 此参数只有当绑定数据集的图层存在不唯一关键列时才需要。例如,使用 MapInfo 表 “United States Counties” 绑定数据就需要依靠 Secondary geofield 参数,因为一个州中的 县名是不唯一的。可能存在在表中的多个州都有县名为 “Warren” 或 “Washington” 的 情况。这样,在数据绑定过程中,就需要更多的信息以解决可能存在的模棱两可的情况。什 么时候绑定数据到 New York 的 Warren,又是什么时候绑定到 New Jersey 的 Warren 呢?通 过指定 “County” 列作为 Geofield 以及 “State” 列作为 Secondary Geofield, MapX 经 MapInfo MapX 培训教程 48 过对各州中的县名的精确数据绑定处理,就能够辨别出绑定到 New York 的 Warren 数据和 绑定到 New Jersey 的 Warren 数据(这和创建 Find 对象的 Refining Boundary 概念相同。 请参阅在地图中查找图元)。 如果指定了 Fields 集合,SecondaryGeofield 参数会引用 Fields 集合中的列,而不是 源数据中的列。 BindLayer 参数 如果正在绑定属性数据,则此参数指定和数据连接的地图图层,或者,若引入的数据被 地理引用到到点引用文件中(如:邮政编码)或包含经/纬度值,则指定一个 BindLayerObject。 这是可选参数,如果没有指定,则 MapX 会搜索 GeoDictionary 中的图层去连接。 如果已知要绑定的地图图层,基于性能的原因,应当指定它。匹配 BindLayer 时, Geofields 必须唯一。否则只匹配不唯一设置的数据中的第一项。其余的则被忽略。 Fields 参数 该参数是 Field 对象集合中的 Fields 对象。Field 对象用来描述导入数据源的字段,以 及当匹配特定地图图元的数据源记录多于一个时,使用的聚合函数。这将建立要绑定到地图 的字段(列)集合。它是可选参数,如果没有指定,则导入所有列,并且如果每个图元有多 个记录,对数据值求和。本章后面更详细地讨论了 Fields 集合。 如果指定了 Fields 集合,则 Geofield 和 SecondaryGeofield 参数会被指定为 Fields 集合中的列,而不是源数据中的列。 Dynamic 参数 该参数的值为布尔型,控制数据绑定是否是动态的。它是可选的,未指定时默认为 False, 即静态绑定数据。(即,当数据库打开时 MapX 复制所需数据)。如果此参数指定为 True, MapX 只在需要数据时实时访问数据(例如,在标注时)。如果此参数指定为 True 但数据集 不支持动态列,则会导致异常。 DataSets.Add 的简单实例 下面的代码从 MSAccess 数据库“MapStats”中打开 US_Cust 表,该数据库在 MapInfo MapX 4.0 目录下的 DATA 文件夹中。 Dim ds As Dataset Dim db As Database Dim rs As Recordset 'Open the MapStats.MDB Databasse Set db = DBEngine.Workspaces(0).OpenDatabase( _ "C:\Program Files\MapInfo MapX 4.0\Data\Mapstats.mdb") 'rs is the sourceData recordset which is an MS Access table MapInfo MapX 培训教程 49 Set rs = db.OpenRecordset("US_Cust") 'Add the dataset to the map Set ds = Map1.Datasets.Add(miDataSetDAO, rs) 第四节 使用 Fields 集合 数据源有多个数据列。MapX 管理绑定的每一列数据,因此应当只绑定地图上所需的数 据(例如,想要进行专题化地图或标注用的数据)。用 DataSets.Add (Fields) 的最后一个 参数来建立要绑定到地图的字段(列)的 Fields 集合。 说明:声明字段变量时使用“MapXLib.Fields”。这样可防止与 DAO "Fields" 对 象发生冲突。 Dim flds As New MapXLib.Fields 可以通过 Dataset.Fields 的属性访问数据集的 Fields 集合。 方法 描述 代码示例 Add 向 Fields 集合中添加一个字段 flds.Add “Sales”, “Sum_of_Sales” _, miAggregationSum Remove 从 Fields 集合中删除一个字段 flds.Remove 3 RemoveAll 从该集合中删除所有 Field 对象 flds.RemoveAll Fields.Add 方法 Fields.Add 方法使您得以将数据源中的一列数据作为字段添加到 Fields 集合中。Fields 集合使用 DataSets.Add 方法建立。Datasets.Add 的 Fields 参数获取 Fields 集合,并使用 Add 方法建立它。一旦数据集已经创建,就不能再将 Add 方法用在数据集的 Fields 集合 上。 Fields.Add 的语法规则如下所示: Fields.Add DataSourceCol, Name, [AggregateFunction], [Type] 部件 描述 DataSourceCol 数据源的列名或列索引。 Name 欲添加的字段名。 AggregateFunction 所使用的聚合函数。此参数获取 AggregationFunctionConstants 值。 Type 列中的数据类型。此参数获取 FieldTypeConstants 值。此参数仅用 于非绑定 DataSets。其它 DataSet 类型则忽略它。 数据聚合 Fields.Add 方法的 Aggregate Function 参数决定当多匹配情况出现时 MapX 怎样计算 Field 的值。 下面是用于处理多匹配情况的聚合: MapInfo MapX 培训教程 50 Aggregation Function 常量 常量 描述 MiAggregationSum 数据求和。 MiAggregationAverage 求数据平均值。 MiAggregationIndividual 拖进每一个单独记录里。 MiAggregationCount 对记录计数。 下面的示例显示了怎样从 DAO 记录集数据源创建字段集合,以及随后如何用 Fields 集合向数据集添加数据。 Private Sub cmdOK_Click() Dim ds As MapXLib.Dataset Dim rs As Recordset Dim i as integer Dim flds As New MapXLib.Fields 'Open the recordset selected from a list box Set rs = db.OpenRecordset(DatasetsList.Text) 'Use the AggregationFunction constant selected from a combo box Dim AggregateTypeNum As Integer Select Case AggregateType.ListIndex Case 0 AggregateTypeNum = miAggregationSum Case 1 AggregateTypeNum = miAggregationAverage Case 2 AggregateTypeNum = miAggregationCount Case 3 AggregateTypeNum = miAggregationIndividual Case 4 AggregateTypeNum = miAggregationAuto End Select 'Loop through the DAO fields of the Recordse ' and add them to a MapX Fields collection. For i = 0 To rs.Fields.Count - 1 flds.Add rs.Fields(i).Name, rs.Fields(i).Name, AggregateTypeNum Next 'Add the dataset, using the fields collection Set ds = Map1.Datasets.Add( miDataSetDAO, rs, "US State Data", , , , flds) MsgBox "Dataset " & DatasetsList.Text & " Added" MapInfo MapX 培训教程 51 Unload Me End Sub 第五节 将数据显示为点图层(BindLayer) BindLayer 数据绑定是数据绑定的一种类型,它用来在由数据指定的位置处创建新的点 图层。通常在下面两种情况下使用: y 数据包含 x 和 y 坐标时(如经度和纬度)。 y 在指定的位置创建点。 y 数据包含参照信息时,例如 Zip Codes。 当绑定数据具有 X/Y 坐标或点信息(例如 Zip Codes)时,以及想要在新的或已存在 的图层上看到由数据指定位置的点时,就需要用到 Bindlayer 对象。 使用 BindLayerObject 添加数据集时,这些点会自动显示在地图上。如果没有用 BindLayerObject 添加数据集,则点是不会自动显示的。只有 BindLayerObjects 才有这种行 为。 BindLayer 对象属性 属性 描述 值 LayerType 指定数据绑定图层的图层类型。 A BindLayerTypeConstant: • MiBindLayerTypeNormal • MiBindLayerTypeXY • MiBindLayerTypePointRef CoordSys 指定创建图层的坐标系统。 CoordSys 对象 FileSpec 标识文件名及文件路径的文本字符 串. A StringValue KeyLength 正数,代表结果图层中字符串列的 期望大小。 (1-254)之间的正整数值。 LayerName 如果 LayerType 是 miBindLayerTypeNormal ,则指定 要绑定数据的图层名称。如果 LayerType 是 miBindLayerTypeXY 或 miBindLayerTypePointRef ,它 则表示新创建图层的名称。 字符串值 RefColumn1 当 LayerType 是 miBindLayerTypeXY 时,该字段包 含经度,当 LayerType 是 miBindLayerTypePointRef 时。该字 段包含的是参数值(例如 ZIP Code)。 列的字符串或整型参数 (one-based 索引)。 RefColumn2 当 LayerType 是 miBindLayerTypeXY 时,指定该字 段包含纬度。 列的字符串或整型参数 (one-based 索引). MapInfo MapX 培训教程 52 属性 描述 值 ReferenceLayer 如 BindLayer.LayerType 是 miBindLayerTypePointRef,则指定 要使用的参照文件的名字。 字符串。 使用 BindLayer 对象的操作步骤如下: 1. 创建 BindLayer 对象。 2. 当通过 datasets.Add 方法中的 BindLayer 参数传递此对象来添加数据集时, 使用它。 下面显示了如何创建 BindLayer 对象并显示 X/Y 或者点参数数据。 在地图上将 X/Y 数据作为点图层显示 如果数据包含 X/Y 坐标,就可以通过数据绑定创建并显示点图元图层。使用 BindLayer 对象,并设置: y LayerType 属性为 miBindLayerTypeXY。 y RefColumn1 属性为包含 X 坐标值的列名或索引(one-based)。 y RefColumn2 属性为包含 Y 坐标值的列名或索引(one-based)。 示例 Dim BindLayerObject As New MapXLib.BindLayer Dim flds As New MapXLib.Fields Dim db As Database Dim ds As MapXLib.Dataset ' Get the recordset to map ' MapStats Access database ' Has Longitude, Latitude columns Set db = DBEngine.Workspaces(0).OpenDatabase( _ "C:\Program Files\MapInfo MapX 4.0\Data\Mapstats.mdb") Set rs = db.OpenRecordset("US_Cust") rs.Movelast Debug.Print "Record Set has " & rs.RecordCount & " records." ' Fill in the Bindlayer object BindLayerObject.LayerName = "US Customers" 'Name of new layer BindLayerObject.RefColumn1 = “X” ' "Longitude" ' Use Column number (one'based!) or Column name BindLayerObject.RefColumn2 = “Y” ' "Latitude" BindLayerObject.LayerType = miBindLayerTypeXY 'Type for X/Y binding Debug.Print "Finished setting up Bind Layer" Set ds = Map1.Datasets.Add(miDataSetDAO, rs, "U.S. Customers" _ , "City", "State", BindLayerObject) Debug.Print "Finished adding dataset" MapInfo MapX 培训教程 53 使新点图层变为永久图层 使 BindLayer 对象创建的新点图层成为永久的 MapInfo 表是很容易的。使用 BindLayer.Filespec 属性或者指定文件的名字和位置,使得 Datasets.Add 方法能够创建永久 图层来替代临时图层。如果不指定这个属性,则图层就是临时的。 第六节 使用 GeoDictionary 进行数据绑定 MapX 使用 GeoDictionary 文件(默认名是 GEODICT.DCT )记录与数据绑定有关的 信息。 使用 DataSets.Add 方法时,MapX 能够分析数据,然后决定怎样绑定数据到地图上去。 此方法有以下自动行为: y 确定数据源中哪一列包含地理信息。 y 确定绑定到哪个图层。 这两个操作都是可选的。有参数使您得以明确地指定包含地理信息的是数据源中的哪一 列,或者哪一个地图图层将用来绑定数据。如果知道这些值中的任一个,就应当明确地指定 它们以提高性能。 为使 MapX 能够绑定数据到地图图层上,下面的几个条件必须确保为真: 1. 此地图的地理关键列需要被索引 2. 此地图和它的关键列必须在 GeoDictionary 中指定 第七节 数据绑定使用的 MapX 事件 一旦数据源的某列被定义为地理列,并且确定了绑定数据的地图图层,则绑定就开始进 行。数据源的每一行都和一个图元相匹配且数据将会带入地图。如果某包含地理列的行和图 元不匹配(或许是键入错误 [“NA” 代替 “MA”] 或仅是一个非地图上的值 [“Puerto Rico”]),则 DataMismatch 事件被激活来通知容器。可以忽略 DataMismatch 事件,这种 情况下 MapX 将简单地忽略此行。 在自动数据绑定期间,如果数据有模棱两可的情况,MapX 就会调用 ResolveDataBind 事件。 在使用“非绑定”类型数据的数据绑定期间,使用 RequestData 事件建立循环,使得 容器一次一个单元地向 MapX 提供数据。 刷新数据集 因为数据源中的数据被聚合后储存在 MapX 中,所以当数据源中的数据发生变化时, MapX 并不反映这种变化。DataSet.Refresh 方法使得 MapX 重读数据源并重新聚合,然后 再次储存它。但是,这样会消耗很长时间。DataSet.Refresh 对创建新点图层的 DataSets 无 效。 说明:当数据源中有新添加的行时,此方法并不在图层中添加新图元。 MapInfo MapX 培训教程 54 第八章 从 DBMS 中访问数据 概述 MapX 提供有空间服务器访问功能。这是个强大的功能,它允许开发者连结存储在空间 服务器内的动态实时数据,例如运行在 Oracle、Informix、DB2 数据库,或者 Oracle 8i Spatial 数据库上的空间服务器 MapInfo SpatialWare。空间服务器允许各公司在其企业数据库中寄 存地图数据,以便于集中管理和确保安全性。空间服务器,如 SpatialWare,为组织的空间 数据提供了高级查询处理以及在服务器上增强性能。 第一节 访问远程空间数据 在 MapX 中可以使用不同的 DBMS 服务器访问地图图层数据。 y 可以使用 Layers.Add 方法用来自 DBMS 的数据来添加图层。有以下两种方法: y 当需要在运行状态下动态计算查询时,随 LayerInfo 对象一起使用 Layers.Add 方法。这 适合于有新数据输入的情况。例如,现有一个应用程序,用来确定已产生用户输入税收量的 商店的位置。通过该应用程序输入的税收值在程序设计阶段是未知的,因此,只能在运行状 态下添加到查询中。这种方法用来取代前面的 AddServerLayer 方法。 y 当查询在设计阶段已知时,和 .tab 文件一起使用 Layers.Add 方法。例如,如果应用程序 要求显示所有在役的火警消防拴,那么就可以设置查询为选择所有消防拴,同时将在役条件 设置为真。这个设置在程序设计阶段完成。可以直接将 .tab 文件放到 geoset 中,只要确保 当任何使用 geoset 的程序初始化时,都装载了该文件。 说明:MapX 4.0 不支持打开 SpatialWare 3.0 的或者更低版本的表。 对 LayerInfo 对象使用 Layers.Add 方法 使用 LayerInfo 对象访问 DBMS 的示例 Dim lInfo As Object Dim lStr As String Set lInfo = CreateObject("mapx.layerinfo.4") lInfo.Type = 4 ' layer type is RDB lInfo.AddParameter "NAME", "city_125" 'layer name lInfo.AddParameter "TOOLKIT", "ODBC" ' use "ORAINET" for oracle direct access lInfo.AddParameter "CONNECTSTRING", "DRIVER={SpatialWare 32 Bit _ Driver4.00};HOST=Champagne;UUID=oracle;UPWD=secret;UID=GEORGETOWN; MapInfo MapX 培训教程 55 PWD=secret;OSID=DB1;DLG=0" lInfo.AddParameter "QUERY", "SELECT * FROM CITY_125" lInfo.AddParameter "CACHE", "ON" lInfo.AddParameter "MBRSEARCH", "ON" g_map.Layers.Add lInfo Set lInfo = Nothing 通过 .tab 文件访问远程表 可以通过创建 .tab 文件,以提供对远程地图的访问。要使用 MapInfo Professional 产 生 .tab 文件,请选择文件>打开 命令打开 DBMS 表。 .tab 文件是文本文件,可以使用任何文本编辑器创建 .tab 文件。创建了 .tab 文件后, 就可以在编程时通过 Layers.Add 方法或通过 Geoset Manager ,像访问任何其它 MapInfo .tab 文件一样访问该文件。 示例(ODBC) 这是一个使用 ODBC 为 SpatialWare 图层建立 .tab 文件的示例。 !table !version 500 !charset WindowsLatin1 Definition Table Type ODBC begin_metadata "\IsReadOnly" = "FALSE" "\DATALINK" = "" "\DATALINK\Query" = "SELECT * FROM CITY_125" "\DATALINK\ConnectionString" = DRIVER={SpatialWare 32 Bit Driver4.00};HOST=Champagne;UUID=oracle;UPWD=secret;UID=GEORGETOWN; PWD=secret;OSID=DB1;DLG=0 "\DATALINK\ToolKit" = "ODBC" "\CACHE" = "OFF" "\MBRSEARCH" = "ON" end_metadata 第二节 Oracle8i 支持 MapX 4.0 新增了支持 Oracle8i 的功能。可在安装 MapX ODBC Connectivity 组件时加 上 Oracle8i。Oracle8i Spatial 是 Oracle 公司新实现的一种空间数据库。MapX 通过 OCI 支 持和 Oracle8i 建立同步连接,通过 ODBC 和其它数据库建立连接。 MapInfo MapX 培训教程 56 Oracle8i 需求 要想在 MapInfo 内部和 Oracle8i 连接,就必须安装 Oracle8i 的客户端。 连接对话工作区 对于 Oracle8i 来说,如果没有指定完整的连接字符串,那么就不能显示连接对话框。 “DLG=” 选项将无效。如果不能提供 userID 和口令,则连接失败。由于由 MapInfo Professional 创建的 DBMS 表 .tab 文件不包含口令(为安全起见),那这将引起打开 tab 文 件失败。 解决这个问题的途径是写一段简单的连接会话,使用该会话从用户处取得口令,并使用有连 接字符串的 layerinfo 定义 DBMS 图层的 Layers.Add 对象,该字符串要访问的数据库的 userID/password。Oracle 连接字符串将会指定如下: "SRVR=superior;UID=user1;PWD=secret;" 添加临时层。这将同时添加在连接池中所期待的连接。由于口令已被识别,所以用此口 令打开的同一数据库中的所有 tab 文件都将使用这种连接。就这样,.tab 文件就成功地打 开了。 若想在 geoset 中使用这些 tab 文件,就必须在应用程序启动时放置此登录。 第三节 DBMS LayerInfo 参数 .tab 文件和 LayerInfo 对象都接受相同的参数。但参数名的命名习惯稍有不同。 参数 描述 Query 这是决定数据表内容的 backend DBMS 查询。若想使数据表可以地图 化,就必须选定空间对象列(或虚假列 OBJECT)。SpatialWare 的用 户可指定返回空间对象的 GISSQL/Server 特定 SQL 字符串/声明。另 外,SpatialWare 用户必须包含 SW_GEOMETRY 和 SW_MEMBER 列,SpatialWare 用它们来存储地理对象和 IDs. ConnectionString 这是与 DBMS 连接的必要信息。对 ODBC 来说,Connection 指定了 ODBC 连接字符串。如果已指定了完整的连接字符串,则建立了没有对 话框的连接。如果未提供连接字符串,则使用默认的带“DLG=0”的字符 串,此时,出现 ODBC Data Source 对话框。对 Oracle Spatial 来说, 必须用 userid 和口令指定完整的字符串。不会应用 DLG 关键字且不 会出现连接对话框。Oracle 直接连接字符串看起来象这样: "SRVR=superior;UID=mapx;PWD=secret" Cache 值为 “ON”/“OFF”,默认为 “ON”。此参数控制在绘制图层时,是否隐 藏获得的数据。此隐藏有助于提高以后的重画,平移/缩放(在隐藏区内), 标注和专题化的性能。巨大图层的隐藏会由于用尽内存而丢失隐藏的 值。 MapInfo MapX 培训教程 57 参数 描述 MBRSearch 值为 “ON”/“OFF” 两种,默认是 “ON”。当 MapX 绘制地图时,它从 图层中获得地图边界内的数据。为了在 dbms 图层中这样做,要添加空 间谓词到表定义查询中去。对于某些类型的查询,或存在 Spatioal 索引 问题的 onm 图层,此谓词可能减慢或引起查询失败。此选项使得可以 关掉空间谓词。 Name 这是为图层提供名称/别名的必要字符串。 ToolKit 值可以是 “ODBC”/“ORAINET”,默认是 “ODBC”。此参数指定了要连 接到服务器数据库 的 DBMS 访问组件。对于 Oracle direct,指定为 ORAINET 并使用 ORAINET 连接字符串。其它的则指定为 ODBC。 DBMS 连接字符串格式 ODBC 连接字符串的格式和 MapInfo Professional ODBC/ Linked 表中的相同。该字符串由 几个以分号(;)相分隔的子句定义。各子句的格式均为 “Key=Value”。下表列出了一些重 要的关键词。 部件 描述 DSN= 指定 ODBC 数据源的名称。注意:如果使用了 “DSN=” 语法关 键字,那么指定的名字必须和正在使用的用户系统中的数据源的 名字相匹配。请注意有时不同的用户可能对同一数据源使用不同 的名字。如果不能预先知道使用的数据源名称,则请使用 “DRIVER=” 语法关键词代替 “DSN=” 语法关键词。 DRIVER= 明确指定所安装的 SpatialWare 的驱动程序名或 IUS 驱动程 序。被用来代替 “DSN=” 语法关键词。示例: DRIVER={SpatialWare 32 Bit Driver} 说明:Informix 2.80.0861 根本不支持 “DRIVER=”。 UID= 如果需要,为数据源指定期望的 UserId。 PWD= 如果需要,为数据源指定用户口令。 DLG= 控制连接对话框显示的数值: 0 --取消连接对话框(为 MapX Theme 所要求); 1 --显示连接对话框; 2 --显示连接对话框,但只 在需要时才显示(例如,如果没有提供全部要求的信息)[默认]。 SRVR= 反映在 Oracle8i EasyConfig 中设置的值。此为 Oracle8i 连通时 所要求。 第四节 访问属性数据 要使用所有有用的数据列,请指定诸如 “Select * From 数据表名”的查询。可以无须 指定 * (星号);而可以特别指明那些要使用的列来代替它。为使执行达到最好的性能,请 限制查询使其只在所需要的列中寻找。 要访问在查询中所选择的 DBMS 图层的空间对象,请以类型为 midatasetlayer 的数据 集使用 datasets.add 方法(从现有的图层中取得这些属性)。 添加 DBMS 图层时,为优化性能,在查询中最好只指定在应用中所要使用的列。如果 未指定,则那些空间列、关键值列、要用来进行标注的列或是要用来创建专题的列会自动添 MapInfo MapX 培训教程 58 加进来。而对所有可在地图上表示的表都可使用虚拟列 “OBJECT”来引用包含空间数据 的列。这是在带有 X/Y 列并使用 MapMarker MDIGEOADDRESS 列的表所需要的。 说明:可以使用任何服务器方表达式/函数来指定列。同样,要避免在实际应 用中从表中选择所有。 下面的代码示例将打开 MapInfo *.tab 文件,然后访问远程数据并将它绑定到图层上。现在 就可以基于这些列来进行标注或是放置专题。 Dim Lay As Layer Dim dsname As String Set Lay = Map1.Layers.Add(filename) dsname = Lay.Name Map1.Datasets.Add miDataSetLayer, Lay, dsname 第五节 MapInfo Map Catalog 如果 MapX 应用程序需要访问远程空间数据,则 DBMS 中必须存在特殊的表,即 MapInfo Map Catalog。在数据库中的所有表可作为 MapX 中的地图图层浏览之前,每个数 据库都必须创建一个目录。Map Catalog 必须包含要访问的数据库中每一个可在地图中表示 的表中有关空间列的信息。 MapX 应用程序可以使用服务器上已经存在的 Map Catalog(同一个目录被不同的 MapInfo 客户端应用程序分享,包括 MapInfo Professional)。如果服务器上没有 Map Catalog,则需要创建一个。 使用 MapInfo Professional 管理 Map Catalog 如果您是 MapInfo Professional 的用户,就可以使用 MapInfo Professional 创建并管理 Map Catalog 。MapInfo Professional 包含一些 MapBasic 工具,例如 MIODBCAT.MBX, 来帮助创建和管理 Map Catalog。 MapX 应用程序能够使用由 MapInfo Professional 创建的 Map Catalog 。例如,在公司 设置中,一个用户,或许是数据库管理员,可能使用 MapInfo Professional 创建 Map Catalog, 然后大量的最终用户可以运行从 Map Catalog 中读取数据的 MapX 应用程序。 给 DBMS 装载空间数据 如果已经有了 MapInfo 表格式的空间数据,而想把 MapInfo 表导入 SpatialWare,可以使 用下面的方法之一完成此任务: y MISWUP32.MBX 工具,它由 MapInfo Professional 提供,在 SpatialWare 客户端安装目录 下。 y IUS 的 EasyLoader y DB2 y Oracle Spatial 手工创建 MapInfo Map Catalog 如果您不是 MapInfo Professional 用户,那么就需要手工创建 Map Catalog(或者让数 MapInfo MapX 培训教程 59 据库管理员创建 Map Catalog),方法如下所述。每个服务器/数据库只要创建 Map Catalog 一次。 1. 在放有可在地图上表示的表的指定数据库中,创建用户 MAPINFO 。 2. 在数据库中创建 MAPINFO_MAPCATALOG 表。Create Table 子句需要和 下面的 SQL Create Table 子句相同。 Create Table MAPINFO_MAPCATALOG ( SPATIALTYPE Float, TABLENAME Char(32), OWNERNAME Char(32), SPATIALCOLUMN Char(32), DB_X_LL Float, DB_Y_LL Float, DB_X_UR Float, DB_Y_UR Float, COORDINATESYSTEM Char(254), SYMBOL Char(254), XCOLUMNNAME Char(32), YCOLUMNNAME Char(32) ) 3. 创建关于 TABLENAME 和 OWNERNAME 的唯一索引,使得对于每个 所有者只有一张表可被地图化。 create index mapcat_i1 on mapinfo.mapinfo_catalog (OwnerName,TableName) 4. 允许在 MAPINFO_MAPCATALOG 中有选择、更新以及插入的权限。使 用户可以把表地图化。而删除权限应当保留给数据库管理员。 第六节 地图化 DBMS 表 下表描述了 MAPINFO_MAPCATALOG 表中每一列的语法和意义: 列名 分配值 示例 SPATIALTYPE 注意:此列描述数据是如何存储和索引,以及此列支 持的、不支持的 Spatial Object 类型。 5.3 TABLENAME 表名 DRAINAGE OWNERNAME 表的属主名 GEORGETOWN SPATIALCOLUMN 列名,如果包含空间图元:SW_GEOMETRY(使用 SpatialWare Type/IUS 进行地图化标示) NULL_COLUMN(使用 XY 进行地图化标示) MI_SQL_MICODE(使用 MI Code 进行地图化标示) 或者是 IUS、DB2、或数据类型为 ST_SPATIAL 的 Oracle 列的名称。Oracle 8i SDO_GEOMETRY 列的名 称。 SW_GEOMETRY MapInfo MapX 培训教程 60 列名 分配值 示例 DB_X_LL 图层边界矩形区左下角的 X 坐标,使用的单位由 COORDINATESYSTEM 指定。 360 DB_Y_LL 左下角边界的 Y 值。 90 DB_X_UR 右上角边界的 X 值。 360 DB_Y_UR 右上角边界的 Y 值。 90 COORDINATES YS TEM 代表 MapInfo CoordSys 子句的字符串,(但在最开始 没有关键词 “CoordSys”),指定地图的投影,坐标单 位,等等。对于简单的经/纬度地图,指定为“Earth Projection 1, 0”。 Earth Projection 1, 0 SYMBOL MapInfo Symbol 子句(如果图层仅包含点);或是 Pen 子句(指定线形图元的样式)之后的 Symbol 子句及 Brush 子句后的其它 Pen 子句(指定区域边界的样式) 后的 Symbol 子句。 Symbol(35,0,12) Pen(1,2,0) Pen(1,2,0) Brush(2,255,255) XCOLUMNNAM E 对有 X/Y 数据的可地图化的表,指定包含 X 坐标的 列的名称。如果没有这样一列(例如,如果此表使用 了单个的空间列,而不是一对 XY 列)则指定为 NO_COLUMN 或让它空着。 NO_COLUMN YCOLUMNNAME 对有 X/Y 数据的可地图化的表,指定包含 Y 坐标的 列的名称,或指定为 NO_COLUMN。 NO_COLUMN 指定点样式 使用 Symbol 子句来指定点样式。Symbol 子句有三种类型:一种用来指定 MapInfo 3.0-style 符号;一种用来指定 TrueType 字体符号;另一种用来指定位图符号。 Symbol 语法 示例 Symbol(shape, color, size) 或是 Symbol(shape,color,size,font,fontstyle,rotation) 或是 Symbol(bitmapname,color,size,customstyle) Symbol(35,0,12) Symbol(64,255,12,"MapInfo Weather" ,17,0) Symbol("sign.bmp", 255, 18, 0) 指定线样式 使用 Pen 子句指定线样式。在 Map Catalog 中,可能需要指定两个 pen 子句:一个 用指定线图元的外观,而另一个用来指定区域边界的外观。 Pen 语法 示例 Pen(thickness, pattern, color) Pen(1, 2, 0) 指定填充样式 使用 Brush 子句为闭合图元(区域)指定样式。 MapInfo MapX 培训教程 61 Brush 语法 示例 Brush(pattern,color,backgroundcolor) Brush(2, 255, 65535) MapInfo MapX 培训教程 62 第九章 专题制图和分析 概述 专题制图是强大的分析以及和可视化化数据的方法。以图形来表示数据,使您可以在地 图上看到数据。使用专题渲染在地图上显示数据时,在数据列表中几乎无法显现的样式和趋 势可以清晰地展现在您眼前。 第一节 什么是专题制图 专题制图是按照特定专题渲染地图的过程。专题通常使用数据集中的一组或多组数据。 专题利用颜色渲染、填充图案、符号、直方和饼图表示数据。根据数据中的特定值指派这些 颜色、图案或符号,可以创建不同的专题地图。直方和饼图使您可以比较数据集中每个记录 的数据。 第二节 规划专题地图 专题变量 专题地图上显示的数据称为专题变量。根据所执行的专题分析类型,地图可以显示一个 或多个专题变量。范围、格网渲染、等级符号、点密度、独立值都检查一个变量。直方图和 饼图一次可以显示多个专题变量。 也可以创建双变量专题地图,在这里一个地图对象(例如符号)表示两组不同数据。例 MapInfo MapX 培训教程 63 如符号颜色代表一个专题变量,符号大小代表另一个专题变量。 数据来源位置 开始应用专题地图前,需要决定要显示哪些信息以及信息驻留的位置。创建专题所用的数据 来自数据集的 Field 对象或 Field 集合。这些字段作为 Themes 集合的 Themes.Add 方法 的 Fields 参数来传递。 第三节 Themes 集合 每个数据集都有专题集合。Themes 集合从专题集合中创建、计数、添加或删除 Theme 对象。 方法 描述 代码示例 Add 创建专题并将它添加到特定数 据集的 Themes 集合中。 Map1.Datasets(1).Themes.Add _miThemeRanges “TotPop”, “My _Ranges Theme” Remove 从集合中删除指定专题。 Map1.Datasets(1).Themes.Remove “My _Ranges Theme” RemoveAl l 从集合中删除所有专题。 Map1.Datasets(1).Themes.RemoveAll 创建专题 Map1.Datasets(1).Themes.Add miThemeRanges “TotPop”, “My Ranges Theme” 上面一行代码使用字段“TotPop”为 Datasets 集合中的第一个数据集创建范围专题。 Themes.Add 方法描述如下。可选参数位于方括号“[]”中。 语法 Themes.Add [Type], [Field], [Name] 部件 描述 Type 指定要创建的专题地图类型。采用 ThemeTypeConstants。为可选参数,如 果没有指定该参数(或者指定为 miThemeAuto),那么 MapX 将根据接 受的字段数量和已显示的其它专题类型来选择合适的默认类型。如果 MapX 无法选择默认专题类型,将产生错误。 Field(s) 指定专题地图中要使用的字段。可以通过名称、索引或 Field 对象指定字 段。如果使用多个变量创建专题,将接受一组字段名称、索引或 Field 对 象。这是可选参数,如果没有指定该参数,那么 MapX 将使用 DataSet 的 第一个数值字段。 Name 指定专题地图名称。这是字符串类型的参数。它是可选参数,如果没有指 定该参数,MapX 将生成一个名称,诸如 StatesBySales。 专题类型常量 以下是可以创建的专题类型 MapInfo MapX 培训教程 64 类型 描述 MiThemeRanged 范围专题 MiThemeBarChart 直方图专题 MiThemePieChart 饼图专题 MiThemeGradSymbol 等级符号专题 MiThemeDotDensity 点密度专题 MiThemeIndividualValue 独立值专题 MiThemeAuto MapX“best guess”专题 一旦将专题添加到指定集合,就可以创建 Theme 对象,并且操作对象的属性。 专题对象 Theme 对象设置 Themes 集合中专题的属性。修改 Theme 对象方法和属性确定了如 何查看专题以及专题类型等。 属性 描述 AutoRecompute 控制当专题属性更改时何时重新计算专题范围(如范围数量)。 默认为 True。 ComputeTheme 控制是否计算专题。默认为 True。 值为 True 时将通过原始数据计算专题。如果值被设为 False,那 么将创建不可见的 Theme 对象,并且,对于独立值专题具有 20 个范围,对于范围专题具有 5 个范围。接着可以设置最大、最 小值来定义专题。 DataMax 确定最大值以设置专题范围,或者计算当 ComputeTheme 设为 False 时范围专题同等大小的范围。 DataMin 确定最小值以设置专题范围或计者计算当 ComputeTheme 设为 False 时范围专题同等大小的范围。 Fields 返回只读 Fields 集合,该集合表示由此专题所依据的数据集使用 的字段集合。 Layers 返回 Layer 对象的只读属性,该属性表示专题所依据的图层。 Legend 每个 Theme 对象都有 Legend 对象(Theme.Legend)。legend 对 象包含控制专题图例显示的属性。每个 ThemeCategory 对象 (RangeCategory、IndividualCategory 或 MultiVarCategory)在 图 例中都有条目,条目保存在 LegendText 对象中。 Name 专题名称。在 Themes 集合中必须唯一。可读/写属性,或者被指 定为 Themes.Add 方法的参数,或者在创建专题时由 MapX 创 建。这是 Theme 对象的默认属性。 ThemeProperties ThemeProperties 对象包含定义专题的信息(范围定义、显示样式 设置等)。 Type 专题对象的专题类型。这是 ThemeTypeConstants 值,只读属性。 Visible 指定专题是否可见。默认为 True。 MapInfo MapX 培训教程 65 第四节 专题制图的类型 独立值地图 独立值地图显示通过特定数据集字段包含的独立值渲染点、线或边界。在独立值地图中 可以使用数值和名词性值。MapX 赋予每个唯一值自己的颜色或符号。当独立值地图使用样 式类型时,采用地图的默认样式。 使用名词性数据渲染点、线或边界时,只能用独立值进行渲染。名词性数据可以是非数 值数据(例如,名称、菜系或销售的汽车品牌),也可以是其数字代表非数值数据的数值数 据。日期被作为数值数据,它可以用于范围和独立值地图。 独立值专题地图设置受 IndividualValueCategories 集合影响,该集合是 IndividualValueCategory 对象的集合— 专题中的每个唯一值有一个对象。要取得 IndividualValueCategories 集合,请参考 ThemeProperties.IndividualValueCategories 属性。 范围地图 创建范围专题地图时,MapX 将所有数据集行组合到各范围中,并且依据每个行对象的 对应范围为它们指派颜色、符号或线。 MapInfo MapX 培训教程 66 范围类型 MapX 使用五种分配方法自动创建范围:等计数、等范围、自然划分、标准偏差和分位 数。通 过 ThemeProperties 对象的 DistMeth 属性可以设置范围。DistMeth 属性可以设置为 以下 DistribMethodConstants 之一。 等级符号地图 等级符号地图使用符号表示不同值。等级符号和所使用的数据类型无关。例如,可以使 用等级符号显示各州的销售排名。在等级符号专题中,MapX 根据销售排名字段中的值改变 每个符号的大小。 MapInfo MapX 培训教程 67 也可以使用代表客户兴趣大小的不同的符号来表示每个客户对给定产品所表现的兴趣。 点密度地图 点密度地图使用点表示和边界或区域相关的数据值。 直方图地图 与一个变量的专题地图(例如范围或可变符号地图)不同,使用直方专题地图,您可以 一次为每行检查多个变量。在对象中心,针对每个地图对象(图元)建造直方图,通过比较 直方高度可以分析特定图表中的专题变量。也可以检查地图中所有图表的同一变量。 MapInfo MapX 培训教程 68 饼图地图 使用饼图的专题地图,您也可以一次对每行中多个变量进行检查。类似于比较直方图中 的直方,在饼图中可以比较单个饼图中饼扇的大小,也可以拿单个饼扇和其它饼图比较。使 用饼图可以比较部分与整体的关系。 双变量专题制图 双变量专题制图使用点或线对象表示两个专题变量。例如,星代表一个变量,如青少年 人数,而填充兰色的星则代表青少年的年购买量。 MapInfo MapX 培训教程 69 第五节 操作专题地图 可以将所有的专题属性调整为“运行时”。有两种办法可以完成此操作: y Theme.ThemeDlg 方法, y 专题的 ThemeProperties 对象。 ThemeDlg 方法 专题对象可以使用 ThemeDlg 方法,此方法显示对话框使用户可以修改专题。以下代 码行显示此方法的易用性。 Map1.Datasets(1).Themes(1).ThemeDlg ThemeProperties 对象 通过操作 ThemeProperties 对象,也可以只更改所需的专题属性。您可以很容易地控制 用户是否可以进行更改。 ThemeProperties 对象存储在 Themes 集合中。ThemeProperties 对象属性用于定义专题 地图的外观(颜色、符号等)。 ThemeProperties 对象实际上包含有关专题如何显示的信息。一些 ThemeProperties 对 象的属性通过另一些对象表示。 属性 描述 AllowEmptyRanges 控制在范围专题中是否允许空白范围。 DataValue 在等级符号、饼图和直方图专题中应用。这是以 Size 属性指定 的大小描绘专题图形时的值。 DistMethod 控制当重新计算 Theme 对象时,如何创建范围。它是 DistribMethodConstants 值,默认为 MiEqualCountPerRange。 其它方法常量有 miEqualRangeSize、MiCustomRanges、 miNaturalBreakRange、miStandardDeviation。 DotSize 控制由点密度专题使用的点的大小。 Graduated 控制饼图的大小是否根据饼图总值而逐渐改变。 IndividualValueCategory IndividualValueCategory 集合。 Independent 控制是否独立处理直方图的数据值。 MultivarCategories 在饼图或直方图专题中映射的每个变量或字段有一个 MultiVarcategory 对象。 NumRanges 控制范围专题地图的范围数量。 RangeCategories 范围专题地图具有 RangeCategory 对象集合。 Size 和 DataValue 属性共同控制在饼图和直方图中对应于特定值的 专题图形大小。 SpreadBy 控制在范围专题地图中如何执行 autospreading。 SymbolStyle 样式对象,它控制等级符号专题所用的符号。 ValuePerDot 该属性应用于点密度专题。它指定点所代表的值。 MapInfo MapX 培训教程 70 属性 描述 Width 指定直方图中所有直方的宽度。 以上多个属性实际是其它对象。这些对象包括 RangeCategory 对象、IndividualValue 对 象、MultiVar 对象和 Style 对象。请参阅以下文本图表中 RangeCategory 对象的属性。其 它与专题相关的对象的行为类似。 属性 描述 代码示例 Max 设置范围专题中范围的最大 值。 Map1.Datasets(1).Themes(1). Properties.RangeCategories(3).Max = 625 Min 设置范围专题中范围的最小 值。 Map1.DataSets(1).Themes(1). Properties.RangeCategories(3).Min = 595 NumItems 显示范围中的项目数。 Print Map1.DataSets(1).Themes(1). Properties.RangeCategories(1).NumItems Style 样式对象,它表示该范围样式。Map1.Datasets(1).Themes.Item(1).Properties.Rang eCategories.Item(1).Style.PickRegion 范围专题地图具有 RangeCategory 对象集合,每个范围有一个对象,按升序存储。 ThemeProperties.RangeCategories 属性存储集合。 如果 ThemeProperties.DistMethod 是 MiCustomRanges,那么 MapX 将认为您自己设置了 该值,并将在给数据值分组时使用已定义的范围。如果在重新计算专题时存在范围重叠,将 产生错误。 第六节 自定义专题图例 在创建专题地图时,MapX 自动创建图例,解释颜色、符号或大小的意义。 Legend 对象 每个专题都有 Legend 对象(Theme.Legend)。Legend 对象包含可以控制图例显示的属性。 使用 Legend 对象的 LegendDlg 方法可以很容易地进行修改。请参阅以下有关此对象的示 例和对象的对话框。 Map1.Datasets(1).Themes(1).Legend.LegendDlg MapInfo MapX 培训教程 71 第十章 逐层细化图层 概述 在本章中将学习一种特殊类型的地图图层,称为逐层细化图层,它使用户得以执行逐层细化分析和 探测。如果地图包含逐层细化图层,用户就可以通过鼠标指向和单击地图的某个区域得到该区域更详 细的信息。逐层细化图层所提供的直观、易用的界面使用户得以通过指定和单击来探测数据。 第一节 “逐层细化”应用程序开发步骤 逐层细化应用程序需要相当数量的设置以及精心地准备。主要步骤总结如下: 1. 获取用来建立多层次逐层细化图层的多种表。可以使用 MapInfo Professional 创建表,或者从 MapInfo 公司或第三方供应商处购买表。 2. 使用特殊的列和特殊的元数据创建新的空逐层细化表(.tab 文件)。元数据为 每一张成员表分配层次名,并且标识成员表中的重要列--ID 列和标题列。 3. 把逐层细化表加入地图(例如,把逐层细化表加入所使用的 Geoset(s)中,或者 通过象 Layers.Add 这样的方法,把逐层细化表添加到地图中)。 4. 添加用户接口元素(例如工具栏按钮)到应用程序中,以便用户选择逐层细化 工具并单击地图来进行细化。 向应用程序添加代码来响应用户对逐层细化工具的使用(即:编写层次结构管理器)。此代码需要 检测用户所选择的图元;确定替换图元的子图元;并调用一些方法 (DrilldownRemoveFeatures, DrilldownAddFeatures) 来展开或者收缩地图图元。 第二节 准备“逐层细化”图层 要创建逐层细化图层,需要提供由两个或更多 MapInfo 表组成的表集合。特别地,需 要: y 逐层细化图层的每一层次的详细信息都需要一张 MapInfo 表。这些被称为成员表。 y 额外会有包含特殊元数据的空表来描述成员表。它被称为逐层细化表。 MapInfo MapX 培训教程 72 成员表的要求 逐层细化图层中的每个图元都必须有标识关键字(可能是字符串,如 “New York”)。 在单个层次中的所有关键字必须是唯一的;例如,州边界层只能包含一个被称为 “Washington”的州。但是,对于逐层细化图层的所有其它层次,图元的标识关键字是不需 要唯一的。例如,逐层细化图层包含州边界和县市边界,就可以同时有 “Washington” 州 和 “Washington” 县。 “逐层细化”表的要求 逐层细化表与其它表不同,它只包含一个文件:filename.tab。 逐层细化表的 .tab 文件必须定义特定的列和元数据关键字,描述如下: 逐层细化表必须定义三个标准列:Key、Level 和 Label。所有这三列都为字符(字符 串)列,32 个字符宽度。 逐层细化表必须包含一系列元数据关键字。元数据关键字语法如下: y 以关键字 begin_metadata 标记 .tab 文件元数据部分的开始。 y 原数据的每一行都有两个元素:关键字和数值。例如,关键字 “\IsDrilldown” 值为 “True”。 所有的关键字和数值都用双引号括起来。 y 逐层细化表必须包含 “\IsDrilldown” 关键字,且此关键字值必须为 “True”。 y 每一个关键字都以字符 “\” (反斜线)开始。 y 元数据关键字可以层次化地嵌套。层次结构的每一层次用反斜线 (\) 符号标记。关键字值限 制最多为 239 个字符。 y 逐层细化表包含 \DDMap\ComponentMaps\ 关键字层次结构。在此层次结构中,为每一张成 员表指定四个元数据关键字: 成员表元数据关键字 关键字 描述 File 必需的关键字,指定成员表路径和文件名。 LevelID 必需的关键字,为此成员表定义标识符。 FeatureIDCol 指定成员表中包含唯一逐层细化关键字的列号。可选关键字;如果忽 略,列号为 1。 FeatureCaptionCol 指定成员表中用来作标注的列号。可选关键字;如果忽略,列号为 1。 例如,“ 逐层细化表示例”包含如 “ \DDMap\ComponentMaps\One\LevelID ”和 “\DDMap\ComponentMaps\Twox\LevelID”这样的关键字层次结构。请注意 DDMap、 ComponentMaps 和 LevelID 是关键字层次结构标准的、必需的部分,而 One 和 Twox 是 可自定义的。可使用任何喜欢的关键字名代替 One、Twox、Twoxx 等等;那些关键字名只 是用来区分每个成员表的关键字集。 “逐层细化”表示例 逐层细化表示例内容如下。如果要创建自己的逐层细化表,可以复制该示例到一文本文 件,并参照自己的成员表进行修改。 MapInfo MapX 培训教程 73 !table !version 300 !charset WindowsLatin1 Definition Table Type Native Charset "WindowsLatin1" Fields 3 Key Char (32); Level Char (32); Label Char (32); begin_metadata "\IsDrilldown" = "TRUE" "\DDMap\ComponentMaps\One\File" = "C:\Program Files\MapInfo\Data\USA\usaXXX.TAB" "\DDMap\ComponentMaps\One\LevelID" = "USA" "\DDMap\ComponentMaps\One\FeatureIDCol" = "3" "\DDMap\ComponentMaps\One\FeatureCaptionCol" = "1" "\DDMap\ComponentMaps\Twox\File" = "C:\Program Files\MapInfo\Data\USA\2Region.TAB" "\DDMap\ComponentMaps\Twox\LevelID" = "2Region" "\DDMap\ComponentMaps\Twox\FeatureIDCol" = "1" "\DDMap\ComponentMaps\Twox\FeatureCaptionCol" = "3" "\DDMap\ComponentMaps\Twoxx\File" = "C:\Program Files\MapInfo\Data\USA\MultiRegionSales.TAB" "\DDMap\ComponentMaps\Twoxx\LevelID" = "MultiRegion" "\DDMap\ComponentMaps\Twoxx\FeatureIDCol" = "1" "\DDMap\ComponentMaps\Twoxx\FeatureCaptionCol" = "3" "\DDMap\ComponentMaps\Two\File" = "C:\Program Files\MapInfo\Data\USA\states.TAB" "\DDMap\ComponentMaps\Two\LevelID" = "States" "\DDMap\ComponentMaps\Two\FeatureIDCol" = "3" "\DDMap\ComponentMaps\Two\FeatureCaptionCol" = "1" "\DDMap\HierarchyManager\IsDLL" = "TRUE" "\DDMap\HierarchyManager\ID" = "SomeDLL.dll" "\DDMap\HierarchyManager\InitialLevel" = "USA" end_metadata MapInfo MapX 培训教程 74 第三节 创建逐层细化和卷起工具 创建“细化”工具 使用 CreateCustomTool 方法可以实现逐层细化工具。CursorConstants 集包括两个为逐 层细化应用程序特别提供的光标:miDrilldownExpandCursor 和 miDrilldownContractCursor。 例如: 每次使用自定义逐层细化工具将触发 ToolUsed 事件。在 ToolUsed 事件过程中,需要 执行引起逐层细化动作的代码。这基本上是一个四步过程: 1. 使用如 SelectByPoint 或 SearchAtPoint 这样的方法,确定用户所单击的地图 图元。 2. 确定用来替换用户所单击图元的子图元集。例如,可使用一个或者更多嵌套的 Case 语句来确定用来替换所选父图元的子图元。 3. 调用 DrilldownAddFeatures 方法添加子图元到地图。 4. 调用 DrilldownRemoveFeatures 方法从地图上删除父图元(用户所单击的图 元)。 说明:这些添加/删除操作绝不会修改组件表;即并不是“编辑”表。使用 DrilldownAddFeatures 方法添加图元,唯一的效果是复制图元到当前可视的 图元集。 创建“卷起”工具 当实现逐层细化工具后,可能希望为用户提供卷起工具——与逐层细化工具有相反效果 的工具。 可使用与创建逐层细化工具相同的方式来创建卷起工具。将会使用同样的方法 (DrilldownAddFeatures 和 DrilldownRemoveFeatures)。不同的是不是添加子图元和删除父 图元,而是做相反操作——添加父图元和删除子图元。 示例:“逐层细化”/“卷起”工具示例 以下示例 ToolUsed 事件过程说明如何操作逐层细化工具。 此过程为以下图层层次结构来处理逐层细化图层: USA 包含单个区域的图层,代表整个美国。 2Region 包含两个大区域(东区和西区)的图层。每一个区域覆盖大约一半的美国 疆域。 MultiRegion 包含八个小区域的图层。每一个区域覆盖大约八分之一的美国疆域。 States 包含美国五十个州的图层。 此示例为 Map1_ToolUsed 函数的节选,主要阐明细化工具的工作方式 ……………………………………………… Dim AddKeys() As String Dim NewLevel As String Dim fs As Features MapInfo MapX 培训教程 75 Dim strLevel As String Dim DelKeys() As String Dim pnt As New Point ' --------------------------------------------- ' Expand ' ---------------------------------------------- If (ToolNum = customDrilldownExpandTool And Ctrl = False) Or (ToolNum = customDrilldownContractTool And Ctrl = True) Then ' Figure out which object we have pnt.Set X1, Y1 Set fs = drilldownLayer.SearchAtPoint(pnt) If fs.Count = 1 Then ReDim DelKeys(0) drilldownLayer.KeyField = "Level" strLevel = fs(1).KeyValue drilldownLayer.KeyField = "Key" DelKeys(0) = fs(1).KeyValue If strLevel = "USA" Then NewLevel = "2Region" ReDim AddKeys(1) AddKeys(0) = "West" AddKeys(1) = "East" ElseIf strLevel = "2Region" Then NewLevel = "MultiRegion" ReDim AddKeys(3) Select Case DelKeys(0) Case "West" usaLevel = usaLevel + 1 AddKeys(0) = "mrRgn1" AddKeys(1) = "mrRgn2" AddKeys(2) = "mrRgn3" AddKeys(3) = "mrRgn4" Case "East" usaLevel = usaLevel + 1 AddKeys(0) = "mrRgn5" AddKeys(1) = "mrRgn6" AddKeys(2) = "mrRgn7" AddKeys(3) = "mrRgn8" End Select ElseIf strLevel = "MultiRegion" Then MapInfo MapX 培训教程 76 NewLevel = "States" Select Case DelKeys(0) Case "mrRgn1" westLevel = westLevel + 5 ReDim AddKeys(4) AddKeys(0) = "16" AddKeys(1) = "30" AddKeys(2) = "41" AddKeys(3) = "53" AddKeys(4) = "56" Case "mrRgn2" westLevel = westLevel + 6 ReDim AddKeys(5) AddKeys(0) = "04" AddKeys(1) = "06" AddKeys(2) = "08" AddKeys(3) = "32" AddKeys(4) = "35" AddKeys(5) = "49" Case "mrRgn3" …………………… Case "mrRgn8" …………………… End Select Else MsgBox "Can't drilldown any further; Level: " + strLevel + " Key: " + DelKeys(0) Exit Sub End If ElseIf fs.Count = 0 Then MsgBox "No features selected." Exit Sub Else MsgBox "More than one feature selected; can only drilldown on exactly one item." Exit Sub End If drilldownLayer.DrillDownRemoveFeatures strLevel, DelKeys drilldownLayer.DrillDownAddFeatures NewLevel, AddKeys ' --------------------------------------------- ' Contract ' ---------------------------------------------- ElseIf (ToolNum = customDrilldownContractTool And Ctrl = False) Or (ToolNum = customDrilldownExpandTool And Ctrl = True) Then MapInfo MapX 培训教程 77 ………………………… End If End Sub 重置“逐层细化”图层 可以通过调用 DrilldownReset 方法重置逐层细化图层。重置逐层细化图层会清除整个 图层,而且使用一张成员表的图元重新初始化图层。 第四节 “逐层细化”图层的限制和要求 逐层细化图层受到一些限制,总结在下面的列表中。 y 逐层细化图层中每一个图元必须拥有一个 ID,该 ID 在所属成员表中是唯一的(尽管 ID 并不需要在构成逐层细化图层的所有的成员表中是唯一的)。 y 不能在逐层细化图层中使用栅格图像衬垫表。 y 当使用 Themes.Add 创建专题时,将花费一些时间用大量的数据行来计算图层范围,例如 逐层细化或是服务器图层。Add 方法的 ComputeTheme 参数使您得以为任意专题类型创建 非计算专题。非计算专题使您得以创建没有自动计算范围的专题。可以自己创建范围。这对 逐层细化或服务器图层来说是比较快的方法。 y 逐层细化图层不会“记录”各种不同逐层细化层次的状态(图元被展开,等等)。如果希望 应用程序恢复上一次使用地图时精确的状态,需要在退出时编写代码存储地图的逐层细化设 置,并在启动时恢复设置。 y 虽然可以编辑逐层细化图层的图元,但不会保存编辑,且成员表不受编辑的影响。当编辑逐 层细化图层中的图元时,不是修改成员表,而是修改从成员表的图元的临时副本。 MapInfo MapX 培训教程 78 第十一章 输出地图 概述 通常,用户可能需要打印地图或在另一应用程序中合并地图的可视化图像。MapX 具有 使用户将地图的内容发送到剪贴板、打印机或图形文件的方法。 第一节 输出地图 要输出地图到图形文件或复制地图的内容到剪贴板,应该使用 ExportMap 方法。 方法 描述 代码示例 ExportMap 输出地图到图形文件。 Map1.ExportMap “C:\Map.TIF”,miFormatTIF ExportMap 输出地图到剪贴板。 Map1.ExportMap “clipboard” 说明:方括号 [ ] 中的为可选参数。 Map.ExportMap (Location, Format, [W], [H]) 部件 描述 Location 放置输出文件位置的详细说明。如果使用了关键字 ‘CLIPBOARD’, 图像将输出到剪贴板。 格式 输出格式。这是 ExportFormatConstants 值。 W 输出的宽度。双精度值,根据 Paper Units (Map.PaperUnit) 来指定宽 度。它为可选参数,如果未指定,则使用 Map.MapPaperWidth。 H 输出的高度。双精度值,根据 Paper Units (Map.PaperUnit) 指定高度。 它为可选参数,如果未指定,则使用 Map.MapPaperHeight。 格式常量 格式 描述 miFormatWMF 元文件 miFormatBMP 位图 miFormatJPEG JPEG 图像 miFormatTIF TIF miFormatGIF GIF 图像 miFormatPNG 便携网络图形 miFormatPSD PhotoShop 该示例说明 Map.ExportMap 方法的用法。它使用该方法将地图以 BMP 格式放置在剪贴板 中。 MapInfo MapX 培训教程 79 Map1.PaperUnit = miUnitCentimeter 将长 12 厘米、宽 9 厘米的地图以 BMP 格式输出到剪贴板 Map1.ExportMap "clipboard", miFormatBMP, 12, 9 第二节 ExportSelection 属性 使用地图的 ExportSelection 属性使得用户可以控制是否让选定范围的模式也随地图输 出。请看如下的代码示例以了解该属性的使用方法: 输出 JPG 图像以显示并包括在图像中突出显示的选定范围。 Map1.ExportSelection=True Map1.ExportMap "c:\temp\map.jpg", miFormatJPEG 第三节 打印地图 要打印地图,请使用 PrintMap 方法。 说明:所绘制的当前地图要与给出的矩形相适应。当保持宽和高的相关比例时, 将获得最佳结果。该方法仅打印 MapX 地图的内容;它不显示任何图标、 工具栏或菜单项。如果要看到输出的附加控件,可以打印包含 MapX 控件 的窗体。 方法 描述 代码示例 PrintMap 打印地图。 Map1.PrintMap Printer.hDC, 0, 0, Map1.Width * 100, Map1.Height * 100 Map.PrintMap (hDC, x, y, w, h) 部件 描述 HDC 打印设备环境。可以是任何设备环境。 X 以 HIMETRIC 为单位的左上角的 X 值。 y 以 HIMETRIC 为单位的左上角的 Y 值。 w 以 HIMETRIC 为单位的宽度。 h 以 HIMETRIC 为单位的高度。 MapInfo MapX 培训教程 80 第十二章 发布 MapX 应用程序 概述 从 MapInfo 购买的 MapX 产品是开发工具包。包含 MapX OCX 控件、示例程序、联 机帮助文件、一些示例地图以及 Geoset、各种实用工具和其它支持文件。本章讲解如何向 用户发布 MapX 应用。 第一节 MapX 客户安装项目和步骤概览 当把应用交付给客户时,需要安装以下项目。它们是: 1. 已创建的软件。 2. MapX 控件,以及与它相关的文件。 3. 在应用中用到的地图和 Geoset。 安装和发布 MapX 应用主要有四个步骤: 1. 将必需的文件安装到用户计算机上。 2. 运行实用工具工具(例如 regsvr32.exe)把特定的文件注册到用户的系统中。 3. 将特定键值添加到 Windows 注册表中。 4. 在应用程序运行时接受 MapX 许可字符串。 安装工具可选用 Installshield 。 第二节 安装 MapX OCX MapX 必要文件 Windows 公用 DLL 文件 安装在“Windows\System”目录下。在替换这些文件之前请做一下版本检查。如果是比 较老的版本,则有可能在替换操作过程中正在使用这些文件。如是这种情况就需要重启系统。 Mfc42.dll msvcp60.dll msvcrt.dll Olepro32.dll oleaut32.dll MapX 程序文件 安装在“\Program Files\Common Files\MapInfo Shared\MapX Common”文件夹之下。这 些文件无须注册。 ALLTYPE.DLL AllTypeRes.dll ColLookupSystem.dll CommandProcessor.dll CommandProcessorRes.dll COMPILER.DLL COORDSYS.DLL CoordSysRes.dll CustomProperties.dll DAENGINE.DLL DAEngineRes.dll DBINFO.DLL MapInfo MapX 培训教程 81 DBInfoRes.dll DBLAYER.DLL DBLayerRes.dll ExprPacket.dll ExprPacketCreator.dll ExprPacketCreatorRes.dll ExprPacketRes.dll FcnInfoServer.dll FcnInfoServerres.dll FIND.DLL FINDRES.DLL GEO.DLL Tools.dll UTILITY.DLL UtilityRes.dll Mapx40.ocx 安装在“\Program Files\Common Files\MapInfo Shared\MapX Common”文件夹之下。使 用 Regsvr32.exe 注册。 字体文件 安装在“Windows\Fonts”(用于 Windows 95 和 Windows NT 4.0)文件夹下。 字体也必须在 Windows 中注册。如果创建安装程序时使用第三方软件包,则可能此软件包 会注册字体。否则就要调用 Win32 的 AddFontResource 例程来手工注册字体。 ARIAL.TTF MAPIS___.TTF MAPSYM.TTF TTMIAR__.TTF TTMICG__.TTF TTMIMI__.TTF TTMIOG__.TTF TTMIOS__.TTF TTMIRE__.TTF TTMITC__.TTF TTMIWE__.TTF 可选文件 NADCON 支持文件 安装在“\Program Files\Common Files\MapInfo Shared\MapX Common”文件夹下。要支 持 NAD 27 和 NAD 83 坐标系统间的双向 NADCON 转换,则需要这些文件。 ALASKA.LAS ALASKA.LOS CONUS.LAS CONUS.LOS HAWAII.LAS HAWAII.LOS PRVI.LAS PRVI.LOS TGEORGE.LAS STGEORGE.LOS STLRNC.LAS STLRNC.LOS STPAUL.LAS STPAUL.LOS 位图符号 安装在“\Program Files\Common Files\MapInfo Shared\MapX Common\CustSymb”文件 夹下。 TOWE1-32.BMP POLI1-32.BMP MBOX2-32.BMP GOLF1-32.BMP TOWE2-32.BMP GLOB1-32.BMP PIN6-32.BMP MBOX1-32.BMP 栅格图像支持 安装在“\Program Files\Common Files\MapInfo Shared\MapX Common”文件夹下。 ODBC 支持 安装在“\Program Files\Common Files\MapInfo Shared\MapX Common”文件夹下。 用 Regsvr32.exe 注册 MODBCDataset.dll、MMapXColumnInfo.dll MapInfo MapX 培训教程 82 用 RegTypLib.exe 注册 mdatasetint.tlb Notes 文档支持 安装在“\Program Files\Common Files\MapInfo Shared\MapX Common”文件夹下。 用 Regsvr32.exe 注册:MNotesDataset.dll 、MMapXColumnInfo.dll。 用 RegTypLib.exe 注册 mdatasetint.tlb 第三节 安装地图和 Geoset 注册 Geoset 是种把和此 Geoset 有关的每一张 MapInfo 表注册到 GeoDictionary 中 的简便方法。通过把 MapInfo 表注册在 GeoDictionary 中,就可以用此表来作自动绑定。 如果确定要使用 GeoDictionary,那么当注册 Geoset 时,GeoDictionaryManager40.exe 就会将合适的项添加到 GeoDictionary 中(geodict.dct)。如果 GeoDictionary 不存在, GeoDictionaryManager40.exe 会创建它。 • GeoDictionaryManager40.exe 此步骤必须要在所有的 Geoset 和相关表都装在用户机器上后才能执行。请再三检查 Geoset,查看每一张表所期望的路径。例如,如果使用硬盘上不同区域的 MapInfo 表创建 Geoset,Geoset 将会给不和 Geoset 在同一目录下的所有表指明完整路径。而如果重新分布 此 Geoset,那么将不得不在与最初的 Geoset 相同的路径下查找这些表。要避免此问题,请 将所有的 MapInfo 表复制到同一目录下,接着创建 Geoset。然后在同一个目录下创建此 Geoset。
还剩84页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

sdshw

贡献于2014-03-14

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf