SuperMap Objects 中级开发教程

Size: px
Start display at page:

Download "SuperMap Objects 中级开发教程"

Transcription

1 SuperMap Objects 开发教程 ( 中级篇 ) 北京超图地理信息技术有限公司 2004 年 8 月. 北京

2 版权所有 ( ), 北京超图地理信息技术有限公司 保留一切权力 警告, 本文档包含的所有内容是北京超图地理信息技术有限公司的财产, 受到著作权法和国际公约的保护 未得到本公司的书面许可, 不能以任何方式 ( 电子的或机械的, 包括影印 ) 翻印或转载本文档的任何部分 本文档并不代表供应商或其代理的承诺, 北京超图地理信息技术有限公司可在不作任何申明的情况下对本文档内容进行修改 SuperMap 及徽标 是北京超图地理信息技术有限公司的注册商标 SuperMap 的一切有关权利属于北京超图地理信息技术有限公司所有 本手册中所涉及的软件产品及其后续升级产品均由北京超图地理信息技术有限公司制作并负责全权销售 本文档中提到的其它公司及其产品的商标所有权属于该商标的所有者 北京超图地理信息技术有限公司联系方式 : 地址 : 北京市海淀区学清路 8 号科技财富中心 B 座 7 层邮编 : 电话 : 传真 : 网址 : 销售电子信箱 :sales@supermap.com 技术支持电子信箱 :support@supermap.com SuperMap 欢迎您的任何建议和意见

3 前 言 北京超图公司继已发布的 SuperMap 组件式 GIS 开发平台 SuperMap 2000 和 SuperMap III 系列之后, 于 2004 年 9 月正式发布 SuperMap Objects 5.0 SuperMap Objects 是一个开放的组件式地理信息系统 (GIS) 软件开发平台 SuperMap Objects 功能强大, 对象和接口数量多, 可以满足各种 GIS 应用需求 为了帮助用户更好的运用 SuperMap Objects 开发不同领域的 GIS 应用系统,SuperMap Objects 开发组推出了一系列教程, 包括 理解 SuperMap GIS SuperMap Objects 开发教程 ( 初级篇 ) SuperMap Objects 开发教程 ( 中级篇 ) 和 SuperMap Objects 程序员参考手册 在 SuperMap Objects 的系列教程中, 理解 SuperMap GIS 让用户充分领略 SuperMap GIS 的设计思想和基本概念 SuperMap Objects 开发教程 则循序渐进的引导用户加深对 SuperMap Objects 各个模块的理解, 以及更好地认识模块之间的关系, 同时以 SuperMap Objects 的示范工程库 (Visual Basic Version) 作为参考 ( 集中封装在 SuperMap Objects 范例程序库 中 ), 详细说明了如何使用 SuperMap Objects 来创建实际的应用程序, 提高用户运用 SuperMap Objects 建立 GIS 应用系统的能力 本书与 SuperMap Objects 示范工程的相关说明互为补充, 共同组成 SuperMap Objects 系列教程之一 结合 SuperMap Objects 组件式 GIS 的特点, 本书以 SuperMap Objects 的功能为线索, 辅以大量的示范代码, 深入浅出的说明各个控件的功能, 以及各个控件之间的联系, 同时每章提供一定的思考练习题, 帮助加深对所学内容的理解 哪些人需要读这本书? 本书的读者应该具有一定 VB 编程经验 ( 至少可以不借助帮助编写一段读出指定文本框中的文本, 并且将它用一个变量保存起来的代码 ) 对于 GIS 有一定的了解, 并希望使用 SuperMap Objects 开发 GIS 应用程序的开发人员和程序设计人员 本书不打算告诉您关于 VB 的高深技巧, 也不会过多的介绍 GIS 理论, 而是向您展示如何借助已有的 VB 技能和 GIS 理论, 结合 SuperMap Objects 组件式 GIS 创建实际的 GIS 应用 组件式技术给 GIS 的发展注入了新的活力,VB 对组件式技术的强力支持则使这种推动力更加强大 如果您是一个新手, 那么本书将带您进入奇妙的 GIS 新领域, 充分领略 GIS 新技术的无穷魅力 ; 如果您是一位 GIS 领域的资深专家, 本书将帮助您更容易驾驭新一代 GIS 开发工具 SuperMap Objects, 为您的事业插上新技术的翅膀 ; 如果您既熟悉 VB 编程, 同时精通组件式 GIS, 那么本书也具有一定的参考价值 本书的内容 本书的主要内容是利用 SuperMap Objects 创建 GIS 应用程序, 这些应用程序的功能涵盖了通用 GIS 应用程序中的大部分的功能, 包括数据的打开 创建 编辑, 将数据显示为地图 编辑 保存地图 地图输出 空间查询和分析等 I

4 本书在编写时, 力求向用户展示一个清晰的流程, 即如何从数据管理到数据的可视化 数据的分析处理, 以及到最后的成果输出等 本书的目的之一就在使您在了解如何实现 GIS 各种功能的基础上对 GIS 应用程序的建立一个宏观的概念, 同时本书也是一本按功能分类的 SuperMap Objects 编程工具书 本书的常见问题解答提供您在使用 SuperMap Objects 时可能会遇到的问题, 同时, 本书还提供了许多二次开发的技巧, 帮助您建立更加精彩的应用系统 本书以 Microsoft Visual Basic 6.0 开发环境为例进行介绍 如何在其他开发环境下使用 SuperMap Objects, 请参阅 SuperMap Objects 开发教程 初级篇 本书没有将 SuperMap Objects 组件式 GIS 中的所有接口都作详细的说明, 而是从如何建立一个 GIS 实际应用的角度出发, 将整个流程说明清楚 关于如何使用本书, 作者的建议是自己动手编写程序, 这比一味的读书的效果要好得多, 本书只能告诉您如何做, 不能代替您去做 我们认为, 会读程序代码并不等于能够写出好的应用程序, 读 和 写 有时候是两回事 在 SuperMap GIS 的系列教程中, 请注意区分 SuperMap Objects SuperMap 控件和 SuperMap GIS 三个概念 这三个概念关系非常密切但又有严格的区别 :SuperMap Objects 是北京超图公司开发的大型 全组件式 GIS 开发平台, 它包含多个控件 ;SuperMap 控件是 SuperMap Objects 的多个控件中的地图控件, 它和 SuperWorkspace 控件一起组成了 SuperMap Objects 的核心组件, 人们通常所说的控件实质上是指可以单独注册的 OCX 控件库, 控件库内可包含许多可编程对象 ; SuperMap GIS 是指北京超图公司所有 GIS 产品的总称, 代表了北京超图公司整体的 GIS 发展理念和产品体系 ;SuperMap Objects 是其中产品之一 三者之间的关系是 :SuperMap GIS 包括 SuperMap Objects,SuperMap Objects 包括了 SuperMap 控件 北京超图地理信息技术有限公司 2004 年 8 月, 北京 II

5 目 录 第 1 章理解 SuperMap Objects 理解组件式 GIS 什么是组件? GIS 组件与组件式 GIS 为什么用组件式 GIS SuperMap Objects 简介 SuperMap GIS 简介 理解 SuperMap Objects 基本概念 工作空间 数据源 数据集 图层 地图 布局 记录集 几何对象 理解 SuperMap Objects 对象结构 理解组件对象关系 数据访问及空间分析对象结构 空间数据可视化 ( 二维 ) 对象结构 几何图元及其相关对象结构 布局对象结构 投影对象结构 理解 SuperMap Objects 空间数据引擎 理解 SuperMap Objects 示范代码库 编码约定 使用 Option Explicit 开关 使用局部变量 使用对象要注意 关于 SuperMap Objects 变量的说明 退出应用系统要注意 思考与练习...28 第 2 章核心控件之数据管理控件 SuperWorkspace SuperWorkspace 控件简介 SuperWorkspace 控件的对象结构 管理工作空间文件 创建新的工作空间...31 III

6 2.3.2 打开已有的工作空间 保存工作空间 关闭工作空间 获取工作空间的数据元素 访问工作空间的数据元素 管理数据源 打开数据源 创建数据源 紧缩数据源 修复数据源 删除数据源 管理数据集 创建数据集 打开数据集 将影像压缩为 ECW 文件 删除数据集 编辑属性数据库 修改属性数据库结构 对属性数据库中记录的操作 数据的交换 SuperWorkspace 控件的其他功能 思考与练习...64 第 3 章核心控件之地图窗口 SuperMap SuperMap 与 SuperWorkspace 的连接 打开地图对象 保存地图 地图另存为 删除地图 关闭地图窗口 SuperMap 浏览操作与环境设置 SuperMap 浏览空间数据基本操作 SuperMap 自定义空间数据浏览 SuperMap 窗口的环境设置 图层管理 图层集合对象 (solayers) 图层对象 (solayer) 图层风格 矢量数据图层用同一种风格渲染 矢量数据图层制作专题图...88 IV

7 3.4.3 DEM 数据图层制作专题图 空间数据与属性数据的双向查询 图查属性 属性查图 空间对象的编辑 SuperMap Objects 支持编辑的空间对象 空间对象的编辑方法 空间对象的基本操作 智能捕捉功能 配准处理 动态目标的显示与跟踪 添加实例 移动实例 刷新跟踪图层 删除实例 动态移动并闪烁实例 ( 应用技巧 ) 地图输出 思考与练习 第 4 章 SuperMap Objects 的空间查询与分析 空间几何查询 用 QueryByDistance 进行范围查找 用 QueryEx 进行空间模式查询 几何分析 量算面积 角度和距离 基本几何运算 缓冲分析 Buffer 方法 Buffer2 方法 为所有对象生成一个总的缓冲区 叠加分析 剪裁运算 (Clip) 擦除运算 (Erase) 并运算 (Union) 交运算 (Intersect) 同一运算 (Identity) 网络分析 路径查询 节点查询 栅格分析 V

8 4.6.1 GRID 数据集的裁剪 点线面数据集生成 GRID GRID 生成等值线 面和三维正射影像数据集 思考与练习 第 5 章在 SuperMap Objects 中处理拓扑关系 SuperTopo 控件简介 使用 SuperTopo 控件进行拓扑处理 思考与练习 第 6 章图例控件 SuperLegend SuperLegend 控件简介 连接 SuperLegend 与激活的地图窗口 SuperLegend 控件的其他功能 专题图向导 响应 SuperLegend 的事件 思考与练习 第 7 章地图排版工具 SuperLayout SuperLayout 控件的对象结构图 SuperLayout 与 SuperWorkspace 建立连接 布局环境的设置 创建和编辑布局元素 创建布局元素 编辑布局元素 布局的基本操作 布局排版 管理布局对象 布局的打印输出 页面设置 打印设置 打印 思考与练习 第 8 章投影与投影转换 地图投影的基本概念 SuperMap Objects 的投影对象 使用 SuperMap Objects 的预定义投影 使用 SuperMap Objects 自定义投影 预先定义几个相关对象 地图投影 投影变换 思考与练习 VI

9 第 9 章应用系统发布 发布方式 可发布文件清单 MFC 运行库 DLL 文件 SuperMap Objects 支持库 DLL 文件 OCX 文件 不可发布的文件清单 开发许可文件 (*.lic) 类型库文件 (VC 开发使用, 扩展名 :*.tlb) 帮助文档 注册 OCX 文件 数据访问支持环境 第 10 章常见问题解答 SuperMap Objects 基本问题 SuperMap Objects 接口使用问题 SuperMap Objects 空间数据库 附录 1 SuperMap Objects 常用数据类型对照表 附录 2 数据元素及对象操作索引表 工作空间 (Workspace) 数据源 (DataSource) 地图 (Map) 布局 (Layout) 资源 (Resource) 数据集 (Dataset) 矢量数据集 (DatasetVector) 影像数据集 (DatasetRaster) 记录 (Recordset) 字段 (Field) 图层集与图层 (Layers and Layer) 专题地图 (ThemeMap) 风格对象 (Style and TextStyle) 几何对象 (Geometry) 布局元素 (LytElement) 投影 (Projection) 附录 3 SuperMap Objects 工程升级说明 附录 4 系统线型缺省一览 附录 5 系统缺省符号一览 附录 6 系统填充模式缺省一览 VII

10

11 第 1 章理解 SuperMap Objects 介绍 本章简要介绍与组件式 GIS 相关的技术背景 组件式 GIS 的特点与优势 SuperMap Objects 组件式 GIS 的基本情况和 SuperMap GIS 系列软件的构成 本章还介绍了 SuperMap GIS 涉及到的一些基本概念, 并以 SuperMap Objects 5 对象结构简图为基准, 简介 SuperMap Objects 各个控件和对象的关系 最后, 本章介绍了本教程所使用的编码约定 目标 大致了解 SuperMap Objects 的技术背景, 了解 SuperMap Objects 的组织结构, 初步理解各对象之间的相互关系, 为以后各章的学习打下基础 1.1 理解组件式 GIS 什么是组件? 在了解什么是组件式 GIS 之前, 首先需要了解什么是组件, 以及与组件相关的一些技术 抛开计算机软件相关的定义, 顾名思义, 组件是构成某个整体的各个部件, 通常这些部件都按照某种通用的标准被定义和生产 在计算机软件领域, 组件有多种不同的定义 有的把 ActiveX 的 DLL( 或 OCX) 称作组件, 有些则把 DLL 中的类视为组件 从使用者的角度出发, 一个系统的各个组件应该是可以裁减 拆卸和重新组装的 人们更习惯于按可拆分的粒度来划分组件, 因此本书更倾向于前者, 即把 ActiveX 的 DLL( 或 OCX) 称作组件 抽象地讲, 计算机软件领域的组件是按照某种标准或者规范进行代码重用的一种形式, 通常这种重用是允许跨语言进行的 当前比较重要的两个组件规范是 Microsoft 定义的 COM/DCOM( 公共对象模型 / 分布式公共对象模型 ) 和 OMG( 对象管理组织 ) 定义的 CORBA( 公共对象请求代理体系结构 ), 业界习惯地称他们为组件平台 基于这两个组件平台, 分别定义和实现了 ActiveX 和 Java Beans 两种组件对象模型 除了以上两个主要的组件规范外, 微软在.NET 框架中提供了新的组件规范.NET 组件 GIS 组件与组件式 GIS 组件式 GIS 是由一系列可拆分 可协作 可裁剪的 GIS 组件构成的具有高度伸缩性的 GIS 软件平台 而所谓 GIS 组件, 是指基于某种组件对象平台, 以具有标准通信接口的 允许跨语 1

12 言应用的组件形式提供的 GIS 软件功能模块 SuperMap Objects 开发教程 一般不应当把组件式 GIS 视为完整的最终应用解决方案, 而是构建应用解决方案的工具集或者开发平台 基于对以上概念的理解, 不难发现, 当前流行的一些产品 ( 如 MapObjects 或 MapX) 实际上应当被称为 GIS 组件 因为他们仅提供了实现部分 GIS 功能的模块, 没有形成完整的 GIS 功能体系 真正的组件式 GIS 应当由一系列 GIS 组件构成, 提供从符号定制到地图可视化 从地图编辑采集到空间数据数据建库 从专题制图到布局输出 从数据转换到空间分析 从二维到三维等全面 GIS 功能的软件 GIS 组件可能容易被看成小软件, 组件式 GIS 则应形成完整的 GIS 功能体系 为什么用组件式 GIS 组件式 GIS 软件, 更加贴近广大 GIS 开发商的需要, 具有强大的生命力 总的来说, 组件式 GIS 具有以下优点 : 第一 : 高度的伸缩性 组件式 GIS 一般都提供绝大部分 GIS 功能, 每一个用户可以根据自己的需要选择使用这些功能, 可以开发功能强大而完备的 GIS 应用系统, 也可以选择其中部分组件开发中 小型应用系统 用组件式 GIS, 您完全可以开发从个人旅游指南到国家级的大型应用系统, 具有高度的伸缩性 第二 : 良好的扩展性 组件式 GIS 主要完成 GIS 相关的功能, 当前和未来的应用系统通常会综合应用多种技术,GIS 仅仅是其中一部分 由于基于同一规范的各种组件可以无缝集成, 您可以使用其他各种专业组件与 GIS 组件协同实现应用系统的功能 第三 : 便于开发 组件式 GIS 采用标准的组件技术, 目前流行的开发语言 ( 如 VB VC Delphi CB PB VC.NET C# 与 VB.NET 等 ) 都支持这些规范, 所以只要对这些开发语言熟悉, 就可以进行开发, 不用去学习专门的 GIS 开发语言, 使得开发变得更加简单 第四 : 易于集成 使用 ActiveX 技术的组件具有良好的亲和力 ( 聚合性 ) 组件式 GIS 可以在程序设计阶段与其他功能的组件进行集成, 使不同的功能组件在程序代码级别上就无缝的集成在一起, 形成紧凑的 一体化的可执行程序 第五 : 更高的性能价格比 由于组件式 GIS 灵活的可裁剪性, 用户可以根据应用需求仅选择购买必要的组件, 以获得更高的性能价格比 由于组件式 GIS 独有的优势, 基于组件的开发 (Components Based Development, CBD) 已经成为 GIS 应用系统建设的主流 2

13 1.1.4 SuperMap Objects 简介 第 1 章理解 SuperMap Objects SuperMap Objects 是超图地理信息技术有限公司 ( 基于 ActiveX/COM 技术开发的组件式 GIS 软件开发平台 SuperMap Objects 由一系列的 ActiveX 组件构成, 包括核心组件 空间分析组件 布局组件 三维组件 拓扑组件 图例组件 数据表格组件 工作空间管理组件 加密锁信息组件 辅助组件等多个可分拆的组件库 表 1.1 SuperMap Objects 组件构成 组件库名称组件库程序文件功能说明 核心组件库布局组件库空间分析组件库三维组件库 SuperMap.ocx SuperLayout.ocx SuperAnalyst.ocx Super3D.ocx 提供地理信息系统的基础的 核心的功能, 主要包括 : 工作空间管理 多数据源访问 地图管理 ; 地图显示 专题图 ; 属性查询 空间与属性组合查询 ; 图形与属性数据编辑 ; 小波压缩格式影像 (Mrsid, ECW) 显示 ECW 压缩 影像配准 ; 矢量数据栅格化 栅格数据处理 ; 点符号编辑 线型编辑 填充模式编辑 ; 缓冲区 叠加分析 最短与最佳路径分析等 地图排版的设计与输出, 包括对地图 比例尺 图例 方向标 文字 艺术文字以及线 多边形等各种布局对象的各种操作 空间分析控件提供了对空间数据包括叠加分析 栅格表面分析 水文分析 统计分析, 网络数据集的网络分析以及栅格代数运算 内插 矢量栅格数据互相转换等的分析功能 生成 TIN 和 DEM; 三维渲染与分层设色 ; 立体透视图 ; 正射三维影像图制作 ; 纹理映像 ; 显示 旋转和三维模型浏览 ; 淹没模拟 ; 三维的分割 填方挖方计算 通视性与可视范围分析 拓扑组件库 SuperTopo.ocx 拓扑错误处理, 建立拓扑多边形 建立网络拓扑关系 图例组件库 属性表组件库 工作空间管理组件库 SuperLegend.ocx SuperGirdView.ocx SuperWkspManager.ocx 方便的图层管理工具, 提供交互式图层控制 专题图的制作 图层风格以及可视范围的设置等功能 图例组件库还另外提供了列表框和组合列表框两种图层列表控件 SuperMap 记录集 sorecordset 的可视化绑定网格控件, 可直接显示并编辑属性数据内容 工作空间中的数据源 数据集 地图 布局 线型库和符号库等的可视化管理工具 加密锁信息 SmxLockInfo.ocx 提供访问加密锁信息的功能, 可获得加密锁中的用户 3

14 SuperMap Objects 开发教程 组件库 辅助组件库 SmxAssistant.dll 名及单位信息, 二次开发商可用该信息加密应用系统 其它辅助开发用的 ATL 组件中 IsoResourceManager 用于上传二进制文件到数据库和从数据库下载到文件 SuperMap Objects 组件库之间既互相关联, 也保持相对独立性 其中核心组件库是基础的 必选的组件, 其他组件库全都是可选的 SuperMap Objects 提供了 12 个 ActiveX 控件 160 多个 AvtiveX 对象, 共计有属性 方法 事件等接口 2700 多个 其中, 控件是有图形窗口交互界面的特殊的 ActiveX 对象 SuperMap Objects 包括的控件如表 1.2 所示 表 1.2 SuperMap Objects 的控件列表 组件库名称组件库程序文件控件说明 核心组件库 SuperMap.ocx SuperWorkspace SuperMap 工作空间控件 地图控件 布局组件库 SuperLayout.ocx SuperLayout 布局控件 空间分析组件库 SuperAnalyst.ocx SuperAnalyst 空间分析控件 三维组件库 Super3D.ocx Super3D 三维分析与可视化控件 拓扑组件库 SuperTopo.ocx SuperTopo 拓扑处理控件 SuperLegend 图例控件 图例组件库 SuperLegend.ocx SuperLegendList 图例列表控件 SuperLegendCombox 图例组合列表框控件 属性表组件库 SuperGirdView.ocx SuperGridView 属性数据格网显示控件 工作空间管理组件库 SuperWkspManager.ocx SuperWkspManager 工作空间管理控件 加密锁信息组件库 SmxLockInfo.ocx SmxLockInfo 加密锁信息控件 辅助组件库 SmxAssistant.dll < 无 > ---- 除以上控件外,SuperMap Objects 还提供了适用于不同规模应用系统的空间数据访问引擎, 包括 :SDB 引擎 MDB 引擎 (SuperMap GIS 5 中为只读引擎 ) SDB+ 引擎 DWG 引擎 ( 只读引擎 ) DGN 引擎 ( 只读引擎 ) SDX+ for Oracle 引擎 SDX for SQL Server 引擎 SDX for Sybase 引擎和 SDX+for DM3 引擎 空间数据访问引擎包括在核心组件中, 缺省情况下, 核心组件提供 SDB SDB+ DWG DGN 四个文件引擎, 四个空间数据库引擎 (SDX+) 都是可选配置 大型应用系统可选用基于数据库的空间数据引擎解决方案 4

15 第 1 章理解 SuperMap Objects 图 1.1 SuperMap Objects 组件框架图 SuperMap GIS 简介 2000 年 10 月,SuperMap 2000 (V2.0) 作为 SuperMap Objects 组件式软件的第一个公开版本被正式发布, 这也是超图公司正式发布的第一个 GIS 软件产品,SuperMap 2000 以其专门面向二次开发商的特殊定位很快引起了业界的广泛关注, 随后陆续推出了包括 WebGIS 软件开发平台 -SuperMap IS 专业桌面 GIS 软件 SuperMap Deskpro 和专业数据采集软件 SuperMap Survey 嵌入式 GIS 开发平台 -esupermap 等, 它们共同构成了 SuperMap GIS 的大家族 ( 表 1.3) 年 9 月超图公司发布了 SuperMap GIS 系列软件的 5.0 版本, 以其更加全面的功能 美观的界面 方便快捷的使用为 GIS 应用与开发提供了更加完善的功能 5

16 SuperMap Objects 开发教程 表 1.3 SuperMap GIS 系列中的其他产品 产品名称 SuperMap IS SuperMap Deskpro SuperMap Survey esupermap SuperMap Express 介绍 SuperMap IS 是基于 Internet/Intranet 的分布式 GIS 产品 使用 SuperMap IS 既可以使用户可以快速地建立 Internet GIS 网站, 也可以建立基于 Intranet 企业级网络 GIS 应用系统 由于 SuperMap IS 采用了一系列创新技术, 使 SuperMap IS 在多用户访问性能, 海量空间数据发布上具有独特的优势 基于 SuperMap 技术开发的通用桌面 GIS 软件, 具有数据采集 数据转换 编辑 建库 空间数据管理 拓扑处理 空间分析 三维建模 三维可视化以及和制图等多种 GIS 功能 SuperMap Deskpro 具有操作方便, 性价比高, 兼容性强等优点 完全以 GIS 为内核的数据采集软件系统 SuperMap Survey 集大比例尺数字化成图技术 栅格图像矢量化技术 GIS 技术为一体, 使大比例尺数字化成图系统彻底摆脱了传统的 CAD 软件的束缚, 在数据的组织方式上完全与 GIS 一致, 真正地把图形数据与属性数据无缝集成起来 为 GIS 工程建设提供理想的数据解决方案 为面向嵌入式设备的地理信息系统的开发和应用提供的开发平台 esupermap 具有内存需求小 存储空间需要小 可移植性强等优点, 可以在多种硬件设备和多种操作系统上运行, 并且 esupermap 支持进行二次开发, 为嵌入式设备的地理信息系统开发和应用提供了理想工具 面向数据采集 编辑和处理人员的桌面软件, 包括数据格式转换 空间数据和属性数据编辑 空间数据库 拓扑数据处理等功能 SuperMap Express 具有编辑功能强大 支持数据格式丰富 操作方便等特点 SuperMap GIS 是一个国际化的 GIS 解决方案, 除简体中文版外, 超图公司与其合作伙伴日本超图株式会社和中科越秀 ( 香港 ) 信息产业有限公司共同制作了 SuperMap GIS 系列软件的日文版和英文版 表 1.4 SuperMap GIS 各产品首次发布时间 产品名称 首发时间 简体中文版英文版日文版韩文版 SuperMap Objects 2000 年 10 月 2001 年 9 月 2000 年 10 月 2004 年 10 月 ( 预计 ) SuperMap IS 2001 年 3 月 2002 年 1 月 2001 年 9 月 ---- SuperMap Deskpro 2001 年 11 月 年 12 月 ---- SuperMap Survey 2001 年 11 月 esupermap 2002 年 5 月 年 2 月 ---- SuperMap Express 2003 年 4 月 年 12 月 ( 预计 )

17 第 1 章理解 SuperMap Objects 1.2 理解 SuperMap Objects 基本概念 本教程将经常提到 SuperMap Objects 技术体系的一些名词, 如工作空间 数据源 数据集 地图 图层等, 这些名词被 GIS 或 SuperMap GIS 赋予了特殊的含义 准确地理解他们, 有助于您更好更快地理解本教程的内容 工作空间 工作空间管理的是用户的工作环境, 由工作空间控件 (SuperWorkspace) 创建, 用于保存用户的工作环境和工作过程中操作和处理的所有数据, 包括数据源 地图 布局和资源等内容 工作空间存放了每个数据源相对于工作空间文件 ( 扩展名为 *.smw 或 *.sxw) 的相对路径 数据源别名 数据源打开方式 ( 只读 独占 事务 加密四种方式 ) 等信息 由于工作空间存放的是数据源的相对路径和别名, 而没有存储和拷贝整个数据源, 因此工作空间文件可以和数据源 ( 文件 ) 分开存放, 而且通常文件大小比数据源文件小 工作空间中使用的空间数据仍然存储于数据源中 ; 地图由一系列有序图层构成 工作空间中的地图存储了地图中每个图层对应的数据源和数据集, 显示风格 显示比例 专题地图和图层的状态信息 ( 显示 选择 编辑 捕捉等 ); 工作空间中的布局存储了布局中的所有要素, 包括引用的地图, 以及各制图要素的位置和大小以及相互关系 ( 叠放的层次 是否成组 比例尺与地图间的对应关系等 ); 资源则包含点状符号库 线型库和填充模式库 在有些软件中, 他们也被称为点状符号库 线状符号库和面状符号库 ; 作为用户的工作环境, 同时只允许有一个工作空间 因此,1) 不要在同一个应用程序中加载超过一个工作空间控件 ;2) 打开一个工作空间的同时必须关闭另一个工作空间 在第一次初始化 SuperWorkspace 控件时, 控件自身会创建一个空的工作空间, 该工作空间不存在数据源 地图和布局, 只有系统默认的资源 ; 当用户关闭一个工作空间时 ( 使用 Close 方法 ), 系统也会自动创建一个空的工作空间 因此, 用户在使用工作空间之前, 不需要创建新的工作空间 此外还需要注意的是 :1) 由于地图和布局 资源等都是直接保存在工作空间中的, 所以修改了地图和布局 资源等要素后, 还必须要保存工作空间 2) 如果使用的是文件型数据源, 那么在复制或者移动工作空间文件时, 还必须连同数据源文件一起复制或者移动, 并保持两者的相对路径不变 3)SuperMap Objects GIS 的工作空间, 除了可以保存为 *.smw 格式外, 还可以保存为 xml 格式 (*.sxw), 在 SuperMap Objects 5 中, 更加新增了把工作空间保存到数据库中的功能, 从而更加方便多用户共享使用 7

18 SuperMap Objects 开发教程 somaps ( 地图名集合 ) solayouts ( 布局名集合 ) Maps Layouts Scenes soscenes ( 三维场景集合 ) SuperWorkspace ( 工作空间控件 ) sodatasources ( 数据源集合 ) Item sodatasource ( 数据源 ) DataSources SymbolLib Resources sosymbollib ( 符号库 ) soresources ( 资源集合 ) LineStyleLib solinestylelib ( 线型库 ) sofillstylelib sofillstylelib ( 填充模式库库 ) Datasets sodatasets ( 数据集集合 ) Item sodataset ( 数据集 ) 图 1.2 工作空间管理内容 数据源 数据源是存储空间数据的场所 前面已经提到, 所有的空间数据都存储于数据源而不是工作空间, 任何对空间数据的操作都需要先打开并且获得数据源 SuperMap Objects 的数据源分为文件型数据源和数据库型数据源 文件型数据源是把空间数据和属性数据直接存储到文件中 ; 数据库性数据源是把空间数据和属性数据一体化的存储到关系型数据库中 SuperMap Objects 的文件型数据源和数据库型数据源又分别支持多种文件格式和数据库, 详情请见 1.4 节对数据引擎的介绍 一个工作空间中可以打开多个数据源, 各数据源通过不同的别名 (Alias) 进行标识 数据集 数据集是 SuperMap Objects 空间数据的基本组织单位之一 一个数据源通常由多个不同类型的数据集组成 您可以根据自己的实际需要, 或者按照数据集的特征 或者按照不同的使用目的来组织它们, 把它们存放到不同的数据源中 SuperMap Objects GIS 提供的数据集的类型如表 1.5 所示 8

19 第 1 章理解 SuperMap Objects 表 1.5 SuperMap 数据集 类型说明元素类型元素长度图标 非空间数据集 Tabular 纯属性数据集, 无几何对象无无 Text 文本 Text 变长 Point 点 Point 定长 Point3D 三维点 Point3D 定长 Line 线 Line 变长 矢量数据集 LineM 路线 LineM 变长 Network 网络 Line + Point 变长 Region 面 Region 变长 TIN 不规则三角网 PointZ + PointGL 定长 CAD 复合数据集 任意几何对象 变长 Image 影像 ImgBlock 定长 Grid 格网 ImgBlock 定长 栅格数据集 DEM 数字高程模型 ImgBlock 定长 MrSID MrSID 压缩影像 MrSID 压缩影像连接无 ECW ECW 压缩影像 ECW 压缩影像连接无 SIT SuperMap 压缩影像 SIT 压缩影像链接 在使用数据集时, 需要区别以下几种数据集 : 矢量数据集与栅格数据集 按照数据结构的不同, 可将 SuperMap Objects 数据集分为矢量数据集 (sodatasetvector) 和栅格数据集 (sodatasetraster) 两大类 常用的点 线 面 文本等类型的数据集属于矢量数据集 ( 图 1.3a) 栅格数据集用于存储网格或影像类的数据, 影像数据集 格网数据集 MrSID 数据集和 ECW 数据集等类型的数据集属于栅格数据集 ( 图 1.3b) 在 SuperMap GIS 中, 这两种数据集可以共存于同一个数据源中, 也可以在同一个地图窗口中叠加显示 9

20 SuperMap Objects 开发教程 a 矢量数据集 复合数据集与简单数据集 图 1.3 SuperMap Objects 矢量数据集和栅格数据集 b 栅格数据集 简单数据集是指只允许存储某一种几何对象的数据集, 点 线 面 文本数据集都是简单数据集 复合数据集是指可以存储多种几何对象的数据集 这是 SuperMap Objects 用来专门存储和管理类似 CAD 组织结构的数据, 或者用于组织 CAD 用途的空间数据 ( 图 1.4 所示 ) 图 1.4 CAD 数据集中存储多种数据类型和风格 复合数据集 ( 即 CAD 数据集 ) 可以存储点 线 面 文本等不同类型的几何对象 ; 而点数据集 线数据集 面数据集 文本数据集等简单数据集都只能存储于数据集类型相同的几何对象, 比如点数据集中只能存储点对象, 而不能存储线对象 10

21 第 1 章理解 SuperMap Objects 此外, 复合数据集中的所有对象都可以存储风格 ( 同文本数据集一样 ); 而点 线 面数据集等简单数据集中的对象都不存储风格, 显示时, 复合数据集使用数据本身的风格, 而简单数据集的显示风格则通过图层风格或者专题图的方式来定义 网络数据集 网络数据集是用于存储具有网络拓扑关系的数据集 网络数据集和简单的点数据集 线数据集不同, 它既包含了网络线对象, 也包含了网络节点对象, 还包含了两种对象之间的空间拓扑关系 ( 图 1.5 所示 ) 因此网络数据集有两个子数据集 (Subdataset), 即节点数据集和线数据集 SuperMap III 以后的版本新增了自动维护网络拓扑关系的功能, 使用更加方便 当然如果不需要, 也可以关闭自动维护拓扑关系的功能 基于网络数据集, 可以进行路径分析 服务区分析 最近设施查找 资源分配 选址分区以及邻接点 通达点分析等多种网络分析 a 道路线数据集 b 道路网络数据集 空间数据集和非空间数据集 图 1.5 线数据集与网络数据集 简单的说, 有图形数据的数据集称为空间数据集 ; 没有图形数据的纯属性表称为非空间数据集 表 1.4 中列出的数据集中, 只有属性表 (Tabular) 数据集属于非空间数据集, 其他的都是空间数据集 非空间数据集不能作为图层被添加到地图窗口中显示 属性表数据集用于存储和管理纯属性 (Tabular) 数据, 属性表数据集没有空间图形数据 ( 图 1.6 所示 ) 您可以把通过拼接 (Joint) 等操作把属性数据集和其它矢量数据集连接起来, 以便进行相关操作 11

22 SuperMap Objects 开发教程 图 1.6 属性数据集 图层 当数据集被加载到地图窗口中显示时被称为图层, 因此图层是数据集的可视化定义 图层可以被看成是地图窗口中的透明薄膜, 而地图就是由一系列的透明薄膜叠加形成 一般情况下一个图层对应着一个数据集 同一个数据集可以被多次添加到不同的地图窗口中, 而且可以赋予不同的显示风格, 因此, 同一个数据集可能对应多个图层 对于不存储风格的数据集 ( 比如简单数据集 ), 在显示时系统将赋予默认的风格 ; 因此其显示风格可以随时根据需要进行修改, 这只需要修改图层风格或制作专题地图两种方法即可实现 存储风格的数据集 ( 比如复合数据集 ) 则按每个几何对象的风格来显示 图层状态是可以控制的, 比如对于二维数据集, 可以设置显示或隐藏 可选择或不可选择 可编辑或不可编辑 可捕捉或不可捕捉, 图层之间的上下顺序也可以被改变, 对于三维数据集, 还可以设置三维模型拉伸系数以及显示风格等 空间数据源 地图窗口 数据集 1 显示 图层 1 数据集 2 显示 图层 2 数据集 3 显示 图层 3 图 1.7 数据集显示为图层 12

23 第 1 章理解 SuperMap Objects 地图 图 1.8 地图 (somaps) 一个或者多个数据集被赋予一定的显示风格而显示在一个 SuperMap 窗口中, 就成为地图 ( 图 1.8 所示 ) 地图中定义了各图层的名称 显示风格 视野范围 图层状态和图层顺序等信息, 保存地图时这些信息都将一起保存下来 地图中的数据集来源于各数据源 在制作地图并保存后, 如将对应的数据源删除, 则相应的地图就会成为无本之木, 打开工作空间中的地图将会出错或出现没有数据的情况 此外, 在制作地图后, 如对相应数据集中的对象进行了编辑修改, 则地图刷新后也会相应更新 因此, 地图的概念类似于关系数据库中视图的概念, 地图中并没有存储数据集 地图并不包含数据本身的内容, 只是一种可视化定义, 是工作空间的一部分 要保存地图, 还需要保存工作空间 布局 把一个或者多个地图放置在布局窗口中适当位置, 并辅以其他制图要素如图名 图例 地图比例尺等, 就成为布局 ( 图 1.9 所示 ) 布局是数字化的空间数据与纸图之间的关系映射, 布 13

24 SuperMap Objects 开发教程 局组件则是实现这种映射的工具 布局里面的地图对象仅仅是本教程前面提到的地图对象的引用, 并没有复制地图定义的内容 因此若所引用的地图被改变, 布局里的地图也会被改变 不难推论, 若数据集内容被改变, 地图显示的内容会被相应改变, 最后布局的内容也被改变了 同地图一样, 布局也保存在工作空间里 图 1.9 布局 (Layout) 从以上几个概念可以看出, 工作空间 数据源 数据集 图层 地图 布局和资源及个概念的联系很紧密 ( 图 1.10) 数据源和工作空间对应于不同的物理存储 数据源存储于文件或数据库中, 地图 布局和资源存储于工作空间中, 工作空间存储于扩展名为 SMW 或 SXW 的文件, 或者存储在关系型数据库中 数据集 地图和图层的关系非常密切 数据集是空间数据的组织单位, 数据集的可视化表达就是图层, 而这种显示方式的保存是通过地图来实现的 14

25 第 1 章理解 SuperMap Objects 数据源 数据源名称 别名等 工作空间 数据集 1 数据集 2 数据集 3 图层 1 图层 2 图层 3 地图 布局 资源 图 1.10 工作空间及其组成部分之间的关系示意图 记录集 在 MIS( 管理信息系统 ) 概念里, 记录 (Record) 是处理和存储信息的基本单位, 记录的集合叫记录集 (Recordset) SuperMap 空间数据组织和存储方式的基本单位也是记录 每个空间几何对象对应一条记录, 这条记录中既有属性字段 ( 或称属性列 ), 又有几何字段 一般地, 记录集是数据集的全部或者部分记录的集合 记录集通常是把数据集中的记录按照某种条件筛选出来的 可以是对行的筛选, 也可以是对列 ( 字段 ) 的筛选, 或者二者结合起来 如果在记录集中添加 修改或删除某个记录, 数据集中的数据将发生相应的变化 空间数据中的记录与 MIS 概念中记录也有重要的区别 : 空间数据的记录一般都有一个特殊的几何字段, 用来存储几何对象的空间位置信息 同时, 空间数据的记录还有一些字段是 GIS 软件平台必需的系统字段 (SuperMap GIS 中是以 sm 开头的字段 ), 这些字段除非特别申明, 一般都不允许对它们进行修改 而 MIS 概念中的记录则没有这些特点 表 1.6 SuperMap Objects 记录集结构表 记录标识符 (SmID) 几何字段 (SmGeometry) 属性字段 1 属性字段 2 属性字段 n 1 几何对象 1 1 属性值 1 1 属性值 2 1 属性值 n 2 几何对象 2 2 属性值 1 2 属性值 2 2 属性值 n n 几何对象 n n 属性值 1 n 属性值 2 n 属性值 n SuperMap Objects 提供的 SuperGridView 控件就专门用来绑定显示记录集中的属性字段 15

26 SuperMap Objects 开发教程 几何对象 SuperMap Objects 提供了十余种几何对象, 除常见的点 线 面 文本几何对象之外, 还提供了复合几何对象和多种 CAD 中常用的参数化几何对象 参数化几何对象包括弧对象 (sogeoarc) B 样条曲线对象 (sogeobspline) C 样条曲线对象 (sogeocardinal) 圆对象 ( sogeocircle ) 曲线对象 (sogeocurve ) 椭圆对象 (sogeoellipse ) 斜椭圆对象 (sogeoellipseoblique) 椭圆弧对象 (sogeoellipticarc) 等 复合几何对象则由多个相同或不同类型的子对象构成 复合几何对象和参数化几何对象都只能放在 SuperMap Objects 的复合数据集 (CAD 数据集 ) 里, 通过类型转换 ( 采用 ConvertToLine 或 ConvertToRegion 方法 ), 可以把他们转成折线化的线或面对象, 添加到 GIS 图层中进行各种分析 1.3 理解 SuperMap Objects 对象结构 在学习使用 SuperMap Objects 编程时, 需要不断地和 SuperMap Objects 数以百计的对象打交道 本节简要介绍 SuperMap Objects 的基本结构以及如何理解对象结构图 理解组件对象关系 了解组件对象之间的各种关系, 有助于理解 SuperMap Objects 对象结构图 SuperMap Objects 组件涉及到的对象关系包括继承关系 聚合关系和关联关系三种 继承关系 (Inheritance, Is-A-Kind-Of 关系 ) 父类与子类的继承关系在 SuperMap Objects 中用三角形符号表示, 如图 1.11 所示 : 图 1.11 SuperMap Objects 几何对象之间的继承关系 16

27 第 1 章理解 SuperMap Objects 聚合关系 (Aggregation, Is-Composed-of 关系 ) 聚合关系表示对象间的组成关系, 用菱形符号表示 组成关系符号根据实际情况进一步细分为三种符号 比如当 A 类型对象由 B 类型对象和其它对象组成时, 我们以下面三种符号表示 A 类型对象和 B 类型对象之间可能的关系 图示 说明 solayer sopjcoordsys sorecordset sodataset sopjgeocoordsys sogeometry 一个 solayer( 图层对象 ) 包含一个 sodataset ( 数据集对象 ) sodataset( 数据集 ) 是存储数据的对象,soLayer 是地图中的图层对象, 二者有密切的联系 当一个数据集添加到地图中显示, 该地图就增加了一个图层 图层实际上是赋予了显示属性的数据集 这些显示属性包括显示风格 (Style) 和专题地图 一个图层对应着一个并且只有一个数据集 一个 sopjcoordsys( 坐标系对象 ) 包含零个或一个 sopjgeocoordsys( 地理投影坐标系对象 ) 如果 sopjcoordsys 的类型是普通平面直角坐标系比如普通的建筑平面图 机械构件图等, 此时 sopjcoordsys 对象不包含 sopjgeocoordsys 对象 ; 如果 sopjcoordsys 的类型是地图投影系, 那么, 它的数据与地球的形状是相关, 所以需要指定一个投影系所依赖的地理坐标系 (sopjgeocoordsys), 用以描述地球的半径 扁率等等 一个 sorecordset( 记录集对象 ) 包含零个或多个 sogeometry( 几何实体对象 ) 记录集是从数据集 (sodataset) 中使用 Query 或者 QueryEx 方法查询出来的记录集合 记录集可能包含或不包含几何对象, 如果包含几何实体对象, 那么其中每一条记录都应该有一个几何实体对象 因此一个 sorecordset 包含零个或多个 sogeometry 图 1.12 SuperMap Objects 对象之间的三种聚合关系 关联关系 (Association) 关联关系表示对象间逻辑上和概念上的联系, 用单实线表示 例如运动员和篮球的关系, 17

28 服务器机和客户计算机的关系等等 SuperMap Objects 开发教程 sodatasetvector sooverlayanalyst 图 1.13 SuperMap Objects 几何对象之间的关联关系 数据访问及空间分析对象结构 工作空间控件用于管理空间数据和多数据源访问, 以及符号库 线型库和填充库等资源, 是 SuperMap Objects 的核心控件之一 工作空间中可以同时打开或存储多个数据源 因此, 从工作空间中可以获得数据源集合对象 (sodatasources), 从数据源集合对象中可以获得所需的某一个数据源 sodatasource 每个数据源中可以有多个数据集, 因此, 可以从某一个数据源获得其中所有的数据集对象, 即数据集集合对象 sodatasets 从集合对象中可获得所需的某一个数据集 sodataset, 数据集按其数据结构可分两大类 栅格数据集 (sodatasetraster) 和矢量数据集 (sodatasetvecter) 通常,GIS 中用于分析的数据集多为矢量数据集类型 每一个矢量数据集都对应着相应的记录集 (sorecordset), 记录数据集中的记录对应每个几何对象 sogeometry 及其属性信息 (sofieldvalue 对象 ) 矢量数据集的属性表数据结构字段信息可通过 sofieldinfo 对象的接口进行管理 18

29 第 1 章理解 SuperMap Objects 1.14 数据访问和空间分析对象结构图 19

30 SuperMap Objects 开发教程 空间数据可视化 ( 二维 ) 对象结构 SuperMap 地图窗口控件是 SuperMap Objects 的核心控件之一, 其主要功能是进行空间数据的显示 基本操作 编辑以及大部分空间分析功能 SuperMap 地图窗口控件提供了显示窗口句柄, 可以显示空间数据 从其主要对象结构图 1.15 中可以看出, 地图窗口控件对象中有图层集合 (solayers) 跟踪层 (sotrackinglayer) 和选择集 (soselection) 三个主要对象 图层可以看作是地图窗口上显示空间数据的透明薄膜, 空间数据在地图窗口上的显示是以图层方式进行的, 一个地图窗口上可以显示多个空间数据, 对应多个图层 以 sotheme 为首命名的对象为专题图制作对象 在图层的上层还有跟踪层, 通常用于显示地图窗口中的动态空间目标 选择集是地图窗口中某个图层上以选中状态高亮显示的所有对象的集合, 是一个逻辑意义上的对象, 其实质仍然是矢量数据集中的对象集合或者记录集 20

31 第 1 章理解 SuperMap Objects 图 1.15 数据可视化对象结构图 几何图元及其相关对象结构 几何对象是空间编辑的主要对象, 了解其相关的主要对象及其相互关系将有利于系统开发 从几何对象相关的对象结构图 1.16 可以看出,soGeometry 是所有各种几何对象的父类 其子类包括点几何对象 (sogeopoint) 线几何对象 (sogeoline) 面几何对象 (sogeoregion) 文本 21

32 SuperMap Objects 开发教程 几何对象 (sogeotext) 对象 路线对象 (sogeolinem) 以及多义线对象 (sogeopath) 复合几何对象 (sogeocompound) 以及圆 弧 椭圆 斜椭圆等参数化的几何对象 几何对象在显示时可以赋予不同的显示风格 (sostyle 或 sotextstyle) 此外, 几何对象之间具有复杂的空间位置关系 (sospatialralation), 如包含 相交 相等 分离 叠加 相接等关系 通过空间操作对象 sospatialoperator 可以进行各种几何对象之间的空间运算, 如进行几何对象的相交 相并 相减 对称差, 或者进行自身的边界 缓冲区 凸包 分裂等运算 几何对象按照一定的条件, 可以采用 sogeometrist 对象进行一些简单的几何运算求解 对于任意一个几何对象, 都可以通过 Bounds 属性得到其外接矩形 在现实生活中, 面几何对象 (sogeoregin) 线几何对象 (sogeoline) 和点几何对象 (sogeopoint) 之间具有密切的空间拓扑关系 面对象和线对象都可以由多个点对象的位置确定, 反过来, 通过面对象和线对象也可以获得组成这些对象的节点的位置 图 1.16 表示了点 线 面几何对象通过简单点集合对象 (sopoints) 和简单点对象 (sopoint) 进行相互转换的主要接口和过程 sogeoarc ( 弧几何对象 ) sogeocircle ( 圆几何对象 ) sogeoellipse ( 椭圆几何对象 ) sogeoellipseoblique ( 斜椭圆几何对象 ) sogeoellipticarc ( 椭圆弧几何对象 ) sogeocompound ( 复合几何对象 ) sogeorect ( 矩形几何对象 ) sostyle ( 风格 ) Style SpatialOperator sospatialoperator ( 空间操作 ) sogeoroundrect ( 圆角矩形几何对象 ) sogeometrist ( 基本几何运算对象 ) sorect ( 简单矩形 ) Bounds sogeometry ( 几何对象 ) SpatialRelation sospatialrelation ( 空间关系 ) SoGeoBSpline (B 样条几何对象 ) sogeoline ( 线几何对象 ) sogeoregion ( 面几何对象 ) sogeolinem ( 路线对象 ) SoGeoPie ( 扇面几何对象 ) sogeotext ( 文本对象 ) sogeocurve ( 曲线几何对象 ) sogeopoint ( 点几何对象 ) sogeocardinal (C 样条几何对象 ) GetPartAt() GetPartAt() sopoints ( 点集合 ) GetPointAtM() GetPartAt() sopointms ( 线标点串对象 ) TextStyle sotextstyle ( 文本风格 ) GetPartAt() sotextpart ( 文本子对象 ) sogeopath ( 路径几何对象 ) GetNodes() Item sopoint ( 点 ) Item sopointm ( 线标点对象 ) sogeocustom ( 自定义集合对象 ) SoPathNodes ( 路经节点对象集合 ) GetItem() SoPathNode ( 路径节点对象 ) 图 1.16 几何实体对象结构图 22

33 第 1 章理解 SuperMap Objects 布局对象结构 SuperLayout 控件为地图排版和输出提供了一系列的功能接口 首先, 布局控件提供了窗口句柄, 为制图要素的排版提供了版面 版面的设置是在逻辑页面 (solytpage 对象 ) 上进行的, 并通过 solytrulelines 对象设定一定的标尺线 其次, 布局控件提供了制图要素对象 ( 即布局元素 solytelement), 用于在版面上添加不同种类的布局元素 SuperLayout 一系列的制图要素对象包括要输出的地图 (solytmap) 比例尺 (solytmapscale) 图例 (solytlegend) 指北针 (solytdirection) 地图名称文本 (solyttext) 表格 (solyttable) 以及点 (solytpoint) 折线 (solytpolyline) 多边形 (solytpolygon) 椭圆 (solytellipse) 圆 (solytcircle) 等几何图形要素对象, 这些制图要素可以组合成组, 进行统一的位置调整 在所有的制图要素中, 最重要的制图要素首先是地图要素 solytmap, 与地图要素紧密相关的是图例和比例尺要素 多个制图要素构成制图要素集合 (solytelements), 这些制图要素在排版版面上都可以被选中, 选中的待处理对象都存放在对象 solytselections 中, 选择集中的所有对象其实质都是布局元素 solytarc ( 圆弧 ) solytdirection ( 方向标 ) solytgroup ( 组 ) solytlinesect ( 线段 ) solytarttext ( 艺术字 ) solytellipse ( 椭圆 ) solytroundrect ( 圆角矩形 ) solytpage ( 布局纸面对象 ) Page solytrulerlines ( 布局标尺线集合 ) RulerLines Item SuperLayout ( 布局控件 ) solytrulerline ( 布局标尺线 ) Elements solytelements ( 布局元素集合 ) Selection solytselection ( 布局选择集 ) Item solytelement ( 布局元素 ) Item solyttext ( 文本 ) solytpolyline ( 折线 ) solytmapscale ( 地图比例尺 ) solytmap ( 地图 ) solytpolygon MapBorder ( 多边形 ) solyttable ( 表格 ) solytmapborder ( 地图边框 ) 图 1.17 布局对象结构图 solytlegend ( 图例 ) solytpoint ( 点对象 ) solytrect ( 矩形 ) solytpicture ( 图片 ) 23

34 SuperMap Objects 开发教程 投影对象结构 SuperMap Objects 的投影子系统包含了国内外常用的基本投影类型, 都具有从地理坐标根据某种投影方案转换到投影平面的平面坐标及其反算得到的功能接口, 使得用户能够充分利用现有的各种不同坐标系统的数据资源 sopjtranslator ( 投影转换器 ) sopjcoordsys ( 投影坐标系 ) GeoCoordSys PJParams sopjgeocoordsys ( 地理坐标系 ) sopjparams ( 投影参数 ) PJPrimeMeridian PJDatum sopjprimemeridian ( 中央经线 ) sopjdatum ( 大地参照系 ) PJSpheroid sopjspheroid ( 地球椭球体 ) 图 1.18 投影对象结构图 1.4 理解 SuperMap Objects 空间数据引擎 前面提到,SuperMap Objects 的数据源分为文件型和数据库型, 它们又支持多种具体的数据格式, 每种格式都是一种数据引擎 文件型包括 :SDB 引擎 SDB 5 引擎 DGN 引擎 DWG 引擎 ; 数据库型包括 :SDX 5 for Oracle 引擎 SDX 5 for SQL Server 引擎 SDX 5 for Sybase 引擎 1. SDB 引擎 SDB 引擎是文件型空间数据引擎, 采用文件 + 数据库混合存储方式 SDB 引擎的一个数据工程包括两个文件, 扩展名为 SDB 的文件存储空间数据, 采用 OLE 复合文档技术 ; 扩展名为 SDD 的文件为属性数据库, 采用 Access 的 MDB 数据库格式 由于 24

35 第 1 章理解 SuperMap Objects SDB 文件采用了复合文档技术, 因此提供了在一个 SDB 工程中存储多个数据集的能力 注意 : 不要随意使用 Access 来直接读写 SDD 文件, 否则可能导致不可预料的错误 SDB 引擎仅仅支持多用户共享读访问, 但只支持单用户写操作 SDB 主要面向中 小型系统和桌面应用 2. SDBPlus 引擎 SDBPlus 引擎是 SuperMap Objects 5.0 推出的增强 SDB 文件型数据引擎 采用新的数据存储结构和空间索引方式, 速度更快, 效率更高, 支持引擎中新的数据模型和新特性 适合中小型系统使用 3. DGN 引擎 DGN 引擎也是一个基于文件的空间数据引擎, 是 SuperMap Objects 中实现的第一个访问其它软件数据格式的引擎 DGN 引擎提供了直接访问 MicroStation DGN 数据文件的能力 DGN 引擎是一个只读引擎, 您可以使用 DGN 数据源中的数据, 但不提供编辑功能 4. DWG 引擎 与 DGN 引擎类似,DWG 引擎提供了直接访问 AutoCAD 的 DWG 数据文件的能力 DWG 引擎也是只读引擎 5. SDX for SQL Server 引擎 SQL Server 引擎是一个基于大型数据库 SQL Server 的纯关系数据库空间引擎 实现了空间数据和属性数据的无缝组织, 支持大数据量管理, 支持多用户共享读写访问, 支持短事务和长事务处理, 有严格的权限管理 SQL Server 引擎适合建立大型空间数据应用 6. SDX+ for SQL Server 引擎 支持 Ms SQL Server 的 SDX+ 空间数据引擎 7. SDX for Oracle 引擎 与 SDX for SQL Server 类似,SDX for Oracle 引擎也是一个基于大型关系数据库的控件数据库, 其特性与空间数据组织方式与 SDX for SQL Server 类似 8. SDX for Oracle Spatial 引擎 SDX for Oracle Spatial 与 SDX for Oracle 有些区别 SDX for Oracle Spatial 采用 Oracle 定义的 Oracle Spatial 数据存储方案 由于 Oracle Spatial 目前缺乏对文本 网络 TIN DEM 等数据存储的支持, 因此 SDX for Oracle Spatial 也不支持这些功能 9. SDX+ for Oracle 引擎 SDX+ for Oracle 采用了 SuperMap 的第三代空间数据库技术, 与 SDX for Oracle 相比,SDX+ 25

36 SuperMap Objects 开发教程 for Oracle 在数据存储格式和空间索引技术上都作了全新的设计, 空间数据访问速度和管理数据量的大小都有很大提高 SDX+ for Oracle 从 SuperMap Objects GIS 3.1 版本开始发布, 发布时是 SuperMap Objects 速度最快的基于数据库的空间数据引擎 一般地, 建议 SuperMap Objects 3.1 或更高版本的用户使用 SDX+ for Oracle 引擎代替其他两个使用 Oracle 的引擎 10. SDX+ for Sybase 引擎 支持 Sybase 数据库的 SDX+ 空间数据引擎 11. SDX+ for DM 引擎 支持达梦数据库的 SDX+ 空间数据引擎 在以上多种数据引擎的基础之上,SuperMap Objects 研发了独特的多源空间数据无缝集成技术 通过这一个技术, 可以在一个系统中直接使用多种数据格式而无需转换, 并可以在不同格式的数据之间进行叠加显示 查询和分析 在实际应用中, 您可以根据应用系统需求, 选择一个或者多个合适的数据引擎 1.5 理解 SuperMap Objects 示范代码库 本教程内容根据 SuperMap Objects 的各功能模块分章节组织, 在论述 SuperMap Objects 各功能的基础上还提供了大量的示例代码, 这会使您很容易掌握每一小节的内容, 轻松实现 GIS 的各种功能 与本教程设计思想一致的还有 SuperMap Objects 范例程序库, 您可以在 SuperMap Objects 开发版的安装目录下找到他们 该范例程序库是 SuperMap Objects 开发组专门为二次开发用户编写的例子程序的集合 范例程序库是针对某一个或一些具体功能来组织和编写的, 程序库内的示范工程实现了 SuperMap Objects 的大部分功能, 您可以通过研究这些范例程序来理解 SuperMap Objects 常用接口的使用 范例程序库包括近 50 个 Visual Basic 示范程序 30 多个 Delphi 示范程序和 30 多个 Visual Basic.NET 示范程序, 每个工程都完成特定的功能, 程序简单 条理清晰, 适合于初学者的入门学习, 能够满足二次开发者的实际需要 此外 SuperMap Objects 还提供了一个相对比较完整的桌面程序范例 (VB 代码 ), 它应用到的控件 对象及对象的属性 方法比较多, 可以作为您构建应用程序的参考样板, 甚至也可以直接以此为基础开发应用系统 1.6 编码约定 在各种编程语言的教程中, 通常都会推荐一些编程时的编码约定 这些约定不是强制性的, 26

37 第 1 章理解 SuperMap Objects 但是采用同一套编码约定可以提高代码的可读性, 减少因为不规范的代码造成的种种问题, 提高编程的效率 您可以在其他的书籍中找到一些 VB 本身的约定, 在此, 我们仅向您介绍本教程推荐的一些约定 使用 Option Explicit 开关 在 VB 中使用强制变量声明机制 虽然 VB 也支持使用变量时不用声明的机制, 但是这将会造成很多的问题 当程序复杂时, 这种问题更加明显 所以, 作者强烈建议您使用强制变量声明机制 使用局部变量 尽量使用局部变量, 将变量的影响范围控制在一定的范围内 当如果一定要使用全局变量, 必须在使用到的地方加上明显的说明 使用对象要注意 使用对象类型的变量之前必须判断该对象是否有效, 即是否为 Nothing; 当不再使用该对象时, 必须手工的释放该对象变量, 即使用 Set 关键字将变量设为 Nothing 关于 SuperMap Objects 变量的说明 为了便于记忆和使用,SuperMap Objects 采用了一套统一的命名规则 SuperMap Objects 中的对象以 so 为前缀, 加上代表实际含义的变量名,so 即 SuperMap Object, 如 sooverlayanalyst 即表示 SuperMap Objects 中用于叠加分析的对象 ;SuperMap Objects 中的枚举变量以 se 为前缀, 即 SuperMap Objects Enum, 如 seoverlaymode 表示叠加分析枚举变量 SuperMap Objects 的常量以 sc 为前缀, 即 SuperMap Objects Constant 第三个字母为枚举变量的第一个字母 ( 有可能相同 ), 如 scacircleselect 和 scaselect 都是 seaction 枚举变量的一个常量 退出应用系统要注意 退出应用系统的时候除了要释放对象级变量之外, 还有一项更重要的工作要做, 就是要断开控件之间的连接, 以及关闭相应的资源, 示范程序如下 : ( 假定应用系统中仅使用 SuperMap Objects 的核心控件, 分别命名为 SuperMap1 SuperWorkspace1) SuperMap1.Close SuperMap1.DisConnect SuperWorkspace1.Close // 关闭 SuperMap // 断开地图控件与工作空间空间的连接 // 关闭工作空间 27

38 SuperMap Objects 开发教程 如果使用了图例组件, 上述退出代码应为 : SuperLegend1.Clear SuperLegend1.Disconnect SuperMap1.Close SuperMap1.DisConnect SuperWorkspace1.Close 若是用了布局或三维控件, 以此类推处理 1.7 思考与练习 // 关闭图例空间 // 断开图例控件与地图控件的连接 // 关闭 SuperMap // 断开地图控件与工作空间空间的连接 // 关闭工作空间 1 组件式 GIS 与 GIS 组件有什么区别和联系? 2 您认为组件式 GIS 具有哪些优势? 3 SuperMap 包括哪些控件? 4 数据集和图层有什么区别和联系? 5 SuperMap 提供了哪些空间数据引擎? 其中, 哪些是基于文件的引擎? 哪些是基于数据库的引擎? 哪些是只读的引擎? 28

39 第 2 章核心控件之数据管理控件 SuperWorkspace 介绍 本章主要介绍全组件式 GIS 软件 SuperMap Objects 的核心控件之一 SuperWorkspace( 工作空间控件 ), 包括 SuperWorkspace 控件的对象结构 SuperWorkspace 控件的主要功能 此外, 本章最后还提供一些思考和练习, 以回顾和加深对本章内容的理解 目标 通过本章的学习, 您将能掌握如下内容 : 工作空间的概念 ; 工作空间中四大要素的关系 : 数据源 (Datasources) 数据集 (Dataset) 地图 (Map) 图层 (Layer) 之间的关系 ; 通过索引或名称访问数据源和数据集 ; 打开和创建不同的数据源文件 ; 创建 SuperMap Objects 中不同类型的数据集 ; 修改 SuperMap Objects 数据库 ; 将其它系统的数据格式转为 SuperMap Objects 的数据格式 ; 将 SuperMap Objects 的数据格式转为其它系统的数据格式 2.1 SuperWorkspace 控件简介 SuperWorkspace 控件是全组件式 GIS 软件 SuperMap Objects 的核心控件之一, 主要功能是管理数据, 包括工作空间文件的创建 打开 保存 关闭, 数据源文件的创建 打开 修复和压缩, 数据集的创建以及数据库的管理等等 它就相当于一个数据仓库,SuperMap Objects 的其它控件所需的数据都要从 SuperWorkspace 控件中获取, 同时 SuperWorkSpace 控件还负责为 SuperMap 控件的正常工作做一些必要的辅助处理, 例如装入已有的线型库文件 (*.lsl) 符号库文件 (*.sym) 填充模式库 (*.bru), 装载 / 卸载字体文件等 在 SuperMap Objects 的数据组织中, 工作空间是个十分重要的概念, 工作空间是用户在同一个工程中 ( 或者是一个事务 ) 工作环境的集合, 包括数据源的信息 ( 位置 别名和打开方式 ) 地图 ( 包括专题图 ) 布局 ( 一个或者多个 ) 资源 ( 线型库 符号库 填充模式库 ) 将组织良好的工作空间保存为工作空间文件, 在下一次工作时就能很快恢复当时的工作环境, 最大限度 29

40 地利用已有的工作成果, 提高工作效率 SuperMap Objects 开发教程 SuperWorkspace 数据地图布局资源 其它控件从工作空间中获取数据, 显示为地图 地图窗口三维窗口表单 对数据进行分析 处理, 生成不同形式的成果 普通地图影像图专题地图 表单 发布成果 排版出图决策报告网络电子地图发布 其他 图 2.1 SuperMap Objects 工作流程图 SuperWorkspace 控件与其它控件的关系 ( 结合整个 GIS 应用程序的工作流程 ) 可由图 2.1 简要描述 2.2 SuperWorkspace 控件的对象结构 SuperWorkspace 控件提供了一系列的方法和属性, 便于用户管理数据 SuperWorkspace 控件的结构如下图所示 : 30

41 第 2 章核心控件之数据管理控件 SuperWorkspace 图 2.2 SuperWorkspace 控件结构图 2.3 管理工作空间文件 创建新的工作空间 在 SuperMap Objects 中, 用户第一次初始化 SuperWorkspace 控件时, 控件会自动创建一个空的工作空间, 该工作空间不存在数据源 地图和布局, 只有系统默认的资源 ; 当用户关闭一个工作空间时 ( 使用 Close 方法 ), 系统也会自动创建另一个空的工作空间 对于系统默认创建的工作空间, 用户不需要作特别的初始化工作即可使用 所以说您不需要手工去创建工作空间, 只需要把所做的工作保存为工作空间文件 ( 使用 SuperWorkspace.Save SuperWorkspace.SaveAs 方法 ) 关闭工作空间 ( 使用 SuperWorkspace.Close 方法 ) 或下次再打开这个工作空间文件 ( 使用 SuperWorkspace.Open 方法 ), 当然, 用户可以通过 SuperWorkspace.Create 方法创建新的工作空间 下面会详细介绍这些方法的使用 打开已有的工作空间 工作空间文件保存了上一次存盘时用户工作的环境, 打开以后就可以恢复当时的工作环境 以下例子演示使用 VB 的公用对话框打开已有的工作空间文件 ( 如何在各种平台上加载 SuperMap Objects 请参考 SuperMap Objects 入门教程 ) 在 VB 中新建一个工程, 并在窗体上加入一个公用对话框控件 (cdlfile), 一个命令按钮控件 (cmdopen), 一个 SuperWorkspace 控件 (SuperWorkspace1)( 注意, 一个工程中有且仅有一 31

42 个 SuperWorkspace 控件 ) 布局如下图所示 : SuperMap Objects 开发教程 公用对话框 命令按钮 SuperWorkspace 控件 图 2.3 窗体布局图 在 cmdopen 的 Click 事件中添加打开工作空间文件的代码, 如下 : Private Sub cmdopen_click() Dim strfilename As String ' 文件名 Dim bopenstatus As Boolean ' 打开结果 ' 设置公用对话框参数 cdlfile.dialogtitle = " 打开工作空间文件 " ' 对话框的标题 cdlfile.initdir = App.Path ' 设置文件的初始目录为应用程序所在的目录 cdlfile.filter = "SuperMap 工作空间文件 (*.smw) *.smw" ' 设置打开文件的扩展名 cdlfile.showopen ' 使用打开文件公用对话框 ' 判断文件名是否有效 If cdlfile.filename <> Then ' 文件名为空, 表示可能用户取消操作 strfilename = cdlfile.filename Else Exit Sub End If ' 打开工作空间文件, 并报告打开的结果 32

43 第 2 章核心控件之数据管理控件 SuperWorkspace bopenstatus = SuperWorkspace1.Open(strFileName) If bopenstatus Then MsgBox " 打开工作空间文件成功!" Else MsgBox " 打开工作空间文件失败!" End If End Sub 工作空间中不仅可以打开文件型数据源, 还可以直接读取以不同数据库格式存储的空间数据, 包括 SQL SQL+ Oracle Spatial Oracle Sybase 和 DM 数据源 通过指定所要访问的服务器名称 数据库名称以及访问数据库的用户名和密码等参数来打开数据库格式的数据 采用的接口为 SuperWorkspace.OpenDataSourceEx( 此处为各项参数 ) 保存工作空间 SuperWorkspace 控件提供了两种方法保存工作空间, 分别为 : Function Save() As Boolean Function SaveAs(strWorkspaceName As String, bfailifexists As Boolean,[bXmlFormat As Boolean]) As Boolean Save 方法用于以当前的名称保存工作空间 ;SaveAs 方法用于以指定的名称保存工作空间, 参数 strworkspacename 为另存的工作空间文件名, 参数 bfailexist 表示是否可以覆盖已有的文件, 若 bfailexist = True 表示不允许覆盖原有文件 ; 若 bfailexist = False 表示允许覆盖原有文件 SuperWorkspace 控件的属性 Modified 返回工作空间是否有所改动, 若 Modified = True 表示工作空间有改动而且没有保存, 若 Modified = False 表示工作空间无改动 值得指出的是, 在 SuperMap Objects 中, 工作空间可以保存成 *.sxw 格式, 这种文件格式类似于 XML 的格式, 可以通过文本编辑器打开并进行修改 在上边的 SaveAs 方法中, 最后一个可选参数 bxmlformat 如果为 True, 表示存储为 sxw 格式, 如果为 False, 则不存储为 sxw 格式 工作空间中的数据源还可以另存为数据库的工作空间, 提供保存为 SQL 工作空间和 Oracle 工作空间的功能 以下例子演示在应用程序关闭时根据工作空间是否改变和用户的选择来决定是否保存工作空间 注 :VB 中处理窗体关闭事件的代码应该写在 Form_Unload(Cancel As Integer) 事件中 Private Sub Form_Unload(Cancel As Integer) Dim bismodified As Boolean ' 用于检测工作空间是否变化 Dim nrespond As Integer ' 用于接收用户的选择 ' 获得工作空间的状态 bismodified = SuperWorkspace1.Modified ' 接收用户的选择 If bismodified Then nrespond = MsgBox(" 工作空间已经改变, 是否存盘?", vbyesnocancel) 33

44 SuperMap Objects 开发教程 ' 根据用户的选择进行相应的处理 Select Case nrespond Case vbyes: SuperWorkspace1.Save Case vbno: Exit Sub Case vbcancel: Cancel = -1 ' 取消关闭窗口的操作 Case Else Cancel = -1 End Select End If End Sub 关闭工作空间 使用 SuperWorkspace 的 Close 方法就可以关闭工作空间 但是在关闭工作空间以前, 需要将程序中所有正在使用工作空间中数据的窗口关闭, 否则, 将会发生不可预料的错误, 这一点需要特别注意 以下是关闭工作空间的步骤 : 1. 使用完记录集应及时关闭 ; 2. 关闭 SuperMap 控件之前, 应先把 SuperMap 的全部 Layer( 图层 ) 删除 ; 3. 关闭 SuperWorkspace 控件之前, 一定要先关闭所有使用 SuperWorkspace 控件中数据的 SuperMap Super3D 等控件, 并断开这些控件与 SuperWorkspace 控件的连接 最后还要移除工作空间中所有的数据源 在关闭工作空间时, 通过 SuperWorkspace 的 Modified 属性可以确定工作空间的状态, 从而决定是否在关闭工作空间以前保存工作空间 2.4 获取工作空间的数据元素 这一节将在第三节例子的基础上做一些改进, 不但打开工作空间文件, 而且将工作空间的信息显示出来, 如工作空间中打开了多少个数据源, 保存有多少张地图和布局 ( 当然您也可以加上其它的信息如工作空间所用到的符号库文件 线型库文件 字体文件等 ) 在上一节的工程中添加三个列表框控件, 两个命令按钮, 三个静态文本控件, 一个框架控件, 布局如下图所示 : 34

45 第 2 章核心控件之数据管理控件 SuperWorkspace 显示按钮 数据源列表 地图列表 布局列表 图 2.4 工程布局图 为了将工作空间的信息显示出来, 在显示按钮的 Click 事件中添加如下代码 : Private Sub cmdshow_click() Dim objdatasources As sodatasources ' 数据源集合对象 Dim objdatasource As sodatasource ' 数据源对象 Dim i As Integer ' 循环变量 Dim objmaps As somaps ' 地图集合对象 Dim objlayouts As solayouts ' 布局集合对象 ' 获取工作空间数据源集合对象 Set objdatasources = SuperWorkspace1.Datasources ' 判断数据源集合中的数据源是否为零, 不为零则添加到列表框中 If objdatasources.count <> 0 Then ' 清空列表框 lstdatasource.clear ' 依次将数据源的别名添加到数据源列表中 For i = 1 To objdatasources.count ' 取数据源 Set objdatasource = objdatasources.item(i) ' 往列表框中添加数据源别名 lstdatasource.additem objdatasource.alias Next i End If ' 以下用同样的方式添加地图和布局 Set objmaps = SuperWorkspace1.Maps If objmaps.count <> 0 Then lstmap.clear For i = 1 To objmaps.count lstmap.additem objmaps.item(i) Next i 35

46 SuperMap Objects 开发教程 End If Set objlayouts = SuperWorkspace1.Layouts If objlayouts.count <> 0 Then lstlayout.clear For i = 1 To objlayouts.count lstlayout.additem objlayouts.item(i) Next i End If ' 清空对象 Set objdatasources = Nothing Set objdatasource = Nothing Set objmaps = Nothing Set objlayouts = Nothing End Sub 2.5 访问工作空间的数据元素 本节将在前几节的基础上, 进一步学习从工作空间中动态地获取其中的数据元素 即如何通过指定的名称生成或者获取相应的数据源对象 通常情况下,GIS 的数据量是相当大的, 一次将所有的数据都调入, 不但占用过多的系统资源, 降低系统性能, 而且没有必要 可行的策略是, 首先将所有数据的相关信息读入, 对于数据的详细信息 ( 如坐标和属性 ) 则在需要的时候再调入 基于这一思想,SuperMap Objects 在 SuperWorkspace 控件中只保存数据的链接关系, 所以, 我们可以从工作空间中先读出工作空间中数据元素的名称, 然后根据名称获得相应的数据 下面的例子在前面章节的例子上稍作修改, 向您演示如何从给定数据源的名称获得数据源对象, 并且将其中的数据集名称列出来 例子程序的界面如下所示 : 36

47 第 2 章核心控件之数据管理控件 SuperWorkspace 数据集列表 (lstdatasets) 数据源下拉组合框 (cmbdatasources) 图 2.5 工程布局图 首先需要将工作空间中所有数据源的名称添加到数据源下拉组合框中, 为此在显示按钮 (cmdshow) 的 Click 事件中添加如下代码 : Private Sub cmdshow_click() Dim objdatasources As sodatasources Dim i As Integer ' 数据源对象 ' 循环变量 ' 取得数据源对象 Set objdatasources = SuperWorkspace1.Datasources ' 判断数据源集合中是否有数据源 If objdatasources.count = 0 Then MsgBox " 工作空间中没有数据源!", vbinformation Exit Sub End If ' 添加数据源的名称 cmbdatasources.clear For i = 1 To objdatasources.count ' 注意 : 以下语句通过数据源的索引 (I) 访问单个数据源 ' 数据源也可以通过数据源的别名访问, 将在后面演示 cmbdatasources.additem objdatasources.item(i).alias Next i ' 设置组合框的显示内容为添加的第一个元素 cmbdatasources.listindex = 1 ' 释放对象变量 Set objdatasources =Nothing End Sub 在数据源下拉组合框中添加工作空间中所有的数据源别名以后, 接着需要处理当选中某一 37

48 SuperMap Objects 开发教程 个数据源时如何在数据集列表中显示相应的数据源中所有数据集的名称, 为此, 在组合框的 Click 事件中添加如下的处理代码 : Private Sub cmbdatasources_click() Dim objdatasources As sodatasources Dim objdatasource As sodatasource Dim strdatasourcealias As String Dim objdatasets As sodatasets Dim objdataset As sodataset Dim i As Integer ' 数据源集合对象 ' 数据源对象 ' 数据源别名 ' 数据集集合 ' 数据集 ' 循环变量 ' 在数据源下拉组合框中获取数据源的别名 strdatasourcealias = cmbdatasources.text ' 使用数据源的别名获得数据源对象, 不用索引 Set objdatasources = SuperWorkspace1.Datasources Set objdatasource = objdatasources(strdatasourcealias) ' 或者改为以下的语句 'Set objdatasource = objdatasources.item(strdatasourcealias) ' 判断数据源对象是否有效 If objdatasource Is Nothing Then MsgBox " 获取数据源失败, 无效的数据源名称或者系统错误!", vbinformation Exit Sub End If ' 判断数据源对象中是否存在数据集对象 'lstdatasets 是列表框控件 Set objdatasets = objdatasource.datasets If objdatasets.count = 0 Then lstdatasets.clear lstdatasets.additem " 数据源中不存在数据集!" Exit Sub Else lstdatasets.clear For i = 1 To objdatasets.count Set objdataset = objdatasets.item(i) lstdatasets.additem objdataset.name Next i End If ' 释放对象变量 Set objdatasources =Nothing Set objdatasource =Nothing Set objdatasets =Nothing Set objdataset =Nothing End Sub 在本节的例子中, 同时使用了数字索引和数据源的别名访问单个数据源对象, 在 SuperMap Objects 中, 数据集集合 (sodatasets) 地图集合 (somaps) 布局集合 (solayouts) 都可以使用同样的方法 本节的例子只是一个演示, 在实际应用中, 可以使用二维数组将数据源和数据集的信息储存下来, 通过数据集的名称再访问相应的数据集 38

49 第 2 章核心控件之数据管理控件 SuperWorkspace 2.6 管理数据源 SuperMap Objects 的工作空间只保存数据源的链接信息, 不保存具体的数据源文件, 但是 SuperWorkspace 控件提供了一系列的方法, 用于打开和创建数据源, 这一节中将学习文件型数据源 ( 关于 SuperMap Objects 的数据组织方案和使用的多源空间数据无缝集成技术, 请参考 SuperMap Objects 基础教程 理解 SuperMap Objects GIS ) SuperMap Objects 中使用数据源集合对象 (sodatasources) 和数据源对象 (sodatasource) 管理数据源, 对象结构图如下所示 : 图 2.6 数据源集合和数据源对象结构 打开数据源 SuperWorkspace 控件提供了两个方法打开数据源, 分别为 : Function OpenDataSource(strDataSourceName As String, stralias As String, nenginetype As seenginetype, breadonly As Boolean) As sodatasource Function OpenDataSourceEx(strDataSourceName As String, stralias As String, nenginetype As seenginetype, breadonly As Boolean, btransacted As Boolean, bexclusive As Boolean, bencrypt As Boolean, strpassword As String) As 39

50 sodatasource SuperMap Objects 开发教程 其中 OpenDatasource 方法为 OpenDataSourceEx 的简单形式 使用打开数据源方法打开数据源, 如果成功, 则返回一个数据源对象, 同时, 工作空间会自动加载数据源的相关信息, 以随时提供给 SuperMap Objects 其他控件使用 如果打开失败, 则返回空对象 打开文件型数据源和数据库型数据源使用同样的方法, 区别在于打开的参数稍有不同, 下面将详细说明 数据源打开后, 就可以通过别名访问, 不再区分数据源的类型了 文件型数据源 1. strdatasourcename 为数据文件的全路径名称, 例如 : C:\Data\World.sdb 等等 2. stralias 是打开数据源赋予的别名, 该名称在数据源打开以后作为数据源的标识名, 通过它可以确定唯一的数据源, 所以, 在同一个工作空间中, 数据源的别名必须是唯一的, 不能相同 否则, 调用该方法将会失败, 返回空对象 注意 : 别名区分大小写 3. nenginetype 为数据源的引擎类型,SuperMap Objects 5 支持 SDB 引擎 (scesdb) 增强的 SDB 引擎 (scesdbplus) 客户自定义的影像插件引擎 (sceimageplugins) DGN 引擎 (scemicrostation) AutoCAD 引擎 (sceautocad) 等文件型引擎和 SDX 5 for SQL Server 引擎 (scesqlserver)sdx 5 for Oracle 引擎 (sceoracleplus) SDX 5 for Sybase 引擎 (scesybaseplus) 等数据库引擎, 以及支持达梦数据库的 SDX+ 空间数据引擎 (scedmplus) 关于 SuperMap Objects 数据引擎, 请参阅 1.4 节 4. breadonly 声明是否以只读方式打开数据源,bReadOnly = True 表示以只读方式打开数据源 在网络环境下, 如果用户的权限为浏览文件, 那么, 就应该以只读方式打开数据源, 防止数据丢失 5. btransacted 声明是否以事务方式打开数据源,bTransacted = True 表示以事务方式打开数据源 在事务方式下, 用户对数据的修改不会立即保存到数据文件中, 而是先保存在一个副本中, 直到用户使用 sodatasource.commit() 方法才把副本中的数据真正保存到数据文件中, 如果在 sodatasource.commit() 之前使用 Rollback 方法, 则用户对该数据文件所有的编辑工作都不保存 6. bexclusive 声明是否以独占方式打开数据源,bExclusive = True 表示以独占方式打开 在独占方式下, 一个数据源只能由一个用户打开, 其他用户不能以任何方式再打开该数据源 7. bencrypt 声明是否以加密的形式打开数据源, 是否加密取决于创建数据源时是否以加密的形式创建 8. strpassword 为密码字符串, 该字符串为创建时输入的密码字符串 注意 : 打开数据源的只读 独占 事务等方式之间有如下制约关系 : 1) 以只读方式打开文件, 则必须以非事务方式打开 (btransacted = False); 40

51 第 2 章核心控件之数据管理控件 SuperWorkspace 2) 以事务方式打开文件, 则必须以独占方式打开 (bexclusive = True) 下例演示如何打开一个 SDB 数据源, 其中 Form1 为包含 SuperWorkspace 控件的窗体,objSW 为 SuperWorkspace 控件实例 Dim objsw As SuperWorkspace ' 应用程序中 Superworkspace 对象 Dim objdatasource As sodatasource ' 数据源对象 Dim strdatasourcename As String ' 数据源文件名 Dim stralias As String ' 数据源别名 Set objsw = Form1. objsw ' 打开数据源文件 strdatasourcename = "D:\Temp\MyDatasource.sdb" stralias = "MyDatasource" Set objdatasource = objsw.opendatasourceex(strdatasourcename, stralias, scesdb, False, False, True, False, ) If objdatasource Is Nothing Then MsgBox " 打开数据源失败!", vbinformation Exit Sub End If ' 释放对象变量 Set objsw =Nothing Set objdatasource =Nothing 数据库型数据源 打开数据库型数据源的参数形式与文件型数据源基本相同, 区别只在 : 打开文件型数据源使用文件的相对路径和绝对路径, 密码也不是必需的 ; 而打开数据库数据源则要使用数据库联接字符串, 同时还必需要合法的用户名和访问密码 详细说明如下 : 1. strdatasourcename: 对于 SDX 数据引擎, 此参数为服务器信息, 格式为 : "Provider = SQLOLEDB;Server = SuperMapis;DataBase = SuperMap;" 其中 SQLOLEDB 为 SQL Server 所对应的 OLEDB Provider 类型 ( 如果是 Oracle 则对应为 MSDAORA),SuperMapis 为服务器名,SuperMap 是 SQLServer 数据库名 2. strpassword : 此参数为用户身份验证信息, 包括用户名和用户密码, 格式为 : "uid=myname;pwd=mypassword;" 其中 MyName 为用户名,MyPassword 为用户密码 下例演示如何使用 SDX 引擎打开存储于 SQL Server 中的数据源 Dim objerror As New soerror Dim objds As sodatasource Dim strdatasourcename As String Dim strpassword As String Dim stralias As String stralias="sqltestdatasource" strdatasourcename="provider=sqloledb;server=supermapis;database = SuperMap" 'SuperMap 是 SQLServer 数据库名 41

52 SuperMap Objects 开发教程 strpassword="uid=sma;pwd=sma" Set objds = frmmain.superworkspace.opendatasourceex(strdatasourcename, stralias, scesqlserver, False, True, False, True, strpassword) If (objds Is Nothing) Then MsgBox objerror.lasterrormsg,vbinformation Exit Sub End if 下例演示如何打开一个 SDX 引擎 ( For Oracle) 数据源, 其中 Form1 为包含 SuperWorkspace 控件的窗体,objWS 为 SuperWorkspace 控件实例 运行 NET 8 建立的服务名为 SuperMap, 不需要提供数据库名称, 用户名为 sdo, 用户密码为 sdo Dim objsw As SuperWorkspace ' 应用程序中 Superworkspace 对象 Dim objdatasource As sodatasource ' 数据源对象 Dim strdatasourcename As String 'Oracle 数据源信息 Dim strpassword As String ' 用户身份验证信息 Dim stralias As String ' 数据源别名 Set objsw = Form1. objsw ' 填充服务器信息和用户身份验证信息 strdatasourcename = "Provider = MSDAORA;server=SuperMap;" strpassword = "uid=sdo;pwd=sdo;" stralias = "MyDatasource" Set objdatasource = objsw.opendatasourceex(strdatasourcename, stralias, sceoracl e, False, False, False,False, strpassword) If objdatasource Is Nothing Then MsgBox " 打开数据源失败!", vbinformation Exit Sub End If 从上面的例子可以看出, 打开数据库类型的数据源, 使用的就是 ODBC 中的数据库联接字符串, 没有什么特殊要求, 所以也非常简单 创建数据源 SuperWorkspace 控件提供一个 CreateDataSource 方法用于创建数据源, 该方法的具体形式为 : Function CreateDataSource(strDataSourceName As String, stralias As String, nenginetype As seenginetype, btransacted As Boolean, bexclusive As Boolean, bencrypt As Boolean, strpassword As String) As sodatasource 创建数据源方法的各个参数的使用方法与打开数据源的使用方法类似, 需要注意的是, 在创建数据源时, 需要指定数据源的投影坐标系 ( 关于 SuperMap Objects 中的投影, 请分别参考 理解 SuperMap Objects GIS 和本教程第八章 : 投影与投影转换 ) 42

53 第 2 章核心控件之数据管理控件 SuperWorkspace 紧缩数据源 为了克服传统 GIS 多文件结构存储地图带来的诸多问题,SuperMap Objects SDB 文件采用结构化存储和复合文件技术, 使得图库文件具有增量文件访问能力 标准化 可以判断文件中的对象何时被修改以及这种修改何时被确认等优点 ( 详细说明请参考 SuperMap Objects 基础教程 理解 SuperMap Objects GIS ) 由于复合文档的复杂性和增量存盘的能力, 频繁的增加删除地图对象容易在复合文件中产生碎片, 从而增加文件大小, 影响访问效率 在 SuperMap 中可以简单调用 sodatasource. Compact 或者 SuperWorkspace.CompactDataSource 方法整理并紧缩 SDB 文件 ( 详细的使用方法请参考 SuperMap Objects 联机文档 ) 修复数据源 在某些情况下, 数据源文件可能会因为某些意外而损坏, 通常是造成几何对象和几何对象的属性信息不匹配 损坏的数据源文件可能打不开, 此时应该使用 SuperWorkspace 控件提供的修复数据源的方法 SuperWorkspace.RepairDatabase 来修复数据源文件 在某些情况下, 数据源文件可以打开, 但是其中的几何对象和属性信息已经不匹配, 这时也可以对数据源文件进行修复 通常情况下, 损坏的数据源可以修复成功, 但是有可能会损失某些信息, 所以, 数据源文件应该做好备份, 防止意外情况, 修复数据源只是出现了意外以后的补救措施, 而不是包治百病的灵丹妙药 删除数据源 因为 SuperMap Objects 的数据源是以文件或数据库的方式保存的, 表现为硬盘上的文件或者是数据库中的 DataBase 所以要删除数据源, 可以直接在操作系统下删除文件或者在数据库管理工具中删除 DataBase 需要注意的是 : 删除数据源之前要确保数据源没有被打开 2.7 管理数据集 在 SuperMap Objects 的数据组织方案中, 数据集是数据源中的元素 SuperMap Objects 中的数据集大致相当于传统 GIS 中的层, 但是在 SuperMap Objects 中同一个数据集可以对应于多个图层, 一个图层只对应于一个数据集, 数据集是空间数据在逻辑上的集合, 或者说是同种类型数据的集合 SuperMap Objects 中用于管理数据集的对象有 sodatasets sodataset sodatasetvector sodatasetraster, 其中 sodatasetvector 和 sodatasetraster 由 sodataset 继承而来 各个对象的结构和相互间的关系如下图所示 : 43

54 SuperMap Objects 开发教程 sodatasets ( 数据集合对象 ) Count:Long Item:soDataset Close ComputeBounds:Boolean Open :Boolean Item sodataset ( 数据集对象 ) Bounds:soRect CanUpdate:Boolean DataSourceAlias:String DateCreated:DATE DateLastUpdated:DATE Description:String MaxZ:Double MinZ:Double Name:String Type:seDatasetType Vector:Boolean AdjustBrightness:Boolean AdjustContrast:Boolean BuildPyramid:Boolean Close ComputeBounds:Boolean ExportImg:Boolean GetHistogram:soHistogram Negate:Boolean Open Register:Boolean Register2:Boolean Register3:Boolean ShowHistogram Smooth:Boolean 图 2.7 数据集集合和数据集对象结构图 sodatasetraster ( 光栅数据集对象 ) Bounds:soRect CanUpdate:Boolean DataSourceAlias:String DateCreated:DATE DateLastUpdated:DATE Description:String MaxZ:Double MinZ:Double Name:String Pixel:Long PixelFormat:sePixelFormat PixelHeight:Long PixelWidth:Long ResolutionX:Double ResolutionY:Double Type:seDatasetType Value:Double Vector:Boolean 图 2.8 栅格数据集对象结构图 44

55 Append:Boolean BuildSpatialIndex:Boolean Cache:Boolean ClearRecordsets:Boolean Close ComputeBounds:Boolean CopyField:Boolean CreateField:Boolean CreateFields:Boolean DeleteField:Boolean CreateIndex:Boolean Dissolve:Boolean EmptyTolerance:Boolean Export:seFileType GetFieldInfo:soFieldInfo GetFieldInfos:soFieldInfos IsAvailableFieldName:Boolean IsToleranceEmpty:Boolean Joint:Boolean Open PolygonClip:Boolean Query:soRecordset QueryByDistance:soRecordset QueryEx:soRecordset QueryWithBounds:soRecordset RecommendSpatialIndexLevel:Long ReleaseCache:Boolean Rename:Boolean Resample:Boolean SetToleranceToDefault:Boolean Statistic Truncate:Boolean UpdateField:Boolean UpdateFieldEx:Boolean 第 2 章核心控件之数据管理控件 SuperWorkspace sodatasetvector ( 矢量数据集对象 ) 图 2.9 矢量数据集对象结构图 Bounds:soRect CanCustomDraw:Boolean CanUpdate:Boolean Charset:seCharset DataSourceAlias:String DateCreated:DATE DateLastUpdated:DATE Description:String Dimension:Long DynamicEventLocator:soDyna miceventlocator FieldCount:Long HasGeometry:Boolean IsEventTable:Boolean MaxZ:Double MinZ:Double Name:String RecordCount:Long Options:seDatasetOption SpatialIndexDirty:Boolean SubDataset:soDataset TableName:String ToleranceDangle:Double ToleranceFuzzy:Double ToleranceGrain:Double ToleranceNodeSnap:Double ToleranceSmallPolygon:Double Type:seDatasetType Vector:Boolean 创建数据集 由于数据集是数据源的一个元素, 所以, 数据集的创建以数据源为单位, 即先获得一个数据源对象, 然后使用数据源对象的相应方法创建数据集 数据源对象中用于创建数据集的方法有如下几种 : Function CopyDataset(objSrcDataset As sodataset, strdstdatasetname As String) As sodataset Function CreateDataset(strName As String, ntype As sedatasettype, noptions As sedatasetoption, [objbounds As sorect]) As sodataset Function CreateDatasetFrom(strName As String, dstemplate As sodatasetvector) As sodataset 45

56 SuperMap Objects 开发教程 Function CreateECWDataset(strName As String, strecwfilename As String) As Boolean Function CreateMrSIDDataset(strName As String, strmrsidfilename As String) As Boolean Function CreatePoints(objGeocodeTable As sodatasetvector, strfieldx As String, strfieldy As String, strnewdatasetname As String) As Boolean Function CreateRaster(strDatasetName As String, ntype As sedatasettype, PixelFormat As sepixelformat, nwidth As Long, nheight As Long) As sodatasetraster 关于各种数据集的说明, 请参考 SuperMap Objects 基础教程 理解 SuperMap Objects GIS, 关于创建各种数据集的详细使用方法, 请参考 SuperMap Objects 程序员参考手册 这里仅对 SuperMap Objects 中两种比较特殊的数据集即 ECW 和 MrSID 数据集作简要的说明 ECW 和 MrSID 是两种基于小波变换的影像压缩技术, 它们都具有压缩比高 还原速度快 影像损失小等优点 ( 关于 ECW 后文还将详细介绍 ) 在 SuperMap Objects 中创建 ECW MrSID 数据集, 实际是创建了一个 ECW 文件和 MrSID 文件的连接, 不会创建实际的数据文件, 所以创建时必须存在相应的 ECW MrSID 文件 数据集创建后就可以像 SuperMap Objects 中其他的栅格数据集一样进行操作了 需要注意的是, 当实际的 ECW 和 MrSID 文件被删除或者移动时, 该数据集将不能打开 SuperMap Objects 还支持把 500M 以下的 BMP JPG 等格式的图像压缩为 ECW 文件 具体使用方法请参阅 节 sotoolkit 对象的使用 由于数据集的名称是该数据集在数据源中的唯一标识名, 所以数据集的命名有一定的规则, 不能与已有的数据集同名, 所以, 在创建数据集以前, 务必使用数据源提供的用于检查数据集名称是否合法的方法 IsAvailableDatasetName 检查一下数据集名称是否合法 打开数据集 在 SuperMap Objects 中, 打开数据集就是获得一个数据集对象, 也就是从数据源对象中得到一个数据集对象 与数据源集合对象一样, 数据集集合的元素 ( 单个数据集 ) 即可以通过数字索引访问, 也可以通过名称访问 由于数据集集合中的元素可能为矢量数据集或栅格数据集, 而矢量数据集和栅格数据集的使用方法有所区别, 因此,SuperMap Objects 的数据集集合中的元素不直接设为栅格数据集和矢量数据集, 而是一个数据集对象, 该对象是栅格数据集和矢量数据集的父对象 在使用数据集时, 应该首先获得一个数据集对象, 然后根据该对象的 Vector 属性判断数据集的类型, 最后才将该数据集用对应类型的数据集对象 (sodatasetvector 或 sodatasetraster) 保存下来 在程序中, 可以如下处理 : Dim dtvector As New sodatasetvector ' 矢量数据集 Dim dtraster As New sodatasetraster ' 栅格数据集 Dim dt As sodataset ' 数据集 Set dt = SuperWorkspace1.Datasources(1).Datasets(1) ' 判断数据集的类型, 进行相应的处理 46

57 If dt.vector Then Set dtvector = dt Else Set dtraster = dt End If 第 2 章核心控件之数据管理控件 SuperWorkspace 将影像压缩为 ECW 文件 ( 注 : 本小节内容部分译自澳大利亚 ER Mapper 公司 ECW 压缩技术白皮书 ) 为什么需要使用 ECW 遥感影像是 GIS 重要的数据源之一, 它在 GIS 应用系统中具有相当重要的地位 通常来说遥感影像数据是相当大的 例如, 某一个城市 3 英寸 (1 英寸 =25.4 毫米 ) 分辨率的彩色航空影像将达到 3TB(3000GB), 整个加州 (U.S.A California)1 米分辨率的彩色航空影像将达到 1.5TB (1,500GB) ECW(ER Mapper Compressed Wavelet) 压缩技术是澳大利亚 ER Mapper 公司基于小波 (Wavelet) 变换的影像压缩技术, 该技术具有高压缩比 ( 通常可达到 50:1 到 20:1) 还原速度快 影像损失小等特点 ( 详细内容请参考澳大利亚 ERMapper 公司 ECW 压缩技术白皮书 ) 如何在 SuperMap Objects 中创建 ECW 影像文件 SuperMap Objects 集成了 ECW 压缩技术, 将影像压缩封装成一个工具对象 (sotoolkit) 使用 ECW 压缩方法就可以将影像数据压缩成为 ECW 文件 sotoolkit 对象结构图如下所示 : sotoolkit ( 工具箱 ) CompressECW:soCompressionInfo PointToVoronoi:Boolean 图 2.10 sotoolkit 对象结构图 在创建数据集小节中提到了创建 ECW 数据集,SuperMap Objects 在创建 ECW 数据集时只是创建一个文件的链接, 不创建实际的数据文件, 如果需要创建 ECW 文件, 则需要通过其他的方法, 即使用 sotoolkit 对象的 CompressECW 方法, 该方法的具体形式为 : Function CompressECW(strSrcImageFile As String, strdestecwfile As String, [ncompresshint As seecwcompresshint], [ndestcompression As Long], [dx0 As Double], [dy0 As Double], [dresolutionx As Double], [dresolutiony As Double], [nresolutionunits As Long], [strdatum As String], [strprojection As String]) As socompressioninfo 方法的各个参数说明如表 2.1 所示 : 47

58 SuperMap Objects 开发教程 表 2.1 ECW 压缩方法参数说明表 参数可选描述 strsrcimagefile 必选被压缩的源文件名 strdestecwfile 必选压缩的目标文件名 [ ncompresshint ] 可选压缩方式设置 :1 是压缩最快 ;2 是压缩质量最高 ;3 是压缩率最大 [ ndestcompression ] 可选预设压缩率 [ dx0 ] 可选影像左上角的横坐标, 单位决定于分辨率单位 [ dy0 ] 可选影像左上角的纵坐标, 单位决定于分辨率单位 [ dresolutionx ] 可选 X 方向的分辨率, 单位决定于分辨率单位的设置 [ dresolutiony ] 可选 Y 方向的分辨率, 单位决定于分辨率单位的设置 [ nresolutionunits ] 可选分辨率单位 [ strdatum ] 可选 ER Mapper GDT 数据属性串 [ strprojection ] 可选投影 CompressECW 方法返回一个 socompressioninfo 类型的变量, 该变量包含有关的压缩信息 socompressioninfo 的对象结构图如下 : socompressioninfo ( 影像压缩信息 ) ActualCompression:Single CompressionMBSec:Double CompressionSeconds:Double OutputSize:Long 图 2.11 socompressioninfo 对象结构图 其中 ActualCompression 表示 ECW 压缩时的压缩比 ;CompressionMBSec 表示在进行 ECW 压缩时的压缩速度 ( 单位 : 兆字节 / 秒 );CompressionSeconds 表示压缩时间 ( 单位 : 秒 );OutoutSize 表示数据文件压缩后的大小 在进行压缩时, 只需要正确设置 CompressECW 方法的各个参数以后调用该方法即可完成影像压缩, 通过返回的 socompressioninfo 对象可以得到压缩后的信息 48

59 第 2 章核心控件之数据管理控件 SuperWorkspace 将影像数据压缩成为 ECW 文件以后不能直接打开, 需要在 SuperMap Objects 中创建一个 ECW 数据集, 将该文件映射成为一个数据集, 然后就可以像操作 SuperMap Objects 中的影像数据集一样对它进行某些操作 以下是某地的遥感影像压缩成为 ECW 文件后在 SuperMap Objects 中的视觉效果 图 2.12 ECW 文件在 SuperMap Objects 中的视觉效果 删除数据集 数据集不再使用时就可以删除掉, 以节约磁盘空间, 提高数据访问速度 删除数据集的接口是 :Boolean sodatasource.deletedataset(strname As String) 对于文件型数据源, 由于复合文档的特点, 数据集删除后, 其占用的磁盘空间不会自动释放, 此时需要调用 紧缩数据源 功能来释放 一般地, 建议完成所有删除数据集操作后做一次紧缩数据源操作 需要注意的是, 删除数据集之前, 请确认一定要关闭该数据集, 即地图窗口中没有使用, 属性表也没有被引用 2.8 编辑属性数据库 编辑属性数据库有两个含义, 第一是修改属性数据库的结构, 第二是修改属性数据库中的 49

60 SuperMap Objects 开发教程 数据 ( 关于 SuperMap Objects 数据集结构的详细资料, 请参考 SuperMap Objects 系列教程 理解 SuperMap Objects GIS ) 在 SuperMap Objects 中, 与编辑属性数据库有关的对象有几个 :sodatasetvector sorecordset sofieldinfo 和 sofieldinfos 各个对象之间的联系和每一个对象的结构如下图所示 : sodatasetvector ( 矢量数据集 ) GetFieldInfos() sofieldinfos ( 字段集合 ) Query() GetFieldInfos() Item sorecordset ( 记录集 ) sofieldinfo ( 字段信息 ) 图 2.13 编辑空间数据库有关对象的结构简图 Add: Boolean Exchange: Boolean InsertAt: Boolean Remove: Long RemoveAll sofieldinfos ( 字段集合 ) Count: Long Item: sofieldinfo Item sofieldinfo ( 字段信息 ) 图 2.14 字段信息对象结构图 AllowZeroLength :Boolean AutoIncremental :Boolean Caption : String DefaultValue :String Descending: Boolean Description: String Format : String Name String : Precision : Long Required : Boolean ScaleFactor : Long Size : Long SourceField : String SourceTable : String Type : sefieldtype VariableLength : Boolean 50

61 第 2 章核心控件之数据管理控件 SuperWorkspace AddNew:Long CancelUpdate:Boolean Close ComputeBounds:Boolean CopyField:Boolean Delete:Boolean DeleteAll:Boolean Edit:Boolean FindFirst:Boolean FindLast:Boolean FindNext:Boolean FindPrev:Boolean FindTextFirst:Boolean FindTextLast:Boolean FindTextNext:Boolean FindTextPrev:Boolean GetFieldInfo:soFieldInfo GetFieldInfos:soFieldInfos GetFieldValue GetGeometry:soGeometry GetID:Long IsBOF:Boolean IsEmpty:Boolean IsEOF:Boolean Move:Boolean MoveFirst:Boolean MoveLast:Boolean MoveNext:Boolean MovePrev:Boolean MoveTo:Boolean Refresh:Boolean SeekID:Boolean SetFieldValue:Boolean SetFieldValueNull:Boolean SetGeometry:Boolean Statistic Update:Boolean sorecordset ( 记录集对象 ) 图 2.15 记录集对象结构图 CanAppend:Boolean CanTransact:Boolean CanUpdate:Boolean FieldCount:Long RecordCount:Long 数据集等同于一张二维表,soFieldInfo 则是这一张表中各个列的结构信息,soRecordset 则是横向视图 ( 是整个数据集的部分或全部 ), 它们之间的关系如下图所示 : 51

62 SuperMap Objects 开发教程 图 2.16 记录集和字段信息 修改属性数据库结构 SuperMap Objects 采用的是数据库形式的图形 属性管理模式, 与 MDB 的管理模式相似 本小节中讲到的数据库结构就是指每一张属性表的字段结构, 修改数据库结构即是修改属性表中的字段信息 与修改 MDB 数据库结构的方式一样,SuperMap Objects 提供了获得字段信息 增加字段 删除字段 插入字段 交换字段位置等基本操作 鉴于空间数据的特殊性, 为保证数据的安全,SuperMap Objects 暂时不提供编辑字段的属性信息 ( 不是指字段值 ) 的功能 ; 下面是一个设计好的简单的修改数据库结构的界面 : 52

63 第 2 章核心控件之数据管理控件 SuperWorkspace 图 2.17 修改数据库结构特别的, 以 Sm 开头的字段是 SuperMap 的系统保留字段 ( 如 :SmID SmUserID SmLength SmTopoError SmArea SmPerimeter 等 ), 既不能删除 ( 实际上也删除不了 ), 也不允许创建 从上面的结构关系图可以看到, 有两条途径可以获得字段信息 : 一是直接从矢量数据集 (sodatasetvector) 中获取 ; 二是从记录集 (sorecordset) 中得到 ; 可以分别得到单个和全部的字段信息 下面的代码演示通过矢量数据集获得单个字段和全部字段的信息 : Dim objdv As sodatasetvector ' 被维护的矢量数据集 Dim objfi As sofieldinfo ' 单个字段信息 Dim objfis As sofieldinfos Set objdv = SuperMap.Layers(1).Dataset ' 第一图层为矢量数据集 Set objfis = objdv.getfieldinfos ' 获取字段集合信息 Set objfi = objdv.getfieldinfo(4) ' 得到数据表第四个字段的信息 MsgBox objfi.name ' 报告字段名称 53

64 SuperMap Objects 开发教程 下面的代码演示通过记录集获得单个字段和全部字段的信息 : Dim objdv As sodatasetvector ' 被维护的矢量数据集 Dim objrce As sorecordset ' 被维护的记录集 Dim objfis As sofieldinfos ' 记录集的字段集合信息 Dim objfi As sofieldinfo ' 单个字段信息 Set objdv = SuperMap.Layers(1).Dataset ' 第一图层为矢量数据集 Set objrce = objdv.query("",true) ' 获取记录集 Set objfis = objrce.getfieldinfos ' 获取字段集合信息 Set objfi = objrce.getfieldinfo(4) ' 获取第四个字段信息 MsgBox objfis.count ' 报告字段集的字段总数 MsgBox objfi.name ' 报告第四个字段的名称 添加新的字段 新字段必须在定义时就定义为新的 ( 如在 VB 中用 New 定义, 在 Delphi 中用 CosoFieldInfo.Create() 创建 ), 可以根据字段的类型设置相应的属性 ( 详细信息参考 SuperMap Objects 程序员参考手册 中的 sofieldinfo 对象的相关信息 ) 添加新字段有两种方法, 即添加到最后和插入到指定位置 Dim objnewfi As New sofieldinfo ' 用来添加的新字段 objnewfi.type = scftext ' 新字段为文本型 objnewfi.name = "NewField " ' 新字段名称 objnewfi.size = 20 ' 新字段长度 objnewfi. DefaultValue = "SuperMap" ' 新字段的值 objfis.add objnewfi ' 添加新字段到字段集的最后 ( 或 : objfis. InsertAt 3,objNewFI ' 在第 3 个字段处插入新字段 ) 删除字段 只能删除用户定义的字段, 系统保留字段不能删除 ;RemoveAll 方法对系统保留字段无效 objfis.remove 4,2 objfis.removeall ' 从第四个字段开始, 删除 2 个字段, 即删除第四 第五字段 ' 移除 objfis 中的全部字段 交换字段位置 交换字段位置就是改变字段的索引 objfis.exchange 3,5 54

65 2.8.2 对属性数据库中记录的操作 第 2 章核心控件之数据管理控件 SuperWorkspace GIS 数据是空间几何对象与属性的统一, 在 SuperMap Objects 的数据组织中, 是把系统保留字段 SmID 作为关键字段, 通过 ID 号来实现属性与对象的有机连接 ; 由于空间数据的特殊性, 几何对象在属性表中的某些字段如 SmArea SmLength 的数据值, 是由系统直接根据地理对象的几何特征生成的, 因此, 对这两个属性字段的值不能进行修改 SuperMap Objects 规定, 除了 SmUserID 外, 其它以 Sm 开头的字段都不能进行记录数据的修改 编辑数据库数据的基本功能是增加记录 删除记录 修改属性数据和修改几何对象, 这些编辑功能通过记录集的更新来保存所作的修改 记录集的游标指向的总是当前那条记录, 而不是多条记录, 因此, 可以通过记录集对象直接编辑当前记录, 要编辑其它的记录就需要重新定位记录 定位记录 记录集在打开时自动定位到第一条记录, 编辑时要把记录指针指向要编辑的记录, 这时就需要对记录进行定位 SuperMap Objects 的记录集对象提供了 7 个方法 (MoveFirst MoveLast MovePrev MoveNext MoveTo Move 和 SeekID) 以实现记录的直接定位和快速浏览记录集中的每一条记录 除了这种方式外,SuperMap Objects 还提供了查询式的定位, 这种定位方式有四个方法 : FindFirst FindLast FindPrev FindNext 四个方法的操作方式完全一样, 不过 FindNext 必须在 FindFirst 返回 True 才有效 ;FindPre 也必须在 FindLast 返回 True 时才有效 当返回 True 时, 记录集自动把当前的指针移到该记录, 这时就可以对该记录进行编辑了 Boolean sorecordset.findfirst (strfilter As String) strfilter 条件要符合 SQL 的语法 ( 这一条件在查询时被作为 SQL 的 Where 子句 ), 比如 : 要查询 ID 号小于 100 面积大于 的记录, 其过滤条件为 "SmID<100 and SmArea>10000"( 其中 SmID 等关键字不区分大小写 ) 下面的代码演示了如何实现查询定位的功能 下面以 FindFirst 为例介绍如何进行查询定位 Dim objdv As sodatasetvector Dim objrcd As sorecordset Dim objresult As Boolean ' 被维护的矢量数据集 ' 被维护的记录集 Set objdv = SuperMap.Layers(1).Dataset ' 第一图层为矢量数据集 Set objrcd = objdv.query("",true) ' 获取记录集 objresult = objrcd.findfirst("smid<100 and SmArea>10000") If objresult = True Then ' 找到符合条件的第一条记录 MsgBox 当前记录的记录号为 & objrcd. GetID() ' 显示该记录的 ID 号 Else MsgBox 没有符合条件的记录 End If 文本 ( 或称注记 ) 数据集中的文本是作为一个几何对象而不是作为一个属性存储在数据集 55

66 SuperMap Objects 开发教程 里, 针对文本数据集的这一特殊性,SuperMap Objects 还提供了专门的文本记录集定位方法 这种查询定位包括四个方法 FindTextFirst FindTextNext FindTextPrev FindTextLast 等, 这四个方法的用法和 FindFirst 相似, 具体的实现过程请参考 SuperMap Objects 联机帮助 增加新的记录 增加新记录是数据库的一个基本操作和维护功能,SueprMap 作为一个以数据库形式管理图形和属性的 GIS 软件, 同样也具备了这个功能 不过与关系数据库不同的是,SuperMap Objects 的操作对象是图形部分和属性部分结合形成有机整体的地理对象记录集, 增加新的记录除了增加属性外, 最重要的是增加几何对象, 因此, 在 SuprMap GIS 的记录集中, 增加新记录是以增加几何对象为准则的, 在增加了几何对象之后再给该记录增加相应的属性数据 增加新的记录不允许设置数据集为可编辑状态, 也不允许开启记录集的编辑状态, 否则增加新的记录将失败 ( 因为在数据库操作中, 这些都是不同种类的操作 ) 以下代码示范如何增加一条新纪录 ( 也即一个集合对象 ): Private Sub SuperMap1_Tracked() Dim objgeometry As sogeometry ' 要新增对象的矢量数据集, 此处假设为地图窗口的第一个图层 Dim objdv As sodatasetvector Dim objrcd As sorecordset ' 与上面数据集对应的记录集 Set objdv = SuperMap.Layers(1).Dataset Set objrcd = objdv.query("",true) ' 获取记录集 ' 获取跟踪图层上刚才绘制的几何对象 Set objgeometry = SuperMap1. TrackedGeometry If objgeometry.type = objdv.type Then ' 同类型才能添加 objrcd.addnew objgeometry ' 增加新的记录 objrcd.update ' 更新记录集 End If End Sub 删除记录 删除记录也是 SuperMap Objects 数据库操作的一个基本功能 除了以事务方式打开数据源之外, 任何删除都是物理删除, 不能恢复, 因此, 任何删除都要谨慎 和增加新的记录一样, 删除记录也不需要把当前图层设置为可编辑, 也不必要设置当前的记录集的编辑状态 Dim objdv As sodatasetvector Dim objrcd As sorecordset Set objdv = SuperMap.Layers(1).Dataset Set objrcd = objdv.query("",true) objrcd.movelast objrcd.move 2 ' 被维护的矢量数据集 ' 被维护的记录集 ' 第一图层为矢量数据集 ' 获取记录集 ' 定位到记录集的最后 ' 移到倒数第三个记录 56

67 第 2 章核心控件之数据管理控件 SuperWorkspace objrcd.delete ' 删除该记录 修改存在的记录属性和几何对象 修改记录指的是修改当前记录的属性值和几何对象 修改记录的属性值应遵守 SuperMap Objects 的内部规定, 不能修改除 SmUserID 以外的其他任何以 ''Sm'' 开头的字段值 修改必须在开启记录编辑状态后才能进行, 同样在修改结束要更新记录集, 保存所作的修改, 否则可能导致修改结果保存失败 几何对象的修改方法可以参考第三章的 空间对象的编辑 部分和 SuperMap Objects 程序员参考手册 中的几何对象 (sogeometry sogeoline sogeoregion 等对象 ) 部分, 这里只简述用代码更新记录的几何对象 Dim objgeometry As sogeometry Dim objdv As sodatasetvector Dim objrcd As sorecordset Dim strvalue As Variant ' 被维护的矢量数据集 ' 被维护的记录集 ' 属性值变量 Set objdv = SuperMap.Layers(1).Dataset ' 第一图层为矢量数据集 Set objrcd = objdv.query("",true) ' 获取记录集 ObjRcd.SeekID 4 ' 定位到 SmID = 4 的记录 ObjRcd.Edit ' 进入编辑状态 ObjRcd.SetFieldValue "SmUserID",20 ' 重新给第四条记录的字段赋值 ObjRcd.Update Dim objgeometry As sogeometry Set sogeometry = objrced.getgeometry ' 此处省略几何对象, 进行编辑代码 objrcd.edit objrcd.setgeometry objgeometry objrcd.update ' 保存经过编辑的几何对象 ' 保存以上所作的编辑结果 2.9 数据的交换 数据转入转出是 GIS 软件重要的功能模块, 大多数 GIS 软件都提供与其他 GIS 软件间的数据交换的功能 SuperMap Objects 则更进一步, 不仅支持流行的矢量交换文件格式, 如 AutoCAD DXF, Arc/Info E00, MapInfo MIF 等, 而且支持流行 GIS/CAD 软件的二进制格式, 如 :Arc/Info Coverage(NT/PC/SUN) ArcView SHP 文件 MapInfo TAB MicroStation 的 DGN 等 ; 在栅格方面不仅支持通用影像格式, 如 BMP JPG GIF 等, 而且支持 Erdas IMG GeoTiff 等专业遥感影像格式 ; 此外, 还同时支持 ECW 和 MrSID 两种基于小波理论的影像压缩技术的格式 在 SuperMap Objects 最新版 5.0 中, 更新增支持 XML 的最高版本 3.0, 通过它, 几乎可以和任何支持 XML 格式的软件进行数据交换 在 SuperMap Objects 中, 数据转入转出的功能由一个叫 sodatapump( 数据泵 ) 的对象来完成, 转入转出参数通过 soimportparams 和 soexportparams 进行设置, 在各种参数设置正确后, 57

68 SuperMap Objects 开发教程 调用 sodatapump 的 Import 和 Export 方法进行转入转出 数据泵对象依附于数据源对象, 是不可创建的对象, 数据泵对象和数据转入转出参数设置对象的结构如图 2.18: Export:Boolean Import:Boolean RetrieveLayerInfo:soStrings RetrievePJCoordSys:soPJCoordSys sodatapump ( 数据泵 ) DataExportParams:soExportParams DataImportParams:soImportParams 数据转入转出的流程如下 : 图 2.18 数据泵结构图 开始 获得某个数据源对象中数据泵属性的引用 设置转入转出的文件名和文件的类型 根据不同的文件类型设置导入导出的参数 调用 Import 和 Export 方法转入和转出数据 图 2.19 数据转入转出流程图 数据泵是一个数据转入 / 转出的工具, 完成 SuperMap Objects 与其他文件的数据转换 由于不同的文件有不同的特点, 在使用数据泵进行数据转换时需要注意以下问题 : 数据泵 (sodatapump) 对象不能单独使用 ( 不能使用 New 关键字 ), 必须是某个数据源对象 (sodatasource) 数据泵属性的引用 转入 GIS 矢量数据时, 只需要提供源数据和转入后的数据集 (Dataset) 名称即可, 不需要提供源数据中包含了哪些点线面数据, 系统会自动判断 转入的规则是 : 只转入源数据中有的数据, 没有的数据不转 ( 也无法转 ); 只转入提供了转入后名称的数据, 没有提供名称的数据即使有也不转 转入的数据集名称不能与原有的数据集的名称相同 GIS 数据可转为 GIS 数据集 (ImportAsCADDataset = False ) 或者是 CAD 数据集 (ImportAsCADDataset=True) 但是 E00 SHP COV VEC VCT 等类型的文件不能转成 CAD 数据集 58

69 第 2 章核心控件之数据管理控件 SuperWorkspace 转成 CAD 图层时, 可以存储对象的风格, 也可以不存储对象的风格 转入 / 转出 MicroStation *.dgn 文件时, 需要指定 dgn 文件的主单位 从单位 最小分辨率 转入图层 颜色映射表等指标 除 Mapinfo Mif 文件以外, 其余的文件需要指定转入的文件的单位 转入 MIF 文件时, 同名的 MID 文件必须在同一目录 转入 SHP 文件时, 同名的 SHX 和 DBF 文件必须在同一目录 转入 Idrisi 的 VEC 矢量文件时, 同名的 DVC 文件必须在同一目录 对 DBF 和 MDB 文件, 只能转入 / 转出为属性数据 转入 Coverage 文件时, 文件名 (FileName) 为要转入的 Coverage 目录下的任意一个文件的全路径 转入 Coverage 时, 如有用户自定义属性表 Annotation.Subclass 或 Region.Subclass 会自动生成相应名称的数据集, 并导入数据 转出 Coverage 时, 属性 FileName 为生成的工作目录名, 源数据集名为生成的 Coverage 目录名 Tiff 文件支持标准 Tiff GeoTiff 行扫描 Tiff 块扫描 Tiff 和压缩 Tiff 下面提供一个简单的例子来说明如何转入一个 Mif 文件, 其中 SuperWorkspace1 为 SuperWorkspace 控件实例 Dim objdatapump As sodatapump ' 数据泵对象 Dim objimportparams As soimportparams ' 数据泵导入参数对象 Set objdatapump = SuperWorkspace1.Datasources(1).DataPump Set objimportparams = objdatapump.dataimportparams With objimportparams.filename = "D:\temp\world.mif".FileType = scfmif.showprogress = True.Compressed = False.ImportAsCADDataset = False.DatasetPoint = "World_Point".DatasetLine = "World_Line".DatasetRegion = "World_Regoin".DatasetText = "World_Text" If Not objdatapump.import Then MsgBox " 文件转入失败!", vbinformation Set objdatapump = Nothing Exit Sub End If End With Set objdatapump = Nothing Set objimportparams = Nothing 以下例子为数据转入的例子, 可加以修改 : Private Sub cmdimport_click() Dim objdatapump As sodatapump Dim objimportparams As soimportparams Dim bresult As VbMsgBoxResult Set objdatapump = SuperWorkspace1.Datasources(1).DataPump If objdatapump Is Nothing Then MsgBox " 数据源错误 ", vbinformation, " 出错 " 59

70 SuperMap Objects 开发教程 With cdlfile2.dialogtitle = " 输入文件 ".InitDir = App.Path.Filter = "dgn 文件 (*.dgn) *.dgn MapInfo 的 mif 文件 (*.mif) *.mif AutoCAD 的 DXF(*.dxf) *.dxf ArcView 的 shp 格式 (*.shp) *.shp ArcInfo 的 Coverage ArcInfo 交换格式 E00(*.e00) *.e00 位图文件 (*.bmp) *.bmp".showopen.cancelerror = True Set objimportparams = objdatapump.dataimportparams objimportparams.filename =.FileName Select Case.FilterIndex Case 1 objimportparams.filetype = scfdgn Dim objdgnlinks As sodgnlinks Case 2 objimportparams.filetype = scfmif Case 3 objimportparams.filetype = scfdxf Case 4 objimportparams.filetype = scfshp Case 5 objimportparams.filetype = scfcoverage objimportparams.coveragetype = sccworkstationdouble Case 6 objimportparams.filetype = scfe00 Case 7 objimportparams.filetype = scfbmp End Select End With bresult = MsgBox(" 是否转成 CAD 图层 ", vbyesno, " 转成 CAD") If bresult = vbno Then objimportparams.datasetpoint = "pointdgn" objimportparams.datasetline = "linedgn" objimportparams.datasetregion = "regiondgn" objimportparams.datasettext = "textdgn" objimportparams.ignoreattribute = True objimportparams.ignorecoordsys = True objimportparams.ignorenetworktopology = True Else objimportparams.importascaddataset = True objimportparams.datasetcad = "mecad1" End If objimportparams.showprogress = True If objdatapump.import = True Then MsgBox " 转换成功 ", vbinformation, " 成功 " Else MsgBox " 失败 ", vbinformation, " 失败 " End If Set objdatapump = Nothing Set objimportparams = Nothing End Sub 在 SuperMap Objects 系列教程 SuperMap Objects 范例程序库 中有一个 Import.vbp 工程, 该工程更详细的说明了如何编写代码来实现数据交换 对于系统使用数据的处理, 推荐使用 SuperMap GIS 的专业桌面 GIS 软件 SuperMap Deskpro 该软件不仅提供了强大的数据交换功能, 而且支持批量处理 数据日志文件等功能, 使用上也非常方便 60

71 第 2 章核心控件之数据管理控件 SuperWorkspace 2.10 SuperWorkspace 控件的其他功能 工作空间有四个组成元素, 即数据源 地图 布局和资源, 前面的章节已经将数据源以及与数据源相关的对象作了简要的介绍, 地图和布局将在以后相应的章节中说明, 所以此处主要介绍工作空间中的 资源 SuperMap Objects 中的资源指的是编辑过程中用到的线型库 符号库和填充模式库 SuperMap Objects 提供了常用的线型 符号和填充模式, 而且还提供了编辑线型 符号和填充模式的功能 SuperMap Objects 资源对象 (soresources) 统一管理资源, 线型库 符号库和填充模式库是资源对象的成员 他们之间的关系和各个对象的结构如下图所示 : 61

72 SuperMap Objects 开发教程 图 2.20 资源 填充库 符号库和线型库资源对象不能单独存在, 必须是工作空间中的资源的引用, 线型库对象 符号库和填充模式库对象也一样 在 SuperMap Objects 中, 编辑线型库 符号库和填充模式库, 只需要调用相应的 ShowEditor 方法即可 线型编辑器 符号编辑器和填充模式编辑器的界面如下 62

73 第 2 章核心控件之数据管理控件 SuperWorkspace 图 2.21 线型库编辑器 图 2.22 符号编辑器 63

74 SuperMap Objects 开发教程 图 2.23 填充模式编辑器 2.11 思考与练习 1 制作一个数据源信息浏览器, 要求 : 提供打开工作空间文件, 关闭工作空间 界面要求为 : 使用树状列表显示工作空间中所有的数据源和数据集并反映出工作空间 数据源 数据集之间的层次关系 ; 使用 ListView 显示数据集的相关信息, 如名称, 创建时间等等, 要求当鼠标点中某一个数据集节点时, 在 ListView 中动态显示数据集的信息 2 制作一个数据批量转入的工具, 要求 : 显示工作空间中的所有数据源 ( 同上一题 ), 可以创建数据源, 关闭数据源的功能, 能批量转入不同目录下 不同类型的数据, 根据不同的文件类型提供缺省参数转入, 用户也可以设置任意一个文件的转入参数, 提供转入参数存盘和打开的功能, 提供转入信息显示, 并且该信息可以保存为文件 ( 提供地图察看的功能更好 ) 64

75 第 3 章核心控件之地图窗口 SuperMap 介绍 SuperMap 控件是核心控件的重要组成部分, 负责二维空间数据的显示, 其主要功能如下 : 空间数据浏览与调整环境设置 ; 图层管理 :SuperWorkspace 中需要显示的数据作为一个图层 (solayer) 添加到 SuperMap 窗口中, 因此 SuperMap 窗口可以看成是一个图层集合 (solayers),supermap 负责管理这个图层集合, 控制集合中个体 (solayers.item(index)) 的显示状态包括 :(1) 图层的可见 可显示 可编辑 可捕捉 (2) 图层风格设置 (3) 制作专题图 (4) 视野范围设置 (5) 动态投影 地理对象 (sogeometry) 的编辑 地理对象与属性双向查询 ; 影像配准 ; 动态目标的显示与跟踪 ; 地图的输出 ; 本章将按照 SuperMap 的这几方面功能组合来具体讲解相关对象之间的关系 以及涉及到的接口的使用方法 目标 通过本章的学习, 您将能掌握以下的内容 : 在地图窗口中显示空间数据 ; 设置地图窗口的外观属性 ; 基本的地图操作 ; 设置地图的可视范围 ; 设置不同的图层的显示风格 ; 编辑地图要素 ; 制作各种类型的专题地图 ; SuperMap 与 GPS 结合应用方法 ; 65

76 SuperMap Objects 开发教程 3.1 SuperMap 与 SuperWorkspace 的连接 在 SuperMap Objects 软件中,SuperMap 控件与 SupreWorkspace 控件都属于核心控件, SuperWorkspace 控件负责管理数据,SuperMap 控件负责显示和编辑数据, 这些数据就来自于 SuperWorkspace, 为了确保数据的正确使用,SuperMap Objects 规定在使用数据之前, 必须建立两者之间的连接, 数据使用完毕, 关闭 SuperMap 控件之前要断开连接 建立连接的语句是 : SuperMap.Connect SuperWorkspace.Handle( 或者 SuperWorkspace.Object) 断开连接的语句是 : SuperMap. Disconnect 在 SuperWorkspace 控件中包括五种基本对象 : 数据源集合 (sodatasources) 地图集合 (somaps) 布局集合 (solayouts) 三维场景集合 (soscenes) 资源 (Resources), 它保存的内容主要包括 : 当前打开的数据源 ( 位置 别名和打开方式 ) 地图 布局 符号库 线型库 填充模式库等 这其中与 SuperMap 控件关系最密切的是地图集合 (somaps), 对于地图对象的保存 (SaveMap) 另存为 (SaveMapAs) 打开 (OpenMap) 关闭 (Close) 和获取当前地图对象的名称 (MapName) 的方法都是由 SuperMap 控件提供 SuperMap 控件是地图显示的窗口, 可以加载一个或者多个数据集进行显示 ; 也可以加载工作空间中的地图来显示 下图是地图对象 (somaps) 与 SuperWorkspace 的关系图 SuperWorkspace ( 工作空间控件 ) Maps Remove:Long RemoveAll:Boolean somaps ( 地图名集合 ) Count:Long Item:String 图 3.1 工作空间与地图对象关系图实现下列各项功能的前提条件是 SuperWorkspace 中已经有打开的数据源, 且 SuperMap 中有显示的空间数据 打开地图对象 SuperMap.OpenMap (strmapname As String) // 直接通过地图的名称进行引用或 SuperMap.OpenMap SuperWorkspace.Maps.Item(nIndex As Long) // 通过地图的索引进行引用 66

77 第 3 章核心控件之地图窗口 SuperMap 当前工作空间 (SuperWorkspace) 中至少有一个地图对象, 否则打开地图会失败, 如果打开成功,SuperMap 会自动关闭原来的地图 保存地图 SuperMap.SaveMap // 保存地图 由于地图保存在工作空间文件中, 所以保存地图对象后还必须要保存工作空间, 否则地图会在关闭工作空间时丢失 地图另存为 地图另存的名称可以是原有的地图对象名称, 不过这将覆盖原来的地图对象, 需要开发人员添加程序进行判断 由于地图保存在工作空间文件中, 所以保存地图对象后还必须要保存工作空间, 否则地图会在关闭工作空间时丢失 SuperMap.SaveMapAs MyMap // 地图另存为 删除地图 Dim objmaps As somaps Set objmaps = Superworkspace.Maps If objmaps Is Nothing then Exit Sub objmaps.remove 1 // 删除地图对象集合中的一个地图对象 objmaps.removeall // 删除地图对象集合中的全部地图对象 说明 : 删除地图完全通过 SuperWorkspace 以及 somaps 对象进行, 与 SuperMap 控件没有直接的联系 考虑到本书的章节安排, 所以将删除地图在此说明 关闭地图窗口 SuperMap.Close // 自动清除所有图层, 但是不会报告地图是否修改, 注意修改后存盘 SuperMap.DisConnect // 断开与工作空间 (SuperWorkspace) 的连接 SuperWorkspace.Close // 关闭工作空间 3.2 SuperMap 浏览操作与环境设置 SuperMap 窗口是空间数据显示的容器, 它提供接口让用户自定义空间数据的显示环境, 包括窗口样式 背景颜色, 更重要的是用户可以设置空间数据显示的比例和视野等 本节主要介绍 SuperMap 窗口的基本操作和环境设置 67

78 AboutBox Close Connect: Boolean Copy: Boolean Cut: Boolean DeleteSelection: Boolean Disconnect DrawGeometry EnsureVisibleGeometry :Boolean EnsureVisibleRecordset : Boolean EnsureVisibleRect : Boolean FromXML:Boolean HitTest :Boolean IsVisible : Boolean LockWindowUpdate :Boolean MapToPixel MapToPixelX: OLE_ XPOS_ PIXELS MapToPixelY: OLE_ YPOS_ PIXELS OpenMap : Boolean OutputMap : Boolean OutputMapEx : Boolean OutputMapToFile : Boolean OutputWindow: Boolean Pan Pan2 Paste : Boolean PixelToMap PixelToMapX : Double PixelToMapY : Double PrintMap :Boolean Redo : Boolean Refresh RefreshEx SaveMap : Boolean SaveMapAs : Boolean SetFocus ModifySelectedGeometryBrushBackColor : Boolean ModifySelectedGeometryBrushColor : Boolean ModifySelectedGeometryBrushStyle : Boolean ModifySelectedGeometryPenColor : Boolean ModifySelectedGeometryPenStyle : Boolean ModifySelectedGeometryPenWidth : Boolean ModifySelectedGeometryStyle : Boolean ModifySelectedGeometrySymbolColor : Boolean ModifySelectedGeometrySymbolSize : Boolean ModifySelectedGeometrySymbolStyle : Boolean ModifySelectedTextAlign : Boolean ModifySelectedTextBold : Boolean ModifySelectedTextColor : Boolean ModifySelectedTextFixed : Boolean ModifySelectedTextFixedSize: Boolean ModifySelectedTextFontName: Boolean ModifySelectedTextFontSize: Boolean ModifySelectedTextItalic : Boolean ModifySelectedTextOpaque: Boolean ModifySelectedTextRotation: Boolean ModifySelectedTextStroke : Boolean ModifySelectedTextStyle : Boolean ModifySelectedTextUnderLine: Boolean ShowColorPicker : Boolean ShowSnapSettingDialog: Boolean ShowStylePicker :Boolean ShowTextStylePicker : Boolean ToXML : String Undo :Boolean SuperMap Objects 开发教程 SuperMap ( 地图控件 ) 图 3.2 SuerMap 控件的属性 方法关系图 Action: seaction ActionCursor: seactioncursor AllowTextOverlapped :Boolean Appearance: Integer AutoBreak: Boolean AutoClip: Boolean BackStyle: sostyle BorderStyle: Integer Bounds: sorect BusyCursor: Boolean BusyCursorEnabled: Boolean CenterX: Double CenterY: Double CoordUnits: seunits CopyEnabled: Boolean CurrentCustomGeometryLibrary :Long CurrentCustomGeometryType :Long CurStyle:soStyle CurTextStyle: sotextstyle CutEnabled :Boolean Editable :Boolean EditHandleOptions: soedithandleoptions EditHistory : soedithistory EnableDynamicProjection :Boolean FixedActionCursor :Boolean FixedTextOrientation:Boolean Handle:Object HitTestBorderOnly: Boolean HotKeyEnabled: Boolean hwnd: OLE_ HANDLE Layers: solayers LockMapViewBounds : Boolean MapName: String MarginPanEnable: Boolean MarginPanPercent :Double MarginPanWidth: Long MaxScale: Double MinScale: Double Modified: Boolean MouseIcon: String PasteEnabled: Boolean PJCoordSys: sopjcoordsys RedoEnabled: Boolean RotationOptions : double Selection: soselection SelectionTolerance :Long SelectMode :SeSelectMode SnapOption: sosnapoption SubAction: sesubaction TrackedGeometry : sogeometry TrackingColor:OLE_COLOR TrackingLayer: TrackingLayer UndoEnabled: Boolean VectorlizationParameters:soVectorlizationParameters ViewBounds: sorect ViewBoundsForLocking: sorect ViewScale: Double VisibleTextSizeMax : Long VisibleTextSizeMin : Long UnlockWindowUpdate ViewEntire Zoom 68

79 3.2.1 SuperMap 浏览空间数据基本操作 第 3 章核心控件之地图窗口 SuperMap 基本操作包括空间数据的放大 缩小 漫游 选择 全幅显示 刷新等, 这几项操作主要用于浏览地图, 因此,SuperMap Objects 把这些其中大部分基本操作都封装在 SuperMap 控件内部 ( 包括不同操作状态下的鼠标状态也会自动更改 ), 简化了编程过程, 应用程序中只要设置 SuperMap 的 Action 属性的状态 ( 设置 Action 状态后不用对 SuperMap 进行刷新, 系统会自动刷新 SuperMap 控件 ), 就可以在 SuperMap 上进行相应的操作了 全幅显示和刷新是 SuperMap 的两个方法, 不通过 Action 状态设置来进行相应的操作 ( 注 : 本节的例子程序参考示范工程 MapBrowse.vbp) 设置选择状态 SuperMap.Action = scaselect SuperMap.Action = scarectselect SuperMap.Action = scacircleselect SuperMap.Action = scaregionselect // 单击选择地理要素 (sogeometry) // 矩形选择地理要素 (sogeometry) // 圆形选择地理要素 (sogeometry) // 区域放肆选择地理要素 (sogeometry) * 按住 Shift 键可以进行多个目标选择 ; 按住 Ctrl 键实现图层之间的目标切换选择 设置地图可视大小状态 SuperMap.Action = scazoomin // 地图放大 可以单击地图进行放大, 也可以在地图上拖动一个矩形框进行矩形放大 SuperMap.Action = scazoomout // 地图缩小 可以单击地图进行缩小, 也可以在地图上拖动一个矩形框进行矩形缩小 SuperMap.Action = scazoomfree // 地图自由缩放 按住鼠标向上移动则放大, 向下移动则缩小 SuperMap.Action = scapan // 地图漫游 地图窗口未锁定时可任意漫游, 但当地图窗口锁定后不能把地图拖到地图窗口以外 SuperMap.ViewEntire // 地图全幅显示 此时的显示范围为地图窗口中所有图层边界的并集 刷新地图 SuperMap.Refresh // 地图刷新 69

80 SuperMap Objects 开发教程 除上述基本操作外,SuperMap 的 Action 状态共有 60 多种, 包括对图层的各种编辑方式 (scaedit 系列常量 ) 和对跟踪图层的跟踪操作 (scatrack 系列常量 ) 等一系列状态的设置, 还有用户自定义操作状态 (scauserdefine ) 这里值得一提的是 SuperMap 还开放了事件 SuperMap_ActionChanged, 在改变 SuperMap.Action 的时候触发这个事件, 方便程序中控制不同 Action 状态下用户的操作限制与相应的系统菜单内容 SuperMap 自定义空间数据浏览 对空间数据进行放大 缩小 漫游等在 SuperMap 中除了提供交互式操作, 即通过设置 SuperMap.Action, 这种方式的优点是开发方法简单, 应用程序的操作灵活度比较高 ; 但是如果应用程序中需要对空间数据的显示比例和视野有比较严格的要求, 就必须通过程序来严格控制, SuperMap 同样提供了这方面的方法, 例如 : SuperMap.Pan(x,y) // 通过传递屏幕坐标来漫游地图 SuperMap.Pan2(x,y) // 通过传递地理坐标来漫游地图 SuperMap.Zoom(dZoomRatio) // 设置地图缩放比例, 如 dzoomratio=2, 则放大到当前范围的 2 倍 ; 如 dzoomratio=0.5, 则缩小到当前范围的 1/2 根据 SuperMap Objects 中的坐标系统 ( 如下图 3.3) 可以进行如下几种的自定义地图浏览方式 : 以像素为单位移动地图 图 3.3 SuperMap Objects 中的坐标系 Dim LastX As Single Dim LastY As Single // 鼠标按下时的平面 X 坐标 // 鼠标按下时的平面 Y 坐标 70

81 第 3 章核心控件之地图窗口 SuperMap Private Sub SuperMap1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) LastX = X // 获取鼠标按下时的平面 X 坐标 LastY = Y // 获取鼠标按下时的平面 Y 坐标 End Sub Private Sub SuperMap1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) SuperMap.Pan(X- LastX, Y- LastY) // 移动地图 SuperMap.Refresh // 刷新地图 End Sub 以地理坐标为单位移动地图 该方法实现的效果与上一个小节一样, 不同之处在于 Pan2 方法使用地理坐标 在实际应用中, 将地图按照实际的距离移动也是比较常见的 Dim LCoordSystemX As Double Dim LCoordSystemY As Double // 鼠标按下时的地理 X 坐标 // 鼠标按下时的地理 Y 坐标 Private Sub SuperMap1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) // 平面坐标 -> 地理坐标 LCoordSystemX = SuperMap1.PixelToMapX(ScaleX(X, vbtwips, vbpixels)) LCoordSystemY = SuperMap1.PixelToMapY(ScaleY(Y, vbtwips, vbpixels)) End Sub Private Sub SuperMap1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) Dim TCoordSystemX As Double // 鼠标释放时的地理 X 坐标 Dim TCoordSystemY As Double // 鼠标释放时的地理 Y 坐标 // 平面坐标 -> 地理坐标 TCoordSystemX = SuperMap.PixelToMapX(ScaleX(X, vbtwips, vbpixels)) TCoordSystemY = SuperMap.PixelToMapX(ScaleY(Y, vbtwips, vbpixels)) SuperMap.Pan2(TCoordSystemX-LCoordSystemX,TCoordSystemY- LCoordSystemY) // 移动地图 SuperMap.Refresh // 刷新地图 End Sub 自定义缩放空间数据 SuperMap.Zoom 2 SuperMap.Refresh //SuperMap 视图放大两倍 ; 大于 1 表示放大 ; 小于 1 表示缩小 // 刷新 SuperMap SuperMap 窗口的环境设置 对于众多的环境设置内容, 我们分成两类 :(1)SuperMap 窗口样式与位置 (2) 与空间数据显示有关的设置 71

82 SuperMap 窗口样式与位置的设置 SuperMap 窗口样式的环境设置 SuperMap Objects 开发教程 SuperMap 窗口样式包括控件的外观 背景以及控件的定位 可视等 控件的外观控制 SuperMap 是否有边框, 是否显示为三维效果, 通过属性 BorderStyle 和 Appearance 实现管理 ; SuperMap.BorderStyle = 0 SuperMap.BorderStyle = 1 SuperMap.Appearance = 0 SuperMap.Appearance = 1 // 无边框 // 固定单个边框 // 平面窗口效果 // 三维窗口效果 (* 当 BorderStyle= 0,Appearance 的设置无效,SuperMap 没有边框 ) 背景设置控制 SuperMap 控件的背景颜色 背景的填充风格等属性, 通过 BackStyle 实现管理 ; SuperMap.BackStyle.BrushColor SuperMap.BackStyle.BrushStyle SuperMap 窗口的位置设置 // 背景颜色 ( 可用任何一个赋值的 OLE_COLOR 类型的变量或 // 颜色常量赋值, 亦可用 RGB 函数赋值 ) // 背景的填充风格 控件的定位是指 SuperMap 控件在 VB 中 Form 的位置及高度和宽度, 由 Left Top Height Width 等属性进行控制, 例如 : SuperMap.Left = 10 SuperMap.Top = 10 SuperMap.Height = 200 SuperMap.Width = 200 控件的可视与否是指运行后的程序界面上 SuperMap 控件是否可见, 属性 Visible 对它进行管理 视图状态设置 SuperMap 的视图就是空间数据的显示窗口, 通过对视图的控制可以实现整个地图显示范围的控制 (ViewBounds Bounds) 返回 / 设置当前视图的显示比例 (ViewScale MaxScale MinScale) 获取视图的中心坐标 (CenterX CenterY) 锁定当前地图的视图 (LockMapViewBounds) 锁定 / 解除当前地图的更新 (LockWindowUpdate UnLockWindowUpdate) 设置当前地图标注的最大 / 小显示尺寸 (VisibleTextSizeMax VisibleTextSizeMin) 控制视图边框滚动和滚动的大小 (MarginPanEnable MarginPanPercent MarginPanWidth) 控制视图范围和视图中心 在 SuperMap 控件中,Bounds 属性是 SuperMap 中当前所有图层 (solayer) 所对应的数据 72

83 第 3 章核心控件之地图窗口 SuperMap 集 (Dataset) 的 Bounds 的并集 此外,SuperMap 中还有 ViewBounds 属性, 它是指空间数据的显示范围 SuperMap 的 ViewBounds 永远不大于 Bounds 特别的, 当 ViewBounds = Bounds 时, 就是全幅显示, 一般通过 ViewBounds 来控制 SuperMap 的视图 下面的程序介绍了除使用 SuperMap.ViewEntire 之外, 通过另外一种方式实现空间数据的全幅显示 : Dim objrect As sorect Set objrect = SuperMap.Bounds Set SuperMap.ViewBounds = objrect SuperMap.Refresh // 矩形对象 // 接受 SuperMap 的全幅视图 // 设置当前视图为全幅视图 // 刷新 SuperMap 下面的程序实现把当前的视图设置为第一个图层的显示范围 : Dim objlayer As solayer Dim objdt As sodataset Dim objrect As sorect Set objlayer = SuperMap.Layers(1) Set objdt = objlayer.dataset Set objrect = objdt.bounds Set SuperMap.ViewBounds = objrect SuperMap.Refresh // 图层对象变量 // 数据集对象变量 // 矩形框对象变量 // 获取 SuperMap 第一个图层 // 获取第一个图层的数据集 // 获取数据集的显示范围 // 重新设置 SuperMap 视图为第一图层的显示范围 // 刷新 SuperMap 当前视图的中心坐标可通过 CenterX 和 CenterY 两个属性直接获取和设置, 通过它们来重新定位当前视图的中心 下面的程序实现把当前的视图中心向左 向上各移动 1000 个地理单位 : SuperMap.CenterX = SuperMap.CenterX 1000 SuperMap.CenterY = SuperMap.CenterY SuperMap.Refresh // 中心左移 1000 地理单位 // 中心上移 1000 地理单位 // 刷新 SuperMap 控制视图的显示比例 空间数据的比例尺是其显示的基本要素之一 SuperMap 提供了三个属性控制空间数据的显示比例, 其中 ViewScale 用来设置和返回 SuperMap 控件中显示的空间数据的比例尺 ( 大于零 ), 如果用户不指定 ViewScale, 则系统将自动计算适当的值 ; 当用户指定某一个值并刷新 SuperMap 窗口时, 空间数据将按照用户指定的比例尺进行缩放 ;MaxScale 控制空间数据显示的最大比例, 当 ViewScale 大于 MaxScale 时, 空间数据无法放大到比该比例更大的视图 ;MinScale 控制空间数据显示的最小比例, 当 ViewScale 小于 MinScale 且大于 0 时, 空间数据无法缩小到比该比例更小的视图 当 MaxScale = 0 时, 没有最大显示比例的限制 ; 当 MinScale = 0 时, 没有最小显示比例的限制 假设地图比例尺为 1:m, 则有以下关系 : 1/ViewScale = m 锁定当前空间数据的视图 在没有锁定视图的时候, 用户可以任意漫游 SuperMap 窗口, 即使空间数据的显示超出了当前视图, 用户也可以任意漫游到空白区 锁定视图后的效果刚好相反, 无论用户怎样缩小或放大地图, 在漫游 SuperMap 窗口的时候, 空间数据总会显示在视图中, 当用户把空间数据拖出视 73

84 SuperMap Objects 开发教程 图松开鼠标按钮时, 空间数据会自动弹回视图范围中 SuperMap.LockMapViewBounds = True 锁定 / 解除当前 SuperMap 窗口的刷新 // 等于 False 就解除视图锁定 SuperMap 控件的每一次改变位置或改变宽度 高度都会使 SuperMap 自动刷新, 这影响系统的性能 如果在 SuperMap 改变状态以前锁定空间数据视图, 在所有改变完成之后解除锁定, 这样 SuperMap 只需要刷新一次, 优化了系统性能 下面是实现这种优化的一个示例 Private Sub Form_Resize() SuperMap.LockWindowUpdate SuperMap.Top = SuperMap.Top + 10 SuperMap.Left = SuperMap.Left + 10 SuperMap.Width = SuperMap.Width SuperMap.Height = SuperMap.Height SuperMap.UnlockWindowUpdate End Sub // 锁定地图窗口, 避免刷新 // 重新确定上边距 // 重新确定左边距 // 重新确定宽度 // 重新确定高度 // 解锁地图窗口 如果没有加锁,SuperMap 会自动刷新 5 次 ( 加上窗体本身的一次刷新 ), 而现在 SuperMap 只刷新一次, 大大提高了系统的性能 设置当前空间数据标注的最大 / 最小显示尺寸 当 SuperMap 视图改变显示比例时, 其中的标注对象随着放大或缩小, 标注对象的尺寸会相应的变化 在地图显示中, 一般当地图缩小到一定的程度时, 标注会很小 ; 相反, 当地图放大到一定程度时, 标注会很大 此时, 标注的显示已经不能起到标识作用, 应该把它隐藏掉, 保持视图的有序和美观 SuperMap 提供了这样的属性, 专门用来控制标注对象的显示 VisibleTextSizeMax 控制注记最大可见尺寸 (Size), 当地图窗口中的注记尺寸大于该值时, 注记不再显示 ;VisibleTextSizeMin 控制注记的最小可见尺寸 (Size), 当地图窗口中的注记尺寸小于该值时, 注记不再显示 控制视图边框滚动和滚动的单位距离 SuperMap 已经提供了两种漫游地图的方法 ( 设置 Action = scapan 和调用 Pan Pan2 方法 ), 另外还拥有一种地图漫游功能 自动滚屏 如果 SuperMap.MarginPanEnable 属性为 True( 系统默认为 True), 那么当鼠标移到视图的边缘,SuperMap 窗口会自动显示一个滚屏标志 ( 一对指向滚动方向的绿色双箭头 ), 此时按下鼠标, 视图中心会自动向滚动方向移动一定的距离 当 MarginPanEnable 为 True 时, 属性 MarginPanWidth MarginPanPercent 的设置均有效 MarginPanWidth 用来返回和设置自动滚屏的有效范围, 即鼠标指针与边框的距离小于该值时, 启用自动滚屏 ( 单位 : 像素 ; 取值范围 :5~30); MarginPanPercent 用来返回和设置自动滚屏的距离与地图窗口尺寸的比值 ( 取值范围 :0--1.0) 74

85 第 3 章核心控件之地图窗口 SuperMap 3.3 图层管理 GIS 一个很重要的特色是将复杂的客观现实世界通过 层 (Layer) 的概念来组织 存储和表达 层是根据地理对象的属性特征进行分类得到的一个专题对象集合, 例如众多的河流对象 ( 线状 ) 构成一个 河流层, 众多的湖泊对象 ( 多边形 ) 又构成一个 湖泊层 等等 如果某一层上的对象过多, 会给 GIS 带来数据管理 输入 输出 分析和显示上的不方便, 造成系统效率低下, 有时甚至不能正常工作 为此, 我们常将对象数目过多的层进行分区, 于是上述 河流层 和 湖泊层 被分别划分为几个 子河流层 和 子湖泊层, 分别用不同的名字标识它们 SuperMap 以数据集 (Dataset) 为单位来组织数据, 它将具有同样地理属性的地理对象存储在同一数据集中, 只有当一个数据集显示在地图窗口中时, 才被称为 层 或 图层 如图 表示了 SuperMap 控件与图层对象的关系 SuperMap 窗口中显示的空间数据来自于 SuperWorkspace 中, 一个 SuperMap 窗口相当于一个图层的集合对象 (solayers), 通过集合对象中个体的引用 (solayers.item(index)) 可以获得每一个图层对象 (solayer), 每个图层对应于一个空间数据表, 即数据集 (sodataset), 图层可以使用不同类型的专题图渲染空间数据, 表达出空间数据的各种专题信息 图 3.4 SuperMap 与图层对象的关系图 图层集合对象 (solayers) 图层集合对象 (solayers) 为我们管理 ( 移动图层叠加显示的顺序等 ) 和操作 ( 添加数据集 删除图层等 ) 其中的图层元素提供了丰富的接口, 如下图所示 : 75

86 SuperMap Objects 开发教程 AddDataset:soLayer DisableEdit FindLayer:Long GetEditableLayer:soLayer MoveBottom:Boolean MoveDown:Boolean MoveTo:Boolean MoveTop:Boolean MoveUp:Boolean Remove:Long RemoveAll RemoveAt:Boolean SetEditableLayer:Boolean solayers ( 图层集合 ) Count:Long Item:soLayer 图 3.5 图层集合对象 (solayers) 结构图 以下将详细地说明如何进行图层的操作的几个步骤 : 向图层集合中添加数据集 从上一章关于 SuperWorkspace 的讲述中我们已经了解到, 在 SuperMap Objects 平台上数据管理的工作全部交给了 SuperWorkspace 控件, 那么要显示一个空间数据就要涉及到从 SuperWorkspace 这个数据仓库中取得数据, 然后建立 SuperMap 和 SuperWorkspace 的连接, 再把数据添加到图层上进行显示 图 3.6 给出了在 SuperMap Objects 平台上显示空间数据的步骤 : SuperWorkspace ( 工作空间控件 ) SuperMap ( 地图控件 ) DataSources sodatasources ( 数据源集合 ) Item Layers sodatasource ( 数据源 ) Datasets sodatasets ( 数据集集合 ) Item sodataset ( 数据集 ) solayers ( 图层集合 ) AddDataset 图 3.6 SuperMap 与数据源对象的关系结构图 76

87 第 3 章核心控件之地图窗口 SuperMap 首先建立 SuperMap 与 SuperWorkspace 之间的连接, 这样 SuperMap 就能从 SuperWorkspace 中获取数据集的各种信息, 包括地图数据和属性数据 ; 定义一个数据源集合对象变量, 从 SuperWorkspace 中取出所有的数据源对象 ; 定义一个数据源对象变量, 从数据源集合中取出一个数据源对象 ; 定义一个数据集集合变量, 从数据源对象中获取数据集集合对象 ; 定义一个数据集变量, 从数据集集合对象中取出单个的数据集 ; 定义一个图层集合变量, 把上一步骤中的数据集添加到 SuperMap 控件中 ; 刷新 SuperMap 控件, 显示添加数据集后的地图 代码示例如下 : SuperMap1.Connect SuperWorkspace1.Handle // 建立 SuperMap 与 SuperWorkspace 之间的连接 Dim objdss As sodatasources Dim objds As sodatasource Dim objdts As sodatasets Dim objdt As sodataset Dim objlayers As solayers Dim objlayer As solayer Dim i As Integer // 数据源集合对象, 指向打开的数据源集合 // 数据源对象, 指向打开的数据源 // 数据集集合对象, 指向指定数据源中的数据集集合 // 数据集对象, 指向指定数据集集合中的一个数据集 // 图层集合变量, 指向 SuperMap 中的图层集合 // 图层对象变量, 指向将要打开的图层 // 循环变量 Set objdss = SuperWorkspace.DataSources // 获取数据源集合 Set objds = objds.item(1) // 获取一个数据源 Set objdts = objds.datasets // 获取数据源中的数据集集合 For i = 1 To objdts.count // 循环添加数据集 Set objdt = objdts.item(i) // 获取一个数据集 Set objlayers=supermap1.layers // 一个 SuperMap 窗口就是一个图层集合 objlayers.adddataset(objdt, True) // 把数据源中的所有图层加入到 SuperMap 最顶层 Next i SuperMap1.Refresh // 刷新 SuperMap 控件 以上程序中的 SuperWorkspace1 是一个 SuperWorkspace 控件, 执行这段程序的前提是系统中已经打开了至少一个数据源, 而且打开的第一个数据源中至少有一个数据集 ;SuperMap1 是一个 SuperMap 控件 ;SuperMap1.Layers.AddDataset(objDT,True) 是将 objdt 数据集添加到 SuperMap1 的最顶层, 如果把 True 改为 False 则是把 objdt 添加到最底层 该示例程序中定义了多个父子关系的对象 ( 例如 :solayers 与 solayer sodatasources 与 sodatasource 等 ), 目的在于更清楚地说明控件 对象之间的关系 简化以后的程序如下 : SuperMap1.Connect SuperWorkspace1.Handle // 建立 SuperMap 与 SuperWorkspace 之间的连接 Dim objdss As sodatasources Dim objlayer As solayer Dim i As Integer // 数据源集合对象, 指向打开的数据源集合 // 图层对象变量, 指向将要打开的图层 // 循环变量 77

88 SuperMap Objects 开发教程 For i = 1 To objdss(1).datasets(1).count // 循环添加数据集 // 把数据源中的图层加入到 SuperMap 最顶层 SuperMap1.Layers.AddDataset(objDSS(1).Datasets(i), True) Next i SuperMap1.Refresh // 刷新 SuperMap 控件 统计图层集合中的图层数 Dim nlayercount As Integer nlayercount = solayers.count MsgBox " 当前图层数有 :" & nlayercount & " 层 ", vbinformation 调整图层显示的顺序 solayers.movebottom(nindex As Long) // 移至最下层 solayers.movetop(nindex As Long) // 移至最上层 solayers.movedown(nindex As Long) // 下移一层 solayers.moveup(nindex As Long) // 上移一层 solayers.moveto(nindexfrom As Long, nindexto As Long) 移除图层 // 移至指定索引的位置 solayers.removeall solayers.removeat(nindex As Long) // 移除全部图层 // 移除指定索引的图层 图层对象 (solayer) 在图层集合中得到图层对象 (solayer) 有两种方法 : // 通过添加数据集获得 SuperMap.Layers.AddDataset(objDataset as sodataset,baddhead as boolean) as solayer // 通过图层集合引用 SuperMap.Layers.Item(Index as Long) as solayer 由此我们看出, 显示一个数据集 (objdataset) 就是将其添加到图层集合 (solayers) 上, 在图层集合中就增加了一个图层, 相反, 通过图层也可以得到数据集, solayer.dataset as sodataset // 返回显示在 solayer 上的 sodataset 可见, 对于一个 SuperMap 窗口, 数据集和图层是一一对应的 但是一个数据集可以在多个 SuperMap 窗口中显示, 这样就相当于一个数据集可以对应多个图层, 因此我们可以说, 对于多个 SuperMap 窗口, 数据集和图层之间是一对多的关系 ( 请参考图 3.7) 78

89 第 3 章核心控件之地图窗口 SuperMap 图 3.7 数据集与图层之间的对应关系图 79

90 SuperMap Objects 开发教程 图层对象 (solayer) 本身提供了一些管理自己的方法和属性 如图 3.8 所示 : AllowTextOverlapped : Boolean Caption : String Dataset : sodataset Description : String DisplayFilter : String DisplayFilterEx : soquerydef DisplayOption : String Editable: Boolean Empty: Boolean GridThemeRange: sogridthemerange GridThemeUnique: sogridthemeunique IgnoreGeometryStyle : Boolean KeepOrder: Boolean MinimumVisible: Double Name : String RasterOpaqueRate : Integer RefreshmentRequired : Boolean Selectable: Boolean Snapable: Boolean Style: sostyle Sublayer: solayer SymbolScalable: Boolean solayer SymbolScaleDefinition : Double ( 图层对象 ) ThemeCustom: sothemecustom ThemeDotDensity: sothemedotdensity ThemeGraduatedSymbol : sothemegraduatedsymbol ThemeGraph: sothemegraph ThemeLabel: sothemelabel ThemeRange: sothemerange ThemeUnique: sothemeunique UseCache :Boolean UseFileCache : Boolean Visible: Boolean VisibleByScale: Boolean VisibleScaleMax: Double VisibleScaleMin: Double CovertThemeToDataset :sodatasetvector DeleteThematicMap : Boolean FromXML :Boolean HitTest: sogeometry HitTestEx: soselection IsValidFieldExpression : SeFieldType ToXML: String 图 3.8 图层对象 (solayer) 结构图 80

91 返回图层的描述信息 Dim strlayercaption As String Dim strlayerdesc As String Dim strlayername As String strlayercaption = objlayer.caption strlayerdesc = objlayer.description strlayername = objlayer.name 返回或设置图层的属性 第 3 章核心控件之地图窗口 SuperMap // 返回图层的标题 // 返回图层的描述 // 返回图层的名字 图层 (solayer) 有四个基本属性 : 可见 可选择 可编辑 可捕捉 这四个属性之间有一定的制约关系, 图层可编辑的前提是 : 图层是可见并且可选择 solayer.visible as Boolean solayer.selectable as Boolean solayers.seteditablelayer(index) as Boolean solayer.snapable as Boolean // 可见 // 可选择 // 可编辑 // 可捕捉 这里需要说明的是设置图层可编辑的方式与其他三种属性设置不同, 因为在一个图层集合中当前可编辑的图层只能有一个, 所以通过图层集合来设置当前可编辑的图层, 每次设置会自动取消上一次设置的图层的可编辑状态 定义图层的显示内容 定义图层的显示内容可以通过两种方式 : 设置图层显示的过滤条件 如果用户的数据集中许多空间对象, 在显示的时候只需要显示满足条件的空间对象, 就可以通过设置图层过滤条件来实现 Dim strsqlfilter As String Set strsqlfilter = smuserid >= 56 objlayer.displayfilter = strsqlfilter // 过滤条件 设置当前图层的最大最小显示比例, 当 SuperMap.ViewScale 不在当前图层设置的最大最小显示比例之间的时候, 当前图层的内容将被隐藏 当图层的最大最小显示比例都被设置为 0, 则当前图层的可视范围设置被取消 Dim dviewmaxscale As Double dviewmaxscale = objlayer.visblescalemax dviewmaxscale = 1/500 Set objlayer.visblescalemax = dviewmaxscale // 返回 SuperMap 窗口的最大比例尺 // 设置 SuperMap 窗口的最大比例尺 3.4 图层风格 在上一章关于 SuperWorkspace 控件的讨论中, 详细介绍过 CAD 类型的数据集与 GIS 类型数据集的区别, 我们了解到 CAD 类型的数据集, 风格面向空间对象, 保存在数据集中 ; 而 GIS 类型的数据集, 风格面向该数据集对应的图层, 保存在地图 (Map) 中, 数据集本身并不保存 81

92 SuperMap Objects 开发教程 风格 那么这一节我们来讨论如何设置 GIS 图层的风格 对 GIS 图层显示风格设置有两种方式 :(1) 整个图层用一种风格渲染 (2) 制作专题图 矢量数据图层用同一种风格渲染 点 线 面是几何对象的三种基本形式,SuperMap 为三个基本几何对象提供了一个风格对象 sostyle, 下图是风格对象 (sostyle) 的属性关系图 : 图 3.9 风格对象 (sostyle) 属性关系图 以风格对象来设置几何对象的显示风格 通过风格对象 (sostyle) 提供的接口, 可以直接设置点 线 面图层的显示风格, 例如 :( 此示范程序实现为面图层改变风格 ) Dim objstyle As New sostyle Dim objlayer As solayer With objstyle.penstyle = vbblue.brushstyle = 1 End With // 创建风格对象变量 // 为风格对象变量赋值 // 设置面状对象的边线颜色为蓝色 // 设置面状对象的填充方式为空填充 Set objlayer = SuperMap.Layers.Item(1) Set objlayer.style = objstyle SuperMap.Refresh // 获取当前面图层 // 给图层设置风格 // 刷新地图窗口 文本对象是另一类空间对象, 在内容 存储格式 风格都与基本的几何对象有很大的区别, SuperMap 专门为文本对象提供了风格对象 sotextstyle, 下图是文本风格对象 (sotextstyle) 的属性关系图 : 82

93 第 3 章核心控件之地图窗口 SuperMap 图 3.10 文本风格对象属性关系图 与前面的点 线 面数据集风格的设置方式不同,SuperMap 不对整个文本图层进行风格设置, 而是对文本图层中的单个文本对象进行文本风格设置, 在这一点文本图层与 CAD 图层很类似, 文本对象的风格保存在数据集中, 下面的示范程序实现了改变文本图层全部文本对象的风格 ( 前提条件是数据源以非只读方式打开,SuperMap 窗口中的第一个图层是文本图层 ): Dim objtextstyle As New sotextstyle // 定义文本风格对象变量 Dim objdataset As sodatasetvector // 定义数据集对象变量 Dim objrecordset As sorecordset // 定义记录集对象变量 Dim objgeometry As sogeometry // 定义空间对象变量 Dim objgeotext As sogeotext // 定义文本对象变量 Dim objlayer As solayer // 定义图层对象变量 With objtextstyle // 为文本风格对象变量赋值.FontName = 宋体 // 设置字体为宋体.FontHeight = 100 // 设置高度为 100.Color = vbblack // 设置文本颜色为黑色 End With Set objlayer = SuperMap.Layers(1) // 获取图层对象 Set objdataset = objlayer.dataset // 得到图层对应的数据集 If Not objdataset Is Nothing Then Set objrecordset = objdataset.query(,true) // 得到记录集 If objrecordset Is Nothing Then Exit Sub objrecordset.movefirst Do Until objrecordset.iseof Set objgeometry = objrecordset.getgeometry // 得到空间对象 If objgeometry.type = scgtext Then Set objgeotext = objgeometry // 得到给文本对象 Set objgeotext.textstyle = objtextstyle // 设置文本对象的风格 objrecordset.edit objrecordset.setgeometry // 将改变了风格的文本对象保存 objrecordset.update // 更新记录集 83

94 End If objrecordset.movenext Loop End If End If SuperMap.Refresh SuperMap Objects 开发教程 以几何对象的风格对话框设置其显示风格 // 刷新地图窗口 除了通过改变风格对象的属性来设置图层的显示风格之外,SuperMap 提供了更方便的方式 : 使用属性对话框 SuperMap 中定义了类型丰富的属性对话框, 其中与风格设置有关的有三个 : 点风格对话框 线面风格对话框和文本风格对话框 在调用 ShowStylePicker 方法显示对话框的时候, 系统会根据用户提供的对象维数显示相应的属性对话框 自动根据参数进行初始化 ( 在 SuperMap 中, 点对象为 0 维, 线对象为 1 维, 面对象为 2 维 ) 点图层的风格设置 ( 前提条件第一个图层为点图层 ): Dim objstyle As sostyle Dim objlayer As solayer // 图层风格变量 // 图层变量 Set objlayer = SuperMap.Layers(1) // 获取点图层 Set objstyle = objlayer.style // 获取点图层风格 SuperMap.ShowStylePicker objstyle,0 // 显示点风格对话框, 设置风格 objstyle Set objlayer.style = objstyle // 设置点图层的风格 SuperMap.Refresh // 刷新 SuperMap 图 3.11 点风格对话框 84

95 第 3 章核心控件之地图窗口 SuperMap 线图层的风格设置 ( 前提条件 SuperMap 中第一个图层为线图层 ): Dim objstyle As sostyle Dim objlayer As solayer // 图层风格变量 // 图层变量 Set objlayer = SuperMap.Layers(1) // 获取线图层 Set objstyle = objlayer.style // 获取线图层风格 SuperMap.ShowStylePicker objstyle,1 // 显示线风格对话框, 设置风格 objstyle Set objlayer.style = objstyle // 设置线图层的风格 SuperMap.Refresh // 刷新 SuperMap 图 3.12 线风格对话框 面图层的整体风格设置 ( 前提条件是 SuperMap 中第一图层为面图层 ): Dim objstyle As sostyle Dim objlayer As solayer // 图层风格变量 // 图层变量 Set objlayer = SuperMap.Layers(1) // 获取面图层 Set objstyle = objlayer.style // 获取面图层风格 SuperMap.ShowStylePicker objstyle,2 // 显示面风格对话框, 设置风格 objstyle Set objlayer.style = objstyle // 重新设置面图层的风格 SuperMap.Refresh // 刷新 SuperMap 85

96 SuperMap Objects 开发教程 图 3.13 面风格对话框 文本图层的风格设置 ( 前提条件是 SuperMap 中第一图层为文本图层 ): Dim objtextstyle As sotextstyle Dim objdtv As sodatasetvector Dim objrecordset As sorecordset Dim objgeotext As sogeotext // 定义文本风格变量 // 定义矢量数据集变量 // 定义记录变量 // 定义文本对象变量 Set objdtv = SuperMap1.Layers(1).Dataset // 获取文本数据集 Set objrecordset = objdtv.query(, True) // 获取文本记录集 Set objgeotext = objrecordset.getgeometry() // 获取第一个记录的文本对象 If Not(objGeoText Is Nothing )Then Set objtextstyle = objgeotext.textstyle // 获取当前文本的当前风格 If SuperMap1.ShowTextStylePicker(objTextStyle) = True Then objrecordset.movefirst Do Until objrecordset.iseof // 循环进行风格设置 // 获取当前记录对应的文本对象 Set objgeotext = objrecordset.getgeometry() If Not (objgeotext Is Nothing) Then objrecordset.edit // 文本对象记录集开始编辑 Set objgeotext.textstyle = objtextstyle // 设置新的文本风格 objrecordset.setgeometry objgeotext // 保存更改风格后的文本对象 objrecordset.update // 更新记录集 End If objrecordset.movenext 86

97 第 3 章核心控件之地图窗口 SuperMap Loop End If End If SuperMap1.Refresh // 刷新 SuperMap 图 3.14 文本风格对话框 在风格对话框中, 系统内部调用了颜色对话框进行相应的风格设置,SuperMap 还提供了外部调用颜色对话框的方法 ShowColorPicker, 也可以使用 SuperMap 的颜色对话框对其它控件进行颜色赋值 下面的程序使用 SuperMap 的颜色对话框对 Vb 的 Form 进行背景颜色设置 Dim color As OLE_COLOR Set color = Form1.BackColor SuperMap1.ShowColorPicker color Form1.BackColor = color Form1.Refresh // 定义颜色变量 // 保存背景颜色 // 显示对话框 // 设置新的背景颜色 // 刷新窗体 87

98 SuperMap Objects 开发教程 图 3.15 颜色对话框 矢量数据图层制作专题图 制作专题地图同样是一种渲染 GIS 图层的一种方式, 但是它又不仅仅用来渲染图层, 制作专题图更能表现属性数据专题, 利用它可以对纷繁复杂的地理信息进行分类提取, 并以不同的颜色 面积 图形等一些特性直观地表现出来, 通过风格渲染来挖掘数据潜力 SuperMap Objects 提供了较强大的专题地图制作功能, 包括单值专题图 范围分段图 点密度图 统计图 等级符号图 标签专题图等多种类型, 能满足众多行业的需求, 同时,SuperMap Objects 还提供了制作自定义专题地图的功能, 由用户来确定专题地图的各种属性, 更增加了制作专题图的灵活性 SuperMap Objects 软件提供了两种专题地图的方法 : 一种是运用其中的一个控件 SuperLegend 直接提供了专题地图制作向导, 在向导中逐步设置参数, 由系统自动生成专题地图, 无需开发者编写程序就可以轻松实现专题地图的制作 使用这种方式方便 准确性高 效率高, 但是向导界面的风格固定, 不能根据开发者的喜好和应用系统的需要制作个性化界面, 局限性较大 另一种方法是利用 SuperMap Objects 提供的制作专题地图的专门接口, 由开发者编写程序制作专题图 开发者可以根据自己的爱好和系统的需要定制合适的向导界面 这里我们要详细介绍的就是用这种方法制作专题图 在 SuperMap Objects 对象库中, 各专题图对象的关系如下图所示 : 88

99 第 3 章核心控件之地图窗口 SuperMap SuperMap ( 地图控件 ) Layers solayers ( 图层集合 ) Item sothemedotdensity ( 点密度专题图 ) sothemeunique ( 单值专题图 ) sothemerange ( 分段专题图 ) sogridthemerange (Grid 分段专题图 ) ThemeDotDensity ThemeUnique ThemeRange sogridthemeunique (Grid 单值专题图 ) GridThemeRange GridThemeUnique solayer ( 图层 ) Dataset sodataset ( 数据集 ) ThemeCustom ThemeLabel ThemeGraph ThemeGraduatedSymbol sothemecustom ( 自定义专题图 ) sothemelabel ( 标签专题图 ) sothemegraph ( 统计图专题图 ) sothemegraduatedsymbol ( 等级符号专题图 ) 图 3.16 SuperMap Objects 图层与专题地图结构关系图 专题图是根据数据集的属性字段值制作出来的一种显示方式, 不具有层的意义, 也不能保存为一个单独的文件, 但是可以作为一种视图状态保存在工作空间里 下面我们详细介绍如何使用 SuperMap Objects 提供的制作专题地图的接口来实现制作专题地图的功能 制作单值专题图 SuperMap Objects 的单值专题图将全制图区域按照专题现象的某种指标划分区域或各类型的分布范围, 在各界线范围内涂以颜色或者填绘晕线 花纹和图案, 以显示连续而布满全制图区域的现象的差别 ( 或各区域间的差别 ), 可用于地质图 地貌图 植被图 土地利用图 行政区划图 自然区划图 经济区划图等 单值专题图的对象结构如下图所示 : 89

100 SuperMap Objects 开发教程 solayer ( 图层 ) ThemeUnique AddItem:Long CalculateUniqueValues:Long ExchangeItem:Boolean FromXML:Boolean InsertItem:Long MakeDefault:Boolean RemoveAllItem RemoveItem:Long Sort ToXML:String sothemeunique ( 单值专题图 ) Caption:String DefaultStyle:soStyle Descending:Boolean Enable:Boolean Field:String ItemCaption:String ItemStyleEnabled Style:soStyle Valid:Boolean Value:String ValueCount:Long VisibleScaleMax:Double VisibleScaleMin:Double 图 3.17 单值专题图对象结构图 示范程序如下 : Dim objthemeunique As sothemeunique // 单值专题图对象 Dim objlayer As solayer // 图层对象 Dim objcolor As New socolors // 颜色集对象 Dim nthemecount As Long // 专题要素数目 Dim i As Integer Set objlayer = SuperMap1.Layers(1) Set objthemeunique = objlayer.themeunique With objthemeunique.enable = True.Field = "SmID" // 指定制作专题图的字段.MakeDefault // 必要, 否则 ValueCount 的值为 0 End With SuperMap1.Refresh // 此时地图刷新的效果和下一次刷新的效果不同 nthemecount = objthemeunique.valuecount // 获取专题要素的数目 objcolor.makerandomcolorset nthemecount // 产生一组随机色 For i = 1 To nthemecount // 设置各个专题元素的填充色 objthemeunique.style(i).brushcolor = objcolor(i) Next i SuperMap1.Refresh 此时刷新的效果与上一次不同, 可以在两次刷新之间添加一个断点, 观察不同的效果 第一次刷新与第二次刷新的区别在于专题图的随机颜色不一样, 第一次的颜色是系统默认的一个随机颜色集, 第二次显示的颜色是随机生成的颜色集 下面是单值专题地图的效果图 : 90

101 第 3 章核心控件之地图窗口 SuperMap 制作范围分段专题图 图 3.18 单值专题图效果图 范围分段专题图是在整个制图区域的若干个小的区划单位内 ( 行政区划或其它区划单位 ), 根据各分区资料统计的相对指标进行分级, 并用相应的色阶或不同疏密的晕线, 反映各区现象的集中程度或发展水平的分布差别 范围分段专题图可以反映布满整个区域的现象, 但较多的是反映呈面状分布但又比较分散的现象, 如人口密度, 农作物产量等等 范围分段专题图的对象结构如下图所示 : 图 3.19 范围分段专题图对象结构图 91

102 SuperMap Objects 开发教程 范程序如下 : Dim objthemerange As sothemerange // 范围分段专题图对象 Set objthemerange = Form1.SuperMap1.Layers.Item(1).ThemeRange With objthemerange.enable = True.Field = "SmID" // 指定制作专题图的字段.BreakCount = 4 // 设置分段个数 // 设置各个专题的分类标准.BreakValue(1) = 25.BreakValue(2) = 50.BreakValue(3) = 75.BreakValue(4) = 100 // 设置各个专题的风格.Style(1).BrushColor = vbred.style(2).brushcolor = vbgreen.style(3).brushcolor = vbblue.style(4).brushcolor = vbwhite End With SuperMap1.Refresh // 刷新地图窗口 分级标准 ( 包括专题图的级别数 每一级的值 ) 可以通过设计交互界面让用户自己控制, 每一级的显示颜色也可以随机设定 下面是一个范围分段专题图的效果图 : 图 3.20 范围分段专题图效果图 92

103 制作等级符号专题图 第 3 章核心控件之地图窗口 SuperMap 等级符号专题图采用不同形状 颜色和大小的符号, 表示各自独立的 以整体概念显示的各个物体的数量与质量特征 通常, 以符号的形状 颜色和大小反映空间实体的特定属性 ; 符号的形状与颜色表示质量特征, 符号的大小表示数量特征 等级符号专题图的对象结构如下图所示 : 示范代码如下 : 图 3.21 等级符号专题图对象结构图 Dim objlayer As solayer // 图层对象 Dim objthemegraduatedsymbol As sothemegraduatedsymbol // 等级符号专题图对象 Set objlayer = SuperMap.layers.Item(1) // 取得图层的等级符号专题图对象 Set objthemegraduatedsymbol = objlayer.themegraduatedsymbol With objthemegraduatedsymbol // 设置等级符号图对象属性 // 设置定义值, 单位取决于创建专题图的字段的单位 ( 要取得此属性, 必须先调用 sothemegraduatedsymbol 对象的 MakeDefault 方法, 而且当用于制作专题图的字段改变后, 应重新调用 MakeDefault 方法, 来计算此值 ).DefinitionValue = CDbl(Val(txtDefVal.Text)).Field = cmbfieldname.text // 指定字段 // 是否显示负值的专题类别 93

104 SuperMap Objects 开发教程.ShowNegative = IIf(chkShowNegative.Value = vbchecked, True, False).// 设置正值的专题类别风格 StyleForPositive = objpositivestyle If.ShowNegative = True Then // 设置负值的专题类别风格.StyleForNegative = objnegativestyle End If // 设置等级符号专题图的分级模式 If cmbgraduatedmode.listindex = "0" Then.GraduatedMode = scgconstant // 正常分段 ElseIf cmbgraduatedmode.listindex = "1" Then.GraduatedMode = scgsquareroot // 开方分段 ElseIf cmbgraduatedmode.listindex = "2" Then.GraduatedMode = scglog End If.Enable = True End With SuperMap.Refresh // 刷新地图窗口 // 对数分段 制作等级符号专题图的分级模式有三种, 即正常分段 对数分段 开方分段, 模式不同, 分段的计算方法不同, 分出的等级差异就不同, 由此生成不同的等级符号专题图 等级符号专题图的字段类型必须是数值型的 下面是等级符号专题图的效果图 : 图 3.22 等级符号专题图效果图 94

105 第 3 章核心控件之地图窗口 SuperMap 制作点密度专题图 点密度专题图是用一定大小的 形状相同的点, 表示现象分布范围 数量特征和分布密度 点的大小和所代表的数值由地图的内容决定 点密度专题图的对象结构如下图所示 : solayer ( 图层 ) FromXML:Boolean ToXML:String ThemeDotDensity sothemedotdensity ( 点密度专题图 ) Caption:String DotColor:OLE_COLOR DotSize:OLE_XSIZE_PIXELS DotValue:Double Enable:Boolean Field:String Valid:Boolean VisibleScaleMax:Double VisibleScaleMin:Double Style:soStyle 图 3.23 点密度专题图对象结构图 示范代码如下 : Dim objlayer As solayer Dim objthemedotdensity As sothemedotdensity // 图层对象 // 点密度专题图对象 Set objlayer = frmmain.supermap1.layers(1) Set objthemedotdensity = objlayer.themedotdensity // 取得图层相应的点密度专题图对象 // 设置点密度专题图对象属性 objthemedotdensity.dotcolor=vb_blue // 设置点的颜色 objthemedotdensity.dotsize=10 // 设置点的大小 ( 以像素为单位 ) objthemedotdensity.dotvalue=20 // 设置点所代表的数值 objthemedotdensity.field="peopledensity" // 指定字段 objthemedensity.enable = True SuperMap1.Refresh // 刷新地图窗口 点密度专题图的字段类型必须是数值型的 下面是点密度专题图的效果图 : 95

106 SuperMap Objects 开发教程 图 3.24 点密度专题图效果图 制作统计图 分区统计图表专题图, 把制图区域分成几个区划单位 ( 通常是以行政区为区划单位 ), 按其相应的统计数据, 描绘不同形式的统计图表, 以表示并比较各个区划单位内现象的总和及其动态, 统计图通常绘制在地图上各相应的分区内 分级统计专题图和分区统计图表专题图都属于统计制图的范畴 统计专题图的对象结构如下图所示 : 96

107 第 3 章核心控件之地图窗口 SuperMap solayer ( 图层 ) ThemeGragh FromXML:Boolean ToXML:String AddField:Long InsertField:Long sothemegragh ( 统计专题图 ) Caption:String Color:OLE_COLOR Enable:Boolean Field:String FieldCount:Long Graduated:Boolean GraduatedMode:seGraduatedMode GraphType:seGraphType ItemCaption:String LineColor:OLE_COLOR MaxSumSize:Double MinSumSize :Double Normalization:VARIANT ShowAxes:Boolean Valid:Boolean VisibleScaleMax:Double VisibleScaleMin:Double AutoAvoidOverlapped:Boolean EnableFlow:Boolean OffsetX:Double OffsetY:Double StartAngle:Double ItemTextStyle:soTextStyle ShowAxesText:Boolean ShowItemText:Boolean ShowLeaderLines:Boolean LeaderLineStyle:soStyle Style:soStyle ShowAxisGrid 图 3.25 统计专题图对象结构图 统计图的模式很多,SuperMap Objects 提供的有 12 种, 包括面积图 阶梯图 折线图 点状图 柱状图 三维柱状图 饼图 三维饼图 玫瑰图 三维玫瑰图 堆叠柱状图, 三维堆叠柱状图, 用户可以根据需要和自己的喜好选择相应的模式 示范程序如下 : Dim objthemegraph As sothemegraph // 统计图表专题图对象 Set objthemegraph = SuperMap1.Layers(1).ThemeGraph With objthemegraph // 设置各个专题的分类标准 97

108 SuperMap Objects 开发教程.Enable = True.GraphType = scppie3d // 统计图的类型为三维饼图.FieldCount = 2 //' 设置饼图的分块数.Field(1) = "SmID" // 饼图的第一部分的字段为 "SmID".Color(1) = vbred // 饼图的第一部分, 颜色为红色.Field(2) = "SmArea" // 饼图的第二部分的字段为 "SmArea" 色.Color(2) = vbblue // 饼图的第二部分, 颜色为蓝.GraduatedMode = scgconstant // 设置分级模式.DefinitionSize = 30 // 设置统计图表的尺寸, 单位为像素.DefinitionValue = 10 // 设置专题图的定义值 End With SuperMap1.Refresh // 刷新地图窗口 统计图的字段类型必须是数值型的, 否则不能制作统计图 下面是制作好的一个统计图的效果图 : 图 3.26 统计专题图效果图 制作标签专题图 标签专题图是在每个空间对象上显示特定字段的内容, 例如显示各个省的名称等 标签专题图的对象结构如下图所示 : 98

109 第 3 章核心控件之地图窗口 SuperMap solayer ( 图层 ) ThemeLabel FromXML:Boolean ToXML:String sothemelabel ( 标签专题图 ) AutoAvoidOverlapped:Boolean Caption:String Enable:Boolean EnableFlow: Field:String TextStyle:soTextStyle Valid:Boolean AllowLine:Boolean FixedAngle:Boolean LeaderLineStyle:soStyle OffserX:Double OffsetY:Double ShowLeaderLines:Boolean VisibleScaleMax:Double VisibleScaleMin:Double 图 3.27 标签专题图对象结构图 示范程序如下 : Dim objthemelabel As sothemelabel Dim objtextstyle As sotextstyle // 标签专题图对象 // 注记风格对象 Set objthemelabel = SuperMap1.Layers(1).ThemeLabel Set objtextstyle = objthemelabel.textstyle // 获取缺省的注记风格 SuperMap1.ShowTextStylePicker objtextstyle // 通过文本风格对话框来设置注记风格 With objthemelabel.enable = True.Field = "SmID" // 指定要制作注记专题图的字段.TextStyle = objtextstyle // 设置注记专题图的注记风格 End With SuperMap1.Refresh // 刷新地图窗口 标签专题图中的字段类型可以是任何类型的 下面是标签专题图的效果图 : 99

110 SuperMap Objects 开发教程 图 3.28 标签专题图效果图 制作自定义专题图 自定义专题图是针对用户的一些特定要求而设计的 以上我们讨论过的专题图中, 除了统计图表专题图之外, 其他几种类型专题图虽然表达方式和目的不同, 但有一点是相同的, 就是它们只能表现属性表中的一个字段的情况 而自定义专题图则不同, 它可以一次性表达多个字段的情况, 关于图层风格设置的每一种属性都可以对应于属性表中的字段, 制作方式更灵活 自定义专题图的对象结构如下图所示 : 100

111 第 3 章核心控件之地图窗口 SuperMap solayer ( 图层 ) ThemeCustom FromXML:Boolean ToXML:String sothemecustom ( 自定义专题图 ) BrushBackColorField:String BrushColorField:String BrushStyleField:String Caption:String Enable:Boolean PenColorField:String PenStyleField:String PenWidthField:String SymbolRotationField:Double SymbolSizeField:String SymbolStyleField:String Valid:Boolean BrushCenterOffsetXField:String BrushCenterOffsetYField:String BrushGradientAngleField:String BrushGradientTypeField:String BrushOpaqueRateField:String VisibleScaleMax:Double VisibleScaleMin:Double 图 3.29 自定义专题图对象结构图 自定义专题图的字段类型需要是数值型, 示范程序如下 :( 此示范是制作点数据集的自定义专题图 ) Dim objlayer As solayer Dim objthemecustom As sothemecustom Dim objstyle As New sostyle // 设置风格对象变量的属性 objstyle.symbolstyle = 416 // 指定符号的编码 Set objlayer = SuperMap1.Layers(1) objlayer.style = objstyle Set objthemecustom = objlayer.themecustom objthemecustom.enable = True With objthemecustom // 将风格属性与属性字段对应.SymbolRotationField = "Angle" // 指定符号旋转角度的字段.PenColorField = "Color" // 指定符号的颜色字段.SymbolSizeField = "Size" // 指定符号的大小字段 End With SuperMap1.Refresh 101

112 SuperMap Objects 开发教程 效果图如图 3.30 所示, 从图中我们可以很明显的看出, 通过符号的颜色 大小和旋转角度的不同表现出了属性表中相应字段的差别 图 3.30 自定义专题图效果图 有一点值得注意 : 对数据的显示风格进行修改, 并没有改变数据本身的属性, 在 SuperMap Objects 中数据仅保存空间对象及其属性数据, 专题图风格是保存在地图对象 (somaps) 中, 因此做好的专题图后, 要及时保存地图 (SuperMap.SaveMap), 并保存工作空间 DEM 数据图层制作专题图 在 SuperMap Objects 中还有一项功能是对 DEM( 数字高程模型 ) 数据制作专题图 DEM 数据在 SuperMap Objects 的二维地图窗口显示的风格是采用系统默认的风格, 不同的数据应用对数据显示风格的要求也不同,SuperMap Objects 提供两种 DEM 专题图类型 : 单值专题图和范围分段专题图 单值专题图 (sogridthemeunique) 这种专题图的制作方法与矢量单值专题图的制作方法基本类似, 可以这样得到单值专题图对象 : sogridthemeunique solayer.gridthemeunique 102

113 第 3 章核心控件之地图窗口 SuperMap 制作专题图的时候将 sogridthemeunique 的属性设置为满足数据需要的, 然后刷新 SuperMap Objects 地图窗口就可以了 sogridthemeunique 的属性介绍如下 : sogridthemeunique.caption sogridthemeunique.defaultstyle sogridthemeunique.enable sogridthemeunique.itemcaption sogridthemeunique.style sogridthemeunique.value sogridthemeunique.valuecount // 专题图的标题 // 缺省风格 // 显示专题图效果 // 单值标题 // 单值风格 // 单值数值 // 单值总数 范围分段专题图 这种专题图的制作方法与矢量范围分段专题图的制作方法类似, 可以这样得到范围分段专题图对象 : sogridthemerange solayer.gridthemerange 制作专题图的时候将 sogridthemerange 的属性设置为满足数据需要的, 然后刷新 SuperMap Objects 地图窗口就可以了 SoGridThemeRange 的属性介绍如下 : sogridthemerange.breakcount sogridthemerange.breakvalue sogridthemerange.caption sogridthemerange.enable sogridthemerange.itemcaption sogridthemerange.style // 范围分段个数 // 范围分段数值 // 专题图标题 // 显示专题图效果 // 单值标题 // 分段对应的显示风格 这里需要指出 : 制作矢量专题图的主要目的是改变二维数据的显示风格, 而制作 DEM 专题图的最重要目的是能够根据专题图的风格设置进行三维数据的显示, 因此 SuperMap Objects 除了提供将其保存为地图对象之外, 还提供了三维显示的方法 3.5 空间数据与属性数据的双向查询 众所周知,GIS 首先是作为一个存储着大量地理信息的数据库而存在的, 其最基本的功能之一就是方便人们查询自己需要的地理信息 SuperMap Objects 的查询模式分为两大类 : 图查属性和属性查图 图查属性是通过在 SuperMap 窗口选择空间对象, 然后查询其相关属性 ; 而属性查图刚好相反, 是先给出属性条件, 然后查找满足条件的空间对象, 在 SuperMap 窗口高亮显示出来 在 SuperMap Objects 中对属性查询是通过记录集对象 sorecordset 来操作, 这个对象在上一章的 SuperWorkspace 中已经详细介绍过 ; 而查询结果的高亮显示是通过选择集对象 soselection 来实现, 因此我们在讲解双向查询之前有必要介绍一下选择集对象 soselection 103

114 SuperMap Objects 开发教程 选择集对象 soselection 与 SuperMap 控件的关系如图 3.31 所示 : SuperMap SuperWorkspace soselection sorecordset 图 3.31 soselection 与 SuperMap 的关系图 选择集存放用户在地图窗口中选择的对象, 可以这样返回当前地图窗口的选择集对象 : Dim objselection as soselection Set objselection=supermap.selection 通过选择集对被选择的空间对象进行操作, 如显示对象的属性 取出对象进行修改 还可以把一个或者一批对象加入到选择集中 变为被选中的高亮方式显示 从选择集中删除对象 由原来的被选中高亮变为没有被选中 图查属性 根据本章第一节的介绍, 我们知道, 当进行如下设置之后, 就可以在地图窗口中进行选择 : SuperMap.Action = scaselect SuperMap.Action = scacircleselect SuperMap.Action = scarectselect // 点击选择 // 圆形选择 // 矩形选择 选择到一个或者多个空间对象, 都会自动激发 SuperMap_GeometrySelected 事件, 我们要进行的查询属性的工作就在这其中进行, 代码如下 : Private Sub SuperMap1_GeometrySelected(Button As Integer, Shift As Integer, x As Single, y As Single) Dim objrecordset As sorecordset // 获取在地图窗口中选择的对象对应的记录集 Set objrecordset = SuperMap1.Selection.ToRecordset(False) // 将当前选中的空间对象的属性值添加到 ListView 中显示 ( 注 : 此处选择的空间对象只有一个 ) If Not (objrecordset Is Nothing) Then objrecordset.movefirst ListView1.ListItems.Clear Dim i As Integer For i = 1 To objrecordset.fieldcount ListView1.ListItems.Add,, objrecordset.getfieldinfo(i).name// 添加属性字段名 104

115 第 3 章核心控件之地图窗口 SuperMap If Not IsNull(objRecordset.GetFieldValue(i)) Then ListView1.ListItems(LstView1.ListItems.Count).SubItems(1) = objrecordset.getfieldvalue(i) // 添加属性值 End If Next i End If Set objrecordset = Nothing End Sub 执行以上程序的结果示意图如下图所示 : 图 3.32 选择查询结果示意图 在上面的示范中我们利用点选仅选择了一个空间对象, 并将它的属性数据显示在 ListView 中, 如果我们选择了多个空间对象, 可以通过移动记录的指针来显示每一个空间对象的属性信息 sorecordset.movefirst sorecordset.moveprev sorecordset.movenext sorecordset.movelast // 移至第一条记录 // 移至前一条记录 // 移至后一条记录 // 移至最后一条记录 属性查图 上一节我们介绍了 SuperMap Objects 的第一种查询模式 --- 图查属性, 其中最关键的方法是 : soselection.torecordset(bgeometryonly as Boolean) as sorecordset 105

116 SuperMap Objects 开发教程 使用这个方法实现空间对象到属性的查询 ; 这一节我们来介绍第二种查询模式 --- 属性查图, 将使用的很关键的方法是 : soselection.fromrecordset(sorecordset) as Boolean 使用这个方法实现满足查询条件的空间对象的高亮显示 下图是一个设计好的用于 SQL 查询的界面, 关系型数据库的 SQL 查询方式在这里同样适用 SQL 查询条件, 即 Query 方法中的参数 示范程序如下 : 图 3.33 SQL 查询界面示例 Dim objrecordset As sorecordset Dim objdv As sodatasetvector // 用来接受查询结果的记录集对象 // 被查询的矢量数据集 Set objdv = SuperMap.Layers("World@RegisterTest").Dataset 据集对象 // 获取被查询的矢量数 Set objrecordset = objdv.query("smik>50 AND Country like 'C*'",True) 性查询, 并把查询结果放在临时记录集 objrecordset 中 If Not objrecordset Is Nothing Then // 找到符合条件的记录 // 进行条件属 SuperMap.Selection.FromRecordset objrecordset SuperMap.EnsureVisibleRecordset objrecordset,2 SuperMap.Refresh End If // 把结果记录的几何对象高亮显示出来 // 将选择对象居中显示 这样就实现了属性查图的功能 另外, 可以通过记录集得到当前满足查询条件的每一个空间对象, 进而返回关于空间对象的一些信息, 例如, 空间对象的类型 面积等 106

117 第 3 章核心控件之地图窗口 SuperMap Dim objgeometry As sogeometry // 用来接受第一个符合条件的记录中的几何对象 objrecordset.movefirst // 移到第一条符合条件的记录 Set objgeometry = objrecordset.getgeometry // 获取几何对象 MsgBox objgeometry.type // 面对象, 返回 5 MsgBox objgeometry.area // 报告面对象的面积 3.6 空间对象的编辑 交互式地图编辑是空间数据处理的重要环节 长期以来,GIS 软件的图形编辑功能较弱, 使得空间数据建库工作往往要混合使用 CAD 软件和 GIS 软件, 不仅增加了建库成本, 而且延长了项目建设周期 SuperMap 在图形编辑方面有所突破, 在方便 灵活的可视化编辑环境基础上, 研究开发了丰富的智能捕捉功能, 有效提高了地图编辑的精度和速度 本节我们将介绍在 SuperMap 中支持编辑的空间对象以及如何实现编辑 值得注意的一点, 以只读方式打开的数据源无法实现这一节中介绍的功能, 在添加几何对象 添加文本对象和编辑几何对象节点时, 必须先设置相应的数据集或图层为可编辑 SuperMap Objects 支持编辑的空间对象 如果按照支持编辑的空间对象和编辑的方式不同, 将 SuperMap Objects 中数据集进行分类, 可以分成三类 :GIS 数据集 CAD 数据集和 NetWork 数据集 GIS 数据集 从前面各章节的讲解中, 我们已经了解到 GIS 数据集的特点 : 在 GIS 数据集中只能保存单一类型的空间对象, 例如点数据集中只能保存点对象 因此对于 GIS 数据集, 在编辑空间对象的时候要考虑其数据集的类型, 如下表 3.1: 表 3.1 编辑对象类型说明 数据集类型 支持编辑的空间对象类型 点数据集 线数据集 面数据集 点对象 (sogeopoint) 线对象 (sogeoline) 面对象 (sogeoregion) 文本数据集 CAD 数据集 文本对象 (sogeotext) 相对于 GIS 数据集,CAD 数据集中的空间对象要丰富得多, 它支持编辑的空间对象包括 : 点 (sogeopoint) 线 (sogeoline) 面 (sogeoregion) 文本 (sogeotext) 圆弧 (sogeoarc) 椭圆弧 (sogeoellipticarc) 曲线 (sogeocurve) 圆 (sogeocircle) 斜椭圆 (sogeoellipse) 矩形对象 (SoGeoRect) 圆角矩形对象 (sogeoroundrect) 扇面对象 (sogeopie) 样条对象 (sogeobspline) 等 107

118 SuperMap Objects 开发教程 对这些几何对象, 可以进行添加 删除 旋转 拖拉改变形状 增加节点 编辑节点 删除节点等常规的编辑操作 SuperMap Objects 提供基于旋转手柄的旋转对象的方式, 可以对复合图层中的复合对象及其子对象进行像简单对象一样的操作, 如移动 拉伸 旋转等, 也可仅仅对子对象进行操作 NetWork 数据集 这种类型的数据集与前面讲到的两种类型的数据集不同, 它是通过对线数据集进行拓扑处理产生的 数据集中包含了网络线对象和网络节点对象, 并记录它们之间的连接关系, 因此对这种数据集的编辑要求也会更高 在网络图层中移动 编辑网络节点时, 相应的线对象也随之移动, 同时也可以增加网络线与网络节点, 相应的连接关系, 由 SuperMap Objects 自动维护 路线数据集 除了具有网络数据集的点线拓扑关系外, 每条路线由一系列的二维点及其线标值组成 (x,y,m), 当对路线上的对象进行修改时, 相应的线标值也会发生改变 SuperMap Objects 中提供了对路线对象进行各种操作的接口, 包括内插 外推 更新 校正线标值等 空间对象的编辑方法 空间对象的编辑可以分成两部分 :(1) 添加空间对象 ;(2) 修改或删除空间对象 在进行这两部分工作之前要设置当前图层可编辑 添加空间对象 添加不同类型的空间对象是通过改变 SuperMap Objects 的操作类型, 以对应添加不同类型的空间对象, 示范如下 : SuperMap.Action = scaeditcreatearc SuperMap.Action = scaeditcreatebeziercurve SuperMap.Action = scaeditcreatecircle SuperMap.Action = scaeditcreatecurvedtext SuperMap.Action = scaeditcreateellipse SuperMap.Action = scaeditcreatelinesect SuperMap.Action = scaeditcreateobliqueellipse SuperMap.Action = scaeditcreateparallelogram SuperMap.Action = scaeditcreatepoint SuperMap.Action = scaeditcreatepolygon SuperMap.Action = scaeditcreatepolyline SuperMap.Action = scaeditcreaterectangle SuperMap.Action = scaeditcreateroundrectangle SuperMap.Action = scaeditcreatetext // 创建弧对象 // 创建样条曲线 // 创建圆对象 // 创建沿线标注对象 // 创建椭圆对象 // 创建直线对象 // 创建斜椭圆对象 // 创建平行四边形对象 // 创建点对象 // 创建多边形对象 // 创建折线对象 // 创建矩形对象 // 创建圆角矩形对象 // 创建文本对象 进行这样的设置之后, 用户就可以通过鼠标的拖拉在图层上添加空间对象 108

119 第 3 章核心控件之地图窗口 SuperMap 一般在添加空间对象之后相应的要进行属性数据的录入工作,SuperMap 开放了一些事件来响应编辑动作, 通过这些事件, 用户可以监视添加空间对象的动作, 使编辑工作流程化, 开放的事件如下 : SuperMap_ActionChanged SuperMap_BeforeLayerDraw SuperMap_AfterLayerDraw SuperMap_DrawingCancled SuperMap_GeometryAdded 修改或删除空间对象 // 改变 SuperMap 操作方式时触发 // 绘制地图之前触发 // 绘制地图之后触发 // 绘制地图取消时触发 // 添加空间对象后触发 选中空间对象, 用鼠标直接拖拉, 能够改变空间对象的位置, 而且在选中空间对象的时候, 在这个空间对象的周围会出现五个黑色手柄, 其中四个用来控制图形的大小, 拖拉它们可以改变空间对象的尺寸, 同时还可以根据需要设置某几个编辑手柄可用或不可用 ; 另一个控制角度, 拖拉它可以旋转空间对象的角度 如需要删除空间对象的时候只要选中它, 按 Delete 键就可以删除了 另外还可以编辑空间对象的节点, 进行如下设置 ( 设置之前选中空间对象 ): SuperMap.Action = scaeditvertexadd SuperMap.Action = scaeditvertexedit // 增加空间对象的节点 // 编辑空间对象的节点 需要删除节点的时候, 同样是选中节点, 按 Delete 键即可删除 为方便用户监视空间对象编辑过程,SuperMap 开发的事件包括 : SuperMap_AfterGeometryAdded SuperMap_GeometrySelected SuperMap_BeforeGeometryDeleted SuperMap_AfterGeometryModified // 增加空间对象之后触发 // 空间对象被选中后触发 // 删除空间对象之前触发, 在 SuperMap 中删除空间对象 // 默认 Deleted 键, 因此开发这个事件很重要 // 修改空间对象之后触发等等 空间对象的基本操作 在进行地图编辑的时候, 还经常需要对多个空间对象进行操作, 比如面对象的合并 面对象分割 构建岛状多边形 线对象连接 打断 炸碎等 为实现这些功能,SuperMap Objects 提供了空间分析的基本方法, 其中包括克隆 切割 擦除 合并 异或 相交 相减 旋转和调整大小等 列举面对象 (sogeoregion) 的空间操作方法如下 : sogeoregion.clip(objgeometry As sogeometry) // 切割 sogeoregion.clone() // 克隆 sogeoregion.converttoline() // 转化为线对象 sogeoregion.difference(objanothergeometry As sogeometry) // 相减 sogeoregion.erase(objgeometry As sogeometry) // 擦除 sogeoregion.getcrossings(objanothergeometry As sogeometry) // 与其他对象求交点集 sogeoregion.intersect(objanothergeometry As sogeoregion) // 相交 109

120 SuperMap Objects 开发教程 sogeoregion.resize(bounds As sorect) sogeoregion.rotate(pntbase As sopoint,angle As Double) sogeoregion.union(objanothergeometry As sogeoregion) sogeoregion.xor(objanothergeometry As sogeoregion) // 调整大小 // 旋转 // 相并 // 异或 这里还值得一提的是, 在图形编辑工作中经常进行的一类操作是 剪切 复制 粘贴 撤销 和 重做,SuperMap 提供了五个方法来实现这样的功能 : SuperMap.Cut SuperMap.Copy SuperMap.Paste SuperMap.Undo SuperMap.Redo // 剪切 // 复制 // 粘贴 // 撤销 // 重做 除此之外, 还有一个对象用来记录 SuperMap 的编辑操作动作 :soedithistory, 提供这个方法, 用户可以通过程序来管理整个编辑过程中的动作 例如 : soedithistory.eventcount soedithistory.currenteventindex soedtihistory.geteventat(index) //soedithistory 中记录的 Event 的总数 // 当前 Event 的索引 // 返回指定索引的 Action 的值 智能捕捉功能 使用过 CAD 软件的用户都会很关注其超强的智能捕捉功能, 它是为了提高制图的准确性和效率而设计 SuperMap Objects 在这方面同样为用户考虑周到, 提供了内容丰富的地图捕捉功能, 用户在制图过程中可以轻松地完成一些比较复杂的特定操作 ; 而且计算机达到的制图精度是手工控制无法比拟的 实际操作时, 用户可用捕捉对话框自由设置捕捉选项, 并可对各选项设置优先级 当待画点与已有像素点重合 待画线段与已有线段平行 垂直, 落在已有线段上或其延长线上, 自身水平 垂直等特性得到满足时, 系统以图标方式智能提示用户 SuperMap Objects 的捕捉功能有四个特点 : 可捕捉的目标多 ; 捕捉设置灵活 ; 支持多个图层捕捉 ; 支持透明操作 可捕捉的目标多 SuperMap Objects 支持的捕捉功能见表 3.2: 110

121 第 3 章核心控件之地图窗口 SuperMap 表 3.2 SuperMap Objects 捕捉功能一览表 待画对象捕捉类型图示 同其它图素点重合 在其它图素上 点 在其它线性图素中点上 在其它线性图素延长线上 同其它图素点水平 竖直 线 同上一线段成固定角度 同其它图素点相交 111

122 SuperMap Objects 开发教程 水平 竖直 同其它线性图素平行 同其它线性图素垂直 ( 包括延长线 ) 固定长度 栅格的边线 栅格线 栅格中线 捕捉设置灵活 在编辑图形的时候, 设置当前编辑的图层为可捕捉, 就可以充分利用 SuperMap Objects 提供的捕捉功能 用户可以设置捕捉的类型 定义捕捉类型的优先级, 其他还包括捕捉线对象的固定角度 固定长度, 被捕捉线对象的颜色, 被捕捉点对象的颜色, 忽略线长度, 光标定位区, 以及是否打断被捕捉线对象 设置这些捕捉内容有两种方式, 第一种是调用 SuperMap Objects 的捕捉设置对话框 ( 如下图所示 ): 112

123 第 3 章核心控件之地图窗口 SuperMap Dim objlayer As solayer Set objlayer = SuperMap.Layers(1) objlayer.snapable = True SuperMap. ShowSnapSettingDialog // 图层变量 // 获取第一个图层 // 开启第一个图层的捕捉状态 // 设置相应的捕捉方式 图 3.34 捕捉设置对话框 ( 一 ) 113

124 SuperMap Objects 开发教程 图 3.35 捕捉设置对话框 ( 二 ) 第二种方式是通过定义捕捉设置选项对象 sosnapoption, 捕捉设置对话框中的选项都可以通过设置 sosnapoption 的属性来进行完成同样的设置, 例如 : sosnapoption.pointonline sosnapoption.pointonmidpoint 支持多个图层捕捉 // 点在线上 // 点在线中点 SuperMap Objects 不仅支持同一个图层的对象捕捉, 同样支持多个图层的捕捉, 用户只需要将图层的可捕捉 (Snapable) 属性开关打开, 就可以进行多个图层的捕捉 支持透明操作 SuperMap Objects 的编辑图形支持透明操作, 也就是编辑一个对象没有结束的时候, 用户可以任意放大 缩小 平移地图 进行捕捉设置 改变图层捕捉属性等操作, 结束这些操作后仍然可以继续编辑未完成的几何对象 3.7 配准处理 在 SuperMap Objects 中, 配准处理包括两部分 : 矢量数据 (sodatasetvector) 配准和栅格数 114

125 第 3 章核心控件之地图窗口 SuperMap 据 (sodatasetraster) 配准 配准处理工作是修改已有数据的坐标位置, 在屏幕数据化工作中用处比较大 一般按照屏幕数据化的正确工作流程是先扫描纸图, 转入 SuperMap Objects 中生成栅格数据集, 其坐标位置是按照 SuperMap Objects 的默认坐标位置, 经常与真实地理位置不同, 这时我们需要对栅格数据进行配准, 将正确地理位置信息赋给当前栅格数据集, 然后进行屏幕数据化生成矢量数据 ; 但是有时候由于某些特殊需要, 在数据化生成矢量数据之前并没有进行栅格数据的配准, 那么矢量数据的坐标位置仍然是系统默认的, 而不是真实地理位置, 这时我们就需要矢量数据配准功能,SuperMap Objects 同时提供这两种配准功能 在 SuperMap Objects 中进行配准需要使用 sotransformation 和 sotransformerror 对象, 其对象结构图如下 : GetErrors:soTransformErrors Rectify:Boolean Transform:Boolean TransformGeometry:soGeometry sotransformation ( 坐标转换 ) OriginalControlPoints:soPoints TansformEquation:String TargetControlPoints:soPoints sotransfromerrors ( 坐标转换误差 ) Count:Long PixelResidualX:Double PixelResidualY:Double ResidualX:Double ResidualY:Double RMS:Double TotalRMS:Double 图 3.36 坐标转换对象与坐标转换误差对象结构图 从对象结构图可以看出, 配准工作可以分成两大部分 : 坐标转换和计算配准误差 配准工作的详细步骤如下 : 获取数据集 配准有两种方式, 第一种不需要参考数据集, 在配准过程中直接将正确的地理位置信息赋给需要配准的数据集 ; 另一种需要参考数据集, 当前数据集的正确地理信息是未知的, 只能通过参考数据集来获取正确地理位置信息 选择配准点 进行配准坐标转换需要有一定数据量的配准点, 在坐标转换中以这些配准点为参照, 计算所有空间对象或图素点的正确位置, 不同配准方法需要的配准点的个数不同,SuperMap Objects 提供 5 种配准方法, 每种配准方法需要的配准点的个数如表 3.3 所示 : 115

126 SuperMap Objects 开发教程 表 3.3 配准方法与配准点数对应表 配准方法 配准点数 矩形配准 2 线性配准 3 二项式配准 6 双二项式配准 9 立方配准 10 选择配准点是配准中很关键的一步 可以通过不同的方法选择配准点, 可以在打开的地图中选择, 也可以通过手动输入坐标值的方式 选择时, 可以用 sopoints 对象来保存选择的点集 我们在选择配准点时需要注意的是, 配准点是成对的, 就是说, 在配准源图上选择了一个点, 那么在配准目标图上也要选一个我们认为是与之坐标相对应的点 配准源图中选择的点保存到 sotransformation.originalcontrolpoints 中, 而配准目标图中的点保存到 : sotransformation.targetcontrolpoints 中 计算配准误差 计算配准误差, 我们要用到 sotransformation 对象和 sotransformerrors 对象 先将选择好的配准点赋值给 sotransformation 对象的相应属性中, 再使用 sotransformation 的 GetErrors 方法来获得误差, 示范程序如下 : Public Function GetTransformErrors(OrinigalControlPoints As sopoints,targetcontrolpoint As sopoints,imethod As setransformtype) As sotransformerrors Dim objtransformation As New SoTransformation Dim objtransformerrors As New sotransformerrors Set objtransformation.orinigalcontrolpoints=orinigalcontrolpoints // 设置配准源点 Set objtransformation.targetcontrolpoints=targetcontrolpoints // 设置目标点 imethod= sctlinear 线性配准 Set objtransformerrors = objtransformation.geterrors(imethod) // 取得误差 Set objtransformation=nothing Set objtransformerrors=nothing End Function 通过上面的函数, 我们获得了一个 sotransformerrors 对象 objtransformerrors 对象的 ResidualX 的属性可以返回指定点的 X 方向上的残差, 如下面的代码用对话框显示第三个配准点的 X Y 方向上的残差 : MsgBox objtransformerrors.residualx(3) MsgBox objtransformerrors.residualy(3) 通过 objtransformerrors 对象的 RMS 属性和 TotalRMS 属性分别可以获取误差均方差和误差总和 116

127 第 3 章核心控件之地图窗口 SuperMap 进行配准 栅格数据集的配准使用重采样 (Rectify) 方法 : Boolean sotransformation.rectify(objdatasetraster As DatasetRaster,objDatasource As sodatasource,strnewdatasetname As String,nMethod As setransformtype) 参数的意义如下 : objdatasetraster 是需要配准的栅格数据集,objDataSource 是栅格数据集重采样配准后, 新生成的数据集所属的数据源,strNewDatasetName 是新数据集的名称,nMethod 是配准方法常量 假设 objdatasetraster objdatasource 配准控制点都已确定, 可以用下面的程序实现对 objdatasetraster 的配准 : Dim objtransformation As New sotransformation Dim strnewdatasetname As String // 新数据集名称 Dim nmethod As setransformtype // 配准方法 Dim bresult As Boolean Set objtransformation.origincontrolpoints = OriginControlPoints // 设置配准源点 Set objtransformation.targetcontrolpoints = TargetControlPoitns // 设置目标点 nmethod=inputbox( 请输入配准方法 : _1 线性 ; _2 二项式配准 ;_3 双二项式配准 _4 立方配准 ) strnewdatasetname = NewDataset While Not objdatasource. IsAvailableDatasetName (strnewdatasetname) 集名称是否合法 StrNewDatasetName = InputBox( 请输入新数据集名称 : ) Wend bresult=objtransformation.rectify(objdatasetraster,objdatasource, strnewdatasetname,nmethod) If bresult =true then MsgBox 配准成功! Else MsgBox 配准失败! End If 矢量数据集的配准采用坐标转换 (Transform) 方法 // 判断新数据 Boolean sotransformation.rectify(objdatasetvector As DatasetVector,objDatasource As sodatasource,strnewdatasetname As String,nMethod As setransformtype) 参数的意义如下 : objdatasetvector 是需要配准的矢量数据集,objDataSource 是矢量数据集坐标转换后, 新生成的数据集所属的数据源,strNewDatasetName 是新数据集的名称,nMethod 是配准方法常量 数据集配准是我们在数据建库过程中经常用到的, 虽然实现配准的方法比较复杂, 尤其对栅格数据集进行配准, 除了矩形配准方法之外, 其他几种配准方法均需要对栅格数据进行重采样, 这是一个很复杂的算法, 但是从上面的介绍, 我们也发现在 SuperMap Objects 中实现配准的过程已经被简单化了, 对于用户, 只需要选择配准点和配准方法, 其他工作已经集成到 SuperMap Objects 软件中了, 操作简单方便 就配准的精度而言, 一般来说, 配准个数越多, 配 117

128 SuperMap Objects 开发教程 准精度越高, 但是并不绝对, 不同的数据和应该选择最合适的配准方法, 通过计算配准误差 来控制配准精度, 以满足不同的数据应用 3.8 动态目标的显示与跟踪 在 SuperMap Objects 地图窗口中, 有一个特殊图层, 这个图层并不对应任何数据源中的数据集, 图层中的地理对象都是临时存在的, 这就是 SuperMap Objects 的跟踪图层 (TrackingLayer) 跟踪图层总是位于地图窗口的最上层, 它的最大特点是图形刷新速度快, 因此, 跟踪图层为建立 GPS 定位系统提供了接口 在城市汽车管理系统中实现对指定车辆的即时跟踪, 随汽车的移动动态显示汽车的位置 另外, 跟踪图层可以管理一些临时产生的地理对象, 例如进行标注距离量测的线段, 进行面积量测时产生的临时多边形及随机产生的临时点等 每个 SuperMap Objects 的地图窗口都有一个跟踪图层, 可以这样获取一个跟踪图层对象 : Dim objtrackinglayer As sotrackinglayer Set objtrackinglayer = SuperMap.TrackingLayer 无论是实现动态目标的显示, 还是管理临时空间对象, 都要通过向跟踪图层上添加实例 (sogeoevent) 来完成, 跟踪图层上的空间对象 (sogeometry) 称为实例 (sogeoevent) SuperMap SuperWorkspace sotrackinglayer sogeoevent sogeometry 图 3.37 跟踪图层对象 (sotrackinglayer) 与 SuperMap 的对象关系图 添加实例 在跟踪图层上添加实例 ( 点 线 面和文本等 ) 的方法只有一个, 即 sotrackinglayer.addevent(objgeometry As sogeometry,objstyle As sostyle,strtag As String) 其中,objGeometry 指的是要添加到跟踪图层上的空间对象, 可以是点 线 面等对象, objstyle 用来设置实例的显示风格,strTag 用来标识当前实例, 相当于关键字, 通过关键字或索引可以访问该实例 点 线 面三种几何对象的风格都由 sostyle 对象来统一设置, 文本对象本身带有风格, 因此在添加文本对象的时候, 添加方法跟添加其它对象的方法一样, 但不需要设 118

129 第 3 章核心控件之地图窗口 SuperMap 置 sostyle 的参数 下面以添加点实例为例说明如何在跟踪图层上添加实例 实现这段程序的准备工作是先设置 SuperMap.Action = scatrackpoint, 然后在跟踪图层跟踪了一个点, 就会触发 SuperMap_Tracked 事件, 程序如下 : Private Sub SuperMap1_Tracked() Dim objgeopoint As sogeopoint // 定义点对象 Dim curgeometry As sogeometry // 定义空间对象变量 Dim objstyle As New sostyle // 定义风格变量 Dim objtrackinglayer as sotrackinglayer // 定义跟踪图层对象 Set curgeometry = SuperMap.TrackedGeometry // 获取在 TrackingLayer 上绘制的空间对象 If curgeometry.type = scgpoint Then Set objgeopoint = curgeometry // 赋值给点对象 End If If Not (objgeopoint Is Nothing) Then // 点对象不为空 // 设置风格对象, 用来控制点对象的显示风格 objstyle.pencolor = vbred objsytle.symbolsize = 40 objsytle.symbolstyle = 1 Set objtrackinglayer = SuperMap1.TrackingLayer // 获取跟踪图层对象 objtrackinglayer.addevent objgeopoint,objstyle, "Point1" // 增加点实例 objtrackinglayer.refresh // 刷新跟踪图层 End If End Sub 移动实例 GPS 系统一个重要的功能是实现动态跟踪,SuperMap 窗口上的实例应该能够根据真实目标的移动来动态显示, 即时报告目标的当前位置 SuperMap 的 sogeoevent 对象自身提供了两种移动方法 : sogeoevent.move(x As Double,y As Double) sogeoevent.moveto(x As Double,y As Double) 第一种移动方法是相对于现在的位置在 X 和 Y 方向上相对移动的距离, 用的是相对概念 ; 第二种移动方法是把实例移动到 X Y 坐标点上, 这是一种绝对的位置移动, 用的是绝对概念 在 添加实例 示范程序的基础上, 下面的代码演示如何移动实例 Dim objgeoevent As sogeoevent // 定义点实例对象变量 Set objgeoevent = SuperMap1.TrackingLayer.Event("Point1") // 通过实例的标识名来引用它 If Not(objGeoEvent Is Nothing) Then objgeoevent.move -1000,1000 // 点实例左移 1000 地理单位, 上移 1000 地理单位 SuperMap1.TrackingLayer.Refresh // 刷新跟踪图层 End If 上面的代码实现了实例的静态移动, 即不连续的单步移动 在实际应用中, 系统要求和关 119

130 SuperMap Objects 开发教程 注的是动态移动, 即连续的移动 SuperMap Objects 本身没有提供这种方法 SuperMap Objects 是全组件式 GIS 软件, 是在其它编程环境中实现系统开发, 在可视化编程环境中, 一般都提供了时间控件或类, 结合时间控件或类就能开发出动态移动功能 用上面的代码替换下面的省略号部分, 就能实现点实例连续的向西北方向移动 Private Sub Timer1_Timer() End Sub 刷新跟踪图层 在前面的两个示范程序中, 我们已经用到了跟踪图层的刷新功能 跟踪图层有两种刷新方法 :sotrackinglayer.refresh 和 sotrackinglayer.refreshex Refresh 用来刷新整个跟踪图层, RefreshEx 比 Refresh 更加智能, 它仅刷新当前时刻发生位置变化的对象, 避免整个图层的闪动 SuperMap 控件自身在刷新的同时也刷新了跟踪图层 但是那样的刷新是针对地图窗口而提供的方法 ; 跟踪图层的刷新只局限于跟踪图层, 其它的层都不刷新 ; 因此, 跟踪图层的刷新速度比 SuperMap 自身的刷新要快得多 跟踪图层是一个永久的存放临时实例的图层, 它上面的实例在结构上比相应的几何对象要简单的多, 需要的暂时存储内存很小, 加上跟踪图层的高速刷新, 在设计 GPS 应用系统可以不考虑实例数目和刷新速度问题 删除实例 删除实例分为删除指定实例和删除全部实例 删除指定实例不区分实例的类型, 只要给定实例的索引号或标识名 ( 添加实例时给定的 Tag) Dim objtrackinglayer As sotrackinglayer Set objtrackinglayer = SuperMap1.TrackingLayer objtrackinglayer.removeevent 1 ( 或 :ObjTrackingLayer.RemoveEvent "Point1") objtrackinglayer.refreshex 删除全部实例将从跟踪图层上清除掉所有的临时对象, 不区分实例的类型, 恢复跟踪图层原来的面貌 objtrackinglayer.clearevents objtrackinglayer.refresh 动态移动并闪烁实例 ( 应用技巧 ) SuperMap 中开放了一些对于 TrackingLayer 操作的事件, 在这些事件中用户可以用程序来控制跟踪的过程, 通过组合这些事件可以实现内容丰富的动态目标移动 闪烁等功能, 开放的事件如下 : 120

131 SuperMap_AfterTrackingLayerDraw SuperMap_BeforeTrackingLayerDraw SuperMap_Tracking SuperMap_Tracked 第 3 章核心控件之地图窗口 SuperMap // 绘制跟踪图层之后触发 // 绘制跟踪图层之前触发 // 跟踪过程中触发 // 跟踪结束后触发 这一小节将介绍一个完整的范例, 说明如何在系统中实现跟踪图层的各种功能 这个范例的实现思路是 : 首先, 设置 SuperMap 的 Acrtion 为在跟踪图层上绘制一根折线 ; 然后, 在 SuperMap 的 Tracked 事件中获得这根折线, 把该折线重新采样, 进行 40 等分 ; 最后, 在时间控件的 Timer 事件里依次在折线的每一个节点上显示一个点实例, 模拟画线的路径, 从而完成点的动态移动和闪烁 定义公共变量 Dim Points As sopoints Dim ncurpoint As Long Dim stytracking As New sostyle Dim Lnt As sogeoline // 定义点集合变量 // 定义点实例的计数器 // 定义风格变量 // 定义线对象变量 设置 SuperMap 的 Action 为绘制折线, 然后在 SuperMap 上任意绘制一根折线 SuperMap.Action = scatrackpolyline 在 SuperMap 的 Tracked 事件中获取折线并重采样生成新的折线 Private Sub SuperMap1_Tracked() Dim ln As sogeoline Dim lnnew As sogeoline Dim dlen As Double Dim CurGeome As sogeometry // 定义线对象变量 // 定义线对象变量 // 定义长度变量 // 定义空间对象变量 Set CurGeome = SuperMap1.TrackedGeometry // 获取在 TrackingLayer 上跟踪的线对象 If CurGeome.Type = scgline Then Set ln = CurGeome End If If Not (ln Is Nothing) Then stytracking.pencolor = vbblue // 设置折线的显示风格 stytracking.penwidth = 6 dlen = ln.length Set lnnew = ln.resampleequidistantly(dlen / 40) // 对折线进行重采样, 等距分为 40 段 If Not (lnnew Is Nothing) Then Set Points = lnnew.getpartat(1) // 获取采样后的折线的点集合 ncurpoint = 1 // 点计数器当前值为 1 Timer1.Interval = 500 // 设置定时器触发两次事件之间的毫秒数 Timer1.Enabled = True // 启动定时器响应事件开关, 触发 Timer1_Timer() 事件 End If End If End Sub 在时间控件的 Timer 事件中, 跟踪图层显示并移动红点, 表示对线的跟踪 Private Sub Timer1_Timer() If Not (Points Is Nothing) Then If Points.Count > ncurpoint Then 121

132 SuperMap Objects 开发教程 Dim pnt As New sogeopoint // 创建点对象变量 Dim style As New sostyle // 创建风格对象变量 pnt.x = Points.Item(nCurPoint).x // 获取点实例的 X 坐标 pnt.y = Points.Item(nCurPoint).y // 获取点实例的 Y 坐标 style.pencolor = 255 // 定义点实例的风格 style.symbolsize = 96 style.symbolstyle = 1 SuperMap1.TrackingLayer.ClearEvents // 清除所有实例 SuperMap1.TrackingLayer.AddEvent Lnt, stytracking, "" // 增加线实例 SuperMap1.TrackingLayer.AddEvent pnt, style, "" // 增加点实例 SuperMap1.TrackingLayer.Refresh // 刷新 ncurpoint = ncurpoint + 1 // 定位下一个点的索引 Else SuperMap1.TrackingLayer.ClearEvents // 清除所有实例 SuperMap1.TrackingLayer.Refresh // 刷新跟踪图层 Timer1.Enabled = False // 停止点实例的跟踪 End If End Sub 下面是运行这个范例的效果图 : 图 3.38 画线跟踪效果图 3.9 地图输出 SuperMap Objects 的地图输出包括把当前显示的地图对象拷贝到指定的图形设备描述表中 (OutputMap) 把当前显示的地图输出为影像数据集 (OutputMapEx) 把当前显示的地图对象 122

133 第 3 章核心控件之地图窗口 SuperMap 保存为影像图形文件 (OutputMapToFile) 及打印当前窗口中的地图 (PrintMap) 四种方式 假设工作空间中已经有一个数据源打开,SuperMap 中有显示的空间数据,PicBox1 为 VB 自带的图片控件, 有一台打印机连接到操作系统, 下面的输出功能就能实现 拷贝到指定的图形设备 :SuperMap.OutPutMap(hdc As OLE_HANDLE), 参数是图形设备的句柄, 例如将当前 SuperMap 窗口中显示的空间数据拷贝到 PicBox( 图片控件 ) 上 : SuperMap1.OutputMap PicBox1.hdc 输出为影像数据集 :SuperMap.OutPutMapEx(objDatasource As sodatasource, strdestdatasetname As String, dresolution As Double, [objbounds As sorect]), 第一个参数是当前数据源, 第二个参数是要输出成影像数据集的矢量数据集名称, 第三个参数是输出的影像数据集的分辨率, 第四个参数是输出的矢量数据集的范围, 可选参数, 缺省时输出全部范围 例如将数据源中的 TempDt 数据集输出为分辨率为 的影像数据集 : Dim objds As sodatasource Set objds = SuperWorkspace.DataSources(1) SuperMap1.OutputMapEx objds, "TempDt", 保存为影像图形文件 :SuperMap.OutPutMapToFile(strPictureFileName As String, nimagefiletype As sefiletype), 第一个参数是输出的图形文件的路径及名称, 第二个参数是图形文件的类型,SuperMap 支持 Bmp JPEG Tif 等十几种图形文件格式 例如将当前 SuperMap 窗口显示的空间数据输出为 Test.bmp: SuperMap1.OutputMapToFile C:\Temp\Test.bmp, scfbmp 打印当前窗口中的地图 :SuperMap.PrintMap([nBorderMode As sepageborder], [bprintbckground As Boolean], [bshowprintdialog As Boolean], [bfittopage As Boolean]), 打印地图的参数都是可选参数, 第一个参数是打印地图的边框, 支持无边框 细边框和粗边框三种类型 ; 第二个参数是是否打印 SuperMap 窗口的背景风格 ; 第三个参数是是否显示打印对话框 ; 第四个参数是是否缩放到纸面尺寸 SuperMap1.PrintMap(scbThin, False, True, True) // 打印细的地图边框, 不打印背景 ( 这样会忽略地图设置的背景 ), 显示打印对话框, 使地图充满整张纸 3.10 思考与练习 1. 做一个地图编辑的工具, 类似于通用的图形编辑器, 可以判断不同的图层类型从而采取相应的操作, 具有图层管理的功能 2. 制作一个专题图创建的工具 3. 制作一个影像配准的工具, 形式可以参考 Erdas 等专业遥感图像处理软件 123

134 SuperMap Objects 开发教程 4. 制作一个图层管理器, 实现对 SuperMap 图层的添加 删除 移动 风格设置等图层的基本属性管理 5. 如何在 SuperMap 中同时编辑不同类型 ( 点 线 面和文本 ) 的实体? 124

135 第 4 章 SuperMap Objects 的空间查询与分析 介绍 GIS 与各种管理信息系统的重要差别就是 GIS 中存贮有地理对象的空间信息 : 位置信息和拓扑信息, 而与传统 CAD 的主要区别是 GIS 能够处理各种拓扑关系和进行自己特有的空间分析 在 GIS 的历史发展中, 传统的拓扑数据模型是以组织好的拓扑关系为基础的, 一切操作和分析必须以完整的拓扑数据结构为出发点 与之不同,SuperMap Objects 采用的是面向对象的数据模型, 拓扑关系并不是一开始就必须存在的, 而是根据需要即时产生, 生成的结果也可保存起来 ( 可参见 SuperTopo 控件中的生成网络数据集方法 ), 这一处理大大加强了 SuperMap Objects GIS 在实际应用中的灵活性, 同时也给用户带来较高的性价比 本章主要介绍 SuperMap Objects 如何利用拓扑关系进行地理对象的空间查询和空间分析, SuperMap Objects 提供的空间查询种类多达 100 多种, 空间分析则包括几何分析 缓冲分析 叠加分析等基本空间分析功能 对于空间分析中的网络分析 水文分析和栅格表面分析等将在 SuperMap Objects 开发教程 - 高级篇 中详述 目标 通过本章的学习, 您将能掌握如下内容 : 了解地理几何对象的各种拓扑关系 ( 如 : 包含 被包含 相交等 ); 利用几何对象之间的距离关系进行范围查询 ; 利用 QueryEx 进行指定空间关系的模式查询 ; 距离 面积测量方法等的几何分析 ; 生成几何对象的缓冲区 ( 单个缓冲区 整体缓冲区 ); 叠加分析的多种运算方法 ( 剪裁 擦除 并 交 同一运算 ); 网络分析的基本功能, 最佳路径和旅行路径分析等 利用矢量数据集和栅格数据集之间的转换进行多种 GRID 分析 ( 栅格分析 ) 4.1 空间几何查询 对于空间数据来说, 有两方面重要信息, 一方面是地学几何对象的位置信息 ( 可以用各种不同的坐标来表示 ), 另一种是地学几何对象之间的空间关系 空间关系分为简单的位置关系和 125

136 SuperMap Objects 开发教程 拓扑关系, 在这里要介绍的是地学几何对象之间的拓扑关系 按照地学几何对象的形状类型 ( 如点 线 面 ), 将不同类型的地学几何对象组合,SuperMap Objects 提供的空间查询方法和查询模式达 100 多种 SuperMap Objects 为几何对象的空间查询提供了两种基本方法 QueryByDistance 和 QueryEx, 下面将介绍如何利用这两种方法进行地学几何对象的空间查询 注 : 本章的例子程序参考示范工程 OverLay.vbp 用 QueryByDistance 进行范围查找 已知空间对象, 查找距该对象一定范围内的其他空间对象, 可以使用矢量数据集 (DatasetVector) 的 QueryByDistance 方法 该方法使用的距离单位为相应地图的地理坐标单位, 如千米 米 英里等 sodatasetvector.querybydistance(objgeometry As sogeometry, dbfferdistance As Double, strfilter As String) As sorecordset 图 4.1 QueryByDistance 查询示意图 QueryByDistance 方法的参数中使用的 sogeometry 可以是点 线 矩形或多边形等空间对象, 查询结果是 sodatasetvector 中落入空间查询范围的全部空间对象 图 4.1 查询示意图中, 使用的查询对象是一个点, 点周围的圆是用来示意查找距离的, 该距离由缓冲区距离决定 用 QueryEx 进行空间模式查询 SuperMap Objects 提供 22 种空间查询模式, 各种查询模式适用于不同类型空间对象的查询, 126

137 第 4 章 SuperMap Objects 的空间查询与分析 可以用线对象搜索满足一定条件的点或者用面对象搜索线对象等, 这样的查询组合达 100 多种, 但是有一些查询组合是没有意义的, 例如查询包含一个面对象的点集, 这样的查询在程序运行的时候不会提示错误, 但是从地理角度来看是没有意义的 下面将详细讲解不同查询模式对应的空间查询对象组合 包含搜索点的面对象 sodatasetvector.queryex(objgeometry As sogeometry, scspointinpolygon, "") As sorecordset // 返回包含搜索对象中的第一个点的面对象 该模式的查询对象是面对象, 因此 sodatasetvector 是面数据集 objgeometry 可以是点 线 面, 如果是点, 那么返回结果就是包含这个点的面对象 ; 如果是线或者面, 那么返回结果就是包含这个线或者面的第一个节点的面对象 注 : 这种查询模式不能用于点数据集和线数据集 图 4.2 scspointinpolygon 查询模式效果图 包含搜索对象的几何对象 sodatasetvector.queryex(objgeometry As sogeometry, scscontainedby, "") As sorecordset // 返回完全包含搜索对象的对象 如果 sodatasetvector 是面数据集, 那么 objgeometry 可以是点 线 面等对象, 搜索结果是 sodatasetvector 数据集中所有完全包含 objgeometry 的空间对象, 允许边界重合或者有交点 ; 如果 sodatasetvector 是线数据集, 那么 objgeometry 可以是点 线等对象, 搜索结果是 sodatasetvector 数据集中所有完全包含 objgeometry 的空间对象, 允许边界重合或者有交点 如果 sodatasetvector 是点数据集, 那么 objgeometry 仅可以为点对象, 这里的包含查询 127

138 SuperMap Objects 开发教程 相当于点重合的查询 图 4.3 scscontainedby 查询模式效果图 包含搜索对象但无接触边的几何对象 sodatasetvector.queryex(objgeometry As sogeometry, scscontainedbynoedgetouch, "") As sorecordset // 包含搜索对象但无接触边的几何对象 这种查询模式与 scscontainedby 查询模式在功能方面很相似, 差别就在于,scsContained 模式允许边线或者点相接触, 而 scscontainedbynoedgetouch 不允许边线或者点接触 图 4.4 scscontainedbynoedgetouch 查询模式效果图 128

139 与搜索对象有公共点的几何对象 第 4 章 SuperMap Objects 的空间查询与分析 sodatasetvector.queryex(objgeometry As sogeometry, scscommonpoint, "") As sorecordset // 搜索有公共点的几何对象 这种查询模式适用于各种数据集类型与各种空间对象类型的查询组合, 只要与搜索对象有公共节点, 就满足查询条件 图 4.5 scscommonpoint 查询模式效果图 与查询线相交的所有对象 sodatasetvector.queryex(objgeometry As sogeometry, scslinecross, "") As sorecordset // 返回与查询线相交的所有对象 这种查询模式适用于线对象和面对象的查询, 用线对象查询线对象和面对象, 用面对象查询线对象和面对象, 只要有相交点就满足条件 它不适用于点对象的查询 129

140 SuperMap Objects 开发教程 图 4.6 scslinecross 查询模式效果图 与搜索对象有公共边的几何对象 sodatasetvector.queryex(objgeometry As sogeometry, scscommonline, "") As sorecordset // 返回与搜索对象有公共边的几何对象 这种查询模式同样适用于线对象和面对象的查询, 与 scslinecross 不同的是,scsLineCross 查询只要有线相交就满足条件, 而 scscommonline 则必须有公共的边 不适用于点对象的查询 图 4.7 scscommonline 查询模式效果图 130

141 与搜索对象有相交区域的几何对象 第 4 章 SuperMap Objects 的空间查询与分析 sodatasetvector.queryex(objgeometry As sogeometry, scsareaintersect,"") As sorecordset // 返回与搜索对象有相交区域的几何对象 查询条件是与搜索对象 (sogeometry) 有相交, 例如面与面相交 线穿过面 线与线相交或者重叠 图 4.8 scsareaintersect 查询模式效果图 与搜索对象完全重叠的几何对象 sodatasetvector.queryex(objgeometry As sogeometry, scsidentity, "") As sorecordset // 返回与搜索对象完全重叠的几何对象 131

142 SuperMap Objects 开发教程 图 4.9 scsidentity 查询模式效果图 返回与搜索对象完全相同的对象, 包括对象类型和坐标数据都相同 与搜索对象有接触的对象 sodatasetvector.queryex(objgeometry As sogeometry, scsedgetouchorareaintersect, "") // 返回与搜索对象有接触的对象 图 4.10 scsedgetouchorareaintersect 查询模式效果图 返回全部或部分包含搜索对象 或者全部或部分被搜索对象包含的所有对象, 边线有接触的对象也符合条件 被搜索对象包含但没有接触的几何对象 sodatasetvector.queryex(objgeometry As sogeometry, scscontainingnoedgetouch, "") // 返回被搜索对象包含但没有接触的几何对象 132

143 第 4 章 SuperMap Objects 的空间查询与分析 图 4.11 scscontainingnoedgetouch 查询模式效果图 返回完全被搜索对象包含的对象, 并且没有边线或者点接触 与搜索线有公共点或被线穿越的几何对象 sodatasetvector.queryex(objgeometry As sogeometry, scscommonpointorlinecross, "") // 返回与搜索线有公共点或被线穿越的几何对象 图 4.12 scscommonpointorlinecross 查询模式效果图 返回与搜索对象有公共点或者与搜索对象中的的边线有相交的所有对象 从上面举例讲解的示范中我们注意到, 查询方法中除了在第二个参数指定不同的查询模式, 还有第三个参数 strfilter, 属性查询条件, 这样我们就可以实现属性和空间位置的联合查询, 更表现出 GIS 在查询方面的优势 133

144 SuperMap Objects 开发教程 4.2 几何分析 量算面积 角度和距离 SuperMap Objects 提供在地图上直接量算任意多个点之间距离的功能, 在量算时用户可以打开智能捕捉开关精确获取感兴趣的位置 ( 如在某点处, 在某条线上, 成多少角度, 使量算线为水平线和垂直线等 ), 这一能力使得用户可以准确地测出自己需要知道的距离 SuperMap 控件开放了一个 Tracking 事件, 通过该事件返回参数, 我们可以容易的获得当前正在绘制的线段的长度, 方位角以及多边形的面积 SuperMap_Tracking(x As Double, y As Double, dcurrentlength As Double, dcurrentangle As Double, dtotallength As Double, dtotalarea As Double, nbuttonclicked As Long) 表 4.1 SuperMap_Tracking 事件参数说明 参数类型描述 x Double 跟踪后鼠标横坐标 ( 地理坐标 ) y Double 跟踪后鼠标纵坐标 ( 地理坐标 ) dcurrentlength Double 返回当前线段的长度, 单位与数据源的单位相同 dcurrentangle Double 返回当前鼠标点与上一个节点的连线的方位角, 即直线 ( 有方向 ) 与正北方 向顺时针的夹角 dtotallength Double 返回当前的线的总长度, 单位与数据源的单位相同 dtotalarea Double 返回当前的多边形的面积, 折线为零, 单位与数据源的单位相同 nbuttonclicked Long 标示鼠标的按键的状态,0 表示没有按键,1 表示按下鼠标左键,2 表示按下 鼠标右键 下图具体描述了各个参数的意义 : 134

145 第 4 章 SuperMap Objects 的空间查询与分析 图 4.13 SuperMap_Tracking 事件参数 基本几何运算 SuperMap Objects 在空间分析方面作了很多工作, 开放给用户许多功能强大 使用方便的空间分析方法, 但是由于各行各业对空间分析的要求差异很大,SuperMap Objects 考虑到开放一些基础空间分析方法, 用户可以根据自己的应用需求开发出相应的空间分析功能, 提高 SuperMap Objects 的灵活性和二次开发能力 SuperMap Objects 中包含了很多优秀的基础空间分析算法, 通过提供 sogeometrist 对象, 集成这些算法和功能, 统一提供给用户, 本节将详细介绍这个对象的基本几何运算 通过这样的方式可以得到一个 sogeometrist 对象 : Dim objgeometrist As New sogeometrist 创建一个基本几何运算对象 (sogeometrist), 就可以使用它提供的 11 种方法了, 如下 : 1. 判断两条直线是否垂直 : 输入四个点构成两条直线, 判断这两条直线是否垂直, 如果垂直, 返回 True; 如果不垂直, 返回 False sogeometrist.isperpendicular(objstartpoint1 As sopoint, objendpoint1 As sopoint, objstartpoint2 As sopoint, objendpoint2 As sopoint) As Boolean 参数说明 : objstartpoint1: 第一条直线的起点 ; objendpoint1: 第一条直线的终点 ; objstartpoint2: 第二条直线的起点 ; objendpoint2: 第二条直线的终点 ; 135

146 SuperMap Objects 开发教程 2. 判断两条直线是否平行 : 输入四个点构成两条直线, 判断这两条直线是否平行, 如果平行, 返回 True; 如果不平行, 返回 False sogeometrist.isparallel(objstartpoint1 As sopoint, objendpoint1 As sopoint, objstartpoint2 As sopoint, objendpoint2 As sopoint) As Boolean 参数说明 : objstartpoint1: 第一条直线的起点 ; objendpoint1: 第一条直线的终点 ; objstartpoint2: 第二条直线的起点 ; objendpoint2: 第二条直线的终点 ; 3. 返回点到线的垂线 : 输入一个点和一条线, 返回点到线的垂线 sogeometrist.getperpendicular(objpoint As sopoint, objstartpoint As sopoint, As sopoint) As sogeoline 参数说明 : objpoint: 已知点 ; objstartpoint: 已知直线的起点 ; objendpoint: 已知直线的终点 ; 4. 返回通过指定点作已知直线的平行线 : 输入一个点和一条线, 返回通过已知点作已知直线的平行线 sogeometrist.getparallel(objpoint As sopoint, objstartpoint As sopoint, objendpoint As sopoint) As sogeoline 参数说明 : objpoint: 已知点 ; objstartpoin: 已知直线的起点 ; objendpoint: 已知直线的终点 ; 5. 根据距离求折线的平行线, 返回折线对象 : 指定一条折线和平行线之间的距离, 求满足距离条件的已知折线的平行线 如果距离大于 0, 平行线位于已知折线的左侧 ; 如果距离小于 0, 平行线位于已知折线的右侧 ; 如果距离等于 0, 返回一条与已知折线相同的对象 sogeometrist.getparallel2(objline As sogeoline, ddistance As Double) 参数说明 : objline: 已知折线 ; ddistance: 平行线之间的距离 ; 6. 求点到线的垂足 : 返回垂足, 是点对象 sogeometrist.getperpendicularposition(objpoint As sopoint, objstartpoint As sopoint, objendpoint As sopoint) As sopoint 136

147 第 4 章 SuperMap Objects 的空间查询与分析 参数说明 : objpoint: 已知点 ; objstartpoint: 已知直线的起点 ; objendpoint: 已知直线的终点 ; 7. 求两条线段 ( 直线 ) 的交点 : 通过定义四个点对象而构成的两条线段, 求它们的交点 如果两条线段不相交, 还可以求它们所在的直线的交点 sogeometrist.intersectline(objstartpoint1 As sopoint, objendpoint1 As sopoint, objstartpoint2 As sopoint, objendpoint2 As sopoint, bextend As Boolean) As sopoint 参数说明 : objstartpoint1: 第一条直线的起点 ; objendpoint1: 第一条直线的终点 ; objstartpoint2: 第二条直线的起点 ; objendpoint2: 第二条直线的终点 ; bextend: 是否扩展, 如果为 True, 求线段所在直线的交点 ; 如果为 False, 求线段的交点 ; 8. 判断点是否在线段 ( 直线 ) 上 : 点在线上, 返回 True; 点不在线上, 返回 False sogeometrist.ispointonline(objpoint As sopoint, objstartpoint As sopoint, objendpoint As sopoint, bextend As Boolean) As Boolean 参数说明 : objpoint: 已知点 ; objstartpoint: 已知直线的起点 ; objendpoint: 已知直线的终点 ; bextend: 是否扩展, 如果为 True, 判断点是否在线段所在的直线上 ; 如果为 False, 判断点是否在线段上 ; 9. 计算点集的凸闭包 : 返回一个简单的凸多边形 sogeometrist.convexhull(objpoints As sopoints) As sogeoregion 参数说明 : objpoints: 输入的点集 ; 10. 线与线倒圆角, 返回倒角结果中的弧段 倒角计算之后两条直线的终点坐标可能发生变化 sogeometrist.fillet(objstartpoint1 As sopoint, objendpoint1 As sopoint, objstartpoint2 As sopoint, objendpoint2 As sopoint, dradius As Double) As sogeoarc 参数说明 : objstartpoint1: 第一条直线的起点 ; 137

148 objendpoint1: 第一条直线的终点 ; objstartpoint2: 第二条直线的起点 ; objendpoint2: 第二条直线的终点 ; dradius: 倒角弧段半径 ; SuperMap Objects 开发教程 11. 求直线上满足距离条件的一个点 : 给定距离, 如果距离大于 0, 则从直线起点开始查找满足距离条件的点 ; 如果距离小于 0, 则从直线的终点开始查找满足距离条件的点 sogeometrist.findpointonlinebydistance(objstartpoint As sopoint, objendpoint As sopoint, ddistance As Double) As sopoint 参数说明 : objstartpoint1: 已知直线的起点 ; objendpoint1: 已知直线的终点 ; ddistance: 指定的距离 4.3 缓冲分析 缓冲区分析 (Buffer) 是根据指定的距离在点 线和多边形实体周围自动建立一定宽度的区域范围的分析方法 例如, 在环境治理中, 常在污染的河流周围划出一定宽度的范围表示受到污染的区域 ; 又如在飞机场, 常根据健康需要在周围划出一定范围的区域作为非居住区, 等等 SuperMap Objects 不仅可以为其支持的全部类型的空间对象作缓冲区分析, 例如点 线 面 圆等空间对象, 而且缓冲区的类型比较丰富, 按照缓冲区的对称情况分为等边和不等边两种类型, 按照平滑情况分为圆头和平头两种类型 另外在实际工程应用中除了需要对单个对象作缓冲区分析, 还经常要为一组对象进行缓冲区分析生成一个或多个缓冲区, 在 SuperMap Objects 中同样提供了相应的方法 实现缓冲区分析, 在 SuperMap Objects 中提供两个方法 :Buffer 和 Buffer Buffer 方法 这个方法可以为 SuperMap Objects 中所有类型的空间对象作缓冲区, 提供的方式就是每一种类型的空间对象都有一个 Buffer 方法, 这里以面对象 (sogeoregion) 为例 : sogeoregion.buffer(ddistance As Double,nSmoothness As Long) As sogeoregion // 为面对象作缓冲区 参数说明 : ddistance: 缓冲区的半径, 单位与数据集的单位相同 ; nsmoothness: 平滑度, 即用 nsmoothness 条弧段来拟合一个圆 ; 下面的图是为缓冲分析设计的一个界面 : 138

149 第 4 章 SuperMap Objects 的空间查询与分析 图 4.14 几何对象缓冲区分析交互界面 示范程序如下 : 进行缓冲区分析的初始化设置 我们假设 SuperWorkspace 中已经有打开的数据源 ;SuperMap 中有打开的地图, 且至少有两个几何对象 ( 面对象 ) 处于选中状态 ; 当前数据源中没有名称为 SampleDT 的数据集 Dim objsourcegeometry As sogeoregion // 生成缓冲区的源对象 ( 以面对象为例 ) Dim objdestgeomtry As sogeoregion // 由源对象生成的单个缓冲区 Dim objrecordset As sorecordset // 所选择对象对应的记录集 Dim objdestrecordset As sorecordset // 生成的缓冲区对象的记录集 Dim objdtvector As sodatasetvector // 生成的缓冲区存放的数据集 // 处理存放缓冲区的面数据集 创建一个新的面数据集, 打开它, 并获取它的记录集, 用于往记录集里添加新的记录 Set objdtvector = SuperWorkspace1.Datasources.Item(1).CreateDataset( SampleDT, 5) objdtvector.open Set DestRecordSet = objdtvector.query(, True) objdestrecordset.movelast // 源记录集, 就是当前处于选中状态的记录集 Set objrecordset = SuperMap1.Selection.ToRecordset(False) objrecordset.movefirst // 移到第一条记录 生成缓冲区 139

150 SuperMap Objects 开发教程 分析的结果是给每一个选中的对象创建一个缓冲区 ( 面对象 ) Do // 开始记录循环, 给每一个记录生成缓冲区, 并添加到目标记录集中 Set objsourcegeometry = objrecordset.getgeometry // 获取当前记录的几何对象 Set objdestgeomtry = objsourcegeometry.buffer(10000,20) // 生成缓冲区 If Not (objdestgeomtry Is Nothing) Then // 生成缓冲区成功 objdestrecordset.addnew objdestgeomtry // 添加到目标记录集中 objdestrecordset.update // 更新目标记录集 End If objrecordset.movenext // 下一条记录 Loop Until RecordSet.IsEOF objdestrecordset.close // 关闭目标记录集 使用 Buffer 方法创建的缓冲区的特点是 :(1) 对称, 即等边 Buffer 方法中的第一个参数控制缓冲区的半径, 两侧相同 ;(2) 圆头 Buffer 方法中第二个参数, 控制缓冲区拐弯处的圆滑度 Buffer2 方法 这种方法仅支持 GIS 类型的空间对象, 即点 线 面对象, 通过空间操作 (sospatialoperator) 来实现缓冲区分析 获得空间对象的空间操作对象 ( 以线对象为例 ) Dim objspatialoperator As sospatialoperator Set objspatialoperator = objgeoline.spatialoperator 生成缓冲区 sospatialoperator.buffer2(dleftdistance As Double, drightdistance As Double, nsmoothness As Long) As sogeoregion 参数说明 : dleftdistance: 缓冲区左侧宽度, 小于 0 无效, 等于 0 则生成单边缓冲区 ; drightdistance: 缓冲区右侧宽度, 小于 0 无效, 等于 0 则生成单边缓冲区 ; nsmoothness: 表示光滑度, 用多少个点模拟一个半圆, 如果少于 4 个, 线段转折处不做平滑处理, 即平头 Buffer 为所有对象生成一个总的缓冲区 前面我们讲解的都是为单个空间对象作缓冲区分析, 在实际工程应用中经常需要对多个对象作总的缓冲区, 在 SuperMap Objects 中实现的方式是先对单个对象作缓冲区, 然后将全部缓冲区合并成为一个总的缓冲区, 示范程序如下 : objrecordset.movefirst Set objsourcegeometry = objrecordset.getgeometry 140

151 第 4 章 SuperMap Objects 的空间查询与分析 Set objallgeometry = objsourcegeometry.buffer(10000,20) // 将第一个对象的缓冲区赋给 objallgeomtry objrecordset.movenext Do Until objrecordset.iseof // 开始记录循环, 给每一个记录生成缓冲区, 但不添加到目标记录集中 Set objsourcegeometry = objrecordset. GetGeometry // 获取当前记录的几何对象 Set objdestgeomtry = objsourcegeometry.buffer(10000,20) // 生成缓冲区 If Not (objdestgeomtry Is Nothing) Then // 生成缓冲区成功 // 合并缓冲区 : 将第一个对象的缓冲区赋给 objallgeomtry, 然后用这个面对象与以后的对象生成的缓冲区进行合并 (Union) 操作, 如此继续, 直到全部对象运算完, 生成一个总的缓冲面对象 objallgeomtry Set objallgeomtry = objallgeomtry.union(objdestgeomtry) End If objrecordset.movenext // 下一条记录 Loop objdestrecordset.addnew objallgeomtry // 添加到目标记录集中 objdestrecordset.update // 更新目标记录集 objdestrecordset.close // 关闭目标记录集 4.4 叠加分析 叠加分析 (Overlay) 是在两个 GIS 数据集之间进行的一系列几何运算 SuperMap Objects 提供了一个独立的对象专门进行叠加分析, 该对象有 8 种类型的叠加分析 :Clip,Erase,Union, Intersect Identity GridErase GridIdentity 和 GridUnion 等 采用独立分析对象进行空间分析, 不与任何几何对象或数据集对象 图层对象进行连接, 而采用设置参数的方法, 这大大增加了分析的灵活性和高效性 图 4.15 叠加分析对象结构图 sooverlayanalyst 对象进行的是数据集之间全部对象的整体叠加分析 SuperMap Objects 中的众多几何对象也有进行单个对象叠加运算的方法 当不必对所有对象进行叠加分析时, 可采用这种方法 下面将介绍如何使用 sooverlayanalyst 对象进行数据集之间的叠加分析 下面的对话框是为数据集的叠加分析设计的一个范例界面 : 141

152 SuperMap Objects 开发教程 图 4.16 叠加分析交互界面 剪裁运算 (Clip) Clip 运算是用剪裁数据集或空间对象从一个被剪裁数据集中抽取部分特征 ( 点 线 面 ) 集合的运算 其中, 剪裁数据集或空间对象的类型必须是面, 被剪裁的数据集可以是点 线 面数据集 sooverlayanalyst.clip(objindataset As sodatasetvector, objclipitem As Object, objoutdataset As sodatasetvector) As Boolean 参数说明 : objindataset: 被剪裁的数据集, 可以是点 线 面数据集 ; objclipitem: 剪裁数据集或者空间对象, 类型必须是面 ; objoutdataset: 结果数据集, 类型与 objindataset 的相同 ; Clip 运算的输出结果数据集的属性表来自于被剪裁数据集, 因此数据集内各特征的属性与被剪裁数据集同一特征的属性相同 Clip 运算的结果属性表是从被剪裁数据集属性表集合中抽取出来的, 是其部分子集 Clip 运算通过叠加操作创建出一个新的数据集, 这个新的数据集是由一个面数据集 ( 或者面对象 ) 用所有多边形对被剪裁数据集内的空间对象进行包围 分割得到的 在被剪裁数据集中, 并不是所有特征都将被裁剪分割并输出到结果数据集中, 只有落在剪裁数据集多边形 ( 集合 ) 内的对象才会被输出到结果数据集中 示范程序如下 : Dim objds As sodatasource Dim objdta As sodataset Dim objdtb As sodataset Dim objdtc As sodataset // 被裁剪的数据集 // 用来裁剪的面数据集 // 存放结果的数据集 142

153 第 4 章 SuperMap Objects 的空间查询与分析 Dim objoverlayanalyst As New sooverlayanalyst // 注意 : 要用 New 关键字来定义 Dim ldtctype As Long // 被裁剪数据集的类型 Dim bresult As Boolean // 成功与否的标志 Set objds = SuperWorkspace.Datasources.Item(1) // 获取数据源 Set objdta = objds.datasets.item(1) // 获取被裁剪数据集 Set objdtb = objds.datasets.item(2) // 获取裁剪面数据集 ldtctype = objdta.type // 保存结果的数据集类型 Set objdtc = objds.createdataset("dataset3",ldtctype,scodefault) // 创建结果数据集 // 在此使用 sooverlayanalyst 对象的不同方法即可实现不同类型的叠加分析 bresult = objoverlay.clip(objdta,objdtb,objdtc) // 进行裁剪分析 If bresult = True Then Msgbox " 分析成功!" Else Msgbox " 分析失败!" End If 擦除运算 (Erase) 与 Clip 运算相反,Erase 运算保留了 Clip 运算去掉的对象 ( 点 线和面 ), 而去掉了 Clip 运算保留的部分 可以将它描述为 : Erase 运算是用来擦除被擦除数据集中与 Erase 数据集中多边形 ( 集合 ) 相重叠部分的操作 sooverlayanalyst.erase(objindataset As sodatasetvector, objeraseitem As Object, objoutdataset As sodatasetvector) As Boolean 参数说明 : objindataset: 被擦除数据集, 可以是点 线 面数据集 ; objeraseitem: 擦除数据集或者空间对象, 其类型必须是面 ; objoutdataset: 结果数据集, 类型与被擦除数据集的类型相同 ; Erase 运算的输出结果的属性表来自于被擦除数据集的属性表, 是其部分子集 Erase 数据集中的多边形 ( 集合 ) 定义了擦除区域, 被擦除数据集中凡是落在这些多边形内的特征要素 ( 点 线和面 )( 全部或其一部分 ) 都将被除去, 凡是落在这些多边形外的特征要素 ( 点 线和面 )( 全部或其一部分 ) 都将被输出到 Erase 结果数据集中 擦除运算的流程和裁剪运算是一样的, 只要把裁剪示例程序中进行叠加分析的一句代码改成如下语句即可 : bresult = objoverlay.erase(objdta,objdtb,objdtc) // 进行擦除分析 并运算 (Union) Union 运算是求两个数据集的并集的操作, 只限于两个面数据集之间 sooverlayanalyst.union(objindataset As sodatasetvector, objuniondataset As sodatasetvector, objoutdataset As sodatasetvector, bjoinattribute As Boolean) As Boolean 143

154 SuperMap Objects 开发教程 objindataset: 被合并数据集, 类型为面数据集 ; objuniondataset: 合并数据集, 类型为面数据集 ; objoutdataset: 结果数据集, 类型同 objindataset; bjoinattribute: 是否进行属性表的连接 ; Union 运算对操作结果的属性表提供两种选择 : 合并和不合并 采用合并选项时, 参与 Union 运算的两个数据集的属性表中的字段都将被加入到操作结果的属性表中 若采用非合并选项, 则在新建属性表中只记录各多边形在输出数据集中的内部标识号 (SmID) 用户标识号 (SmUserID) 周长 (SmPerimeter) 面积属性 (SmArea) 及生成它的两个多边形在原数据集中的各自内部标识号 (SmID), 其它属性字段继承了生成该多边形的相应数据集属性表中的字段信息 ( 包括字段值 ) 并运算的流程和裁剪是一样的, 只要把裁剪示例程序中进行叠加分析的一句代码改成 : bresult = objoverlay.union(objdta,objdtb,objdtc,true) // 进行并运算, 连接属性即可 交运算 (Intersect) Intersect 运算是求两个数据集的交集的操作, 两个数据集中共同的部分将被输出到结果数据集中, 其余部分将被排除 sooverlayanalyst.intersect(objindataset As sodatasetvector, objintersectdataset As sodatasetvector, objoutdataset As sodatasetvector, bjoinattribute As Boolean) As Boolean objindataset: 待求交数据集, 类型可以是点 线 面数据集 ; objintersectdataset: 求交数据集, 类型是面数据集 ; objoutdataset: 类型同 objindataset; bjoinattribute: 是否连接属性表 ; Intersect 运算的结果来自于两个数据集重叠的部分, 待求交数据集的特征对象 ( 点 线和面 ) 在与求交数据集中的多边形相交处被分裂 ( 点对象除外 ), 分裂结果被输出到结果数据集中 Intersect 运算的结果属性表不仅包括待求交数据集的属性字段, 而且包括交数据集的属性字段 它也提供两种选择 : 合并和不合并 采用合并选项时, 参与 Intersect 运算的两个数据集的属性表中的字段都将被加入到操作结果的属性表中 若采用非合并选项, 则在新建属性表中只记录各特征对象 ( 对面和点数据集来说 ) 在输出数据集中的内部标识号 (SmID) 用户标识号 (SmUserID) 周长 (SmPerimeter) 面积属性 (SmArea)( 对一般线数据集来说, 则是长度等属性 ; 对含有拓扑关系的网络数据集来说, 还要加上从节点 (SmFNode) 到节点 (SmTNode) 左多边形 右多边形四个属性 ) 及生成它的两个对象在原求交数据集中的各自内部标识号, 其它属性仍然使用生成该对象的两个对象的原属性表 ( 在两个原数据集中 ) 交运算的流程和裁剪是一样的, 只要把裁剪示例程序中进行叠加分析的一句代码改成 : bresult = objoverlay.intersect(objdta,objdtb,objdtc,true) // 进行交分析, 连接属性 144

155 4.4.5 同一运算 (Identity) 第 4 章 SuperMap Objects 的空间查询与分析 Identity 运算类似于 Union 运算, 要对两个数据集进行相交计算 不同之处在于,Union 运算保留了两个数据集的所有部分, 而 Identity 运算只保留第一个数据集的所有部分, 去掉第二个数据集 ( 称为 Identity 数据集 ) 中与第一个数据集没有重叠的部分 sooverlayanalyst.identity(objindataset As sodatasetvector, objidentitydataset As sodatasetvector, objoutdataset As sodatasetvector, bjoinattribute As Boolean) As Boolean objindataset: 类型可以是点 线 面数据集 ; objidentitydataset: 仅为面数据集 ; objoutdataset: 结果数据集, 类型同 objindataset; bjoinattribute: 是否连接属性表 ; Identity 运算的结果属性表来自于两个数据集的属性表 提供两种选择 : 合并属性和不合并属性 采用合并属性选项时, 参与 Identity 运算的两个数据集的属性表中的字段都将被加入到操作结果的属性表中 若采用非合并选项, 则在新建属性表中只记录各特征对象 ( 对面和点数据集来说 ) 在输出数据集中的内部标识号 用户标识号 周长 面积属性 ( 对一般线数据集来说, 则是长度等属性 ; 对含有拓扑关系的网络数据集来说, 还要加上从节点 到节点 左多边形 右多边形四个属性 ) 及生成它的两个对象在原数据集中的各自内部标识号, 其它属性仍然使用生成该对象的两个对象的属性表 ( 在两个原数据集中 ) 同一运算的流程和裁剪是一样的, 只要把裁剪示例程序中进行叠加分析的一句代码改成 : bresult = objoverlay.identity(objdta,objdtb,objdtc,true) // 进行同一运算, 连接属性即可 在 理解 SuperMap Objects GIS 这本书里, 我们详细的介绍了叠加分析的各种运算, 并以大量的图示为辅助工具, 将加深您对叠加分析各种运算的理解 详细情况请参阅 理解 SuperMap Objects GIS 4.5 网络分析 网络系统是指由许多相互连接的线段构成的网状系统, 网络数据模型是对现实世界中网络系统的抽象表达, 其中, 线段称为网络连接, 而线段与线段的交点称为网络节点 在网络模型中, 资源和信息能够从一个节点到达另一个节点 网络分析是在网络模型的基础上进行的一系列分析, 如网络节点查询 网络路径查询 最佳路径分析 最短路径分析 旅行路径分析等 此外,SuperMap Objects 5 在分析功能方面扩展了基于网络模型的深入分析和应用, 包括资源分配, 选址分区, 服务区分析和最近设施查找等功能 只有网络数据集才能进行网络分析, 其它任何数据集都不能进行这种操作 SuperMap Objects 将网络分析常用功能封装为一个 sonetworkanalyst 对象, 该对象提供了 6 种路径查询和 3 种节点查询的方法 网络分析对象结构图如下 : 145

156 SuperMap Objects 开发教程 sonetworkanalyst ( 网络分析 ) FindAdjacentNodes:soSelection FindConnectedEdges:soSelection FindConnectedNodes:soSelection FindCriticalEdges:soSelection FindCriticalNodes:soSelection FindPath:soSelection FindPath2:soSelection FindPathEx:soSelection FindPathEx2:soSelection FindTSPPath:soSelection TraceByDistance TraceByDistanceEx:soSelection 图 4.17 网络分析对象结构图 路径查询 查找与指定节点相连的所有边 已知节点, 可以查询与其相连的所有边 在网络数据中, 路径是有方向的, 正方向为从路径的起始节点指向终止节点, 反方向为从终止节点指向起始节点 路径查找的时候可以指定查找的方向 : 正方向 反方向 双方向 sonetworkanalyst.findconnectededges(objnetworkdataset As sodatasetvector, nnode As Long, ndirection As sepathfindingdirection, nlevel As Long) As soselection 参数说明 : objnetworkdataset: 用于网络分析的数据集 ; nnode: 已知节点的编号 ; ndirection: 路径查询的方向 ; nlevel: 查找的级数, 即连接节点的边数超过级数就不继续查找 ; 节点间关键边查找 任意两个节点间至少有一种连通关系, 其中有一种连通关系是关键边 ( 桥 ), 如果断开关键边, 则这两个节点之间将不能连通 sonetworkanalyst.findcriticaledges(objnetworkdataset As sodatasetvector, nfromnode As Long, ntonode As Long, ndirection As sepathfindingdirection) 参数说明 : objnetworkdataset: 用于网络分析的数据集 ; nfromnode: 起始节点编号 ; 146

157 ntonode: 终止节点编号 ; ndirection: 路径查询的方向 ; 最短路径分析 第 4 章 SuperMap Objects 的空间查询与分析 最短路径分析是简单的网络分析, 是在网络图层中的任意两个节点之间寻找一条由网络数据集中的线段组成的距离最短的通道 指定起止节点, 分析的结果是一个临时的选择记录集, 选择记录集中的所有记录对应的线对象组成一条连接两个节点的最短路径 最短路径分析有两种方法 : sonetworkanalyst.findpath(objnetworkdataset As sodatasetvector, nfromnode As Long, ntonode As Long, bshortestonly As Boolean) As Selection 参数说明 : objnetworkdataset: 用于网络分析的数据集 ; nfromnode: 编号 ; ntonode: 终止节点编号 ; bshortestonly: 是否仅分析最短路径 当 bshortestonly = True 时, 网络分析的结果是最短路径 ; sonetworkanalyst.findpathex(objnetworkdataset As sodatasetvector, objfrompoint As sopoint, objtopoint As sopoint, dtolerance As Double, bshortestonly As Boolean) 参数说明 : objnetworkdataset: 用于网络分析的数据集 ; objfrompoint: 起始节点 ; objtopoint: 终止节点 dtolerance: 选择起止点的容限值, 当所选点到某一点的距离小于这个值即认为选中该点 ; bshortestonly: 是否仅分析最短路径 当返回 True 时, 网络分析的结果是最短路径 ; 下面的程序实现网络数据集中最短路径分析 ( 这段代码实现的前提条件是 SuperMap Objects 中的第一个图层为网络数据集, 且这个网络数据集中有至少 2 个节点 ) Dim objgeometry As sogeometry // 几何对象, 这里是点 Dim Selection As soselection // 查找结果集 Dim objdatasetvector As sodatasetvector // 网络数据集 Dim objdv As sodatasetvector // 网络数据集子集 ( 即网络节点数据集 ) Dim objrecordset As sorecordset // 子集的记录集 Dim iselectnumber As Integer // 选中的点判断变量 Dim lnodenumber1 As Long // 第一个节点的 ID 号 Dim lnodenumber2 As Long // 第二个节点的 ID 号 iselectnumber = 0 // 初始化判断变量 Set objdatasetvector = SuperMap1.Layers(1).dataset Set objdv = objdatasetvector.subdataset Set objrecordset = objdv.query(, True) // 必须是网络数据集 // 获取子集 // 获取子集的记录集 147

158 SuperMap Objects 开发教程 objrecordset.movefirst // 移动到第一个记录 Do // 循环查找节点 Set objgeometry = objrecordset.getgeometry // 获取当前记录的几何对象 If objgeometry.type = scgpoint Then // 当前对象为节点 iselectnumber = iselectnumber + 1 // 累计增加节点数 If iselectnumber = 1 Then // 获得第一个节点 lnodenumber1 = objrecordset.getid // 获得第一个节点的 ID 号 ElseIf iselectnumber = 2 Then // 当选中点数目为 2 时开始分析 Dim objnetworkanalyst As New sonetworkanalyst // 网络分析对象 lnodenumber2 = objrecordset.getid // 获取第二个节点的 ID 号 Set Selection = objnetworkanalyst.findpath (objdatasetvector, lnodenumber1, lnodenumber2, True) // 最短路径分析 If Selection Is Nothing Then MsgBox ' 节点间无最短路径 ' Else Me.SuperMap1.EnsureVisibleRecordset objrecordset, 2 // 设置地图显示范围 Dim recd As sorecordset // 结果记录集 Set recd = Selection.ToRecordset(True) // 获取结果记录集 SuperMap1.Selection.FromRecordset recd // 显示分析结果 End If Me.SuperMap1.Refresh // 刷新 SuperMap Exit Do // 分析结束, 退出循环 End If End If objrecordset.movenext // 下一条记录 Loop Until objrecordset.iseof() 最佳路径分析 与最短路径分析相比较, 最佳路径分析要复杂的多 最佳路径分析在内部要对两点间的线段长度与正向 逆向阻力进行加权和运算, 最后得到一条连接两点且加权和最小的路径 ( 实际得到的是一个临时记录集, 记录集中的所有线对象组成一条两点间的连线 ) SuperMap Objects 中提供了 4 种最佳路径分析方法 : 参数说明 : sonetworkanalyst.findpath(objnetworkdataset As sodatasetvector, nfromnode As Long, ntonode As Long, bshortestonly As Boolean) As Selection objnetworkdataset: 用于网络分析的数据集 ; nfromnode: 起始节点编号 ; ntonode: 终止节点编号 ; bshortestonly: 当 bshortestonly = False 时, 网络分析时除了考虑路径长度因素, 还要考虑路径的阻力, 网络数据集中的线段都是有方向的, 数据集表结构中有两个半保留的字段 ( 只能编辑其属性值, 不能编辑字段本身或删除字段 )SmResistanceA 和 SmResistanceB, 分别记录正反方向的阻力 sonetworkanalyst.findpathex(objnetworkdataset As sodatasetvector, 148

159 参数说明 : 第 4 章 SuperMap Objects 的空间查询与分析 objfrompoint As sopoint, objtopoint As sopoint, dtolerance As Double, bshortestonly As Boolean) As Selection objnetworkdataset: 用于网络分析的数据集 ; objfrompoint: 起始节点 ; objtopoint: 终止节点 dtolerance: 选择起止点的容限值, 当所选点到某一点的距离小于这个值即认为选中该点 ; bshortestonly: 是否仅分析最短路径 当 bshortestonly = False 时, 网络分析的结果是最佳路径 ; 由最佳路径分析的机制可以知道, 要进行正确的最佳路径分析, 就需要在分析之前根据一定的标准设置线段的 SmResistanceA( 正向阻力 ) 和 SmResistanceB( 逆向阻力 ) 值 如果不设定这两个字段的值或所有线段这两个字段的值都一样, 那样的最佳路径分析结果就是得到一条跟最短路径分析得到的结果完全重合的路径 上面两种最佳路径分析方法比较简单, 适合用作简单的城市交通路径分析, 但是在很多行业中对网络分析的要求比较高, 例如在电力行业中, 需要连接矩阵 ; 还有一些复杂的网络数据, 在分析的时候对网络节点或者边需要根据属性进行过滤 针对这些更专业的需求,SuperMap Objects 还设计了另外两种路径查询方法 参数说明 : sonetworkanalyst.findpath2(objnetworkdataset As sodatasetvector, nfromnode As Long, ntonode As Long, bcheckconnectionmatix As Boolean, ncheckmask As Long, [RuleMaskField], [ForwardCostField], [BackwardCostField], [strnodefilter], [strlinefilter]) As Selection objnetworkdataset: 用于网络分析的数据集 ; nfromnode: 起始节点编号 ; ntonode: 终止节点编号 ; bcheckconnectionmatix: 是否使用连接矩阵, 连接矩阵由连接矩阵对象 (soconnectionmatix) 来记录, 保存在系统字段中 ; ncheckmask: 连接掩码, 与掩码字段进行位运算 ; [RuleMaskField]: 输入掩码字段 ; [ForwardCostField]: 正方向 花费 字段, 默认为 SMResistanceA; [BackwardCostField]: 反方向 花费 字段, 默认为 SMResistanceB; [strnodefilter]: 节点过滤条件 ; [strlinefilter]: 边过滤条件 ; sonetworkanalyst.findpathex2(objnetworkdataset As sodatasetvector, objfrompoint As sopoint, objtopoint As sopoint, dtolerance As Double, bcheckconnectionmatix As Boolean, ncheckmask As Long, [RuleMaskField], [ForwardCostField], [BackwardCostField], [strnodefilter], [strlinefilter]) As Selection 这个方法与 FindPathEx 的区别就在于不通过输入节点编号, 而是通过设置容限值, 在选择 149

160 SuperMap Objects 开发教程 节点的时候, 直接传入两个节点对象来进行网络分析 旅行路径分析 从网络分析提供的最短路径分析和最佳路径分析的方法中, 我们可以看出, 这些方法都是通过指定起始节点和终止节点, 来自动计算满足条件的路径, 但是在某些行业中还有一种特殊网络分析需求, 例如在旅行和运输行业中, 在已知起止节点条件之外, 分析出的路径还必须经过用户指定的一些节点,SuperMap Objects 提供了另外一种方法 : sonetworkanalyst. FindTSPPath(objNetworkDataset As sodatasetvector, nfromnode As Long, objnodes As soselection, ntonode As Long, [ForwardCostField], [BackwardCostField]) As soselection 参数说明 : objnetworkdataset: 用作网络分析的数据集 ; nfromnode: 起始节点编号 ; objnodes: 结果路径中必须经过的节点 ; ntonode: 终止节点编号 ; [ForwardCostField]: 正方向 花费 字段, 默认为 SMResistanceA; [BackwardCostField]: 反方向 花费 字段, 默认为 SMResistanceB; 节点查询 网络分析中除了要查询路径, 经常也需要查询节点, 例如在自来水行业中的爆管分析中就需要查询阀门节点, 在 SuperMap Objects 中提供了 3 种节点查询方法 : 邻近节点查询 这个方法很简单, 但是很实用 指定一个节点, 查找所有与它直接相连的节点 sonetworkanalyst.findadjacentnodes(objnetworkdataset As sodatasetvector, nfromnode As Long, ndirection As sepathfindingdirection) As Selection 参数说明 : objnetworkdataset: 用于网络分析的数据集 ; nfromnode: 指定节点编号 ndirection: 查找边的方向 ; 连接节点查询 邻近节点查询的是与已知节点直接相连的所有节点, 而连接节点查询可以指定查找的级数, 查询多级连接节点, 当连接节点之间的边数超过级数, 则不继续查找 sonetworkanalyst.findconnectednodes(objnetworkdataset As sodatasetvector, nnode As Long, ndirection As sepathfindingdirection, nlevel As Long) As Selection 参数说明 : 150

161 第 4 章 SuperMap Objects 的空间查询与分析 objnetworkdataset: 用于网络分析的数据集 ; nnode: 指定节点编号 ndirection: 查找边的方向 ; nlevel: 查找级数 ; 关键节点查询 在网络数据集中, 两个节点之间有很多通道, 这些通道由另一些节点和边连接而成, 这些节点中有一些被称作关键节点, 断开这些关键节点, 则已知的两个节点的所有连通关系将全部被断掉 sonetworkanalyst.findcriticalnodes(objnetworkdataset As sodatasetvector, nfromnode As Long, ntonode As Long, ndirection As sepathfindingdirection) As Selection 参数说明 : objnetworkdataset: 用作网络分析的数据集 ; nfromnode: 起始节点编号 ; ntonode: 终止节点编号 ; ndirection: 查找边的方向 ; 4.6 栅格分析 GRID 模型是对地理空间分布现象进行表达的一种网格模型, 网格的每个角点都有一个值, 代表该点的属性, 角点的平面空间位置隐含在行 列坐标中 SuperMap Objects 的 GRID 分析包括 :GRID 数据集的裁剪,GRID 建模,GRID 生成等值线 面和三维正射影像数据集 sogridanalyst ( 栅格分析 ) Aggregate:Boolean Clip:Boolean ClipEx:Boolean GridToIsoline:Boolean GridToOrthoImage:Boolean GridToRegion:Boolean LineToGrid:Boolean Point3DToGrid:Boolean RegionToGrid:Boolean Section:Boolean TINToGrid:Boolean Volume:Double LineToDEM:Boolean 图 4.18 GRID 分析对象结构图 151

162 SuperMap Objects 开发教程 GRID 数据集的裁剪 GRID 数据集的裁剪是对栅格数据集的裁剪, 在意义上和操作上与 sooverlayanalyst 的 Clip 相似, 区别在于 sooverlayanalyst 的 Clip 的对象是矢量数据集, 用来裁剪的对象可以是矢量数据集 记录集和面对象, 而 sogridanalyst 的 Clip 和 ClipEx 用来裁剪的对象只能是面对象 下面是 sogridanalyst 的两种裁剪方法 : sogridanalyst.clip(objsrcdataset As sodatasetraster, objclipbounds As sorect, objdestdatasource As sodatasource, strnewdatasetname As String) As Boolean sogridanalyst.clipex(objsrcdataset As sodatasetraster, objclipregion As sogeoregion, objdestdatasource As sodatasource, strnewdataset As String, BackValue) As Boolean 两种方法的区别在于 ClipEx 在裁剪之后, 自动给裁剪区域填充用户给定的颜色, 而 Clip 没有这个过程, 因此裁剪后的视觉效果不一样 点线面数据集生成 GRID SuperMap Objects 的 GRID 建模方法有如下几种 : 从三维点 从线数据集和从面数据集生成 GRID 以及从 TIN 生成 GIRD 在由点 线和面数据集生成 GRID 的方法中,GRID 网格角点的属性值由用户任意指定, 这样用户可根据自己的需要来构建 GRID 模型, 如属性可以是土壤类型 密度值 高程 温度 湿度等 属性甚至可以是对象的标识号 拓扑误差 线的长度 面的面积 周长等在 GRID 模型中不具有实际意义的字段 如果属性是高程, 那么得到的 GRID 模型就是一种数字高程模型 ( 即一种 DEM,DEM 的表达除了 GRID 模型外, 还有 TIN 等值线和趋势面等模型 ) 在实际工作中, 我们常用的处理方法是先用各种插值方法 ( 反距离权 (IDW) 线性 双线性 样条 Kriging 插值 ) 获取 GRID 网格角点的属性值, 然后再用三维可视化技术将 GRID 模型在计算机上表现出来, 以便人们进行观察和分析 我们将在下一小节里介绍如何用面数据集生成 GRID, 在此就不作更多的介绍, 读者可以根据下面代码的思路自己编写从其它数据集生成 GRID 的过程 下面是从其它数据集生成 GRID 的方法 : sogridanalyst.linetogrid(objsrcgriddataset As sodatasetvector,fieldname As String, objdatasource As sodatasource,strgridname As String,dResolution As Double) sogridanalyst.point3dtogrid(objpoint3ddatasetas sodatasetvector,objdatasource As sodatasource,strgriddatasetname As String,dResolution As Double) sogridanalyst.regiontogrid(objsrcgriddataset As sodatasetvector,strfieldname As String, objdatasource As sodatasource,strgridname As String,dResolution As Double) 152

163 第 4 章 SuperMap Objects 的空间查询与分析 sogridanalyst.tintogrid(objsrcgriddataset As sodatasetvector, objdatasource As sodatasource,griddtname As String,dResolution As Double) sogridanalyst.linetodem(objsrclinedataset As sodatasetvector,fieldname As String, objdatasource As sodatasource,strdemname As String,dResolution As Double) GRID 生成等值线 面和三维正射影像数据集 将 GRID 生成等值线通常的做法是首先生成格网 DEM( 格网 DEM 是 GRID 模型中的一种 ), 然后再由格网 DEM 生成等值线 下面是一个用来由 TIN 数据集生成 DEM 的界面, 通过参数设置来生成 DEM 数据集 图 4.19 TIN 数据集生成格网 DEM 交互界面 下面的代码实现 TIN 数据集到 GRID 数据集的转变 ( 即 GRID 数据集的建模方法之一 ) Dim objgridanalyst As New sogridanalyst Dim objdestdtg As sodataset Dim objds As sodatasource Dim objsourcedtv As sodataset Dim bresult As Boolean Set objds = SuperWorkspace.Datasources.Item( Tin ) Set objsourcedtv = objds.datasets.item( Tin ) // 取得源矢量数据集 bresult = objgridanalyst.tintogrid(objsourcedtv, objds, DEM,8.100) If bresult = False Then MsgBox " 转换失败!", vbinformation End If 下面是 TIN 和生成的 DEM 数据集的效果图 : // 开始转换 153

164 SuperMap Objects 开发教程 图 4.20 TIN 数据 图 4.21 生成的格网 DEM 效果图 在生成的 DEM 数据集的基础上就可以生成等值线图了 Dim objsourcedtr As sodatasetraster Set objsourcedtr = objds.datasets( DEM ) bresult = objgridanalyst.gridtoisoline(objsourcedrr, objds, Counter,22,3) If bresult = False Then MsgBox " 转换失败!", vbinformation End If 下面是转换成功后叠加到原来的面数据集上的效果图 : 154

165 第 4 章 SuperMap Objects 的空间查询与分析 图 4.22 DEM 生成等值线与源图层的分析结果图 GRID 生成面数据集和生成三维正射影像数据集的方法与生成等值线的方法类似, 在此就不作更多的介绍, 留给读者自己去练习 下面是 GRID 数据集生成其它两种数据集的方法 : sogridanalyst.gridtoregion(objsrcgriddataset As sodatasetraster, objdstregiondataset As sodatasetvector) sogridanalyst.gridtoorthoimage(objgriddataset As sodatasetraster, objdatasource As sodatasource, strimagename As String, objcolorset As socolors) 4.7 思考与练习 1 理解几何对象的各种空间位置关系 制作一个通用的空间查询工具, 将所有的空间查询模式集成为一个系统, 同时将查询到的几何对象的属性显示出来, 根据选中的属性数据定位到对应的几何对象 ; 2 思考 GIS 的叠加分析中两个数据集的区别和注意事项, 编程实现多种叠加分析 ; 3 设计缓冲分析对话框, 根据介绍时象完整的缓冲分析功能 ; 4 理解网络分析和 Grid 分析, 思考这两种分析适用于哪些行业的哪些用途, 编程实现这些功能 ; 5 试着做一个空间 属性条件联合查询的例子 6 选取一个网络数据集, 对其进行各种网络分析 7 采用本章提到的接口, 对空间分析的各种功能进行练习实现 155

166

167 第 5 章在 SuperMap Objects 中处理拓扑关系 介绍 拓扑关系的创建和处理拓扑关系是 GIS 软件重要的功能模块, 也是 GIS 区别于传统 CAD 和可视化软件的特征之一 本章介绍 SuperMap Objects 组件式 GIS 中处理拓扑关系的控件 SuperTopo 目标 通过本章的学习, 您将能掌握以下的内容 : 了解 SuperMap Objects 具有的拓扑处理功能 ; 学会使用 SuperTopo 控件进行拓扑关系处理 5.1 SuperTopo 控件简介 拓扑关系是地理对象在空间位置上的相互关系, 如两个节点之间的连通性 ( 关于拓扑关系的详细说明, 请参考 SuperMap Objects 系列教程 理解 SuperMap Objects GIS ), 空间实体之间的拓扑关系是 GIS 空间分析和决策的基础, 是否具有高效 可靠的拓扑处理功能成为衡量 GIS 软件的重要标准 SuperMap Objects 将常用的拓扑处理功能封装为一个控件 SuperTopo, 虽然 SuperTopo 控件是 SuperMap Objects 组件式 GIS 中相对独立的一个控件, 但是, 它的地位也十分重要, 是 SuperMap Objects 实现 GIS 高级分析功能必不可少的功能模块 SuperMap Objects 内置的拓扑处理功能包括 : 去冗余顶点 短悬线 重复线, 碎多边形的检查 显示和清除 ; 节点类型识别 ( 普通节点 假节点和悬节点 ); 弧段交叉和自交叉 ; 长悬线延伸 ; 假节点合并 ; 多边形建立 ; 网络关系建立 SuperTopo 控件的结构如下图所示 : 157

168 SuperMap Objects 开发教程 AboutBox BuildNetwork:Boolean BuildPolygons:Boolean CheckErrors:Boolean Clean:Boolean RegisterForRuntime:Boolean SuperTopo ( 拓扑控件 ) CleanIdenticalVertices:Boolean CleanOvershootDangles:Boolean CleanRepeatedLines:Boolean ExtendDangleLines:Boolean IntersectLines:Boolean MergePseudoNodes:Boolean MergeRedundantNodes:Boolean Filter:soTopoBuildFilter 图 5.1 SuperTopo 控件对象结构图 5.2 使用 SuperTopo 控件进行拓扑处理 利用 SuperTopo 控件不仅可以对一个线数据集或者网络数据集进行去除短悬线 合并假节点等拓扑处理, 而且可以生成具有严格拓扑关系的网络数据集或者面数据集 在 SuperMap Objects 中, 拓扑处理的对象为一个矢量数据集 在进行拓扑处理时, 需要做的是创建一个 SuperTopo 控件的实例, 设置 SuperTopo 控件的处理参数, 设置待处理数据集与拓扑处理有关的属性, 设置好这些参数以后, 调用 SuperTopo 控件的相应方法即可 下面将拓扑处理用到的属性和方法分别说明 : 图 5.2 全自动拓扑处理界面 158

169 SuperTopo 控件的属性 : 第 5 章在 SuperMap Objects 中处理拓扑关系 Boolean CleanIdenticalVertices: 是否进行去除冗余点的拓扑处理 Boolean CleanOvershootDangles: 是否进行删除短悬线的拓扑处理 Boolean SuperTopo.CleanRepeatedLines: 是否要进行去除重复线的拓扑处理 Boolean SuperTopo.ExtendDangleLines: 是否进行延伸长悬线的拓扑处理 Boolean SuperTopo.IntersectLines: 是否进行弧段求交的拓扑处理 Boolean SuperTopo.MergePseudoNodes: 是否进行合并假节点的拓扑处理 Boolean SuperTopo.MergeRedundantNodes: 是否进行合并冗余点的拓扑处理 说明 : 设置上述属性后, 调用 SuperTopo 的 Clean 方法, 就能立即进行相应的处理 SuperTopo 的方法 : Boolean SuperTopo.Clean(objSrcDataset As Object): 用于对一个线或者网络数据集进行弧段求交 去除冗余点 合并邻近点 去除重复线 合并假节点 去除短悬线 长悬线延伸等拓扑处理操作 成功返回 True, 失败返回 False 参数为要进行拓扑处理的线或网络数据集对象 Boolean SuperTopo.BuildNetwork(objSrcDataset As Object,objDestDataSource As Object,strDestDataset As String): 用于对一个线或者网络数据集进行网络拓扑处理, 生成一个网络数据集 参数 objsrcdataset 为建立网络拓扑的源数据集, 只能是线数据集或网络数据集 ;objdestdatasource 为存放生成的网络数据集的数据源 ;strdestdataset 为要生成的网络数据集的名称 Boolean SuperTopo.BuildPolygons(objSrcDataset As Object,objDestDataSource As Object,strDestDataset As String): 用于对一个线或者网络数据集进行多边形拓扑处理, 生成一个面数据集 参数 objsrcdataset 为进行多边形拓扑处理的源数据集, 只能是线数据集或网络数据集 ;objdestdatasource 为存放生成的网络数据集的数据源 ; strdestdataset 为要生成的网络数据集的名称 Boolean SuperTopo.CheckErrors(objSrcDataset As Object): 用于检查线或者网络数据集中的拓扑错误, 并把结果记录在线或网络数据集的 SmTopoError 字段中 参数 objsrcdataset 为要检查拓扑错误的数据集 矢量数据集中与拓扑处理有关的属性 ( 容限 ): Double sodatasetvector.tolerancedangle: 指定建立拓扑关系时可以删除的过头线的最大长度 Double sodatasetvector.tolerancefuzzy: 指定数据集的模糊 (Fuzzy ) 容限, 即顶点 (Vertex) 或结点 (Node) 之间的最小距离 也就是说, 在此距离之内的两个点可以视 159

170 SuperMap Objects 开发教程 为重合 Double sodatasetvector.tolerancegrain: 指定数据集的颗粒 (Grain) 容限, 即圆 弧线 曲线转换成折线时的取点密度 Double sodatasetvector.tolerancenodesnap: 指定数据集中结点容限, 即当两个点的距离可以认为一点的最小距离 Double sodatasetvector.tolerancesmallpolygon: 指定数据集的最小多边形容限, 即建立拓扑关系时可以删除的最大碎多边形的面积 SuperTopo 库中新增一个对象 sotopofilter, 用来进行拓扑操作时的打断, 符合条件的弧段将不被打断 关于 SuperTopo 的具体使用方法的说明和示范工程, 您可以参考 SuperMap Objects 系列教程 SuperMap Objects 程序员参考手册 和 SuperMap Objects 示范工程库 中的 Topo.vbp 5.3 思考与练习 1 示范工程, 制作一个拓扑处理的工具 2 您认为 GIS 中拓扑处理功能还应该向什么方向改进? 160

171 介绍 第 6 章图例控件 SuperLegend 图例是地图的有机组成部分, 它是地图元素的说明, 是理解地图必备的辅助工具 在 SuperMap Objects 组件式 GIS 中, 图例以一个图例控件的形式出现 本章将向您介绍该图例控件 SuperLegend 目标 通过本章的学习, 您将掌握以下内容 : SuperLegend 控件具有的功能 ; 如何让图例控件显示正确的内容 ; 使用图例控件的其他功能 6.1 SuperLegend 控件简介 SuperLegend( 图例 ) 控件是 SuperMap Objects 组件式 GIS 的有机组成部分, 它的主要功能是提供地图的说明, 是进行地图解释的必备工具 SuperMap Objects 的图例控件不但可以正确显示地图窗口的图例, 而且提供了诸如图层管理, 专题图向导的辅助功能, 为您管理地图提供了一个方便实用的工具, 图例控件在应用程序中的外观大致如下图所示 : 161

172 SuperMap Objects 开发教程 图 6.1 SuperLegned 控件外观图 图例控件是 SuperMap Objects 组件式 GIS 中相对独立的一个控件, 它只与 SuperMap 控件有联系 SuperLegend 是一个十分智能化的控件, 只要与某一个地图窗口关联成功以后, 无需用户设置就能正确的显示相应地图窗口的图例 SuperLegend 控件十分小巧, 仅有为数不多的方法 属性和事件 ( 您在对象浏览窗口中看到的一些方法 事件和属性是 VB 为每一个控件加上的标准的成员 ), 其结构如下图所示 : AboutBox Clear:Boolean Connect:Boolean Disconnect Expand Refresh EditableLayerChanged Modified SuperLegend ( 图例控件 ) 图 6.2 图例控件结构图 Appearance:Integer BackColor:OLE_COLOR EditLabels:Boolean Font:IFontDisp ForeColor:OLE_COLOR HasButtons:Boolean HasLines:Boolean ItemDragAndDrop:Boolean PopupMenu:Boolean SingleExpand:Boolean 162

173 第 6 章图例控件 SuperLegend 6.2 连接 SuperLegend 与激活的地图窗口 图例必须依附于某个特定的地图, 在 SuperMap Objects 中, 需要将 SuperLegend 与 SuperMap 控件的某个实例关联 具体关联时是通过 SuperLegend 控件的 Connect 方法进行的 具体形式为 : Boolean SuperLegend.Connect(objSuperMapCtrl As Object) 参数 objsupermapctrl 为要显示图例的地图控件实例, 连接成功以后, 图例控件就能正确显示地图的有关信息 注意, 关闭图例控件时, 要断开与地图窗口的连接, 否则会发生不可预料的错误 以一个多文档的 VB 工程为例 : 假设 MDI 主窗体为 frmmain,mdi 子窗体为 frmmapwin, 该窗体中包含一个 SuperMap 控件的实例, 图例窗口为 frmlegend, 该窗口包含一个 SuperLegend 控件的实例 为了让图例窗口正确显示地图的内容, 可以在 frmmapwin 的 Active 事件中添加如下的代码 : ( 注 : 本章的例子程序参考示范工程 Legend.vbp) Private Sub Form_Activate() ' 其他处理代码 'frmlegend.superlegend1.connect Me.SuperMap1 End Sub 本节的例子只是一个演示, 在实际应用中, 还需要做些别的工作, 例如地图中是否有图层等等 SuperLegend 控件提供一系列的属性用来设置图例控件的外观和行为, 如是否显示连接线, 是否允许编辑标题, 设置标题的字体, 是否弹出右键快捷菜单等等 关于 SuperLegend 的外观设置, 请参考 SuperMap Objects 系列教程 SuperMap Objects 程序员参考手册 6.3 SuperLegend 控件的其他功能 专题图向导 SuperLegend 控件不仅具有显示地图窗口的图例的功能, 而且集成图层管理和创建专题图向导功能, 使用 SuperLegend 控件的右键快捷菜单就能完成繁杂的专题图设置 ( 编程实现专题图请参考第三章第四节 ) 163

174 SuperMap Objects 开发教程 图 6.3 SuperLegend 控件的其他辅助功能 响应 SuperLegend 的事件 SuperLegend 控件开放了两个事件, 即 EditableLayerChanged(nIndex As Long)( 当改变可编辑图层时触发 ) 和 Modified() 事件 ( 当 SuperLegend 中的设置改变时触发 ), 当使用 SuperLegend 辅助管理地图窗口时, 必须正确处理这两个事件 通常, 我们只需在 Modified 事件中刷新与图例控件连接的地图窗口, 而通过 EditableLayerChanged 事件返回可编辑图层的索引 进一步, 用该索引作为参数调用 solayers 对象的 SetEditableLayer(Index) 方法, 我们就可以轻松地设置或指定地图窗口中的可编辑图层 SuperMap Objects 中还增加了另外两种风格的图例控件, 分别是 SuperLegendComboBox 和 SuperLegendList, 功能较 SuperLegend 更加简单些 6.4 思考与练习 1 您认为图例控件还应该具备那些功能 2 利用图例控件提供的操作功能进行相应的操作 164

175 第 7 章地图排版工具 SuperLayout 介绍 SuperLayout 控件是 SuperMap Objects 的地图排版工具, 它提供了创建标题艺术字体 复杂图框 表格 接图表 责任栏 模板和模板嵌套等灵活的地图排版功能 本章将以实现一个完整布局的编程顺序为讲解顺序, 来介绍对象之间的相互关系 接口的说明和使用 目标 通过本章的学习, 您将能掌握如下内容 : SuperLayout 是一个桌面排版工具 ; SuperLayout 中各个对象之间的相互关系 ; 在 SuperLayout 中如何创建布局元素 ( 地图 图例 标题等 ); 在 SuperLayout 中实现布局排版 ; SuperLayout 的基本操作 ( 放大 缩小 漫游等 ); 在 SuperLayout 中实现布局的打印 7.1 SuperLayout 控件的对象结构图 从 SuperLayout 控件的对象结构图来看, 处于树状结构最顶端的有两个对象, 它们分别是 solytelements 和 solytselection 一个布局就是一个 solytelements 所有布局元素的集合 ; solytselection 是 solytelements 的子集, 是布局中被选择了的一部分元素的集合, 即布局元素的选择集 solytelements 和 solytselection 的成员就是 solytelement, 每一种类型的布局元素都是一个 solytelement,superlayout 的管理方式和 SuperWorkspace 的管理方式基本相同, 都体现了集合与个体的关系 165

176 SuperMap Objects 开发教程 solytarc ( 圆弧 ) solytdirection ( 方向标 ) solytgroup ( 组 ) solytlinesect ( 线段 ) solytarttext ( 艺术字 ) solytellipse ( 椭圆 ) solytroundrect ( 圆角矩形 ) solytpage ( 布局纸面对象 ) Page solytrulerlines ( 布局标尺线集合 ) RulerLines Item SuperLayout ( 布局控件 ) solytrulerline ( 布局标尺线 ) Elements Selection solytelements ( 布局元素集合 ) solytselection ( 布局选择集 ) Item Item solytelement ( 布局元素 ) solyttext ( 文本 ) solytpolyline ( 折线 ) solytmapscale ( 地图比例尺 ) solytmap ( 地图 ) solytpolygon MapBorder ( 多边形 ) solyttable ( 表格 ) solytmapborder ( 地图边框 ) 图 7.1 布局控件对象关系结构图 solytlegend ( 图例 ) solytpoint ( 点对象 ) solytrect ( 矩形 ) solytpicture ( 图片 ) 7.2 SuperLayout 与 SuperWorkspace 建立连接 在 SuperMap Objects 的数据组织结构中,SuperWorkspace 担任着数据和资源仓库的角色, 它管理着 DataSources Maps Layouts Resource, 其中 Maps 和 Layouts 不作为单独的结构保存在一个单独的文件里, 而是作为一种视图保存在 SuperWorkspace 中, 用唯一的名字或索引号来标识 (SuperLayout 与 SuperWorkspace 的关系请见图 7.2) Layouts 由 SuperLayout 创建,Layouts 中显示的地图来自于 Maps, 在 Layouts 中仅记录引用 Maps 的索引 每个布局元素的显示状态 因此 SuperLayout 与 SuperWorkspace 之间有密切的关系, 那么在使用 SuperLayout 之前,SuperLayout 必须与 SuperWorkspace 建立连接, 语法如下 : SuperLayout.Connect SuperWorkspace.Handle( 或 Object) 另外要注意两点 :(1) 既然 SuperLayout 中显示的地图来自于 SuperWorkspace 的 Maps, 那 166

177 第 7 章地图排版工具 SuperLayout 么在布局之前必须在 SuperWorkspace 中已经存在 Map;(2) 完成布局排版之后首先要保存这个 Layout, 然后保存 SuperWorkspace, 这样 Layout 才真正被保存了 SuperWorkspace ( 工作空间控件 ) Layouts Remove:Boolean RemoveAll:Boolean solayouts ( 布局名集合 ) Count:Long Item:String 图 7.2 工作空间与布局集合对象关系图 7.3 布局环境的设置 布局环境的设置直接影响到是否可以完成一个精美的布局,SuperLayout 提供的布局环境设置选项包括显示刻度尺 显示分页符 显示网格 网格捕捉以及设置网格尺间隔长度和页面大小, 如图 7.3 所示的 布局显示选项, 可以通过这个方法调出这个对话框 : SuperLayout.LayoutSetup 167

178 SuperMap Objects 开发教程 图 7.3 布局控件属性设置对话框 这个对话框是 SuperLayout 弹出的, 在其上进行的修改在点击 确定 按钮的时候就会直接更新到布局环境上, 不需要任何二次开发程序来完成这个工作 当然这些选项的修改在控件也提供了直接修改的接口, 列表如下 : SuperLayout 布局对象.HasRuler: 显示刻度尺,Boolean.HasScrollBar: 显示滚动条,Boolean.GridVisible: 显示网格,Boolean.GridSnapable: 网格捕捉,Boolean.PropertyPageEnabled: 使用对象属性页,Boolean.ShortcutEnabled: 使用快捷键,Boolean.DragRulerLine: 使用标尺线,Boolean.AutoSelected: 新生成对象自动被选择,Boolean.PaperSize: 打印纸面类型.PaperWidth: 打印机纸面宽度,Integer.PaperLength: 打印机纸面高度,Integer.Page.BackColor: 打印纸面背景色,OLE_COLOR.Page.GridColor: 打印纸面网格颜色,OLE_COLOR 除了以上对 SuperLayout 的相关属性的设置外, 控件还提供了 3 个对象, 更进一步完善布局环境 1. solytpage 布局中页面对象 通过 SuperLayout.Page 可以返回一个 solytpage 类型的对象变量, 这个对象提供了修改 Page 的属性 :.Size: 页面类型, selytprinterpapersize.pagewidth: 页面宽度,Double.PageHeight: 页面高度,Double.Units: 页面单位,seLytPageUnits.BackColor: 页面背景颜色,OLE_COLOR.GridColor: 网格颜色,OLE_COLOR.GridVisible: 网格是否可见,Boolean.Orientation: 页面朝向, selytorientation 2. solytrulerlines 标尺线集合对象 通过 SuperLayout.RulerLines 可以返回一个 solytrulerlines 类型的对象变量, 这个集合对象提供了管理和生成 solytrulerline( 标尺线对象 ) 的方法和属性 ;.Count: 标尺线个数,Long.Item(Long Index): 得到指定索引的标尺线对象,soLytRulerLine.CreateRulerLine(seLytRulerLine Type,Double Position): 生成标尺线,soLytRulerLine.RemoveAll: 删除所有标尺线,Boolean.RemoveAt(Long Index,[Count]): 删除指定索引的标尺线,Boolean 3. solytrulerline 标尺线对象 168

179 第 7 章地图排版工具 SuperLayout 通过 solytrulerlines.item(index) 和 solytrulerlines.createrulerline(type,position) 可以返回一个 solytrulerline 类型的对象变量, 使用这个变量您可以在布局的任何位置添加标尺线, 以此来提高布局的精确性 其属性如下 :.Type: 标尺线的类型,seLytRulerLine.HighLight: 标尺线是否高亮显示,Boolean.HighLightColor: 标尺线高亮显示的颜色,OLE_COLOR.Position: 标尺线的位置,Double 7.4 创建和编辑布局元素 布局元素 (solytelement) 是布局 (solytelements) 的组成者, 因此控件提供的布局元素是否丰富是很重要的,SuperLayout 提供了 16 种不同类型的布局元素 由于布局元素 (solytelement) 是通过布局元素集合 (solytelements) 来管理的, 那么我们有必要先介绍一下布局元素集合对象 solytelements 通过以下方法得到这样的对象 : SuperLayout.Elements: 返回布局元素集合对象,soLytElements solytelements 的属性和方法 :.Count: 布局元素的个数,Long.Item(Long Index): 返回指定索引号的布局元素,soLytElement.CloneElement(soLytElement objlytelement): 拷贝布局元素,soLytElement.CreateElement(seLytObjType Type): 生成布局元素,soLytElement.CreateLegend(soLytMap objmap): 生成已有布局地图的图例,soLytGroup.CreateSoObject(string strobjectname): 创建对象,soLytElement.MoveBottom(Variant Index): 将指定索引号的布局元素移到最底层,Boolean.MoveDown(Variant Index): 将指定索引号的布局元素下移一位,Boolean.MoveTo(Variant Index, Long nindex): 将指定索引号的布局元素移到指定位置,Boolean.MoveUp(Variant Index): 将指定索引号的布局元素移到顶层,Boolean.Remove(Long Index): 删除指定索引号的布局元素,Boolean.RemoveAll: 删除所有布局元素 solytelements 还提供了改变布局元素叠置顺序的方法, 将在第六节的布局排版中详细介绍 创建布局元素 在 SuperLayout 中创建布局元素有两种方法 : 通过设置 SuperLayout.LytAction=seLytActionType, 然后在布局窗口中拉框即可画出一个设置类型的布局元素, 以及该布局元素的属性设置对话框, 将其中必需的属性设置完成, 这时您就已经创建了设置类型的布局元素 SuperLayout.LytAction=sclytActArc: 弧段 SuperLayout.LytAction=sclytActArtText: 艺术字 SuperLayout.LytAction=sclytActDirection: 方向标 SuperLayout.LytAction=sclytActEllipse: 椭圆 169

180 SuperMap Objects 开发教程 SuperLayout.LytAction=sclytActLegend: 图例 SuperLayout.LytAction=sclytActLinesect: 直线 SuperLayout.LytAction=sclytActMap: 地图 SuperLayout.LytAction=sclytActPicture: 图片 SuperLayout.LytAction=sclytActPoint: 点 SuperLayout.LytAction=sclytActPolygon: 多边形 SuperLayout.LytAction=sclytActPolyLine: 折线 SuperLayout.LytAction=sclytActRect: 矩形 SuperLayout.LytAction=sclytActRoundRect: 圆角矩形 SuperLayout.LytAction=sclytActScale: 比例尺 SuperLayout.LytAction=sclytActTable: 表格 SuperLayout.LytAction=sclytActText: 文字 下面以创建地图布局元素为例详细说明如何创建布局元素 设置 SuperLayout.LytAction = sclytactmap; 用鼠标在布局窗口上按下左键, 拖出一个矩形框, 系统会自动弹出如下的属性对话框 ( 如图 7.4 所示 ), 在地图下拉框中选择要进行布局的地图 ( 注 : 工作空间中必须保存有地图 ), 这是必选项, 其他的如边框设置 ( 如图 7.5 所示 ) 也可以在这个对话框中完成, 然后按下 确定 按钮 ; 图 7.4 地图布局元素属性对话框 170

181 第 7 章地图排版工具 SuperLayout 图 7.5 地图布局元素边框属性设置对话框 需要说明的是比例尺和图例的创建方式有一点不同, 因为这两个布局元素是与布局地图的属性相关的, 所以在设置了相应的 LytAction 之后, 绘制布局元素之前要先选择一个布局地图, 那么所绘制的比例尺和图例就是说明该布局地图的显示比例尺和该地图的图例内容 通过 soelements.createelement(selytelementtype Type) 方法用程序创建布局元素 布局元素 solytelement 用.Type 来标识不同类型, 这里以创建地图对象为例说明如何使用 CreateElement 方法 程序背景介绍 : 在窗体上有一个 SuperLayout 控件, 取名为 SuperLayout1; 在工作空间中已经有保存好的地图, 地图名为 World Dim objrect As New sorect Dim objlytmap As solytmap ====== 定义地图布局元素的尺寸 ======= objrect.top = 150 objrect.bottom = objrect.top objrect.left = 150 objrect.right = objrect.left ====== 创建地图布局元素 ======= Set objlytmap = SuperLayout1.Elements.CreateElement (sclytmap) objlytmap.setposition objrect objlytmap.mapname = "World" objlytmap.viewentire ====== 刷新布局窗口 ======= SuperLayotu1.Refresh 171

182 Set objrect = Nothing Set objmap = Nothing SuperMap Objects 开发教程 从上面的示范程序中可以看出使用 CreateElement 方法创建了一种指定类型的布局元素, 就可以设置其相关的属性了, 不同类型的布局元素有不同的属性, 那么根据您的布局需要分别进行设置, 没有设置的属性按照 SuperLayout 预定义的缺省值执行 其中需要说明的有三点 : 地图布局元素 布局中使用的地图是来源于工作空间的, 相当于布局只是地图的容器, 不提供对地图显示效果的修改功能, 但是对于需要布局的地图的范围却是可以修改的,soLytMap 提供了这样的方法 : solytmap.clipregion as sogeoregion: 切割指定范围的地图 通过这个方法您可以切割原始地图中的任意范围用来布局打印出图 比例尺和图例布局元素的创建, 如上面曾经提过这两个布局元素是与布局地图的属性密切相关的, 因此在创建的时候要增加一个步骤 : solytmapscale.connect(objlytmap as solytmap) solytlegend.connect(objlytmap as solytmap) SoLytElement 虽然根据 Type 不同有不同的属性, 但是对于这个布局来说, 它们又具有一些共同的属性和方法如下 :.Bounds: 布局元素的范围,soRect.Editable: 是否可编辑,Boolean.Style: 风格.Tag: 标识.Type: 布局元素类型.AlignToGrid: 将布局元素对齐到布局网格.HitTest(x as Long,y as Long): 测试给定的位置对象是否呈现被激活选中的状态,Boolean.Move(xOffset as Long,yOffset as Long): 移动布局元素.SetPosition(newposition as sorect): 设置布局元素的位置.ShowPropertyDlg: 显示布局元素的属性对话框 编辑布局元素 在 SuperLayout 中, 首先提供了基本的编辑功能, 例如布局元素的剪切 复制和粘贴 SuperLayout.Selection.Cut: 剪切 SuperLayout.Selection.Copy: 拷贝 SuperLayout.Selection.Paste: 粘贴 ( 需要有 Cut 或 Copy 的前提过程才能有效 ) 另外更重要的,SuperLayout 提供了三种修改布局元素属性的方式 : 通过系统提供的属性对话框直接编辑 SuperLayout.PropertyPageEnabled as Boolean: 是否允许双击弹出属性对话框, 默认为 false 如果该属性设置为 True, 那么在编辑的时候只要双击需要编辑的布局元素, 会弹出其属性对话框, 完成修改之后, 按下 确定 按钮, 修改的内容就会自动刷新到布局窗口中, 不需要 172

183 第 7 章地图排版工具 SuperLayout 任何程序来辅助 ; 通过 solytelement.showproperdlg 方法 使用这个方法同样可以调出布局元素属性对话框, 在其中进行的修改同样能够自动更新到布局窗口中 ; 设置 solytelement 的属性 在 solytelement 属性对话框中可以修改的属性在控件上同样提供了直接可以修改的接口, 用户可以自定义属性对话框, 来实现布局元素的编辑 SuperLayout 还有一个很重要的属性 ShortcutEnable, 是控制布局是否接受来自键盘的调整操作, 如果该属性为 True, 就可以使用 Shift+ 方向键进行组合来调整布局元素的尺寸 但是当 solytelement.enable=false, 那么所有的来自键盘和鼠标的编辑将全部失去作用 下面是两个重要的布局元素的属性对话框 : 图 7.6 图例布局元素属性对话框 173

184 SuperMap Objects 开发教程 图 7.7 比例尺布局元素属性对话框 7.5 布局的基本操作 在 SuperLayout 不仅需要实现类似 SuperMap 中的放大 缩小 漫游 选择等基本操作, 还要提供对其中布局的地图的放大 缩小 漫游 全幅显示等浏览操作, 在 SuperLytout 中是这样实现的 对布局的基本操作, 通过设置 SuperLayout.LytAciton 来改变布局操作状态 SuperLayout.LytAction = sclytactsel: 选择布局元素 SuperLayout.LytAction = sclytactzoomin: 放大布局元素 SuperLayout.LytAction = sclytactzoomout: 缩小布局元素 SuperLayout.LytAction = sclytactpalm: 漫游布局元素 对地图的浏览操作, 分为两个步骤 : 锁定地图布局元素 : 选择要进行浏览的地图布局元素, 得到一个 solytmap, 然后设置 solytmap.maphold as Boolean 当这个属性为 True 时, 地图锁定 ; 设置地图操作状态 : solytmap.mapaction=scmapactnull: 地图空操作 solytmap.mapaction=scmapactzoomin: 地图放大 174

185 第 7 章地图排版工具 SuperLayout solytmap.mapaction=scmapactzoomout: 地图缩小 solytmap.mapaction=scmapactzoomfree: 地图自由缩放 solytmap.mapaction=scmapactpan: 地图漫游 solytmap.viewentire: 地图全幅显示 7.6 布局排版 布局的排版主要指调整布局元素的相对位置, 使整个布局看起来更专业 更美观 位置调整包括叠置顺序和平面相对位置的调整 改变叠置顺序 solytelements.movetop(index as Long): 将指定索引的布局元素移至最上层 solytelements.moveup(index as Long): 将指定索引的布局元素上移一层 solytelements.movebottom(index as Long): 将指定索引的布局元素移至最下层 solytelements.movedown(index as Long): 将指定索引的布局元素下移一层 solytelements.moveto(index as Long,Indexto as Long): 将指定索引的布局元素移至指定的叠置顺序位置 相对位置调整 在 SuperLayout 中, 选中一个布局元素, 然后拖动它就可以直接改变它的布局位置 当 SuperLayout.ShortcutEnableds 属性设置成 True 时, 布局接受来自键盘的微调 (Ctrl 键与方向键组合使用 ) 但是如果布局元素不仅仅只有一个, 那么通过单个布局元素的位置调整来排版布局将是一个很繁琐的工作,SuperLayout 为了解决这个问题, 为我们提供了格式调整功能, 您可以将需要调整的布局元素任意组合和解除组合, 这样您的排版工作就变得轻松而且有趣了 组合布局元素 将需要编辑的布局元素组合成一个复杂布局元素, 为格式调整做好准备工作 ; SuperLayout.Selection.Group: 组合布局元素 解除复杂元素的组合 与组合布局元素相反, 是将组合起来的复杂布局元素打散, 还原为简单的布局元素, 这时您可以进行单个布局元素的位置调整 ; SuperLayout.Selection.Ungroup: 拆分布局元素组合 让选中的布局元素居中 这是相对于整个布局页来说的, 就是让元素处于当前布局页的水平或垂直方向上的中间 SuperLayout.Selection.CenterHorizontal: 水平居中 SuperLayout.Selection.CenterVertical: 垂直居中 使选中的元素按某一规则对齐 对齐规则有四种, 分别为 左对齐 右对齐 上对齐 下对齐 这四种对齐方式中都 175

186 SuperMap Objects 开发教程 是以最后选中的那个布局元素为对齐标准的 SuperLayout.Selection.AlignLeft: 左对齐 SuperLayout.Selection.AlignRight: 右对齐 SuperLayout.Selection.AlignTop: 上对齐 SuperLayout.Selection.AlignBottom: 下对齐 使选中的布局元素尺寸相等 尺寸相等就是指高 宽相等, 是以最后一个选中的元素为相等标准的 SuperLayout.Selection.SameWidth: 等宽 SuperLayout.Selection.SameHeight: 等高 使选中的布局元素间距相等 布局元素间距相等包括水平和垂直两个方向 SuperLayout.Selection.SpaceAcross: 水平方向间距相等 SuperLayout.Selection.SpaceDown: 垂直方向间距相等 7.7 管理布局对象 管理布局对象包括布局对象的保存为 保存 打开和删除 布局对象保存为 : 如果当前的布局对象是创建产生的, 那么保存的时候使用这个方法 ( 注 : 保存的布局对象必须通过保存工作空间才能实现物理保存, 如果保存了布局对象后没有保存工作空间, 则保存的布局对象会丢失, 下次打开时无法显示保存过的布局对象 ) SuperLayout.SaveLayoutAs(strNewName as String) as Boolean strnewname 可以是原有的地图对象名称, 那将覆盖原来的地图对象, 此时开发人员需要自己加判断代码 保存布局对象 : 如果当前布局对象是打开已有的布局, 进行修改之后要保存, 则使用这个方法 ( 注 : 保存的布局对象必须通过保存工作空间才能实现物理保存, 如果保存了布局对象后没有保存工作空间, 则保存的布局对象会丢失, 下次打开时无法显示保存过的布局对象 ) SuperLayout.SaveLayout As Boolean 打开布局对象 : 当前工作空间中必须至少有一个保存过的布局对象, 否则打开失败, 如果打开成功,SuperLayout 会自动关闭原来的布局 SuperLayout.OpenLayout(strLayoutName as String) As Boolean 删除布局对象 : 因为布局对象是由它所在的工作空间管理的, 因此删除布局对象的时候要通过工作空间得到一个布局对象集合, 然后执行删除操作 Dim objlyts As solayouts Set objlyts = Superworkspace.Layouts If objlyts Is Nothing Then Exit Sub 176

187 第 7 章地图排版工具 SuperLayout objlyts.remove Index(as Long): 删除布局对象集合中的指定索引的布局对象 objlyts.removeall: 删除布局对象集合中的全部布局对象 SuperLayout1.SaveLayoutAs MyMap 7.8 布局的打印输出 当您完成了地图的整体布局, 排版出一幅美观的地图后, 就需要对它进行打印输出, 把数字地图变成普通的地图 SuperLayout 提供了三个接口 ( 方法 ) 分别实现页面设置 打印设置和打印, 三个方法各弹出一个标准的对话框, 实现与用户的交互操作, 根据用户的要求进行打印 图 7.8 排版成功的布局对象效果图 页面设置 SuperLayout.PageSetup: 页面设置 将弹出页面设置的属性对话框 ( 如图 7.9 所示 ): 177

188 SuperMap Objects 开发教程 图 7.9 页面设置对话框 打印设置 打印设置是针对用户当前要打印的地图大小来设置打印的份数 打印的模式 纸张尺寸和纸张方向 前提条件是至少安装了一台打印机 SuperLayout.PrintSetup: 打印设置 将弹出打印设置的属性对话框 ( 如图 7.10 所示 ): 178

189 第 7 章地图排版工具 SuperLayout 图 7.10 打印设置对话框 打印 SuperLayout.PrintLayout: 打印将弹出属性对话框 ( 如图 7.11 所示 ) 图 7.11 打印对话框 179

190 SuperMap Objects 开发教程 7.9 思考与练习 1 较 SuperMap Objects 的地图排版控件 SuperLayout 与其它组件式 GIS 软件的优缺点 ; 2 思考 SuperLayout 中地图元素和 SuperMap 中地图对象的关系, 及图例与地图元素的关系 ; 3 制作一个排版制图工具 ; 4 您认为目前的排版工具还有那些需要改进的方面 180

191 第 8 章投影与投影转换 介绍 地图投影是地图学的数学基础, 也是 GIS 的基本要素之一, 本章将向您介绍 SuperMap Objects 中的投影处理机制和投影对象, 及如何利用 SuperMap Objects 提供的投影对象进行坐标投影和不同投影坐标系之间的转换 目标 通过本章的学习, 您将能掌握以下内容 : 地图投影的基本概念 ; SuperMap Objects 投影的基本模型 ; SuperMap Objects 投影转换方法 8.1 地图投影的基本概念 地图投影的实质是将地球椭球面上的经纬网按照一定的数学法则转移到平面上 地图投影就是在球面和平面之间建立点与点之间的函数关系的数学方法, 即将球面上任意一点的地理坐标 ( 纬度 φ, 经度 λ) 使用一定的数学法则转换为平面直角坐标 ( 纵坐标 x, 横坐标 y) 或极坐标 ( 动径 ρ, 动径角 δ) 因为球面上任一点的位置决定于它的经纬度, 所以实际投影时先将一些经纬线交点展绘在平面上, 再将相同经度的点连成经线, 相同纬度的点连成纬线, 构成经纬网 有了经纬网以后, 就可以将球面上的点, 按照其经纬度画在平面的相应的位置上 经纬网是绘制地图的基础, 它是地图的主要数学要素 181

192 SuperMap Objects 开发教程 B N3 A B C N3 A C N1 M4 N2 N3 M3 M2 (a) M1 N1 M4 M3 M2 M1 (b) 图 8.1 按经纬度将球面上的点转移到平面上 地图投影是要产生变形的, 不同投影方法的变形性质和变形分布规律也各不相同 不同用途的地图应该根据不同的制图区域的范围 地理位置和轮廓形状选择地图投影的类型 ( 关于地图投影的详细说明, 请参考 SuperMap Objects 基础教程 理解 SuperMap Objects GIS ) 8.2 SuperMap Objects 的投影对象 地图投影的数学模型是比较复杂的,SuperMap Objects 简化了地图投影的数学模型, 用如下数据模型处理地图投影和投影转换 182

193 第 8 章投影与投影转换 投影坐标系 投影方式投影参数坐标单位地理坐标系 大地参照系 中央经线 地球椭球体 图 8.2 SuperMap Objects 地图投影的数据模型 与上面的数据模型对应,SuperMap Objects 封装了一系列可编程对象, 用户既可以通过系统提供的界面设置投影的各个参数, 也可以通过程序自由控制 投影对象的关系和结构如下图 : sopjtranslator ( 投影转换器 ) sopjcoordsys ( 投影坐标系 ) GeoCoordSys PJParams sopjgeocoordsys ( 地理坐标系 ) sopjparams ( 投影参数 ) PJPrimeMeridian PJDatum sopjprimemeridian ( 中央经线 ) sopjdatum ( 大地参照系 ) PJSpheroid sopjspheroid ( 地球椭球体 ) 图 8.3 投影对象的关系和结构图 183

194 SuperMap Objects 开发教程 8.3 使用 SuperMap Objects 的预定义投影 下面我们用一个系统预定义投影系, 并在该投影系中转换 / 反转换一个点 : Private Sub MercatorPreDef_Click() ' 以下为适合南美洲区域墨卡托投影 Dim objpcs As New sopjcoordsys objpcs.type = scpcs_sad_1969_utm_19s If objpcs.isprojected Then Dim objpoint As New sopoint objpoint.x = objpoint.y = objpcs.forward objpoint ' 地理经纬坐标 --- 投影平面坐标 objpcs.inverse objpoint ' 投影平面坐标 --- 地理经纬坐标 Set objpoint = Nothing End If End Sub 8.4 使用 SuperMap Objects 自定义投影 预先定义几个相关对象 本小节定义的投影对象将为下面各小节用到 Dim objpcs As New sopjcoordsys Dim objdatum As New sopjdatum Dim objgcs As New sopjgeocoordsys Dim objprimem As New sopjprimemeridian Dim objspheroid As New sopjspheroid Dim objparams As New sopjparams 为便于理解, 下面列举全球六度带划分表以供参考 : 'Zone Central Meridian Longitude Range '1 177W 180W -174W '2 171W 174W -168W '3 165W 168W -162W '4 159W 162W -156W '5 153W 156W -150W '6 147W 150W -144W '7 141W 144W -138W '8 135W 138W -132W '9 129W 132W -126W '10 123W 126W -120W '11 117W 120W -114W '12 111W 114W -108W '13 105W 108W -102W '14 99W 102W - 96W '15 93W 96W - 90W '16 87W 90W - 84W '17 81W 84W - 78W '18 75W 78W - 72W '19 69W 72W - 66W '20 63W 66W - 60W '21 57W 60W - 54W 184

195 第 8 章投影与投影转换 'Zone Central Meridian Longitude Range '22 51W 54W - 48W '23 45W 48W - 42W '24 39W 42W - 36W '25 33W 36W - 30W '26 27W 30W - 24W '27 21W 24W - 18W '28 15W 18W - 12W '29 9W 12W - 6W '30 3W 6W - 0 '31 3E 0-6E '32 9E 6E - 12E '33 15E 12E - 18E '34 21E 18E - 24E '35 27E 24E - 30E '36 33E 30E - 36E '37 39E 36E - 42E '38 45E 42E - 48E '39 51E 48E - 54E '40 57E 54E - 60E '41 63E 60E - 66E '42 69E 66E - 72E '43 75E 72E - 78E '44 81E 78E - 84E '45 87E 84E - 90E '46 93E 90E - 96E '47 99E 96E -102E '48 105E 102E -108E '49 111E 108E -114E '50 117E 114E -120E '51 123E 120E -126E '52 129E 126E -132E '53 135E 132E -138E '54 141E 138E -144E '55 147E 144E -150E '56 153E 150E -156E '57 159E 156E -162E '58 165E 162E -168E '59 171E 168E -174E '60 177E 174E -180E 地图投影 本小节我们介绍如何使用 SuperMap Objects 的投影对象进行几种常用投影的开发编程 自定义墨卡托投影 下面我们对墨卡托投影进行自定义, 并对一个点进行 地理坐标到投影坐标, 投影坐标到地理坐标的转换 : Private Sub Mercator_Click() ' 以下所有类型 Type 为 -1 或 USER_DEFINED, 都表示是自定义 '1 定义中央经线 ( 用于地理坐标系对象 ) objprimem.type = scprimemeridian_user_defined ' = -1 自定义中央经线类型 objprimem.longitudevalue = -69 ' 中央经线值 185

196 SuperMap Objects 开发教程 '2 定义大地参照系( 用于地理坐标系对象 ) (1) 先定义椭球体 ( 用于大地参照系对象 ) objspheroid.type = -1 'SPHEROID_INTERNATIONAL_1967, 这是 UTM_SAD_1969 所用的椭球参数 objspheroid.axis = ' 半长径 objspheroid.flatten = 1 / ' E-03 扁率 (2) 再定义大地参照系类型 objdatum.type = -1 Set objdatum.pjspheroid = objspheroid ' objspheroid 为上一步中所定义的 '3 定义地理坐标系对象( 与投影参数对象一起, 加上别的参数用于投影坐标系对象 ) objgcs.type = -1 ' 地理坐标系类型为自定义 objgcs.coordunits = scudegree ' 坐标单位为度 Set objgcs.pjdatum = objdatum Set objgcs.pjprimemeridian = objprimem '4 定义投影参数对象( 与地理坐标系对象一起, 加上别的参数用于投影坐标系对象 ) objparams.centralmeridian = -69 ' 中央经线值 -- 第 19 带 ( 可以从上面附表查到 ) objparams.falseeasting = ' 坐标平移量 -- 水平方向 objparams.falsenorthing = ' 坐标平移量 -- 垂直方向 '5 现在可以开始定义投影坐标系对象了 objpcs.type = -1 ' 投影系为自定义类型 objpcs.projection = scprj_mercator ' 投影方式 -- 墨卡托投影 ( 等角正轴圆柱投影 ) objpcs.coordunits = scumeter ' 坐标单位 Set objpcs.pjparams = objparams ' 用到前面定义的投影参数对象 Set objpcs.geocoordsys = objgcs ' 用到前面定义的地理坐标系对象 '6 最后, 让投影坐标系对象发挥作用, 开始投影与反投影坐标变换 If objpcs.isprojected Then Dim objpoint As New sopoint objpoint.x = objpoint.y = objpcs.forward objpoint ' 地理经纬坐标 --- 投影平面坐标 objpcs.inverse objpoint ' 投影平面坐标 --- 地理经纬坐标 Set objpoint = Nothing End If End Sub 注意, 本例中有两个与中央经线有关的参数 : 一个是地理坐标系对象中的中央经线对象属性, 一个是投影参数对象的中央经线属性 前者是在地理坐标系中指定某根经线 ( 如经过格林威治 波哥大 巴黎的经线 ) 为中央经线 ( 相当于在数学上常用的平面直角坐标系 xoy 中指定经过原点的竖直 y 轴在哪里 ) 以确定对象的相对经度坐标, 后者是指定地理坐标系中的某一经线值为投影坐标系中 ( 如果采用分带投影, 则各带均有自己的中央经线 ) 的中心线 自定义通用横轴墨卡托投影 (UTM) 通用 ( 或称全球 ) 横轴墨卡托投影的自定义与上面墨卡托投影 ( 正轴 ) 的自定义差不多, 只需根据自己的需要将中央经线设置为指定的某一值即可 当然投影类型必须选择 scprj_transverse_mercator 常数, 关键代码如下 : 186

197 第 8 章投影与投影转换 objparams.centralmeridian = -69 ' 中央经线 -- 第 19 带 ( 可以从上表查 ) objparams.standardparallel1 = 0 ' 标准纬度 -- 变形为 0 的纬线, 在此是赤道 objparams.falseeasting = ' 坐标平移量 -- 水平方向 objparams.falsenorthing = ' 坐标平移量 -- 垂直方向 objpcs.type = -1 ' 投影系 ' 以上代码与上面的小节类似 objpcs.projection = scprj_transverse_mercator ' 投影方式 -- 通用横轴墨卡托投影 ( 等角横轴圆柱投影, 中央经线长度比为 ) 自定义高斯克吕格投影 高斯克吕格投影的自定义与上面几种投影的自定义差不多, 只需根据自己的需要将中央经线设置为指定的某一值即可 当然投影类型必须选择高斯克吕格投影类型常数, 关键代码如下 : objparams.centralmeridian = -69 ' 中央经线 --> 第 19 带 ( 可以从上表查 ) objparams.standardparallel1 = 0 ' 标准纬度, 变形为 0 的纬线, 在此是赤道 objparams.falseeasting = ' 坐标平移量 -- 水平方向 objparams.falsenorthing = ' 坐标平移量 -- 垂直方向 objpcs.type = -1 ' 投影系 ' 以上代码与上面的小节类似 objpcs.projection = scprj_gauss_kruger ' 投影方式 --- 高斯克吕格 ( 等角横轴椭圆柱投影 ) -- 将地球当作椭球体讲了三种投影的编程示例后, 有必要对它们进行一下小结 墨卡托投影是等角正轴圆柱投影, 横轴墨卡托投影顾名思义是等角横轴圆柱投影, 通用横轴墨卡托投影 (UTM) 是横轴墨卡托投影的一种变形, 其规定中央经线长度比为 , 在 6 度带内最大长度变形不超过 0.04%, 是美国编制世界各地军用地图和地球资源卫星象片所采用的投影 高斯克吕格投影与横轴墨卡托投影类似, 但投影面是椭圆柱, 因此为等角横轴椭圆柱投影, 其中央经线长度比也等于 自定义兰伯特等角圆锥投影 上面 3 个小节中的投影都属于圆柱或椭圆柱投影, 对投影参数对象中的第一 第二标准纬线的纬度值都设定为 0, 即变形为 0 的纬线为赤道, 实际上也用不到 兰伯特等角圆锥投影属于圆锥投影, 圆锥面可能与椭球体相切或相割, 它的标准纬线 ( 变形为 0 的纬线 ) 参数定义与上面几种稍有不同, 具有实际的意义, 需要用户指定 关键代码为 : objparams.standardparallel1 = 40 ' 双标准纬度之一 objparams.standardparallel2 = 24 ' 双标准纬度之二 objparams.centralmeridian = 74 ' 中央经线 --- 原点经度 objparams.centralparallel = 17 ' 最南端纬线值 --- 原点纬度 objpcs.type = -1 ' 自定义投影坐标系 objpcs.isprojected = False objpcs.projection = scprj_lambert_conformal_conic ' 投影方式 187

198 SuperMap Objects 开发教程 投影变换 本章第二节讲述的是如何进行地图投影, 即地理坐标系到投影平面直角坐标系的变换 ( 从投影坐标到地理坐标的反变换很简单, 使用 sopjcoordsys.inverse 方法即可 ), 实际工作中还存在另一种坐标变换, 即从一种平面投影坐标系到另一种平面投影坐标系之间的转换 本小节我们介绍如何使用 SuperMap Objects 的投影对象进行投影坐标系相互变换的开发编程 其实, 复杂的投影坐标转换在 SuperMap Objects 里得到了非常简化的处理, 我们只需调用如下代码即可轻松地完成这一工作 全部代码如下 : Dim objdatasource As sodatasource ' 待转换的数据源对象 Dim objpjtranslator As sotranslator ' 定义投影转换对象, 用来实现转换功能 Dim objpjcoordsyssrc As sopjcoordsys ' 待转换数据源的原投影系 Dim objpjcoordsysdst As sopjcoordsys ' 待转换数据源将要转成的目标投影系 1 直接得到待转换数据源的原投影系 objpjcoordsyssrc = ObjDataSource.PJCoordSys 2 为地理坐标系之间相互转换而定义一个新的投影参数对象, 并给该参数对象中的 7 个有关地理坐标系相互转换的参数赋值 Dim objparamforgcstrans As New sopjparams objparamforgcstrans.scaledifference = objparamforgcstrans.translatex = -9.1 objparamforgcstrans.translatey = objparamforgcstrans.translatez = objparamforgcstrans.rotatex = objparamforgcstrans.rotatey = objparamforgcstrans.rotatez = ' 对于待转换数据源将要转成的目标投影系对象 (objpjcoordsysdst) 的定义, 应该象上一节 地图投影中为投影坐标系对象赋值 那样给这个对象的各个属性赋值, 例如 : objpjcoordsysdst.type = -1 ' 自定义投影系 objpjcoordsysdst.projection = scprj_mercator ' 投影方式 -- 墨卡托投影 ( 等角正轴圆柱投影 ) objpjcoordsysdst.coordunits = scumeter ' 坐标单位 Set objpjcoordsysdst.pjparams = objparams ' 假设投影参数对象已经得到定义 ( 如上节所讲方法 ) Set objpjcoordsysdst.geocoordsys = objgcs ' 假设地理坐标系对象已经得到定义 ( 如上节所讲方法 ) 4 根据上面的定义创建真正的符合用户要求的投影坐标系转换对象 objpjtranslator.pjcoordsyssrc = objpjcoordsyssrc objpjtranslator.pjcoordsysdes = objpjcoordsysdst objpjtranslator.pjparams = objparamforgcstrans objpjtranslator.transmethod = Bursa-Wolf ' 参见 sepjtransmethodtype 常量的取值 objpjtranslator.create 5 最后为待转换数据源对象进行投影坐标系之间的转换 objpjtranslator.convert objdatasource 本方法也可以对一个点或数据集进行转换 8.5 思考与练习 您认为 SuperMap Objects 的投影数据模型是否完善, 为什么? 188

199 第 9 章应用系统发布 介绍 在前面的章节中, 我们向您详细介绍了如何使用 SuperMap Objects 开发 GIS 应用程序, 本章就将以 SuperMap Objects 5 为例向您介绍如何发布 ( 打包 ) 使用 SuperMap Objects 开发的应用系统 目标 通过本章的学习, 您将能掌握以下内容 : 哪些文件可以发布给最终用户 ; 注册 SuperMap Objects 组件 OCX 文件 ; SuperMap Objects 运行时需要哪些数据访问支持环境 9.1 发布方式 SuperMap Objects 是一个面向二次开发的 GIS 平台, 您可以基于 SuperMap Objects 开发出适用于不同领域 功能强大的应用系统 通常情况下需要将应用系统以及附属文件制作成一个安装包, 便于最终用户的使用 那么如何发布基于 SuperMap Objects 开发的软件呢? 通常可以有两种模式, 一种为简便模式, 另一种为高级模式 下面将向您介绍这两种模式 1 简便模式即只将应用系统单独打包, 不包括 SuperMap Objects 运行库文件 用户安装时先安装 SuperMap Objects 运行版, 然后再安装应用系统 发布应用系统只能提供给用户运行版安装程序, 而不能提供开发版安装程序 2 高级模式即把 SuperMap Objects 的运行支持文件与应用系统一起打包成安装程序, 用户只需要安装一次, 如果您的系统是一个可以单独销售的产品, 建议采用这种方式 9.2 可发布文件清单 SuperMap Objects 运行库包括三种类型文件 :MFC 运行库 DLL 文件 SuperMap Objects 支持库 DLL 文件和 SuperMap Objects OCX 控件文件 通常把第一组文件安装到 Winodws 系统目录下, 后面两组文件需要在安装到同一个目录下, 为避免版本冲突, 最好不要将后面两组文件安装到 Windows 系统目录 189

200 SuperMap Objects 开发教程 MFC 运行库 DLL 文件 SuperMap Objects 基于 MicroSoft 的 MFC 开发, 运行时需要 MFC 的运行库文件, 这些文件必须安装到 Windows 的系统目录 在 Windows 9X 中安装到 System 目录, 在 Windows NT 4.0 和 Windows 2000 中安装到 System32 目录 MFC 的运行库文件包括 : msvcrt.dll msvcp60.dll mfc42.dll SuperMap Objects 支持库 DLL 文件 SuperMap Objects 的支持库文件包括 30 多个动态连接库 为了避免版本冲突, 这些文件最好不要安装到 Windows 的系统目录下 DiskSerial.dll iconv.dll ilu.dll libexpat.dll lt_appsupport.dll lt_common.dll lt_messagetext.dll lt_meta.dll lt_trans.dll lt_xtrans.dll mrsid32.dll mrsidd.dll NCScnet.dll NCSEcw.dll NCSUtil.dll NrClient.dll RyClient.dll SmAdInit.dll SmAlib50.dll SmCSF50.dll SmCtl50.dll SmDTM50.DLL SmeDgn50.dll SmeDgn50.dll SmEdit50.dll SmeImg50.dll SmElem50.dll SmEng50.dll SmeSDB50.dll 190

201 第 9 章应用系统发布 SmeSDBPlus50.dll SmFPS50.dll SmFSL50.DLL SmGrid50.dll SmImg50.dll SmLsl50.dll Smlyt50.dll SmOCI.dll SmOdbc50.dll SmPmp50.dll SmPrj50.dll SmScn50.dll SmSym50.dll SmTopo50.dll SmWks50.dll OCX 文件 SuperMap Objects 包括如下几个 OCX 文件 同样, 我们建议您不必安装到系统目录 这些文件安装之后需要进行注册, 您可以使用安装工具 ( 如 InstallShield) 提供的 OCX 控件注册功能, 也可以手工注册 ( 如使用 Windows 的 RegSvr32.exe) SuperMap Objects 安装包中还提供了一个专门的注册工具 SmRegister.exe, 直接执行这个文件, 就可以自动注册同一目录下的所有 SuperMap Objects 控件 第四节将介绍注册 OCX 文件的技巧和注意事项 SuperMap.ocx SuperLayout.ocx SuperLegend.ocx Super3D.ocx SuperAnalyst.ocx SuperLockInfo.ocx SuperTopo.ocx SuperGridView.ocx SuperWkspManager.ocx 如果使用了 SuperMap Objects 组件的数据库引擎, 则应该增加相应的数据引擎文件, 所有的数据引擎文件如下 : SmeAcad50.sdx SmeODm50.sdx SmeOrcPlus50.sdx SmeOSbs50.sdx SmeOSP50.sdx SmeOSqlPlus.sdx SmeSQL50.sdx 191

202 SuperMap Objects 开发教程 9.3 不可发布的文件清单 发布应用系统时, 有些文件属于 SuperMap Objects 开发版专有, 不能发布给您的用户使用, 如果您的用户需要使用 SuperMap Objects 进行开发, 可以向 SuperMap Objects 在当地的代理商联系 不能发布给最终用户的 SuperMap Objects 文件包括 ( 但不限于 ): 开发许可文件 (*.lic) SuperLayout.lic SuperAnalyst.lic Super3D.lic SuperLegend.lic SuperMap.lic SuperTopo.lic SuperWkspManager.lic 以及 SuperMap Objects 安装包携带的扩展名为.lic 的其他文件 类型库文件 (VC 开发使用, 扩展名 :*.tlb) SuperLayout.tlb SuperAnalyst.tlb Super3D.tlb SuperLegend.tlb SuperMap.tlb SuperTopo.tlb SuperGridView.tlb SuperWkspManager.tlb 以及 SuperMap Objects 安装包携带的扩展名为.tlb 的其他文件 帮助文档 smproref.chm smstart.chm 以及 SuperMap Objects 安装包携带的扩展名为.chm 的其他文件 9.4 注册 OCX 文件 首先, 把 SuperMap Objects 提供的 SmRegister.exe 文件打包到 InstallShield 中, 并且与 SuperMap Objects 的一系列 OCX 文件安装在同一个目录下 设置 OCX 文件所在的文件组的 self-registered 属性为 FALSE, 因为您准备自行解决注册问题 当然, 别忘记把 MFC 的运行库文件打包了, 并且把这三个文件所在文件组的 Potentially Locked 属性设置为 TRUE, 否则不能正常安装 192

203 第 9 章应用系统发布 接着, 在 InstallShield (6.22 以上 ) Script 中定义并实现如下函数 : 定义 ExecuteAfterRebootOrAtEnd() 函数, 定义之后需在头文件中声明 ;( 注意区分大小写 ) function ExecuteAfterRebootOrAtEnd() STRING strtempfile; begin strtempfile = TARGETDIR ^ "\\Bin\\SmRegister.exe"; // 指定自动注册程序的目标路径, 请根据实际安装目录进行相应的修改 LongPathToQuote ( strtempfile, TRUE ); LaunchAppAndWait ( strtempfile, "", WAIT ); end; 响应 OnEnd(), 并添加如下代码 : function OnEnd() begin if (BATCH_INSTALL) then ;//do nothing else ExecuteAfterRebootOrAtEnd(); endif; end; 响应 OnRebooted() 函数并添加如下代码 : function OnRebooted() begin ExecuteAfterRebootOrAtEnd(); end; 9.5 数据访问支持环境 由于 SDB 引擎的属性数据访问基于 DAO 开发,SDX 引擎则基于 MDAC 的 SDK 开发, 所以在随您的开发成果发布 SuperMap Objects 运行版的时候, 还需要考虑发布 DAO 和 MDAC 的运行库 您可以向您的用户单独提供 DAO 和 MDAC 的安装程序, 在 SuperMap Objects 的光盘上可以找到这两个安装包, 文件名分别为 :DA360.EXE 和 MDAC_TYP.EXE 这两个文件可以由用户自行安装, 当然, 您也可以在您的安装程序中直接调用这两个可执行文件, 以减少用户的麻烦 最好的方式是一体化打包, 如果您使用 InstallShield 打包, 其中的 DAO 和 MDAC 模板可以帮助您收集 DAO 和 MDAC 的运行库文件 193

204

205 第 10 章常见问题解答 10.1 SuperMap Objects 基本问题 SuperMap Objects 开发版和运行版的区别? SuperMap Objects 开发版和运行版的使用目的和对象不同 SuperMap Objects 开发版的使用对象是地理信息系统的应用开发者, 主要用于 GIS 应用系统的开发建设 SuperMap Objects 运行版只能供编译好的可执行程序运行, 而不能用于系统开发 基于 SuerMap 开发的系统或者程序也必须要有 SuperMap Objects 运行版的支持才能正常运行 所以采用开发版开发出的应用系统或软件在提交给最终用户使用时, 最终用户需要安装 SuperMap Objects 运行版才能运行该系统或软件 因此, 运行版是 SuperMap Objects 应用系统的最终用户安装和使用的, 运行版能使采用 SuperMap Objects 开发版开发出的应用系统正常运行 当然, 开发版在开发应用程序的过程中为了调试程序的需要也是可以运行的, 但由于没有运行版的正式许可, 所以基于开发版运行的应用程序会在界面上会出现没有注册运行许可的提示 例如 SuperMap Objects 窗口出现的提示信息是 : 警告 : 您的运行版本没有注册, 请调用 SuperWorkSpace.RegisterForRuntime 注册运行版 如果有运行版的正式许可, 将不会出现提示信息 调用各控件的 RegisterForRuntime 方法可以注册该控件的运行许可, 例 : SuperWorkspace.RegisterForRuntime(strUser As String,strCompany As String,strSerialNo As String)( 三个参数的意义分别是 : 用户名 用户单位 相对应的序列号 ) 对于采用加密锁或者硬件序列号 ( 目前是依据 IDE 硬盘序列号进行不可逆运算得到的一个序列号 ) 等方式加密的用户, 可以不再调用这一方法进行注册了 如果调用, 那么其三个参数可以设置为空 投影坐标系的坐标单位和距离单位有何区别? 坐标单位是指坐标刻度的单位, 距离单位是指在该坐标系下, 进行距离量算时的数值单位 返回 / 设置投影系统坐标单位 :seunits sopjcoordsys.coordunits 返回 / 设置距离 ( 长度 ) 单位 :seunits sopjcoordsys.distunits 投影系统的坐标单位与距离单位 (DistUnits) 可以相同, 也可以不同 例如经纬度坐标下的坐标单位是度., 距离单位可以是米. 公里.. 等 195

206 SuperMap Objects 开发教程 SuperMap Objects 中的复合对象有何特点? 在 SuperMap Objects 中, 复合对象 (sogeocompound) 是为了处理比较复杂的数据而特别提供的, 它是指对象由多个位置上相对独立的子部分构成的对象, 这些独立的子部分称为复合对象的子对象 (Part) 复合对象支持不同的类型子对象, 如点 线 面或者文本 ( 当然相同类型的更加可以了 ) 基于此, 复合对象只能存在于复合 (CAD) 数据集中, 而且每一个复合对象 复合对象的子对象都可以保存自己的显示风格 在 SuperMap Objects 中, 一般的线 面 文本对象也有自己的特点 与复合对象类似,SuperMap Objects 的线 面 文本对象都可以包含多个独立的子对象 (Part) 但是与复合对象不同的是, 这里的子对象必须是相同的, 都是线 或者面 或者文本 这样设计对象具有非常重要的实际意义, 如中国对象需要由大陆面对象 台湾岛面对象以及其他岛屿面对象合并而成, 成为一个单独的具有语义涵义的对象 当然, 多数情况下, 这类对象往往只有一个子对象 像素坐标与地理坐标的转换 在目前的各编程语言中, 经常会有涉及到屏幕坐标的处理, 比如获得鼠标位置后进行某种操作 而在 GIS 软件里面经常使用的是地理坐标, 不是屏幕坐标 这就需要对这两种不同的作进行相互转换 SuperMap Objects 对这种需求进行充分考虑, 提供了相应的接口来实现两种坐标的互转功能 : 把像素坐标转换成地理坐标,SuperMap Objects 提供的接口是 SuperMap.PixelToMap (objpoint As sopoint) 把地理坐标转换成像素坐标,SuperMap Objects 提供的接口是 SuperMap.MapToPixel (objpoint As sopoint) 需要说明的是, 部分开发语言可以支持多种屏幕坐标, 而且缺省的屏幕坐标不是像素坐标, 这是需要首先把屏幕坐标转换为像素坐标, 再调用上述接口才能得到正确的结果 否则其结果必然是错误的 而且, 不同的地图窗口由于地图的范围和比例尺不同, 对同一个像素值转换出来的地理坐标值也不相同 所以, 只能用得到像素值的那个 SuperMap Objects 窗口的方法来转换, 否则也会得到错误的结果 SuperMap Objects 软件不能正确卸载, 无法进行重新安装? 按照正常的方式安装 SuperMap Objects 是能够顺利卸载的 但在没有卸载上次安装的情况下重复多次安装, 或者其他非正常操作可能会导致无法正确卸载 SuperMap Objects 产品的情况 这时候只需手工删除一项注册表的内容, 就可以重新安装了 注册表的内容是 : 可以先手工删除注册表中的以下内容 : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 目录下 DisplayName 为 SuperMap+ 版本号 的项 196

207 第 10 章常见问题解答 就可以正常安装 SuperMap Objects 软件了 VC 中调用 SuperMap Objects 控件时, 以 SO 为首命名的类和以 ISO 为首命名的类在使用上有何区别? 以 SO 为首命名的类和以 ISO 为首命名的类之间的差别不是 SuperMap Objects 造成的, 是 VC 使用 ActiveX 对象的两种不同的方式, 两种类在使用上基本相同, 仅仅是加载方式有一定的区别, 在加载 SuperMap Objects 控件的时候,VC 仅自动加载了 ActiveX 对象引用过的类, 缺省的类名称以 SO 为首, 以 ISO 为首命名的类为接口类,SuperMap Objects 中, 有些类没有包含在以 SO 为首命名的类中, 而是包含在以 ISO 为首命名的类中 这需要手动加载到系统中 : 点击菜单项 View > ClassWizard, 在出现的 MFC ClassWizard 对话框中, 点击右上角的 Add Class ->From a Type Library, 选中需要加载的类即可, 此时缺省为以 ISO 为首的类名称 SuperMap Objects 支持哪些 AutoCAD 数据格式的转换? SuperMap Objects 支持对 AutoCAD 的 DXF DWG 数据格式的转换, 支持 R13 R14 R15 版本以及 AutoCAD 版本的数据导入, 并且既支持合并图层导入, 也支持分层转入 ( 把数据按照点 线 面 文本四种类型分层转入 ) 目前, 支持的对象类型有 LINE POINT ELLIPSE ARC TRACE SOLID BLOCK ENDBLK INSERT ATTDEF ATTRIB SEQEND POLYLINE VERTEX LINE3D FACE3D DIMENSION RAY XLINE Lwpline 以及 CIRCLE SPLINE TEXT LEADER TOLERANCE MLINE MTEXT Hatch 等类型的对象转换 怎样采用数据库管理工作空间? 用数据库管理工作空间是 SuperMap Objects 上一版本新增的功能, 即可以把工作空间以文件形式存放到本地, 也可以把工作空间存放到数据库中 要把工作空间存放到数据库中, 可以这样实现 :SuperMap Objects 5 安装目录下的 bin 目录下提供了一个 SmAsssistance.dll 文件, 注册后调用 SmAsssistance.Upload 方法能将本地的工作空间文件上传到数据库中进行管理, 调用 SmAsssistance.Download 方法可以把数据库中的工作空间下载到本地进行打开 在启动 SuperMap Objects 软件时, 为什么总是弹出拨号网络对话框? 这是因为在 IE 浏览器的的默认属性中, 连接 属性项默认值为 始终拨默认得连接 ( 如图 10.1), 而 SuperMap Objects 系列软件的网络加密锁的加密方式是通过网络传输许可信息的, 因此每当启动 SuperMap Objects 时就会弹出拨号网络对话框, 因为默认设置的网络通信方式是拨号连接, 只有先拨号网络才可以使用, 而不是采用 LAN 局域网或其他方式的上网方式 解决方法是在 IE 浏览器的 属性 对话框中进行设置, 具体设置方法是 : 右键点击桌面上的 IE, 在弹出的快捷菜单中选择 属性, 在弹出的对话框中选择 连接, 在该页中选择 从不进行拨号连接 即可 197

208 SuperMap Objects 开发教程 图 10.1 IE 属性对话框 显示空间数据集时, 数据集中的数据是否全部调入内存中? SuperMap Objects 打开数据源中的数据集时并没有加载数据集中的数据到内存 (DGN 引擎和 DWG 引擎除外 ) 对于 SDB 数据引擎, 系统仅仅加载了数据集的空间索引 ; 对于空间数据库引擎, 索引仍在服务器端进行, 不占客户端的内存空间 因此, 地图显示之后,SuperMap Objects 并不在内存中保存图形和属性数据 当然, 系统的客户端还是有一定的内存开销, 特别在数据量比较大的情况下 这是因为有系统缓存的原因 系统会自动缓存访问过的数据, 以便下次访问的时候更快一些 ; 如 SDX for SQL Server,ADO 可能会在客户端缓存一些数据, 以便加快速度, 缓存的容量大小仅与访问过的数据大小有关 SuperMap Objects 网络锁出现异常, 软件无法运行, 该怎么办? 198

209 第 10 章常见问题解答 软件无法运行, 报告 512 的错误代码, 往往是由于无法正确读取许可信息 造成无法正确读取许可信息的情况有许多原因 如果使用的单机加密锁, 请按以下步骤尝试 : 1. 重新安装加密锁驱动程序 : 加密锁驱动在安装目录下的 \SuperMap\SuperMap 5\Support\ 里面有 先卸载驱动再重新安装 ( 注意 : 先装驱动程序, 再插锁 ) 重新运行程序, 看是否顺利运行 如果不能, 则尝试下一方法 2. 检查加密锁是否损坏 : 在另外一台安装了 SuperMap Objects 的机器上 ( 如果没有现成的, 请使用 SuperMap Objects 的安装盘安装一个, 用完后再卸载 ), 启动一个使用了 SuperMap Objects 的应用程序, 看程序是否能正常启动 如果还不能, 请与北京超图公司客户服务部联系 如果使用的网络加密锁, 请按以下方法逐个尝试 : 1. 检查许可服务是否启动 : 在许可服务器上看看 SuperMap Objects License Servic 是否已经启动 如果没有启动则启动 如果是启动的, 则重新启动服务 如果不行, 则尝试下一方法 2. 加查加密锁是否损坏 : 在许可服务器端直接运行使用了 SuperMap Objects 的应用程序, 看是否能顺利打开数据 显示地图 如果不行, 则把加密锁查到一个客户端上, 修改客户端的加密方式为本机加密 ( 运行开始菜单上的 软件许可信息配置 进行配置即可 ); 在客户端直接运行应用程序 看是否能启动, 并顺利地打开地图 如果不能, 请尝试下一方法 3. 检查网络锁的各项参数配置 : 查看客户端的加密所配置是否有误, 主要看服务器名称 ( 或者 IP 地址 ) 是否正确 ; 使用的端口号是否与服务器一致 可以尝试把服务器的机器名改为服务器 IP 地址, 或者更换使用的端口号 尝试后看能解决问题, 如果不能请尝试下一方法 4. 检查局域网中网络是否通畅 : 如果出现软件在使用过程中时断时续的情况 ( 即使这时两台机器之间仍能访问 ), 可检查网络是否出现故障, 特别是检查集线器是否稳定 必要时可重新启动应用程序进行测试 5. 增加超时限制时间 : 在局域网网络速度较慢的情况, 可以增加服务器的超时限制时间, 增大原来的 5000 毫秒 6. 重新安装加密锁驱动程序 : 如果以上方法都不行, 则请尝试在许可服务器端 重新安装加密所驱动程序 ( 注意 : 先装驱动程序, 再插锁 ) 199

210 SuperMap Objects 开发教程 7. 如果以上方法都不能解决问题, 请与北京超图公司客户服务部联系 SuperMap Objects 在各种开发语言环境下的性能有何区别? SuperMap Objects 是由多个标准的 ActiveX 控件构成的, 因此所有支持 ActiveX 编程的二次开发语言都可以对 SuperMap Objects 进行开发 SuperMap Objects 可以方便的嵌入到各种流行的可视化高级开发语言环境中进行开发, 例如 VB VC++ Delphi C++Builder PowerBuilder 等 采用不同语言的开发出的系统对图形的处理性能相差不大, 因为对图形部分的操作都是由控件来处理的, 与使用的二次开发语言基本无关 当然这个性能还收到该语言对 ActiveX 控件的支持程度 系统其余部分的性能则与语言关系比较密切, 不同语言其编译后的执行效率一般有比较的差异 用户可以根据实际需要, 采用自己熟悉的语言进行开发, 目前使用较多的语言为 VB VC++ 和 Delphi 此外,SuperMap Objects 支持.NET 框架, 采用 VB.NET VC.NET C#.NET 都可以进行开发 为什么会出现数据集的记录数不为零, 却不能正确显示图形的情况? 大多数出现在 SQL Server 或者 Oracle Access 等空间数据库中, 由于采用格网对数据集的范围进行索引, 当图层的范围超过空间索引的范围时, 对象将无法显示 解决方法是 : 先重新计算范围 (BOUNDS), 再重新建立空间索引 图形可正确显示 Boolean sodatasetvector.computebounds() 数据集重新计算范围 Boolean sodatasetvector.spatialindexdirty 判断矢量数据集中空间索引是否需要重建 如果需要重建, 可先自动计算空间索引的层数, 接口为 : Long sodatasetvector.recommendspatialindexlevel() 之后, 可重建矢量数据的空间索引 : Boolean sodatasetvector.buildspatialindex(nlevel As Long) 在 VC Delphi 中怎样快捷地加入 SuperMap Objects 控件? 在 SuperMap Objects 安装后, 可以使用 SuperMap Objects 提供的 Delphi 加载工具进行控件的加载, 通过 开始 菜单 -> 程序 ->SuperMap->SuperMap5-> 注册工具 ->Delphi 注册工具可打开, 进行手工注册需要按照一定的控件顺序进行 向 VC++ 中加入 SuperMap Objects 控件可以使用 SuperMap Objects 提供的向导进行, 使用方法在 SuperMap Objects 的入门教程中有详细介绍, 在最新的 SuperMap Objects 中可以使用 VC++ 的向导就可以完成控件的加载, 并可以直接打开地图 资源库中的符号 线型和填充是怎样渲染对应的点 线和面对象的? 在 SuperMap Objects 中, 每项资源 ( 符号 线型或填充 ) 都有对应的编码, 给相应的几何对象匹配资源是通过该编码进行的 如 objstyle.symbolstyle=1110, 可以设置该点对象显示为符 200

211 第 10 章常见问题解答 号库中编码为 1110 的符号 (SuperMap Objects 缺省的符号库是三角点 ) 为什么保存后的地图, 再次打开时不见了? 地图保存后, 需保存工作空间, 才能真正将地图存储于物理磁盘中 (*.SMW 文件 ) 否则, 下次打开工作空间将没有地图 因此, 调用 SuperMap.SaveMap 后, 还要调用 SuperWorkspace.Save 方法 如果该地图 工作控件保存后删除了数据源, 或者更换了数据源文件名, 或者更改了数据源类型 ( 比如有文件型改成了数据库类型 ), 都可能导致再次打开工作空间时不能打开原来的数据源, 从而使相关的地图打开后没有内容 ( 或者丢失了图层 ) 这种情况下, 可以在打开工作控件后, 再打开变化后的数据源 ( 注意 : 一定要使用原来的别名 ) 不过别忘了退出时还得要记住保存工作空间 如果需要按照不同属性字段的值来控制渲染符号的类型 大小 旋转角度等, 该怎么办? 可以采用 自定义专题图 (sothemecustom 对象 ), 分别将不同的属性字段赋给 sothemecustom 对象的相应属性即可, 其属性包括设置风格的颜色字段 (PenStyleField) 符号类型字段 符号大小字段 (SymbolSizeField) 符号旋转角度字段 (SymbolRotationField), 以及线型和填充的相应字段 (BrushStyleField) 等 SuperMap Objects 如何使用自定义的鼠标指针? SuperMap Objects 可以支持自制的鼠标指针, 方法如下 :SuperMap.MouseIcon=" 文件名 ", 这个文件名用您自制的鼠标指针的文件名即可 10.2 SuperMap Objects 接口使用问题 怎样实现对图层中的不同几何对象设置不同的显示风格? 采用图层的风格设置可对同一图层的各个对象设置统一的风格 ( 复合图层 CAD Dataset 除外 ) 但是要对图层中的不同 ( 种类 ) 的对象设置不同的风格, 就需要使用 SuperMap Objects 的专题地图功能了 ( 对复合图层 CAD Dataset 也有效 ) 具体可以采用单值专题图 (sothemerange ) 或者分段专题图 (sothemeunique ) 来实现 关于单值专题图和分段专题图的使用,SuperMap Objects 提供完整的范例程序 不过需要注意的是, 单值专题图制作时, 对象值的种类不能超过 255 种 ; 分段专题图的段数也不能超过 255 段 怎样设置文本对象和符号的大小随地图缩放而缩放? 文本对象大小是否随地图缩放而缩放, 可通过设置 : 201

212 SuperMap Objects 开发教程 SuperMap Objects 的 sotextstyle.fixedsize 属性可以控制文本对象的大小是否随地图一同缩放 如果设置为 FixedSize = True, 字体将固定显示大小, 不随地图的缩放而缩放, 此时文本对象的大小由 sotextstyle.fixedtextsize 属性决定 ; 此属性使用像素坐标 如果设置 FixedSize = False, 则文本的显示大小不固定, 会随地图的缩放而缩放, 此时文本对象的大小由 sotextstyle.fontheight 和 sotextstyle.fontwidth 属性决定 ( 也可以只设置 FontHeight 属性, 系统会自动处理文本的显示 ); 此属性使用地理坐标, 而不是像素坐标 FixedSize 缺省为 False, 即文本不定大小, 随地图缩放而缩放 符号大小是否随地图缩放而缩放, 可以通过设置 : solayer.symbolscalable 和 solayer.symbolscaledefinition sostyle.symbosize 来实现 布尔型属性 solayer.symbolscalable 用于控制点状符号是否随地图缩放而缩放, = False 时表示符号固定大小, 不随地图缩放而缩放 ; 此时符号的大小由 sostyle.symbolsize 唯一决定 solayer.symbolscalable = True 时, 表示符号随地图缩放 ; 此时需要设置 solayer.symbolscaledefinition 属性和 SymbolSize 属性 SymbolSize 属性是符号的大小, 单位为 0.1mm,SymbolScaleDefinition 属性是指当前所设置的符号的大小的基准地图比例尺, 以后当地图比例尺发生变化后, 符号的大小将由地图当前比例尺 (SuperMap.ViewScale) 与 SymbolScaleDefinition SymbolSize 共同决定 他们之间的关系为 : 符号当前大小 = SuperMap.ViewScale / SymbolScaleDefinition * SymbolSize 举个例子说明一下, 设置 : SymbolScalable = True SymbolSize = 100 SymbolScaleDefinition = 1:10000 意思是 : 在地图显示比例尺为 1:10000 时, 符号屏幕显示大小为 1cm 如果改变地图比例尺为 1:1000, 那么符号的大小将变化为 (1:1000)/(1:10000) * 100 = 1000, 即变为 10cm 大小 SymbolScalable 属性缺省 = False, 即符号固定显示大小, 不随地图缩放而缩放 solayer.symbolscalable 和 solayer.symbolscaledefinition 对线型宽度是否随地图缩放而缩放也同样有效 点线面等几何对象的风格设置和文本对象的风格设置有什么不同? 点线面等几何对象的风格设置是通过 sosttyle 进行的, 而文本对象的风格是通过 sotextstyle 对象来设置的 点 线 面对象的风格包括对象的颜色 大小 符号形状等, 而文本对象的风格包括文本的字体类型 字体颜色 大小 旋转角度等 因此, 在 SuperMap Objects 中分别采用了两个不同的对象 :sostyle 对象与 sotextstyle 对象, 其接口如图 10.2 所示 此外, 点 线 面等几何对象不能存储风格, 需要在显示时动态赋予, 而文本风格设置后, 将会存储于文本对象中 202

213 第 10 章常见问题解答 图 10.2 几何对象风格对象和文本对象风格对象主要接口图 使用 GRIDVIEW 进行数据集浏览时, 显示用户需要的字段, 该怎么做? 第一, 要想不显示以 SM 开头的系统字段, 可以通过设置 : Boolean SuperGridView.sysFieldVisible 属性 = False 接口进行控制 第二, 对其它非系统字段的显示控制 在 SuperMap Objects 的查询接口 : sorecordsetsodatasetvector.query(strsqlfilterasstring,bhasgeometryasboolean, [objfields As sostrings], [stroptions As String]) 中, 第三个参数 [objfields As sostrings] 为可选参数, 可以控制查询出得记录集的字段列表 这个参数缺省时, 查询结果将包括全部字段 通过 sostrings.add 方法获得要显示的字段, 再设置以上参数即可控制显示字段 删除记录集中数据的两个接口的用法和功能有什么区别? 删除数据集中的记录的接口主要有 : 1. 删除当前记录 :Boolean sorecordset.delete() 2. 保留表的结构, 截去表中的数据 :Boolean sodatasetvector.truncate() 3. 清除表中当前记录集的所有记录 : Boolean sorecordset.deleteall() 使用 Delete 方法可以循环删除所有的记录 Truncate 方法和 DeleteAll 方法可以直接删除数据集中的所有数据记录, 但在使用效率方面有区别 采用 DeleteAll 方法删除时, 如果记录数很多, 执行速度会很慢, 要消耗大量的日志空间 而且只是物理性地删除数据, 不会自动回收释放的空间以供重新利用 这样会导致的 sdd 文件或数据库数据文件的大小不断地增长 使用 sodatasetvector.truncate 方法删除的效率较高 执行速度其非常快, 甚至比删除数据库中的表 ( 如 Oracle 中 Drop Table) 还要快 此外, 采用 Truncate 方法删除不需要日志空间, 在执行完后会自动释放空间以供重新利用 203

214 SuperMap Objects 开发教程 但是, 当只需要删除数据集中的部分记录时, 只能采用 sorecordset.delete 方法进行删除 点几何对象 sogeopoint 和简单点对象 sopoint 的区别 sogeopoint 是点几何对象, 描述点状地物, 是 sogeometry 的子类, 继承 sogeometry 对象的所有接口 因此, 可以赋予风格, 并添加到跟踪层上显示, 还能和其他对象进行空间运算和操作 sopoint 只是简单点对象, 是构成线 面几何对象控制点 ; 不能用于表达点状地物 其主要接口有三个 :objpoint.x objpoint.y objpoint.offset 简单点对象只描述点的空间位置 ( 地理坐标 ), 通常不具有点实体的语义 由于不是 SuperMap Objects 中的点几何对象类型, 因此, 该对象不能进行几何对象的相关操作 ( 比如缓冲 ), 不能将其直接加入跟踪层, 不能赋予风格显示等等 通常, 可以根据 sopoint 的位置确定 sogeopoint 对象的位置, 将 sopoint 对象转化成 sogeopoint, 以进行相关分析和操作 方法如下 : dim objpoint as New sopoint dim objgeopoint as New sogeopoint objgeopoint.x=objpoint.x objgeopoint.y=objpoint.y 简单矩形对象 sorect 和矩形几何对象 sogeorect 的用法区别 简单矩形对象 (sorect) 和矩形几何对象 (sogeorect) 的区别同以上的简单点和点几何对象的关系和用法基本相同 简单矩形对象通常通过几何对象或地图窗口的范围 (Bounds) 获得 简单矩形对象主要用于确定矩形的位置, 其接口有九个 :Bottom Left Right Top BottomRight CenterPoint Height TopLeft Width 矩形几何对象 (sogeorect) 则是几何对象 (sogeometry) 的子类 可通过以下方法将简单矩形对象转化成矩形几何对象 Dim objrect As sorect Dim objgeorect As New sogeorect Set objrect = SuperMap1.ViewBounds // 获得简单矩形 ( 为地图窗口的视野范围 ) objgeorect.topleft = objrect.topleft // 定位矩形几何对象的左上角 objgeorect.bottomright = objrect.bottomright // 定位矩形几何对象的右下角 设置对象选中风格 (soselection.style ) 和修改选中对象风格 (SuperMap.ModifySelectedGeometry ) 有什么区别? 1. soselection.style: 所有的 GIS 软件中, 一个几何对象被选中后都会一种特定的显示风格来显示, 以区别于没有被选中的对象 在 SuperMap Objects 中, 这一风格由 soselection.style 决定 它包含了线的风格 面填充风格和点状符号的风格三部分 SuperMap Objects 的点 线 面和文本对象的选中风格都有自己的缺省值, 也可以通过 soselection.style 来修改对象的选中风格 例如 : 204

215 第 10 章常见问题解答 Dim objselection As soselection Dim objstyle As New sostyle objstyle.pencolor = vbblue // 选中对象呈红颜色 objstyle.penwidth = 20 // 选中的线状地物或者面状地物的边线为 2mm 宽 objstyle.brushcolor = vbred // 选中的面状地物的填充前景色为红色 Set objselection = SuperMap1.selection Set objselection.style = objstyle SuperMap1.Refresh 需要注意的是 : A. 这一方法不会实质性地修改对象的风格 ; B. 对于点状地物, 以上的选中风格只能改变使用的矢量符号, 而不能改变栅格符号的显示风格 C. 对于文本对象, 只能通过 PenColor 来修改文本选中后的显示的颜色, 不能修改其它内容 2. SuperMap.ModifySelectedGeometry : 这一系列方法是实质性的修改对象的风格 一般而言, 只有在这样的情况需要这一个功能 : 有多个具有各自风格的几何对象, 现需要修改它们的某一个风格项 ( 比如文本的颜色 ) 而其他风格都还保持每个几何对象自己的 由于只有在复合数据集和文本数据集中的几何对象才能存储风格, 因此 ModifySelectedGeometry 方法只适用于复合数据集和文本数据集, 对其它数据集类型中的几何对象的风格设置无效 例如 : With SuperMap1.ModifySelectedGeometryBrushBackColor vbyellow.modifyselectedgeometrybrushcolor vbred.modifyselectedgeometrybrushstyle 102.ModifySelectedGeometryPenColor vbblue.modifyselectedgeometrypenstyle 1.ModifySelectedGeometryPenWidth 5.ModifySelectedGeometrySymbolColor vbblack.modifyselectedgeometrysymbolsize 20.ModifySelectedGeometrySymbolStyle 110.Refresh End With 怎样获得跟踪层上的对象的属性? 跟踪层是在内存中创建的一个层, 其上的全部对象都保存在内存中, 其最大特点是对空间几何对象能快速刷新和动态显示 跟踪层适合于图形更新较快的应用, 如根据 GPS 接收的数据进行点位置的动态跟踪 由于跟踪层上的对象全部保存在内存中, 所以那些几何对象本身都不附带属性数据 不过一般情况下, 如果跟踪层上的对象是从已有的数据集中获得的, 那么只要记住跟踪层上的对象来自于哪个数据源的哪个数据集, 是其中的哪个几何对象, 就可以到那个数据集中去取出该对象的属性 要记住这些关系, 可以充分利用跟踪层对象的 Tag 属性 思路是 : 首先对跟踪层对 205

216 SuperMap Objects 开发教程 象来源的数据源 数据集和源对象的 SMID 按照一定规则进行编码, 把这个编码作为跟踪层对象的 Tag 属性值 当要查询跟踪层对象的属性时, 就取出其 Tag 属性, 解析出数据源 数据集和 SMID 值, 使用 Query 进行查询, 得到 Recorset, 从中就可以取出属性值了 为什么采用 sorecordset 的 FindFirst,FindNext 等接口查询时不能得到相应的记录? 这几个查询定位记录的接口的使用只对属性数据有效, 查询出的记录如果只有图形而没有属性数据的话, 则调用这几个方法将无效 因此, 对于采用 soselection.torecordset 方法得到的 Recordset, 其参数必须设置为 False, 否则查询将会无效 通过鼠标点击或者给定坐标进行点切割线操作, 调用 sogeoline.split 方法后, 为什么并没有成功切割? 主要原因是点击的点或者给定的点并未在线上 所以调用 sogeoline.split 方法无法进行切割 需要先判断点是不是在线上 ( 通过 sogeometrist.ispointonline 方法 ), 如果不在线上, 应先求出该点在线上的垂足 ( 通过 sogeometrist.getperpendicularposition 方法 ), 使用这个垂足来分割线对象就可以了 如何用鼠标选择地图窗口中被覆盖的对象? 自地图窗口中, 对象被覆盖有两种情况 : 第一种情况是, 在不同的层中, 一层的对象把另一层的对象覆盖了, 比如面数据集如果显示在线或者点数据集的上面的时候就会覆盖线层上的对象 ( 除非面数据集使用空填充模式 ) 这是要选中被覆盖的层上的对象, 可以把 SuperMap.Active 设置为 scaselect, 在地图窗口中点击选择的同时按住 CTRL 键 当然如果有可能的话, 最好是把被覆盖的数据集的层次往上调, 这就不用按住 CTRL 键了 第二种情况是, 同一层中对象相互之间有覆盖现象 这种情况下, 可以用上述的第一种方法来选择, 即把 SuperMap.Active 设置为 scaselect, 在地图窗口中点击选择的同时按住 CTRL 键 如何把线型库中的线绘制到其他地方? SuperMap Objects 中, 符号 线型和填充模式等资源都可以通过他们各自的 Draw 方法输出到具有设备描述体的设备上 以下代码示例将工作空间中的一个线型输出到 Picture 控件 SuperMap Objects 控件 MapObjects 控件设备上 Option Explicit Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpstring As String, ByVal ncount As Long) As Long Private Sub Command1_Click() Dim objstyle As New sostyle 206

217 Dim hdc As Long, hdc1 As Long Dim points(8) As Long points(0) = 20 points(1) = 50 points(2) = 40 points(3) = 100 points(4) = 60 points(5) = 50 points(6) = 80 points(7) = 100 objstyle.penstyle = 6 objstyle.pencolor = vbblue 第 10 章常见问题解答 // 把线型绘制到 Picture 控件中 SuperWorkspace1.Resources.LineStyleLib.Draw Picture1.hdc, objstyle, 4, points(0) Picture1.Refresh // 把线型绘制到 SuperMap Objects 控件中 hdc1 = GetDC(SuperMap1.hwnd) SuperWorkspace1.Resources.LineStyleLib.Draw hdc1, objstyle, 4, points(0) // 把线型绘制到 MapObjects 控件中 hdc = GetDC(Map1.hwnd) SuperWorkspace1.Resources.LineStyleLib.Draw hdc, objstyle, 4, points(0) Set objstyle = Nothing End Sub 为什么用以下代码不能移除全部图层, 还会报错? Dim objlayers As solayers Dim i As Integer Set objlayers = SuperMap1.Layers For i = 1 To objlayers.count SuperMap1.Layers.RemoveAt i Next i SuperMap1.Refresh 这是由于每执行移除图层一次, 地图窗口中的图层就会减少一个, 被删除图层以后的图层的索引号就会依次减少 1 即原来图层索引号为 2 的图层现在变为了 1, 当第二次循环想移除原来的第二个图层时, 结果却移除了原来的第三层, 第二层因为变成了第一层而一直不能被移除所以 此外, 还会出现被删除的索引号大于地图中的地图个数的情况 因此正确的代码如下 : Dim objlayers As solayers Dim Layer As solayer Set objlayers = SuperMap1.Layers For Each Layer In objlayers SuperMap1.Layers.RemoveAt Layer.Name Next SuperMap1.Refresh 10.3 SuperMap Objects 空间数据库 SuperMap Objects 不同的空间数据库 ( 数据源 ) 与相应关系数据库之间有 207

218 SuperMap Objects 开发教程 什么对应关系? SQL Server 中, 一个空间数据源对应其一个数据库, 一个数据集对应该数据库中的一个表 ; Oracle 中, 一个空间数据源对应于一个用户, 一个数据集对应该用户下的一个表 要建立一个空间数据源, 对 SQL Server 数据库, 直接使用 SuperMap Objects 的 SDX 引擎就可以 ; 对 Oracle 数据库, 需要先在数据库中建一个新的用户, 才能通过 SuperMap Objects SDX For Oracle(Plus) 引擎在该用户下建立一个新的数据源 如何将 SDB 文件中的空间数据导入到空间数据库中? SuperMap Objects 的 sodatasource.copydataset 接口可以把一个数据源的数据集复制到两一个数据源中, 源数据源和目标数据源类型可以不同 复制过程中 SuperMap Objects 会自动处理不同类型数据源之间属性表的差异, 自动增删系统字段 通过复制数据集的方式可将 SDB 文件中的空间数据导入到空间数据库中, 也可将空间数据库中的数据导出成文件数据源方式进行存储和管理 如果确定目标数据源是 SQL Server 类型的, 还可以使用 SuperMap Objects 提供的 SuperMap Objects ToolKit 工具来转换, 如果要把大数据量导入到 SQL Server 数据库中, 应注意 SQL Server 的配置问题 试着将日志文件的大小放大一些, 至少也应该是几十兆, 这对 SQL Server 的性能非常重要 当导入数据时,SQL Server 先将其写入日志文件, 当日志文件写满后一次写入数据文件, 若日志文件太小, 会导致很多的 I/O 操作, 效率会很低, 就像用小勺去舀干一锅水和用一个大瓢去舀干一锅水, 就算力气一样, 两种做法的效率也大不一样的 另外, 数据文件的大小和自动扩充参数也应该设置得大些, 因为如果数据文件的初始大小小于要导入的数据, 那么当数据文件装满时, 数据文件会自动扩充, 扩充的大小为设置的自动扩充参数, 默认为原文件大小的 10%, 而这些操作都是非常耗时间的 通常, 数据库中剩余空间一定要大于要导入的数据占的空间, 日志文件大小应为导入数据的 1/4 以上 数据转换的速度不但与软件的速度有关, 还与服务器的设置有关系, 对于 SQL Server 来说, 如果数据库的数据文件小, 它需要经常性的增大文件, 会导致性能下降 此外, 数据库的 log 文件与事务处理有关, 也会影响性能, 所以在转换数据时, 建议先增加数据库容量和 log 大小 需要注意的是, 转换数据源的类型, 会导致系统字段的变化 如果系统中使用了系统字段, 则应该先修改系统为不使用系统字段, 否则可能转换后系统无法正常运行 怎样操作 SuperMap Objects 空间数据库中的表, 和纯关系数据库的表的操作有什么不同? 含有 SuperMap Objects 数据的表, 与普通的表类似, 需要注意的是 : 以 Sm 开头的字段是系统字段, 不能删除这些字段, 对可编辑的系统字段修改值时也要小心, 最好通过 SuperMap Objects 来处理这些数据 除了空间数据集所对应的数据表,SuperMap Objects 还设计了许多管理表, 存储过程 ( 以 Smsp_ 开头的存储过程 ) 等, 不要修改这些数据或过程, 否则可能会导致无法预料的错 208

219 误 第 10 章常见问题解答 SuperMap Objects 有没有自己的 Spatial Database? SuperMap Objects 从一推出就有自己的 Spatial Databse 技术 从 SuperMap 2000 的 ADO 引擎到 SuperMap Objects Ⅲ 的 SDX/SDX Plus 引擎, 每次都有大的进步 SuperMap Objects 的空间数据引擎包括 :SDX For SQL Server SDX For Oracle SDX For Oracle Spatial SDX For Access 引擎和 SDX Plus For Oracle SDX Plus For SQL Server 引擎等 SQL Server 与 Oracle 空间数据库都采用 SuperMap Objects 的空间数据存储格式 SDX Plus For Oracle 引擎与 SDX For Oracle 引擎有什么区别? SDX For Oracle 引擎和 SDX Plus For Oracle 引擎都是 SuperMap Objects 提供的访问 Oracle 关系数据库引擎, 都采用 SuperMap Objects 定义的数据结构进行存储和管理 但二者的数据存储结构不同, 空间索引的方式不同, 因此, 查询检索效率也有所不同 SDX For Oracle 引擎采用了格网索引的方法进行了索引,SDX Plus For Oracle 引擎采用了格网索引和四叉数索引相结合的方法进行空间索引, 大大提高了空间数据的查询和检索效率 SDX For Oracle 引擎与 SDX For Oracle Spatial 引擎有什么区别? 两个引擎主要是数据结构不同 SDX For Oracle 引擎的空间数据库结构是 SuperMap Objects 自己定义的, 可以存放 SuperMap Objects 的各种类型的数据 ; 而 SDX For Oracle Spatial 引擎的空间数据库结构是 Oracle 公司定义的 Oracle Spatial 的结构 受结构的限制, 该引擎只能存储点 线 面数据集, 不能存放文本 影像 网络等数据集 所以如果不是特别需要, 推荐用户不要轻易使用 SDX For Oracle Spatial 引擎 如何更改 SQL Server 数据库中数据库对应的数据文件的路径? 先备份数据库, 再将原数据库删除, 然后新建一个同名数据库, 在新建时指定新的数据文件目录为需要的路径, 最后再从设备恢复数据库就可以了 怎样在 Oracle 中创建一个新的数据源? 在使用 Oracle 空间数据库之前, 需要先安装 Oracle 数据库服务端, 安装时应注意建立一个局域网内部的全局服务名 创建 Oracle 空间数据源, 需要先利用 Oracle SQL Plus 或者 DBA 创建一个表空间和一个新的用户 采用 Oracle Plus SQL 创建空间数据源的具体步骤如下 : 第一步 : 安装 Oracle 客户端程序, 并测试服务是否处于通畅状态 启动 SQL Plus( 这个过程在服务器端和客户端都可以进行, 其作用一样 ), 登录用户名 sys, 密码 change_on_install, 主机字符串是全局的服务名称, 登录成功后, 建立表空间和对应于表空间的用户 第二步 : 创建表空间 :( 以下示例创建名为 mytablespace 的表空间 ) 209

220 0) SuperMap Objects 开发教程 Create tablespace mytablespace Datafile d:\oradata\supermap\supermap.dbf size 20M ( 路径名称根据本地情况填写的 ) Default storage(initial 16k next 8k minextents1 maxextents pctincrease Minmum extent 0k; 第三步 : 创建用户 :( 假设创建用户 supermap, 密码是 supermap) CREATE USER supermap PROFILE DEFAULT IDENTIFIED BY supermap DEFAULT TABLESPACE SUPERMAP TEMPORARY TABLESPACE TEMP QUOTA K ON SUPERMAP QUOTA K ON SYSTEM QUOTA K ON TEMP ACCOUNT UNLOCK; 第四步 : 运行下列内容分配权限 : GRANT UNLIMITED TABLESPACE TO SUPERMAP; GRANT EXECUTE ON SYS. DBMS_SQL TO SUPERMAP; GRANT SELECT ON SYS. DBA_TAB_COLUMNS TO SUPERMAP; GRANT CONNECT TO SUPERMAP; GRANT RESOURCE TO SUPERMAP; ALTER USER SDA DEFAULT ROLE ALL; 第五步 : 在 SQL Plus 中输入 Commit;, 提交事务 创建用户后, 就可以调用 CreateDataSource 方法在该用户下创建的数据源了 其中第一个参数大体如下 : strdatasourcename = "Provider = MSDAORA;Server = orc816;" //server 为数据库别名最后一个参数大体是 :strpassword = "UID = supermap;pwd = supermap" 图 10.3 所示为打开 Oracle 数据库所需的参数 图 10.3 打开 Oracle 数据库所需参数 SuperMap Objects 如何有效地组织和管理海量数据? 210

221 第 10 章常见问题解答 在 SuperMap Objects 中, 合理组织的海量空间数据, 将会大大提高空间数据获取和查询效率 怎样合理进行组织呢? 综合起来, 有两个方面 : 一是合理分层, 一是适当分区, 把握好数据集的个数和数据集中记录集的个数之间的动态平衡 合理分层是将图幅按照专题要素分成不同的图层进行管理, 便于进行各要素的分析 如果将每一个图幅进行同样的分层, 而不进行不同图幅相关图层的合并, 将会导致数据集和图层的数量过多 每一个图层在打开时需要新建空间索引, 配置相应的风格, 这会影响空间数据的显示和查询检索效率 相反, 如果将多个图幅的相应图层都合并成一层, 则会导致一个数据集或者图层中记录数过多的情况, 也会导致效率较低 因此, 应根据图幅的实际数据量的大小来进行合理组织数据 通常,SuperMap Objects 的一个地图的图层最好不超过 100 个数据集, 一个数据集的记录数通常不超过几万条, 一个 SQL Server 数据源中的数据集中的记录数不超过几十万条, 一个 Oracle 数据源中的数据集记录数不超过百万条记录 SuperMap Objects SDX/SDX Plus 引擎与 ADO 引擎 SDE 引擎的有何区别? ADO 引擎是 SuperMap 2000 时的空间数据库引擎 它基于 ADO 访问 SQL Server 和 Oracle 关系数据库, 所以称为 ADO 引擎 ADO 引擎基于 ActiveX 数据对象 (ADO) 构建, 支持 SQL Server 与 Oracle 存储管理空间数据, 由于 ADO 是一种关系数据库访问的接口规范, 因此在多数据库扩展方面发展很有优势 SuperMap Objects 扩展了 ADO 引擎, 并新增了 Access 引擎 Oracle Spatial 引擎 ( 当然还有其他文件引擎, 如 DWG DXF 引擎 ), 所有的数据库引擎在 SuperMap Objects 中统称为 SDX 引擎 而 SuperMap Objects SDE 引擎是基于 ESRI 公司的 ArcSDE 空间引擎开发, 能访问 ArcSDE 空间数据库 ( 当然需要 ArcSDE 支持 ) 使用 Oracle 空间数据库时如何解决 没有找到指定的 OCI.DLL 文件 的问题? 在使用 Oracle 空间数据库过程中, 有时会报告 没有找到指定的 OCI.DLL 文件 的情况 这是由于客户端 Oracle 版本和 SuperMap Objects 中的 Oracle 版本不匹配造成的 这时只需将 Oracle 安装目录下的 OCI.DLL 文件拷贝到 SuperMap Objects 安装目录下的 Bin 目录下, 覆盖已有的 OCI.DLL 文件即可 SuperMap Objects 支持服务端 以上的版本, 客户端为 的版本 需要注意的是 Oracle 客户端版本不能高于服务器端版本, 否则会在城不能正确访问数据库的作物 SQL 数据源下, 实际查询对象数目超过 100 个时, 为什么返回的记录 sorecordset 却为 NOTHING? 这是因为查询对象数量较多 或者对空间查询中进行排序需要一些临时空间, 为避免主数 211

222 SuperMap Objects 开发教程 据库空间的碎片化, 临时空间需要占用临时数据库 ( 每个 SQL Server 安装实例中的 tempdb 数据库 ) 的空间 但一般默认情况下所有用户都没有写这个数据库的权限, 所以无法返回这个较大的选择集 处理办法是 : 修改用户的权限使之对这个数据库有写的权限, 需要手工配置临时数据库的可建表状态, 并为用户分配访问临时数据库的权限 可以用两种方式来实现配置过程, 一种是在查询分析器中执行脚本, 另一种是在企业管理器中图形界面下配置 第一种 : 脚本配置 以具有 SQL Server 的 System Administrators 权限的用户 ( 如 sa 用户 ) 登录查询分析器, 在编辑框中输入如下的脚本 :( 或将以下脚本存为一个 SQL 文件, 以后配置时打开并执行即可 ) use tempdb exec sp_grantdbaccess 'UserName','UserName' go grant create table to public grant create table to UserName go 执行即可后, 可配置用户 UserName 第二种 : 图形界面配置, 配置分为两部分 ; 1) 配置临时数据库的可建表状态 SQL Server 实例安装好后会默认创建一个临时数据库, 名为 tempdb, 默认状态下, 用户是不能在 tempdb 中建表的, 要使用 tempdb 数据库, 需要允许用户在 tempdb 库中建表, 可以按如下步骤配置 : 以具有 SYSADMIN 权限的用户登录 SQL Server Enterprise Manager 展开实例, 展开数据库, 在 tempdb 数据库上点鼠标右键并在弹出的菜单中点属性 在弹出的对话框中点选 权限 标签, 并选中 public 的 创建表 选项 注意 : 以上配置只需要配置一次, 以后再建新的数据源以及添加新的用户不需要再执行此步配置 2) 为用户指定访问临时数据库的权限 用户必须可访问临时数据库才可使用临时数据库, 所以要为用户指定访问临时数据库的权限, 步骤如下 ( 在此假设需要使用数据库中的 lis 用户访问 SQL Server): 以具有 SYSADMIN 权限的用户登录 SQL Server Enterprise Manager 展开实例, 展开安全性, 单击 登录, 在右侧列出的用户中右键单击要操作的用 户并点选属性 212

223 第 10 章常见问题解答 在弹出的对话框中点选数据库访问标签并选中对 tempdb 的许可 注意 :SQL Server 每次重新启动服务时都会自动重新创建临时数据库, 所以在每次重启动计算机或重启 SQL Server 服务后, 如果需要执行大数据量的空间查询, 都需要执行以上配置 影响空间数据库性能和效率的主要因素有哪些? 影响空间数据库的性能和效率的因素有很多, 在使用中应主要注意以下几个方面 : 1. 数据引擎的类型 SuperMap Objects 最新的 SDX Plus For SQL Server 引擎和 SDX Plus For Oracle 引擎采用了四叉树和格网索引两种空间索引相结合的机制, 大大提高了空间数据库的性能和效率 2. 记录数的个数 影响空间数据库查询和检索效率的主要因素是记录集的个数 因此, 对于直接转入 CAD 结构数据 ( 如 *.DXF) 的 SuperMap Objects 空间数据库, 可以先进行拓扑处理 去掉一些重复线, 进行相邻节点的合并, 这样可以大大减少线对象的数量, 提高查询和检索的效率 如果可能, 还可以去除一些修饰性的点 线等, 以尽可能的减少记录数量 3. 正确使用记录集 在进行空间查询, 尽量使查询的条件能最精确地定位要检索的对象 在新增空间对象时, 注意不要查询出 SmID= 的所有记录, 而只需查询出 SmID<0 的空记录 此外, 空间数据库性能和效率还和空间数据的组织 硬盘的性能等因素有关 213

224

225 附录 1 SuperMap Objects 常用数据类型对照表 SuperMap Objects 可以嵌入到多种开发平台上, 关于如何在不同平台上使用 SuperMap Objects, 本书在前面的章节中已经作了介绍 在此, 我们将 SuperMap Objects 中常用数据类型在不同平台上的表示方法整理出来, 希望能给您带来方便 Visual Basic Visual C++ Delphi C++ Builder PowerBuilder Boolean Bool Boolean Bool Boolean Integer Short, short int, signed short int Integer Short, short int, signed short int Integer(Int) Long Long int, LongInt Long int, Long signed short int signed short int Single Float Single Float Real Double Double Double Double Double Date Date Date Date Date Object String ( 变长 ) String ( 定长 ) TObject LPSTR,Char[] String LPSTR String Char[] Char Char Character(Char) Variant ( 数字 ) Variant ( 字符 ) 用 COleVariant 转换 用 COleVariant 转换 Variant Variant Any Variant Variant Any SuperMap 1 CSuperMap SuperMap TSuperMap oleobject sodatasource 2 CsoDataource sodatasource IsoDataSourceDisp oleobject 1 :SuperMap Objects 的控件在上述各语言中的类型同 SuperMap 2 :SuperMap Objects 的对象在上述各语言中的类型同 sodatasource 215

226

227 附录 2 数据元素及对象操作索引表 本教程是为使用或准备选用 SuperMap Objects 为开发工具开发 GIS 应用系统的读者编写的, 全书按 SuperMap Objects 的控件和功能分类为线索分章设节, 目的是为了让读者了解如何利用 SuperMap Objects 开发实现相应的 GIS 功能 开发 GIS 应用系统 教程目录为读者提供了很好的索引方式, 读者可以通过目录快速准确的定位到要实现的功能介绍及代码说明部分 SuperMap Objects 具有自己独特的数据组织和管理方式 对象数目多, 对于初识 SuperMap Objects 的人来说, 快速了解和掌握这些内容有一定难度 为了使适应不同层次读者的需要, 也为了使读者更好的理解 SuperMap Objects GIS 和更好的使用本教程进行应用系统的开发, 我们编写了此附录 附录 2 是按照 SuperMap Objects 的数据元素和操作对象进行组织, 这样可以加深你对 SuperMap Objects 中数据元素和操作对象概念的理解, 从而更全面的理解 SuperMap Objects 通过附录 A, 你可以在很短的时间里了解 SuperMap Objects 主要的数据元素和操作对象及其操作方式, 并可以快速在教程中定位 附录 B 不能代替目录, 它只是目录一个有益而重要的一个补充 ; 附录 B 覆盖的面较小, 要想知道附录 A 中没有列出的其它功能, 请从目录中查找 工作空间 (Workspace) 相应的操作页面 创建一个新的工作空间 27 打开已经存在的工作空间文件 27 保存 ( 原来的 新的 ) 工作空间 29 关闭已经打开的工作空间 30 访问工作工作空间中的数据元素 32 数据源 (DataSource) 相 应 的 操 作 页面 打开一个已经存在的数据源文件 35 创建一个新的数据源文件 38 紧缩数据源文件 38 修复数据源文件 39 删除数据源文件

228 SuperMap Objects 开发教程 地图 (Map) 相 应 的 操 作 页面 保存当前 SuperMap Objects 控件中的地图对象 65 当前 SuperMap Objects 控件地图另存为 65 在 SuperMap Objects 中打开工作空间中已经存在的地图对象 64 删除保存过的地图对象 65 关闭地图 65 地图对象与工作空间的关系 64 地图的基本操作 ( 移动 放大 ) 67 地图的输出 ( 输出到其它控件 文件 打印 影像数据集等 ) 120 布局 (Layout) 相 应 的 操 作 页面 打开工作空间中保存过的布局对象 176 在工作空间中保存当前布局对象 176 另存布局为一个新的布局对象 176 删除工作空间中的布局对象 176 布局的打印预处理和打印 177 布局的基本操作 ( 放大 漫游 选择等 ) 174 资源 (Resource) 相 应 的 操 作 页面 符号资源 58 线型资源 58 填充模式资源

229 附录 2 数据元素及操作对象索引表 数据集 (Dataset) 相 应 的 操 作 页面 创建一个新的数据集 41 打开一个已经存在的数据集 42 转入 \ 出数据集 ( 实现 SuperMap Objects 的数据与其它格式数据的转换 ) 43 在 SuperMap Objects 控件中显示数据集 74 数据集与地图中图层的关系 76 矢量数据集 (DatasetVector) 相 应 的 操 作 页面 几何分析 ( 包括距离 面积的量算 ) 135 缓冲分析 ( 为数据集每个对象建立一个公共的缓冲区 ) 139 数据集的叠加分析 ( 剪裁 擦除 并 交 同一运算 ) 142 网络数据集的网络分析 ( 最短 最佳路径查找 ) 146 拓扑关系处理 157 影像数据集 (DatasetRaster) 相 应 的 操 作 页面 影像数据集的配准 112 将其它影像数据集压缩为 ECW 影像数据集 43 GRID( 栅格 ) 分析 ( 建模 与其它数据集的转换 ) 152 记录 (Recordset) 相 应 的 操 作 页面 定位记录 ( 漫游 ) 52 增加一个新的记录

230 SuperMap Objects 开发教程 修改存在的记录属性和几何对象 54 删除当前记录 53 更新编辑过的记录集 54 如何获得一个记录集 ( 查询 由选择集转换 ) 102 字段 (Field) 相 应 的 操 作 页面 添加一个新的字段 51 删除指定字段 51 交换两个字段的索引位置 51 图层集与图层 (Layers and Layer) 相 应 的 操 作 页面 用图层集合对象管理图层元素 ( 添加 删除图层 改变图层索引 ) 73 让图层对象管理自己 ( 设置图层可见 可选 可捕捉 ) 76 为图层制作专题地图 254 图层对象与数据集的关系 74 利用 SuperLegend 管理地图中的图层 161 专题地图 (ThemeMap) 相 应 的 操 作 页面 利用 专题图向导 制作专题图 86 编程制作单值专题图 87 编程制作范围分段专题图 89 编程制作等级符号专题图 91 编程制作点密度专题图

231 附录 2 数据元素及操作对象索引表 编程制作统计图 94 编程制作标签专题图 96 编程制作用户自定义专题图 98 专题地图的打印输出 120 风格对象 (Style and TextStyle) 相 应 的 操 作 页面 点 ( 数据集 ) 风格设置 79 线 ( 数据集 ) 风格设置 79 面 ( 数据集 ) 风格设置 79 文本 ( 对象 ) 风格设置 80 几何对象 (Geometry) 相 应 的 操 作 页面 在数据集中添加几何对象 ( 点 线 面 ) 106 编辑几何对象的节点 ( 添加 修改 删除 ) 107 在文本数据集中添加文本对象 106 几何对象的基本操作 ( 相并 相交 克隆 连接 剪裁 ) 107 几何对象的转换 ( 线 -> 面 面 -> 线 ) 107 获取地理对象的属性 ( 通过选择和查询的方法 ) 101 布局元素 (LytElement) 相 应 的 操 作 页面 创建布局元素 ( 用系统方法和编程两种方法 ) 169 编辑布局元素 ( 剪切 复制 粘贴和对象精确编辑 ) 172 布局元素的格式调整

232 SuperMap Objects 开发教程 改变布局元素的堆栈顺序 175 投影 (Projection) 相 应 的 操 作 页面 地图投影的基本概念 181 SuperMap Objects 的投影对象 182 使用 SuperMap Objects 的预定义投影 184 使用 SuperMap Objects 自定义投影

233 附录 3 SuperMap Objects 工程升级说明 SuperMap Objects 备受广大 GIS 用户的喜爱, 在 SuperMap Objects 推出之前就拥有了大量用户, 对于使用 SuperMap 2000 或 SuperMap 2003 的用户来说, 如何把已有的 VB 工程 ( 使用低版本的控件 ) 升级到 SuperMap Objects 新的版本就是一个很迫切的问题, 下面以从 SuperMap 2003 的 VB 工程升级到 SuperMap Objects 5 为例进行说明, 具体的升级说明请参考 SuperMap Objects 程序员参考手册 中的相关说明 SuperMap Objects 5 与 SuperMap 2003 两个版本的控件是可以共存的, 也就是说如果注册了 SuperMap 5 和 SuperMap Objects 2003 这两个版本, 那么分别用 SuperMap 5 和 SuperMap Objects 2003 做的 VB 工程都可以同时运行, 互不干扰 如果想用 SuperMap Objects 5 去开发, 而又不想放弃原来在 SuperMap 2003 下开发的 VB 工程, 那么, 按照以下步骤就可以实现 1 把 VB 工程重新拷贝一份, 这样主要是为了保留在 SuperMap 2003 下运行的工程 2 通过 SmRegister.exe 文件注册 SuperMap Objects 5 控件 3 通过 UnInstallOCX.bat 文件反注册 SuperMap 2003 控件 4 打开 VB 工程, 出现错误对话框, 如图附 3-1 所示, 选择 是 按钮进入 图附 3-1 加载控件错误对话框 5 在 VB 的 Toolbox 工具箱中点击右键, 在弹出菜单中选择 Components ( 英文 VB) 或 部件 ( 中文 VB) 如图附 3-2 所示, 进入 components 对话框如图附 3-3 示, 并 Check 上 SuperMap Objects 5 所需的控件 图附 3-2 添加控件 223

234 SuperMap Objects 开发教程 图附 3-3 加载 SuperMap Objects 5.0 控件 此时 Toolbox 工具箱中的 SuperMap Objects 控件就是 SuperMap Objects 5 控件了, 保存该工程即可 注意 : 在整个过程中都不要显示窗体设计界面, 否则就必须重新在窗体上加载 SuperMap Objects 5 的控件 224

理解 SuperMap GIS

理解 SuperMap GIS TM SuperMap GIS 2000 ( ) SuperMap ECW ErMapper MrSID LizardTech +86-10-64884631, 64884632, 64884633 +86-10-64884630 http://www.supermap.com sales@supermap.com support@supermap.com SuperMap ...3 1 GIS...4

More information

幻灯片 1

幻灯片 1 组件式 GIS ComGIS WWW. SDJTU. EDU.CN 主讲人 : 尹涛 实验 (6) TrackingLayer 2 实验内容 一 实验目的 二 实验要求 三 实验准备知识 四 实验步骤及方法 五 实验结果 六 实验时间 七 实验报告要求 3 一 实验目的 掌握 GPS 动态目标跟踪显示 4 二 实验要求 1 掌握跟踪层概念 2 掌握添加几何对象到跟踪层, 并高亮显示设计方法 ; 2

More information

长 安 大 学 硕 士 学 位 论 文 基 于 数 据 仓 库 和 数 据 挖 掘 的 行 为 分 析 研 究 姓 名 : 杨 雅 薇 申 请 学 位 级 别 : 硕 士 专 业 : 计 算 机 软 件 与 理 论 指 导 教 师 : 张 卫 钢 20100530 长安大学硕士学位论文 3 1 3系统架构设计 行为分析数据仓库的应用模型由四部分组成 如图3 3所示

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品 Autodesk Product Design Suite Standard 20122 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品设计 Autodesk Product Design Suite Standard 版本包包括以下软件产产品

More information

SuperMap Objects 初级开发教程

SuperMap Objects 初级开发教程 SuperMap Objects 5 开发教程 ( 初级篇 ) 北京超图地理信息技术有限公司 2006 年 4 月 北京 SuperMap Objects 初级开发教程 版权所有 1998-2006, 北京超图地理信息技术有限公司 保留一切权力 警告, 本文档包含的所有内容是北京超图地理信息技术有限公司的财产, 受到著作权法和国际公约的保护 未得到本公司的书面许可, 不能以任何方式 ( 电子的或机械的,

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f 27 1 Vol.27 No.1 CEMENTED CARBIDE 2010 2 Feb.2010!"!!!!"!!!!"!" doi:10.3969/j.issn.1003-7292.2010.01.011 OPC 1 1 2 1 (1., 412008; 2., 518052), OPC, WinCC VB,,, OPC ; ;VB ;WinCC Application of OPC Technology

More information

VB程序设计教程

VB程序设计教程 高 等 学 校 教 材 Visual Basic 程 序 设 计 教 程 魏 东 平 郑 立 垠 梁 玉 环 石 油 大 学 出 版 社 内 容 提 要 本 书 是 按 高 等 学 校 计 算 机 程 序 设 计 课 程 教 学 大 纲 编 写 的 大 学 教 材, 主 要 包 括 VB 基 础 知 识 常 用 程 序 结 构 和 算 法 Windows 用 户 界 面 设 计 基 础 文 件 处

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

穨文件1

穨文件1 2-1 Access 2000 Visual Basic Access 2000 97 Office Visual Basic Visual Basic Visual Basic VBA Visual Basic Visual Basic 2-1-1 Visual Basic Access Visual Basic ( ) 2-1 2-1 Visual Basic 2-1 Microsoft Access

More information

3 Driver do Microsoft Access (*.mdb) hisdata IFIX 1.4

3 Driver do Microsoft Access (*.mdb) hisdata IFIX 1.4 IFix3.5 ACCESS ACCESS hisdata D:\Dynamics\SampleSystem\HistoricalData ODBC DSN hisdata 1 ODBC 1.1 2 1.2 3 Driver do Microsoft Access (*.mdb) 1.3 4 hisdata IFIX 1.4 1.4 5 Access 1.5 6 ODBC ifix3.5 1.6 1.6

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

培训提纲

培训提纲 SuperMap Objects 5 基础培训教材 北京超图地理信息技术有限公司 2004 年 10 月 北京 版权所有 2001-2004, 北京超图地理信息技术有限公司 保留一切权力 警告, 本文档包含的所有内容是北京超图地理信息技术有限公司的财产, 受到著作权法和国际公约的保护 未得到本公司的书面许可, 不能以任何方式 ( 电子的或机械的, 包括影印 ) 翻印或转载本文档的任何部分 本文档并不代表供应商或其代理的承诺,

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

等所有需要地图显示 分析 处理的行业 SuperMap Deskpro 5 是 SuperMap Deskpro 2003 的升级版本 1. SuperMap 的安装 1.1 硬件要求 CPU : 要求 550MHz 以上 ; 内存 : 最低要求为 128M, 推荐 256M 或以上 ; 硬盘 :

等所有需要地图显示 分析 处理的行业 SuperMap Deskpro 5 是 SuperMap Deskpro 2003 的升级版本 1. SuperMap 的安装 1.1 硬件要求 CPU : 要求 550MHz 以上 ; 内存 : 最低要求为 128M, 推荐 256M 或以上 ; 硬盘 : GIS 理论与实践 讲义八 SuperMap 基础与操作 目的 熟悉国产 GIS 软件 -----Supermap 的基本情况 了解 Supermap 的数据组织与操作方式 了解 ArcGIS 与 Supermap 之间的区别 内容 Supermap 的安装与介绍 Supermap 的数据操作 一. SuperMap 的安装与基本介绍 SuperMap Deskpro 5 是一款专业的桌面型 GIS

More information

VB控件教程大全

VB控件教程大全 Datagrid DataGrid1.Columns.Remove(0) ' 0 DataGrid1.Columns.Add(0).Caption= ' DataGrod1.Columns(0).DataField= Name ' Adodc1.Refresh DataGrid BackColor Font DataGrid CellPadding HTML CellSpacing HTML Width

More information

水晶分析师

水晶分析师 大数据时代的挑战 产品定位 体系架构 功能特点 大数据处理平台 行业大数据应用 IT 基础设施 数据源 Hadoop Yarn 终端 统一管理和监控中心(Deploy,Configure,monitor,Manage) Master Servers TRS CRYSTAL MPP Flat Files Applications&DBs ETL&DI Products 技术指标 1 TRS

More information

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464> 第 1 章 进入 Photoshop 的全新世界 本章导读 Photoshop 1 1.1 Photoshop CS6 Photoshop Photoshop 1.1.1 Photoshop POP 1-1 图 1-1 平面广告效果 1.1.2 Photoshop 1-2 Photoshop CS6 Photoshop CS6 Photoshop CS6 Extended 3D 3 Photoshop

More information

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1 Chapter 01 Photoshop CS6 的基本操作 本章内容 1.1 Photoshop 的应用领域 1.6 控制面板的显示与隐藏 1.2 位图和矢量图的特性 1.7 新建 打开与保存文件 1.3 像素和分辨率的关系 1.8 图像的缩放 1.4 色彩模式 1.9 屏幕显示模式 1.5 Photoshop CS6 界面 1.10 计算机图形图像常用的色彩模式 Photoshop CS6 艺术设计案例教程

More information

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM CHAPTER 6 SQL SQL SQL 6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM 3. 1986 10 ANSI SQL ANSI X3. 135-1986

More information

ThreeDtunnel.doc

ThreeDtunnel.doc (12) 1 1. Visual Basic Private Sub LoadDatabase() Dim strip As String Dim straccount As String Dim strpassword As String Dim strdatabase As String Dim strtable As String Dim strsql As String Dim strtemp1

More information

01

01 ZEBRA 技术白皮书 条码编码 101 相关知识介绍 引言 20 70 数据 80 20 90 (JIT) AIAG EIA HIBCC HAZMAT 条码的优势提高数据准确性 99% 85% / / 提升效率 / 2 Zebra Technologies 保持一致性 ID 改进库存和资产管理 成本 / 效益分析 ID ID ID (ERP) RFID Zebra Technologies 3 ID

More information

多層次傳銷與獎金系統

多層次傳銷與獎金系統 醒 吾 技 術 學 院 資 訊 管 理 系 ( 五 專 部 ) 九 十 六 學 年 度 畢 業 專 題 多 層 次 傳 銷 與 獎 金 系 統 組 員 : 921506122 游 濬 瑋 921506126 陳 彥 宇 921506139 林 龍 華 921506144 陳 昶 志 921506149 楊 璧 如 指 導 老 師 : 汪 淵 老 師 中 華 民 國 九 十 七 年 一 月 十 一 醒

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

Microsoft Word - CX1000-HMI_程序开发_PLC通讯 用 VB.Net 开发 CX1000 的 HMI 第二部分和 TwinCAT PLC 通讯 一 TwinCAT 动态库 TwinCAT.Ads.dll The TwinCAT.Ads.dll 是一个.NET 类库, 它提供和 ADS 设备通讯的类 如果 TwinCAT PLC 运行在 IPC 上, 则需要添加的类库是路径 \TwinCAT\ADS Api\.NET\v1.1.4322 下的 TwinCAT.Ads.dll

More information

Microsoft Word - 小心翼翼的二十一點N.doc

Microsoft Word - 小心翼翼的二十一點N.doc 投 稿 類 別 : 資 訊 類 篇 名 : 小 心 翼 翼 的 二 十 一 點 作 者 : 陳 鈺 文 國 立 瑞 芳 高 級 工 業 職 業 學 校 資 訊 二 李 伯 謙 國 立 瑞 芳 高 級 工 業 職 業 學 校 資 訊 二 胡 家 媛 國 立 瑞 芳 高 級 工 業 職 業 學 校 資 訊 二 指 導 老 師 : 周 曉 玲 老 師 陳 思 亮 主 任 壹 前 言 一 研 究 動 機 平

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

目录 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 控制卡 GPU 卡 网卡 FC HBA 卡 TPM/TCM 模块 NVMe SSD PCle 加速卡 1-31 i

目录 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 控制卡 GPU 卡 网卡 FC HBA 卡 TPM/TCM 模块 NVMe SSD PCle 加速卡 1-31 i 目录 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 1-1 1.1 控制卡 1-1 1.2 GPU 卡 1-5 1.3 网卡 1-8 1.4 FC HBA 卡 1-21 1.5 TPM/TCM 模块 1-29 1.6 NVMe SSD PCle 加速卡 1-31 i 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 本手册为产品通用资料 对于定制化产品, 请用户以产品实际情况为准

More information

TwinCAT 1. TwinCAT TwinCAT PLC PLC IEC TwinCAT TwinCAT Masc

TwinCAT 1. TwinCAT TwinCAT PLC PLC IEC TwinCAT TwinCAT Masc TwinCAT 2001.12.11 TwinCAT 1. TwinCAT... 3 2.... 4... 4...11 3. TwinCAT PLC... 13... 13 PLC IEC 61131-3... 14 4. TwinCAT... 17... 17 5. TwinCAT... 18... 18 6.... 19 Maschine.pro... 19... 27 7.... 31...

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

4.C ( 详细解析见视频课程 绝对值 01 约 21 分 15 秒处 ) 5.E ( 详细解析见视频课程 绝对值 01 约 32 分 05 秒处 ) 6.D ( 详细解析见视频课程 绝对值 02 约 4 分 28 秒处 ) 7.C ( 详细解析见视频课程 绝对值 02 约 14 分 05 秒处 )

4.C ( 详细解析见视频课程 绝对值 01 约 21 分 15 秒处 ) 5.E ( 详细解析见视频课程 绝对值 01 约 32 分 05 秒处 ) 6.D ( 详细解析见视频课程 绝对值 02 约 4 分 28 秒处 ) 7.C ( 详细解析见视频课程 绝对值 02 约 14 分 05 秒处 ) [ 说明 ] 1. 以下所指教材是指朱杰老师的 管理类联考综合能力数学套路化攻略 2. 该文档中所标答案和参见的教材答案, 与视频有冲突的, 以视频答案为准! 基础篇 第 1 章 数 1.2.1 整数例题答案 : 1. A ( 详细解析见教材 P7 例 2) 2. D ( 详细解析见视频课程 数的性质 约 10 分 53 秒处 ) 3. C ( 详细解析见教材 P7 例 3) 4.E ( 详细解析见视频课程

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

14A 0.1%5% 14A 14A.52 1 2 3 30 2

14A 0.1%5% 14A 14A.52 1 2 3 30 2 2389 30 1 14A 0.1%5% 14A 14A.52 1 2 3 30 2 (a) (b) (c) (d) (e) 3 (i) (ii) (iii) (iv) (v) (vi) (vii) 4 (1) (2) (3) (4) (5) 400,000 (a) 400,000300,000 100,000 5 (b) 30% (i)(ii) 200,000 400,000 400,000 30,000,000

More information

(Chi)_.indb

(Chi)_.indb 1,000,000 4,000,000 1,000,000 10,000,000 30,000,000 V-1 1,000,000 2,000,000 20,000,00010,000,0005,000,000 3,000,000 30 20% 35% 20%30% V-2 1) 2)3) 171 10,000,00050% 35% 171 V-3 30 V-4 50,000100,000 1) 2)

More information

穨_2_.PDF

穨_2_.PDF 6 7.... 9.. 11.. 12... 14.. 15.... 3 .. 17 18.. 20... 25... 27... 29 30.. 4 31 32 34-35 36-38 39 40 5 6 : 1. 2. 1. 55 (2) 2. : 2.1 2.2 2.3 3. 4. ( ) 5. 6. ( ) 7. ( ) 8. ( ) 9. ( ) 10. 7 ( ) 1. 2. 3. 4.

More information

幻灯片 1

幻灯片 1 ArcGIS Runtime Esri 中国 ( 北京 ) 有限公司江复兴 主要内容 1. 认识 ArcGIS Runtime 2. ArcGIS Runtime 架构剖析 3. ArcGIS Runtime 安装 开发 部署 认识 ArcGIS Runtime ArcGIS Runtime 简介 ArcGIS Runtime 是伴随 ArcGIS 10.1 的发布而诞生的一个全新产品, 是一款具备强大的可伸缩性的轻量级桌面开发产品

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

投稿類別:電子工程類

投稿類別:電子工程類 投 稿 類 別 : 工 程 技 術 類 篇 名 : 井 字 生 死 戰 攻 略 作 者 : 陳 威 宇 國 立 臺 南 高 級 海 事 水 產 職 業 學 校 電 子 科 二 年 甲 班 邱 富 群 國 立 臺 南 高 級 海 事 水 產 職 業 學 校 電 子 科 二 年 甲 班 指 導 老 師 : 林 育 助 老 師 王 彥 盛 老 師 壹 前 言 家 喻 戶 曉 的 井 字 遊 戲 (Tic-Tac-Toe)

More information

CAD CAE CAPP CAD CAM PDM CAD ERP T Q C S E CAD CAPP PDM OAERP PDM PDM MISAL 40 90% CK CK ISO

CAD CAE CAPP CAD CAM PDM CAD ERP T Q C S E CAD CAPP PDM OAERP PDM PDM MISAL 40 90% CK CK ISO CAD CAD PDM / 1996 5 80 WTO 15 75 1 2000 1998 0.3 810 2 MISMRP ERP OAERP 5 20 CADCAPPPDMOAERP 1 CAD CAE CAPP CAD CAM PDM CAD ERP T Q C S E CAD CAPP PDM OAERP PDM PDM 2.1 1965 MISAL 40 90% CK7815 1995 104

More information

KV-cache 1 KV-cache Fig.1 WorkflowofKV-cache 2.2 Key-value Key ; Key Mem-cache (FIFO) Value Value Key Mem-cache ( Value 256B 100 MB 20%

KV-cache 1 KV-cache Fig.1 WorkflowofKV-cache 2.2 Key-value Key ; Key Mem-cache (FIFO) Value Value Key Mem-cache ( Value 256B 100 MB 20% 38 11 2013 11 GeomaticsandInformationScienceofWuhanUniversity Vol.38No.11 Nov.2013 :1671-8860(2013)11-1339-05 :A GIS Key-value 1 1 1 1 (1 129 430079) : 设计了一种基于 Key-value 结构的缓存 KV-cache 旨在简化数据结构 高效管理缓存数据

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

01

01 Zebra Technologies 白皮书 移动打印给仓储运营带来显著优势 综述 RFID RFID (RF) RFID RFID / ROI LAN 采用移动打印机, 享受显而易见的业务成效 - 49.74 28.11 Zebra 2 Zebra Technologies 移动打印机成本效益分析 示例数据固定式打印机移动打印机每年节省资金 10 10 8 8 48 48 3840 3840 15

More information

iConnector打通REST服务共用的界限

iConnector打通REST服务共用的界限 轻松搭建轻量级移 动端应用 北京超图软件股份有限公司 陆国伟 P1 提纲 认识移动 GIS SuperMap 移动 GIS 平台轻量级移动端应用总结 P2 认识移动 GIS 移动 GIS 概念 核心技术 关键问题 P3 认识移动 GIS--- 概念 GIS 服务 移动平台 移动 GIS P4 认识移动 GIS--- 概念 GIS 服 务 移动 端 移动 GIS GIS 服务 移动平台 移动 GIS

More information

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作 * 夏传玲 : 本文简要回顾了国内外定性研究在最近 多年的发展概况, 总结 了定性研究的六个发展趋势和分析策略上的三种流派 在上述两种背景下, 本文探讨了计算机辅助的定性分析给定性研究带来的机遇和挑战, 特别是它和手工操作对比时的优势和劣势, 以及应用这种定性分析技术所可能面临的困难 : 定性研究定性分析 文化差异,, (, ),,,, ( - ) ( - ) ( - ) ( - ) ( - ) (

More information

X713_CS_Book.book

X713_CS_Book.book / / /USB ) ; ; C D ; ; B B 1 >> 2 3 B 1 ( > > ) 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 GSM GPS ( ) 手机已连接到 GSM 网络 指示条越多, 接收质量越好 GPS 2 ...........................4.............................. 4 Micro SD (

More information

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech - OfficeCoder 1 2 3 4 1,2,3,4 xingjiarong@mail.sdu.edu.cn 1 xuchongyang@mail.sdu.edu.cn 2 sun.mc@outlook.com 3 luoyuanhang@mail.sdu.edu.cn 4 Abstract. Microsoft Word 2013 Word 2013 Office Keywords:,, HTML5,

More information

ArcGIS Sever.NET ArcGIS Server Web JAVA ArcGIS Server Web

ArcGIS Sever.NET ArcGIS Server Web JAVA ArcGIS Server Web rcgis 9 GIS ArcGIS Server ESRI ArcGIS Sever.NET ArcGIS Server Web JAVA ArcGIS Server Web ArcGIS Server ArcGIS Server? ArcGIS Server ArcGIS Server ArcGIS Server ArcGIS Server Web ArcGIS Server? ArcGIS Server

More information

Visual Basic D 3D

Visual Basic D 3D Visual Basic 2008 2D 3D 6-1 6-1 - 6-2 - 06 6-2 STEP 1 5-2 (1) STEP 2 5-3 (2) - 6-3 - Visual Basic 2008 2D 3D STEP 3 User1 6-4 (3) STEP 4 User1 6-5 (4) - 6-4 - 06 STEP 5 6-6 (5) 6-3 6-3-1 (LoginForm) PictureBox1

More information

教学输入与学习者的语言输出 温晓虹 本文从三个方面探讨了语言的输入与输出的关系 首先从理论研究的角度讨 论了从语言输入到语言输出的习得过程 实验研究表明 输入的语言素材必须被学习者所接收 即使接收了的内容也并不会自动进入中介语的体系 而是需要进一步对输入语言进行 分解 归类等分析性与综合性的处理 在语言 内化 的基础上 学习者的中介语系统才能 够不断地得到重新组合 趋于目的语 另外 学习者在语言输出前和输出时需要调节

More information

2009 年第 6 期 高清总动员 35

2009 年第 6 期 高清总动员 35 要说 08 年最成功的高清机, 非三合一 F1/F2 莫属 它集中了国内不同的高清接收需求, 整合了当时能想到的各种功能, 为欣赏高清奥运, 满足高端发烧人士, 做出了贡献 F1/F2 的成功, 说明不依赖进口, 我们也有能力打造顶级的高清机, 并且更适合国内的使用习惯 不过, 即使 F1/F2 的终极版, 也不兼容 ABS-S 或 ISDB-S, 没有网络功能, 不能 USB 录像等等, 有一定的局限性

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

册子0906

册子0906 IBM SelectStack ( PMC v2.0 ) 模块化私有云管理平台 是跨主流虚拟化技术的统一资源云管理平台 01 亮点 : 快速可靠地实现集成化 私有云管理平台 02/03 丰富的功能支持企业数据中心云计算 扩展性强 : 简单易用 : 04/05 功能丰富 : 06/07 为什么选择 IBM SelectStack (PMC v2.0)? 快速实现价值 提高创新能力 降低 IT 成本 降低复杂度和风险

More information

第 2 頁 (a) 擔 任 機 場 擴 建 統 籌 辦 總 監 的 首 席 政 府 工 程 師 職 位 第 3 點 ) ; (b) 擔 任 ( 機 場 擴 建 統 籌 辦 ) 的 首 長 級 丙 級 政 務 官 職 位 ; 以 及 (c) 擔 任 總 助 理 ( 機 場 擴 建 統 籌 辦 ) 的

第 2 頁 (a) 擔 任 機 場 擴 建 統 籌 辦 總 監 的 首 席 政 府 工 程 師 職 位 第 3 點 ) ; (b) 擔 任 ( 機 場 擴 建 統 籌 辦 ) 的 首 長 級 丙 級 政 務 官 職 位 ; 以 及 (c) 擔 任 總 助 理 ( 機 場 擴 建 統 籌 辦 ) 的 財 務 委 員 會 人 事 編 制 小 組 委 員 會 討 論 文 件 2015 年 11 月 4 日 總 目 158- 政 府 總 部 : 運 輸 及 房 屋 局 ( 運 輸 科 ) 分 目 000 運 作 開 支 請 各 委 員 向 財 務 委 員 會 提 出 下 述 建 議, 即 由 財 務 委 員 會 批 准 當 日 起, 在 運 輸 及 房 屋 局 運 輸 科 機 場 擴 建 工 程 統

More information

cgn

cgn 3654 ( 571 ) 88(4) 2014 3 31 10766 10778 2014 3 31 ( ) 2 21 ( ) 2014 3 31 10768 10778 6 9 1. ( ) 2. 3. 4. 5. 2014 6 3 ( ) 10768 10778 ( ) 2014 3 31 ( 622 ) 11 80 2014 3 31 2014 6 3 10 8 2014 3 31 ( ) 2014

More information

第13章 SQL Server提供的应用程序接口

第13章 SQL Server提供的应用程序接口 第 13 部分 SQL Server 提供的应用程序接口 学习要点 : 通过 ODBC 连接 SQL Server 通过 ADO 对象连接 SQL Server 通过 JDBC 连接 SQL Server 13.1 ODBC 与 SQL Server 13.1.1 ODBC 的概述 开放式数据库连接 (Open Database Connectivity, ODBC) 是数据库服务器的一个标准协议,

More information

教 學 綱 要 表 1-1 多 媒 體 應 用 科 目 大 要 學 分 數 :2 建 議 開 課 學 期 : 第 九 十 八 學 年 第 二 學 期 本 科 目 教 學 目 標 在 培 養 學 生 影 像 製 作 及 影 像 剪 輯 等 多 媒 體 應 用 之 興 趣 與 能 力, 並 能 在 生

教 學 綱 要 表 1-1 多 媒 體 應 用 科 目 大 要 學 分 數 :2 建 議 開 課 學 期 : 第 九 十 八 學 年 第 二 學 期 本 科 目 教 學 目 標 在 培 養 學 生 影 像 製 作 及 影 像 剪 輯 等 多 媒 體 應 用 之 興 趣 與 能 力, 並 能 在 生 教 學 綱 要 表 1-1 文 書 處 理 科 目 大 要 學 分 數 :2 建 議 開 課 學 期 :98 學 年 第 二 學 期 本 科 目 目 標 : 本 課 程 主 要 在 引 導 學 生 學 會 文 書 處 理 軟 體 的 使 用 在 應 用 方 面 則 要 訓 練 學 生 常 用 的 電 腦 應 用 軟 體, 強 化 學 生 資 料 處 理 的 能 力 表 1-2 文 書 處 理 - 教

More information

基于UML建模的管理管理信息系统项目案例导航——VB篇

基于UML建模的管理管理信息系统项目案例导航——VB篇 PowerBuilder 8.0 PowerBuilder 8.0 12 PowerBuilder 8.0 PowerScript PowerBuilder CIP PowerBuilder 8.0 /. 2004 21 ISBN 7-03-014600-X.P.. -,PowerBuilder 8.0 - -.TP311.56 CIP 2004 117494 / / 16 100717 http://www.sciencep.com

More information

39898.indb

39898.indb 1988 4 1998 12 1990 5 40 70.................................................. 40.............................................................. 70..............................................................

More information

穨ecr2_c.PDF

穨ecr2_c.PDF i ii iii iv v vi vii viii 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 26 27 2 28 29 30 31 32 33 34 35 36 37 38 39 40 3 4 41 42 43 5 44 45 46 6 47 48 49 50 51 52 1 53 2 54 55 3 56

More information

電腦相關罪行跨部門工作小組-報告書

電腦相關罪行跨部門工作小組-報告書 - ii - - iii - - iv - - v - - vi - - vii - - viii - (1) 2.1 (2) (3) 13.6 (4) 1.6 (5) 21 (6) (7) 210 (8) (9) (10) (11) ( ) ( 12) 20 60 16 (13) ( ) (

More information

i

i i ii iii iv v vi vii viii ===== 1 2 3 4 5 6 7 8 9 10 ==== 11 12 13 14 15 16 17 18 19 ==== ==== 20 .. ===== ===== ===== ===== ===== ======.. 21 22 ===== ===== ===== ===== 23 24 25 26 27 28 29 ==== ====

More information

发展党员工作手册

发展党员工作手册 发 展 党 员 工 作 问 答 目 录 一 总 论...9 1. 发 展 党 员 工 作 的 方 针 是 什 么? 如 何 正 确 理 解 这 个 方 针?... 9 2. 为 什 么 强 调 发 展 党 员 必 须 保 证 质 量?... 9 3. 如 何 做 到 慎 重 发 展?... 10 4. 如 何 处 理 好 发 展 党 员 工 作 中 的 重 点 与 一 般 的 关 系?...11 5.

More information

i

i 9 1 2 3 4 i 5 6 ii iii iv v vi vii viii 1 1 1 2 3 4 2 5 6 2 3 2.10 ( 2.11 ) ( 2.11 ) ( 2.9 ) 7 8 9 3 10 5% 2% 4 11 93% (2001 02 2003 04 ) ( ) 2,490 (100%) 5 12 25% (2.57% 25%) 6 (2001 02 2003 04 ) 13 100%

More information

中医疗法(上).doc

中医疗法(上).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...1...2...4...5...7...13...15...17...18...19...21...23...24...24...26...26...27 I ...28...29...30...30...31...32...33...34...35...36...37...39...40...41...42...43...43...45...46...47...47...48

More information

香 港 舞 蹈 總 會    北 京 舞 蹈 學 院

香 港 舞 蹈 總 會    北 京 舞 蹈 學 院 報 名 規 則 : I. 保 送 教 師 資 格 : 香 港 舞 蹈 總 會 主 辦 二 零 一 六 年 秋 季 趣 學 堂 幼 兒 舞 蹈 課 程 評 核 報 名 及 規 則 ( 請 於 報 名 前 詳 細 閱 讀 整 份 文 件 ) 學 生 必 須 由 認 可 教 師 保 送 參 加 評 核, 而 以 下 為 認 可 教 師 的 資 格 : i. 持 有 由 香 港 舞 蹈 總 會 頒 發 之

More information

(As at 28

(As at 28 内 地 与 香 港 关 于 建 立 更 紧 密 经 贸 关 系 的 安 排 ( 安 排 ) 常 见 问 答 个 别 行 业 : 法 律 服 务 法 律 服 务 ( 18) I 受 聘 于 内 地 律 师 事 务 所 1 II 律 师 事 务 所 联 营 组 织 2 III 香 港 律 师 事 务 所 驻 内 地 代 表 机 构 ( 代 表 处 ) 4 I V 最 低 居 留 条 件 6 V 律 师

More information

學 習 內 容 元 素 一 直 透 過 中 小 學 校 課 程 相 關 課 題 培 養, 如 : 小 學 常 識 科 人 文 學 科 和 科 學 科 等 這 些 從 沒 有 因 為 德 育 及 國 民 教 育 科 課 程 指 引 在 2012 年 擱 置 而 有 任 何 改 變 4. 教 育 局 持

學 習 內 容 元 素 一 直 透 過 中 小 學 校 課 程 相 關 課 題 培 養, 如 : 小 學 常 識 科 人 文 學 科 和 科 學 科 等 這 些 從 沒 有 因 為 德 育 及 國 民 教 育 科 課 程 指 引 在 2012 年 擱 置 而 有 任 何 改 變 4. 教 育 局 持 立 法 會 CB(4)1287/14-15(01) 2015 年 7 月 15 日 會 議 討 論 文 件 立 法 會 教 育 事 務 委 員 會 在 學 校 推 行 德 育 及 公 民 教 育 前 言 本 文 件 旨 在 就 學 校 教 育 中 推 行 德 育 及 公 民 教 育 的 進 展 ( 包 括 基 本 法 教 育 及 推 廣 對 一 國 兩 制 的 認 識 ), 匯 報 德 育 及 公

More information

untitled

untitled 21 Visual FoxPro Visual FoxPro 6.0 11 Visual FoxPro Visual FoxPro CIP Visual FoxPro 2004 21 ISBN 7-03-014834-7 V Visual FoxPro TP311.138 CIP 2004 143035 16 100717 http://www.sciencep.com * 2004 12 7871092

More information

全国信息化工程师----GIS应用水平考试大纲(二级)

全国信息化工程师----GIS应用水平考试大纲(二级) 全 国 信 息 化 工 程 师 ----GIS 应 用 水 平 考 试 (NCIE-GIS) 二 级 应 用 方 向 考 试 大 纲 (2011.12 月 修 订 ) 为 了 更 好 地 指 导 考 生 学 习, 地 理 信 息 系 统 软 件 及 其 应 用 教 育 部 工 程 研 究 中 心 依 据 该 考 试 的 整 体 指 导 思 路, 会 同 有 关 专 家 共 同 制 定 了 全 国 信

More information

二零零六年一月二十三日會議

二零零六年一月二十三日會議 附 件 B 有 关 政 策 局 推 行 或 正 在 策 划 的 纾 缓 及 预 防 贫 穷 措 施 下 文 载 述 有 关 政 策 局 / 部 门 为 加 强 纾 缓 及 预 防 贫 穷 的 工 作, 以 及 为 配 合 委 员 会 工 作, 在 过 去 十 一 个 月 公 布 及 正 在 策 划 的 新 政 策 和 措 施 生 福 利 及 食 物 局 (i) 综 合 儿 童 发 展 服 务 2.

More information

马太亨利完整圣经注释—雅歌

马太亨利完整圣经注释—雅歌 第 1 页 目 录 雅 歌 简 介... 2 雅 歌 第 一 章... 2 雅 歌 第 二 章... 10 雅 歌 第 三 章... 16 雅 歌 第 四 章... 20 雅 歌 第 五 章... 25 雅 歌 第 六 章... 32 雅 歌 第 七 章... 36 雅 歌 第 八 章... 39 第 2 页 雅 歌 简 介 我 们 坚 信 圣 经 都 是 神 所 默 示 的 ( 提 摩 太 后 书

More information

厨房小知识(四)

厨房小知识(四) I...1...2...3...4...4...5...6...6...7...9...10... 11...12...12...13...14...15...16...17...18...18...19...22...22 II...23...24...25...26...27...27...28...29...29...30...31...31?...32...32...33?...33...34...34...35...36...36...37...37...38...38...40

More information

妇女更年期保健.doc

妇女更年期保健.doc ...1...2...3...5...6...7 40...8... 11...13...14...16...17...19...20...21...26...29...30...32 I ...34...35...37...41...46...50...51...52...53...54...55...58...64...65 X...67...68...70...70...74...76...78...79

More information

小儿传染病防治(上)

小儿传染病防治(上) ...1...2...3...5...7...7...9... 11...13...14...15...16...32...34...34...36...37...39 I ...39...40...41...42...43...48...50...54...56...57...59...59...60...61...63...65...66...66...68...68...70...70 II

More information

<4D6963726F736F667420576F7264202D2031303430333234B875B9B5A448ADFBBADEB27AA740B77EA4E2A5555FA95EAED6A641ADD75F2E646F63>

<4D6963726F736F667420576F7264202D2031303430333234B875B9B5A448ADFBBADEB27AA740B77EA4E2A5555FA95EAED6A641ADD75F2E646F63> 聘 僱 人 員 管 理 作 業 參 考 手 冊 行 政 院 人 事 行 政 總 處 編 印 中 華 民 國 104 年 3 月 序 人 事 是 政 通 人 和 的 關 鍵 是 百 事 俱 興 的 基 礎, 也 是 追 求 卓 越 的 張 本 唯 有 人 事 健 全, 業 務 才 能 順 利 推 動, 政 府 施 政 自 然 績 效 斐 然 本 總 處 做 為 行 政 院 人 事 政 策 幕 僚 機

More information

女性青春期保健(下).doc

女性青春期保健(下).doc ...1...4...10... 11...13...14...15...17...18...19...20...21...22...23...24...26...27...30...31 I ...32...33...36...37...38...40...41...43...44...45...46...47...50...51...51...53...54...55...56...58...59

More information

避孕知识(下).doc

避孕知识(下).doc ...1...3...6...13...13...14...15...16...17...17...18...19...19...20...20...23...24...24...25 I ...25...26...26...27...28...28...29...30...30...31...32...34...35 11...36...37...38...40...42...43...44...44...46

More information

孕妇饮食调养(下).doc

孕妇饮食调养(下).doc ...1...2...5...9 7...9...14...15...16...18...22...23...24...25...27...29...31...32...34 I ...35...36...37...39...40...40...42...44...46...48...51...52...53...53...54...55...56...56...58...61...64 II ...65...66...67...68...69...70...71...72...73...74...75...76...77...80...83...85...87...88

More information

禽畜饲料配制技术(一).doc

禽畜饲料配制技术(一).doc ( ) ...1...1...4...5...6...7...8...9...10... 11...13...14...17...18...21...23...24...26 I ...28 70...30...33...35...36...37...39...40...41...49...50...52...53...54...56...58...59...60...67...68...70...71

More information

中老年保健必读(十一).doc

中老年保健必读(十一).doc ...1...2...4...6...8...9...10...12...14...15...17...18...20...22...23...25...27...29 I ...30...32...35...38...40...42...43...45...46...48...52...55...56...59...62...63...66...67...69...71...74 II ...76...78...79...81...84...86...87...88...89...90...91...93...96...99...

More information

i

i i ii iii iv v vi 1 2 3 4 5 (b) (a) (b) (c) = 100% (a) 6 7 (b) (a) (b) (c) = 100% (a) 2 456 329 13% 12 120 7.1 0.06% 8 9 10 11 12 13 14 15 16 17 18 19 20 (a) (b) (c) 21 22 23 24 25 26 27 28 29 30 31 =

More information

怎样使孩子更加聪明健康(七).doc

怎样使孩子更加聪明健康(七).doc ...1...2...2...4...5 7 8...6...7...9 1 3... 11...12...14...15...16...17...18...19...20...21...22 I II...23...24...26 1 3...27...29...31...31...33...33...35...35...37...39...41...43...44...45 3 4...47...48...49...51...52

More information

i

i i ii iii iv v vi 1 g j 2 3 4 ==== ==== ==== 5 ==== ======= 6 ==== ======= 7 ==== ==== ==== 8 [(d) = (a) (b)] [(e) = (c) (b)] 9 ===== ===== ===== ===== ===== ===== 10 11 12 13 14 15 16 17 ===== [ ] 18 19

More information

Microsoft Word - EDB Panel Paper 2016 (Chi)_finalr

Microsoft Word - EDB Panel Paper 2016 (Chi)_finalr 2016 年 1 月 15 日 會 議 討 論 文 件 立 法 會 教 育 事 務 委 員 會 2016 年 施 政 報 告 教 育 局 的 政 策 措 施 行 政 長 官 在 2016 年 1 月 13 日 發 表 其 2016 年 施 政 報 告 本 文 件 旨 在 闡 述 施 政 報 告 中 有 關 教 育 事 務 的 主 要 措 施 2. 培 育 人 才 始 於 教 育 在 教 育 政 策

More information

Microsoft Word - 书目文件.doc

Microsoft Word - 书目文件.doc 计 算 机 类 算 法 与 程 序 设 计 类 1 11025 数 据 结 构 ( 第 三 版 ) 十 一 五 国 家 级 规 划 教 材 刘 振 鹏 等 28.00 2010.5 本 科 2 11563 数 据 结 构 习 题 解 答 与 实 验 指 导 ( 第 三 版 ) 石 强 等 21.00 2010.7 本 科 3 07628 数 据 结 构 与 算 法 王 昆 仑 35.00 2007.6

More information

工程项目进度管理 西北工业大学管理学院 黄柯鑫博士 甘特图 A B C D E F G 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 甘特图的优点 : 直观明了 ( 图形化概要 ); 简单易懂 ( 易于理解 ); 应用广泛 ( 技术通用 ) 甘特图的缺点 : 不能清晰表示活动间的逻辑关系 WBS 责任分配矩阵 ( 负责〇审批

More information

untitled

untitled 說 參 例 邏 邏 1. 說 2. 數 數 3. 8 4. 理念 李 龍老 立 1. 理 料 2. 理 料 3. 數 料 4. 流 邏 念 5. 良 6. 讀 行 行 7. 行 例 來 邏 1. 說 說 識 量 2. 說 理 類 3. 數 數 念 4. 令 5. 良 6. 流 邏 念 7. 說 邏 理 力 1. 2. 3. 4. 5. 列 念 1 參 1. ( Visual Basic 例 ) (1)

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

Linux服务器构建与运维管理

Linux服务器构建与运维管理 1 Linux 服务器构建与运维管理 第 2 章 :Linux 基本命令 阮晓龙 13938213680 / rxl@hactcm.edu.cn http://linux.xg.hactcm.edu.cn http://www.51xueweb.cn 河南中医药大学管理科学与工程学科 2018.3 2 提纲 目录与文件的操作 mkdir touch mv cp rm rmdir file tree

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

FPGAs in Next Generation Wireless Networks WPChinese

FPGAs in Next Generation Wireless Networks WPChinese FPGA 2010 3 Lattice Semiconductor 5555 Northeast Moore Ct. Hillsboro, Oregon 97124 USA Telephone: (503) 268-8000 www.latticesemi.com 1 FPGAs in Next Generation Wireless Networks GSM GSM-EDGE 384kbps CDMA2000

More information

TC35短信发送程序设计

TC35短信发送程序设计 http://www.dragonsoft.net.cn/down/project/tc35_sms.rar TC35 AT /down/book/tc35_at.pdf TC35/TC35i GSM Modem TC35 GSM POS COM SIM DOWN COM E, vbcr AT VB6.0 1)C# http://www.yesky.com/softchannel/72342380468109312/20040523/1800310.shtml,

More information

Microsoft Word - Panel Paper on T&D-Chinese _as at 6.2.2013__final_.doc

Microsoft Word - Panel Paper on T&D-Chinese _as at 6.2.2013__final_.doc 二 零 一 三 年 二 月 十 八 日 會 議 討 論 文 件 立 法 會 CB(4)395/12-13(03) 號 文 件 立 法 會 公 務 員 及 資 助 機 構 員 工 事 務 委 員 會 公 務 員 培 訓 及 發 展 概 況 目 的 本 文 件 介 紹 公 務 員 事 務 局 為 公 務 員 所 提 供 培 訓 和 發 展 的 最 新 概 況, 以 及 將 於 二 零 一 三 年 推 出

More information