MapXtreme Java 版本开发人员指南


ᓔথ㗙ᣛफ文档内容如有更改,恕不另行通知,文档的任意内容不代表供应商或其销售代表的承诺。若非得到位于 New York 12180-8399 Troy One Global View 的 MapInfo Corporation 的书面许可,不得以包含影印在内的任何电子或机械的形式或手段,复制或传播本文档的任意部分。 © 2006 MapInfo Corporation。保留所有权利。MapInfo、MapInfo 徽标和 MapXtreme Java 均为 MapInfo 公司和 / 或其分支机构所属的商标。 MapInfo 公司总部: 语音电话:(518) 285-6000 传真:(518) 285-6070 销售信息热线:(800) 327-8627 政府机构销售热线:(800) 619-2333 技术支持热线:(518) 285-7283 技术支持传真:(518) 285-6080 欲获取所有 MapInfo 办事处的联系信息,也可查询以下网页:http://www.mapinfo.com/contactus。 Adobe Acrobat® 是 Adobe Systems Incorporated 在美国的注册商标。 ECW by ER mapper © 1998-2001. HIL - Halo Image Library © 1993, Media Cybernetics Inc. Halo Imaging Library 是 Media Cybernetics, Inc. 的商标。 LEAD Technologies, Inc. © 1996. MrSID、MrSID Decompressor 和 MrSID 徽标均为 LizardTech, Inc 的商标,许可授权使用。本计算机程序部分版权属于 © 1995-1998 LizardTech 和 / 或加利福尼亚大学所有,受到美国 5,710,835、5,130,701 或 5,467,110 号专利保护,授权许可使用。保留所有权利。MrSID 受到美国和国际 专利和版权条约以及外国申请未决专利的保护。禁止未经授权使用或复制。 Portions © Tele Atlas, Inc (GDT, Inc.) 在此涉及到的产品名称均是且视为其各自制造商所有的商标。商标名称均为文档编辑过程所引用,令商标所有人受益并无意侵犯商标的合法 权利。 2006 年 10 月目录 第 1 章:简介. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 产品目标用户. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 优点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 编程优点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 使用 MapXtreme Java 可以做什么? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 MapXtreme Java 文档集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 MapXtreme Java Edition 4.8 新增特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 将 MapXtreme Java 4.x 应用程序移植到 4.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 第 A 部分:使用 MapXtreme Java . . . . . . . . . . . . . . . . . . . . . . . . . 13 第 2 章:入门. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 安装 MapXtreme Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 卸载 MapXtreme Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23 Apache-Tomcat 部署环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24 在其它 Web 服务器环境中部署 MapXtreme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24 已安装的组件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 静默安装模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27 配置故障排除. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28 软件复制保护. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 第 3 章:应用程序规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 部署选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33 MapXtreme Java 概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33 设计时的考虑因素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35 第 4 章:地图绘制概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 地图定义格式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 地图图元 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40 样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40目录 iv MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 标注. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 地图数据分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 将数据置于地图中 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41 第 5 章:管理 MapXtreme Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 地图定义面板. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Web 应用程序面板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 命名资源面板. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 连接管理器面板. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 向 MapXtreme Java Manager 添加服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 使用 MapXtreme Java Manager 管理数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Geosets 和地图定义. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 加载现有的地图定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 创建地图定义. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 保存地图定义. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 使用地图工具控制图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 图层控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 通过图层控制显示选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 经由图层控制的标注选项. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 管理命名资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 第 6 章:Web 应用程序构建器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 定制 JSP 标记库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 第 7 章:MapXtreme JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 VisualMapJ Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 MapTool Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 MapToolBar Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 LayerControl Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 AddTheme Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 SimpleMap Applet 示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 在 Applet 或应用程序中包含 MapTools. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 配置和控制标准地图工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 创建定制 MapTools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 第 8 章:编写定制 Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 使用 Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 瘦客户机 / 胖服务器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 胖客户机 / 瘦服务器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 中型客户机 / 中型服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112目录 开发人员指南 v © 2006 MapInfo Corporation. 保留所有权利。 MapXtremeServlet 数据流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115 Servlet 转发 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .117 示例 Servlet:HTMLEmbeddedMapServlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .117 带有专题功能的样例 Servlet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120 使用 Servlet 实用程序库 (MapToolkit). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120 第 B 部分:MapJ API 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 第 9 章:MapJ API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 创建第一个地图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .126 控制地图视图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129 添加图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131 通过编程保存地图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131 命名地图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134 基本地图之外的其它特性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135 第 10 章:在图层中绘制地图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 图层类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138 Layers 集合:构建地图的模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139 使用数据提供方定义图层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139 创建定制数据提供方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142 定义 JDBC 图层的注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142 将图层添加到 MapJ Layers 集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143 从远程数据库访问 TAB 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148 数据绑定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148 注释图层(Annotation 图层) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152 分析图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152 命名图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153 Layers 集合的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .154 缩放图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .158 生成图层标注. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159 栅格图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .160 导入栅格图像的考虑因素. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162 栅格样式标记. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163 MapXtreme Java 中的网格图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166 第 11 章:渲染涉及的考虑因素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 LocalRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168 EncodedImageRenderer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168 使用命名地图渲染附加图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168目录 vi MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 动画图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 渲染速度与渲染质量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 栅格输出格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 SVG 输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 WBMP 支持 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 复合渲染器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 渐进渲染 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Intra-Servlet 容器渲染器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 第 12 章:访问远程数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 命名连接池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 如何创建命名连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 访问入池连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 管理命名和直接数据库连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 第 13 章:图元和搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 使用 FeatureFactory 创建图元. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 FeatureSet 集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 搜索方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 搜索由 SQL 查询定义的图层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 图元编辑 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 第 14 章:标注和样式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 专题标注 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 每图元标注样式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 LabelProperties 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 合并标注属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 标注代码示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 样式概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 样式属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 命名样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 每图元样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 第 15 章:专题地图绘制和分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 用于专题的一般对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 OverrideTheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 RangedTheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 SelectionTheme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 IndividualValueTheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238目录 开发人员指南 vii © 2006 MapInfo Corporation. 保留所有权利。 专题图例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240 制图图例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .241 使用分析图层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242 第 C 部分:高级主题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 第 16 章:XML 协议 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 MapImageRequest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .249 MapVectorRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .252 第 17 章:定制 AddLayer 向导. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 更改数据源列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256 指定命名数据库连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259 addlayerwizard.properties 的位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260 指定默认值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260 保存口令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261 第 18 章:创建定制数据提供方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 主数据提供方接口和文件概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264 用于向量数据的 DataProvider 实现步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .266 用于栅格数据的 DataProvider 实现步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267 向 AddLayerWizard 添加定制 DataProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268 第 19 章:Web 地图服务. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 GetCapabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272 GetMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276 GetFeatureInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .277 WMS 栅格数据提供方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279 WMS 客户端 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .280 第 D 部分:附录. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 附录 A:MapXtreme Java Jar 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 附录 B:坐标系的元素. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 投影基准面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .293 有关投影的详细信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305 附录 C:定制 JSP 标记库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 创建定制 JSP 标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .317目录 viii MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 创建添加 TAB 图层标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 向 Web 应用程序向导添加定制标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 附录 D:理解 MapBasic 样式字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 画刷样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 符号样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 字体样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 颜色. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 使用 MapInfo Professional 确定 MapBasic 样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 附录 E:图像符号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 附录 F:MAPINFO.MAPINFO_MAPCATALOG . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 MapXtreme Java SQL 脚本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 MAPINFO.MAPINFO_MAPCATALOG 格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 附录 G:系统属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 附录 H:系统日志记录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 在服务器端记录日志 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 在客户机端记录日志 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 日志记录级别. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359简介 MapXtreme Java Edition 是企业级的地图绘制开发工具,可实现数据的可视化和 地图绘制,帮助企业作出更加出色的决策,并更加有效地进行运营和管理资产。 在可管理的服务器网络上实现应用程序的运行,不仅在很大程度上提高了规模效 益,如降低硬件和管理成本,同时还明显改善了应用程序性能、可靠性和安全 性。使用 MapXtreme Java 构建的应用程序既可适用于企业内部网,也可适用于 公共的因特网。 本章内容:  产品组件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2  产品目标用户 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2  特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2  优点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3  编程优点. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3  使用 MapXtreme Java 可以做什么? . . . . . . . . . . . . . . . . . . . . . . . . .5  MapXtreme Java 文档集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6  MapXtreme Java Edition 4.8 新增特性 . . . . . . . . . . . . . . . . . . . . . . .6  将 MapXtreme Java 4.x 应用程序移植到 4.8 . . . . . . . . . . . . . . . . . .11产品组件 2 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 产品组件 MapXtreme Java 是一个 100% 的纯 Java 类(Java 2 兼容)集合,借助于这一集合,可将应用程序 部署到各种系统,无论是 Windows、UNIX 系统,还是这两种系统的混合环境。本产品包括以下组件: • MapXtremeServlet 地图绘制引擎 • MapJ API 和 Java 类库 • MapXtreme JavaBean • MapXtreme Java Manager 和 Web Application Builder • JSP 定制标记库 • Java 2 VM (1.4.1) • 示例应用程序 • 示例数据 • MapXtreme Java 文档集(本《开发人员指南》和 MapJ API Javadocs) 产品目标用户 本产品面向开发人员设计,适用于创建集成动态地图以及与相应地图进行交互所需工具的 Web 应用 程序。 对于经验丰富的 Java 程序员而言,可选择使用 MapJ API 通过编程设计定制的地图和功能。 对于 Java 程序员新手,则可选择以 JavaBean 形式提供的地图绘制功能,在可视化的 IDE 中通过鼠 标的拖放,轻松实现开发。 即使不是程序员,也可使用 Web Application Builder 迅速创建 Web 应用程序原型,无需编程。Web Application Builder 提供了逐个步骤的指南,帮助用户创建基于 JavaServer 页 (JSP) 标记的地图绘 制应用程序。 特性 MapXtreme Java 是基于 Java 2 企业版中指定的 servlet 体系结构的企业级应用程序开发工具。 MapXtremeServlet 是本产品的关键组件之一,用于在服务器端管理地图绘制服务的请求和响应,其 中包括图像请求(GIF 和 JPEG)、向量数据请求(查询方法)和元数据请求(表信息)。 借助于 servlet 体系结构,MapXtreme Java 可以侧重于处理地图绘制请求,而由 Web 服务器 /servlet 容器处理例如负载平衡、安全和容错等其它服务器端问题。此外,相应 servlet 模型使用 HTTP 这一 因特网上的标准通信协议。MapXtreme Java 的其它特性包括: • 诸如选择行为、专题地图绘制和分析以及高级标注和渲染等功能的高级地图绘制功能。 • 通过 JDBC 访问数据源,不仅可在安全 RDBMS 上维护空间数据,同时还可利用其全部潜力构建 地图。 • 轻松便捷的安装、配置、开发和部署,本产品提供了 JavaBean、Web Application Builder、JSP 定制标记库、示例应用程序和 Apache Web Server/Tomcat servlet 容器等众多便利。第 1 章:简介 开发人员指南 3 © 2006 MapInfo Corporation. 保留所有权利。 优点 MapXtreme 提供了支持多平台、高质量、高性能的易用解决方案来满足各种地图绘制需求。 多平台 出于安全性、可靠性和性能方面的种种原因,诸如电信和保险业等众多面向最终用户的行业,均采 用了 UNIX 系统;而与此同时,同一企业中的不同用户,还有可能使用 Windows 系统。在多种平台 上部署类似解决方案是常见的需求之一。借助于基于 Java 的地图绘制应用程序,开发人员编写一个 程序,即可在支持虚拟机的多种平台上运行。 将 MapXtreme Java Edition 部署在服务器端运行,即可充分利用现有的 UNIX 或 Windows 资源。开 发人员可以在一个系统上存储和控制数据,同时通过编程方式从其它运行虚拟机的计算机实现相应 数据的访问。 高扩展性 对于使用 MapXtreme 创建企业级地图绘制解决方案的组织而言,所开发的应用程序不仅应该可以良 好运行,而且还应该可以支持需要访问各种应用的所有用户。MapXtreme 为此采用基于组件的策 略,提供了可靠的多线程解决方案,确保了出色的适应性和扩展性。借助于此,企业即可根据组织 的具体需求来扩展应用程序。 快速部署 借助于 MapXtreme,用户可以实现应用程序的快速开发、安装和部署。本产品为此提供了用于快速 开发原型的 Web Application Builder 向导,以及展示 MapXtreme Java 基本概念和知识的若干示例 应用程序。这些示例应用程序既可以进一步开发为专用的应用程序,也可以作为用户自行开发应用 程序所依赖的基础。MapXtreme Java 与所有 J2EE 验证的 Web 服务器 / 浏览器兼容,并且不使用专 属的插件。 编程优点 面向对象 MapXtreme 是面向对象的开发工具,采用易用的对象模型分层结构,用于地图的显示、查询和分析。 MapJ API MapJ API 是用于与地图绘制引擎 MapXtremeServlet 通信的客户端 API。每个源自 MapXtreme 的客 户端请求地图均使用(或复用)MapJ 对象的实例。由于 MapXtreme 没有采用专属的插件,因此其 可以将地图传输到任意操作系统上的任意浏览器。 MapXtreme 是异步多线程且无状态的,实现了性能的最大化。编程优点 4 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 服务器端 Java 大部分 Web 应用软件提供商的原始解决方案均为全状态的客户端工具,这些工具必须与特定的服务 器环境相匹配。与此相反,MapXtreme 从设计之初就是服务器端的 Java 组件。使用 MapXtreme 开 发的应用程序尤其支持: • 众多并发用户 • 计算机群集 • 采用多 CPU 的服务器 • 任意平台(包括 Windows NT 和众多版本的 UNIX) • 数据库连接池 • 将安全问题与客户端实现相隔离 借助于此,MapXtreme 基于 Web 的地图绘制应用程序可扩展以支持众多用户,并可由应用服务器来管理 相应的用户。MapXtreme 可以与采用 Web 服务器(例如,Apache/Tomcat、JRun 或 IBM WebSphere) 的高负载网站高效协同工作。 智能多线程 MapXtreme 使用由 servlet 容器/应用服务器提供的智能 Java 线程来有效处理多个并发用户的负荷。 这样不仅消耗的内存较低,而且还可以通过添加额外的 CPU 来支持更高的用户负荷。测试表明, MapXtreme 服务器引擎在稳定状态下需要约 8MB 内存,另外每个并发用户需要增加 100 KB 至 200 KB 内存。例如,假定一个线程正在处理地图请求。那么与此同时,另外三个线程可以通过网络 I/O 来传 递此前三个地图请求的结果。 基于组件的灵活性 MapXtreme 采用基于组件的体系结构,在部署上实现了相当高的灵活性。本产品共有 4 个高层组件, 如下所示:MapJ 对象、显示地图的地图渲染器、访问各种数据源的数据提供方以及 MapXtremeServlet。 MapXtreme 可用于两层的内部网部署,将 MapJ 置于客户端;也可用于因特网的三层配置,将 MapJ 和业务逻辑置于中间层。 针对远程数据集的强大连接性能 MapXtreme 顺应在关系数据库中存储空间数据的潮流,提供了对于带有空间选项的 Oracle ,带有 Spatial Extender 的 IBM DB2 和带有 SpatialWare DataBlade 的 Informix Dynamic Server 等数据库 管理系统的支持。借助于此,即可在企业级数据库管理系统中维护空间数据,确保关键任务的完 成,也可同时为万维网上的任意用户提供适当的访问权限。 兼容任意 Web 环境 MapXtreme 的开放式体系结构几乎完全兼容所有的 Web 环境(尤其是三层体系结构),并可以和支 持 ISAPI、NSAPI 或 CGI 网关的任意 Web 服务器系统(如 Netscape、Apache)一起工作。作为一 个 servlet 环境,MapXtreme 兼备了 Sun 的 Java Servlet API 的全部优点。 MapInfo 建议的环境体系结构包括可以生成 Java 对象实例的应用服务器。为了便于使用,产品光盘 上提供了 Apache Web Server 和 Tomcat servlet 容器。第 1 章:简介 开发人员指南 5 © 2006 MapInfo Corporation. 保留所有权利。 事实上,任意 Web 浏览器均接受 MapXtreme 生成的地图,因为 MapXtreme 可以将地图图像作为 GIF 或 JPEG 等栅格图像输出,这些图像随后嵌入到 HTML 中。有些功能更强大的浏览器(或带有 1.4 或更高版本 VM 插件的浏览器)还可以接收向量数据,并使用这些向量显示地图。MapInfo 建议 使用 Netscape 或 Internet Explorer 4.x 或更高版本。 便于编程 MapXtreme Java 提供了众多工具和便利,协助用户开发 Web 应用程序。MapXtreme Java Manager 提供 Web Application Builder 向导,引导您创建 web 应用程序。这对于快速创建体现概念应用程序 的原型尤为实用。该向导使用 JavaServer 页技术,采用定制 JSP 标记的形式,简化了地图绘制应用 程序所需的必要编码。MapXtreme 还提供了众多 JavaBean 以及可拖放至可视化 IDE 界面中的地图 绘制组件。 使用 MapXtreme Java 可以做什么? 使用 MapXtreme Java 可以构建两层和三层 Web 地图绘制程序,处理源自客户机的地图数据请求。 借助于其灵活的可扩展体系结构,可根据具体的地图绘制需要,向客户机发送软件、控制对敏感数 据的访问和随需求的增长来扩展应用程序。 程序员尤其可以: • 设计只具备所需的特性和信息的定制地图 • 通过编程方式创建静态和动态对象 • 定制地图图元的外观、位置和行为 • 监听类似用户鼠标点击的地图事件,初始化地图的变更 对于要使用地图绘制应用程序的最终用户而言,可为其提供工具来实现: • 缩放和平移,以更改地图视野 • 选择地图图元和绘制搜索区域 • 查询地图图元以获取更多信息 • 创建专题影线表示,例如基于数据库中数据的颜色编码地图 • 控制对象和标注的可见性和样式 实用 MapXtreme Java 在提供众多强大功能的同时,还可以通过若干种方式,将地图绘制功能集成到企业 应用程序中。 • 为现场技术人员提供实时访问公司和客户数据的能力,更好地从现场提供服务。 • 在电信和运输领域,地图提供了一种监视网络的途径,用于确定问题区域、性能瓶颈或维修状态。 • 在供应链管理中,地图绘制应用程序可用于查看货物、服务或人员的分布,并根据需要重新分配 相应资源。 • 创建用于供货卡车、网络电话或军队部署的跟踪应用程序。 • 实现更加便捷的客服自助服务应用,例如用于公众访问有关政府计划的信息。MapXtreme Java 文档集 6 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapXtreme Java 文档集 本《开发人员指南》是开始学习 MapXtreme Java 的最佳资源。此外,还有若干附加信息资源对于 MapXtreme 开发人员非常实用,其中包括: • MapJ API 规范 (HTML) — 随 MapXtreme 安装的 Javadoc 提供 • Web 上的 MapXtreme Java — www.mapinfo.com/mapxtreme 的 web 资源,包括可访问的论 坛和知识库。 MapXtreme Java Edition 4.8 新增特性 MapXtreme Java Edition 包括了以下的最新功能扩展: DB2 Spatial Extender 数据提供方 MapXtreme 通过增加 IBM DB2 Spatial Extender 数据提供方,继续构建对空间数据库访问的支持。 使用 JDBC 可以在准确位置访问 DB2 空间和非空间数据。使用 MapXtreme 示例和模板时,此数据 提供方自动可用。如果从头开始构建应用程序,请将 mxjdb2sedp.jar 置于 classpath 中。 和其它受支持的远程数据库管理系统一样,DB2 Spatial Extender 数据提供方使用 DataProviderHelper (DB2SEDataProviderHelper) 定义数据源,并使用 TableDescHelper (DB2SETableDescHelper) 通过表名或查询描述数据。 DB2 Spatial 数据提供方支持瘦驱动程序和胖驱动程序类型。在连接请求内核或 thickbequeth 的驱动 程序类型时,DB2SEDataProviderHelper 将其视为瘦驱动程序请求。此数据提供方支持以下 DB2 Spatial Extender 驱动程序类: • com.ibm.db2.jcc.DB2Driver(设置为默认的瘦驱动程序) • COM.ibm.db2.jdbc.app.DB2Driver(设置为默认的胖驱动程序) DB2 Spatial Extender 数据提供方在添加图层向导中构建,用于通过 MapXtreme Java Manager 或编 程方式来实现简单数据访问。相关编程信息,请参阅第 139 页第 10 章的使用数据提供方定义图层。 有关使用 MapXtreme Java Manager 的说明,请参阅第 50 页第 5 章的使用添加图层向导。要控制添 加图层向导中数据源的显示,请参阅第 17 章:定制 AddLayer 向导。 支持显示 TAB 文件的文本对象 MapXtreme Java Edition 现在可以从 MapInfo TAB 文件读取并显示文本对象,例如地图标题、版权 信息和其它注释。文本对象是使用 MapInfo Professional 创建的,存储在 MAP 文件中,MAP 文件同时 存储了 TAB 文件的几何对象。渲染 MapXtreme Java Edition 中的文本对象遵循 MapInfo Professional 中预期的相同样式,位置和大小调整。 在将 MapXtreme 专题应用到包含文本对象的图层时,专题的符号前景色会用于渲染文本。从 TAB 文件渲染文本对象既支持本地渲染也支持远程渲染。第 1 章:简介 开发人员指南 7 © 2006 MapInfo Corporation. 保留所有权利。 支持栅格格式 MapXtreme Java Edition 继续扩展了对读取各种栅格图像格式的支持。支持以下新增格式: ECW 栅格格式 ECW(增强小波压缩)是一种使用小波压缩的栅格数据格式,能够生成 100:1 或更高的压缩比率。 此栅格数据提供方使用 Java ECW 数据开发工具包 (DDK)。 可以加载 TAB 文件中与地理相关的 ECW 栅格文件,且能够应用标准栅格样式(亮度、对比度、灰 度、透明度和半透明度)。 MrSID 栅格格式 MrSID(多分辨率无缝图像数据库)是一种图像压缩工具、查看器和文件格式,用于超大栅格图形图 像。MrSID 通过将上百幅小图像一起填充到一幅大的无缝图像来工作,此无缝图像能够极少或无退 化地压缩和解压。 军用栅格格式 MapXtreme Java Edition 现在支持多种在政府和军用 GIS 中常用的栅格格式,包括 ADRG、CADRG、 CIB、ASRP、USRP、NITF 和 DTED (0,1,2,3,)。 有关栅格图像的详细信息,请参阅第 10 章:在图层中绘制地图。 支持通过 WMS 的 ImageConnect 服务 MapXtreme Java Edition 支持通过 WMS 接口连接到 GlobeXplorer 的 ImageConnect 服务。这样就 可以将 WMS 地图图像作为图层添加到用户的 MapXtreme 应用程序中。有关如何访问图像连接服务 的详细信息,请参阅 /MapXtreme-4.8.0/examples/client/wms 中的示例应用程序 ImageConnectService.java。此示例说明了如何添加 ImageConnect WMS 栅格图层和使用 Swing 覆 盖向量图层以显示结果。 渲染质量 目前,MapXtreme 地图图像使用 Java 2D API 的反锯齿支持。输出的质量越高,显示的线条和边缘 越平滑。反锯齿是一种平滑线条和边缘外观的技术,通过增加颜色或灰度的像素并与原始像素混合 来实现。 现在可以在地图请求中指定 MapXtreme 是应按最佳绘制质量优先于绘制速度(使用反锯齿支持)还 是按绘制速度优先于绘制质量来渲染地图。可以对每个请求分别设置,也可以在服务器上设置所有 请求的渲染操作。 为了执行该操作,已将下面的渲染增强功能添加到 MapJ API: • com.mapinfo.xmlprot.mxtj.Rendering:这是类型安全的枚举,使用以下三个值:QUALITY、 SPEED 和 DEFAULT(使用服务器默认值)。 • com.mapinfo.xmlprot.mxtj.ImageRequestComposer:该类使用两种新的方法来获取和设置 渲染类型。ImageRequestComposer 是用于请求地图图像的主要类。MapXtreme Java Edition 4.8 新增特性 8 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 • com.mapinfo.render.quality:该系统属性允许服务器管理员设置用于所有地图渲染请求的渲染 操作。值为 true 时将按最佳质量渲染地图。值为 false 时将按最佳速度渲染地图。请参阅 Javadocs 获取有关渲染类的示例。 有关详细信息,请参阅第 9 章:MapJ API 和第 11 章:渲染涉及的考虑因素中的渲染地图。 用于多个几何对象的单一图例 MapXtreme 图例 API 的功能现已增强,使地图中具有多个几何对象的 FeatureSets 能够以同一制图 图例表示。此前每个几何对象都要以其自己的图例表示。 网格的图例 MapXtreme 现在能够显示表示网格栅格拐点的图例。MapXtreme 使用网格拐点表中的信息来创建制 图图例。图例通过显示色块表示每个拐点。拐点通常反映数据值的显著变化,例如正值和负值。 网格专题可以在 MapInfo Professional 中创建和修改,并在 MapXtreme 应用程序中查看。MapXtreme 不执行任何网格插值操作。请参阅第 166 页第 10 章的 MapXtreme Java 中的网格图像。 新增和更新的坐标系支持 MapXtreme Java Edition 现已增加对瑞典、以色列、法国、芬兰和日本的坐标系定义的支持。此外, 新增了对多种投影和基准面转换的支持。坐标系支持使 MapXtreme Java 符合 MapInfo Professional 和 MapXtreme 2005 (Windows) 支持的标准。 坐标系数据存储在名为 micsys.txt 的投影文件中,该文件位于 MapXtreme-4.8.0/lib/common 目录下 的 micsys.jar 中。 要通过编程设置坐标系,请参阅第 131 页第 9 章的设置坐标系。要使用 MapXtreme Java Manager 选择坐标系,至少要有一个地图图层打开,再转至地图选项并滚动标注为显示坐标系的列表。 有关坐标系的详细信息,请参阅附录 B:坐标系的元素。 坐标系 • 瑞典:SWEREF 99 • 以色列:Reshet Israel Yeshana, Reshet Israel Hadasha • 法国:French RGF93, various French Lambert • 芬兰:KKJ Zones 1-4 • 日本:Zones I-XIX (JGD2000 Datum) 投影 • 球面双像 • Cassini-Soldner • Lambert 等面积方位(修改为支持全部原点纬度) • 等距方位(修改为支持全部原点纬度) • 多圆锥 • Regional Mercator(修改为支持全部原点纬度)第 1 章:简介 开发人员指南 9 © 2006 MapInfo Corporation. 保留所有权利。 • Swiss Oblique Mercator • Transverse Mercator(修改为支持 Finnish KKJ) 基准面转换 3 参数转换 (dx, dy, dz) 7 参数转换 (dx, dy, dz, rx, ry, rz, s) 地图定义允许数据的绝对或相对路径 MapXtreme Java 支持读取和保存地图定义,其中包含任意基于文件的引用(GeoTiff、TAB、raster 等)的相对路径或绝对路径。相对路径表示文件引用相对于地图定义文件的位置。绝对路径表示文 件的固定位置,包括文件系统的根目录。 MapXtreme Java Edition 将两种版本的世界地图定义示例安装到本地目录 (\MapXtreme-4.8.0\examples\server\data\local): • world.mdf 包含绝对路径。将 MapXtreme Java Manager 作为 web 服务器使用时,请使用此版本。 • world_relative.mdf 包含相对路径:将 MapXtreme Java Manager 作为独立实用程序使用时,请 使用此版本。 用户保存自己的地图定义时,MapXtreme Java Manager 会在保存地图定义对话框中包含一个复选 框,用于指定是绝对路径还是相对路径。对于编程方式,com.mapinfo.MapJ.saveMapDefinition 现已新增布尔值参数 isRelative 以实现此功能。 有关使用 MapXtreme Java Manager 保存地图定义的详细信息,请参阅第 56 页第 5 章的保存地图定 义。相关编程信息,请参阅第 131 页第 9 章的通过编程保存地图。有关地图定义的一般讨论,请参 阅第 48 页第 5 章的 Geosets 和地图定义。 编号 基准面 区域地图 椭圆体 150 Hartbeesthoek 94 南非 WGS 84 151 ATS77 (Average Terrestrial System 1977) 加拿大 ATS77 151 Average Terrestrial System 1977 (ATS77) 编号 基准面 区域地图 椭圆体 1015 Japanese Geodetic Datum 2000 (JGD2000) 日本 Bessel 1015 Tokyo97 日本 Bessel 1841 1016 KKJ Finnish 芬兰 国际通用 1024 SK95 俄罗斯 PZ90MapXtreme Java Edition 4.8 新增特性 10 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapXtreme WMS 服务器 Capabilities.XML 用户将 GetCapabilities 请求发送到 MapXtreme WMS 服务器,这样就能够控制服务器重新生成功能信 息的频率。MapXtreme Java 在初始化时生成 capabilities.xml。MapXtreme Java 响应 GetCapabilities 请求时,Capabilities.xml 作为缓存使用。 要设置重新生成的频率,\wmsserver111\web.xml 中提供了 maxAgeOfCapabilitiesXML 参数的数字 值。默认设置为 -1,表示 capabilities.xml 文件不过期,直到 MapXtreme WMS 服务器重新初始化。 要以分钟表示时间,请使用小数值。例如,0.25 表示 capabilities.xml 将在 15 分钟后重新生成。 maxAgeOfCapabilitiesXML 0.25 MapXtreme WMS 服务器管理员可以设置接收所有功能请求的频率。\wmsserver111\web.xml 中新增 了一个名为 createCapabilitiesXML 的参数。此参数默认设置为 true,表示 capabilities.xml 将在达到 maxAgeOfCapabilitiesXML 参数定义的最长时间后重新生成。要保持使用相同的 capabilities.xml (而不重新生成),请将此参数更改为 False。 createCapabilitiesXML true 有关 MapXtreme WMS 的详细信息,请参阅第 19 章:Web 地图服务。 QueryBuilderEx,用于辅助用户定义的查询 现已引入扩展 com.mapinfo.dp.jdbc.QueryBuilder 的接口,用于更好地处理使用用户定义查询创建的 表上的专题。以前在此类表上调用 fetchColumnStatistics() 时,MapXtreme Java 会抛出异常,因为 表名未在查询中定义。 新接口 com.mapinfo.dp.jdbc.QueryBuilderEx 增加了公共方法 fetchColumnStatistics(DataLayer layer, String colName),MapXtreme 会在调用 FeatureLayer.fetchColumnStatistics 时使用此方法。在这种情况下,如果 QueryBuilder 不是 QueryBuilderEx 的实例,则和以前的版本一样会抛出异常。 调用非数值 (varchar) 列时不需要 QueryBuilderEx 实例。对于空间列,MapXtreme Java 在遇到空间 列类型时会抛出 ArrayIndexOutOfBounds 异常,因为 fetchColumnStatistics 不处理此列类型。 如果要利用此功能,请确保查询构建器实现了 QueryBuilderEx 接口。可以查看附带的最新 OracleQueryBuilder 以协助您编写自己的 fetchColumnStatistics() 实现。 请参阅第 200 页第 13 章的 QueryBuilder 接口。第 1 章:简介 开发人员指南 11 © 2006 MapInfo Corporation. 保留所有权利。 创建定制数据提供方 MapXtreme Java Edition 提供了数据提供方示例以说明如何创建自己的数据提供方。示例位于 /examples/client/dataproviders 目录中。 TextXYDataProvider 是定制数据提供方的示例,用于从“逗号分隔值”文件访问 XY 点几何对象和 属性数据。此文件格式中,每行是一条记录,每条记录是由分隔符(通常为 ',',但并不一定)隔开的 值的有序集。此类文件通常通过将数据从电子表格或关系数据库导出到文本文件的方式生成。这些 文本文件常见的文件扩展名为 ".csv"。 有关支持的数据提供方的详细信息,请参阅第 139 页第 10 章的使用数据提供方定义图层。有关创建 定制数据提供方的详细信息,请参阅第 263 页第 18 章的创建定制数据提供方。 ZoomConstraints 类的增强 com.mapinfo.util.ZoomConstraints 类现在为公共类。使用此类可以控制图层缩放设置。 将 MapXtreme Java 4.x 应用程序移植到 4.8 将 4.x 应用程序移植到 4.8 时,务必注意 API 中建议不使用的过时项目。有关已经过时的类、字段、 方法和构造器的完全列表,请参阅 HTML API 文档。 重新编译现有应用程序 尽管可能并非必要,但是我们建议重新编译现有应用程序,并使用 -deprecation 标记。如果已经实 现定制数据提供方,则必须重新编译现有应用程序。将 MapXtreme Java 4.x 应用程序移植到 4.8 12 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 第 A 部分:使用 MapXtreme Java 本部分介绍 MapXtreme Java 及其为辅助 Web 应用程序开发所提供的众多特性和便利。 主题:  第 2 章:入门 包括产品内容、系统要求、安装和设置指导。  第 3 章:应用程序规划 在安装之后,下一个决策是要构建哪类 Web 应用程序。本章定义配置和部署选项的 供选范围。  第 4 章:地图绘制概念 本章介绍构建地图绘制应用程序所需具备的基本地图绘制概念。  第 5 章:管理 MapXtreme Java 本章介绍管理工具 MapXtreme Java Manager,以及其中所含的地图定义管理器、 命名资源面板和用于应用程序原型开发的 Web 应用程序构建器。  第 6 章:Web 应用程序构建器 本章还详细介绍了原型向导,并进一步分析了有关 Java 服务器页标记这一原型构建 器基础的使用。  第 7 章:MapXtreme JavaBeans 本章介绍 MapXtreme JavaBeans,这一预置 Java 组件可用于在应用程序中提供地 图绘制功能,无需编写代码。  第 8 章:编写定制 Servlet 本章面向需要编写调用 MapXtremeServlet 的 servlet 以进一步扩展 Web 服务器功 能的开发人员。入门 本章介绍 MapXtreme Java Edition 中包括的组件及其安装和初始化的方法。 本章内容:  系统要求. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16  安装 MapXtreme Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17  卸载 MapXtreme Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23  Apache-Tomcat 部署环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24  在其它 Web 服务器环境中部署 MapXtreme . . . . . . . . . . . . . . . . . . .24  已安装的组件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25  静默安装模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27  配置故障排除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28  软件复制保护 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30系统要求 16 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 系统要求 MapXtreme Java Edition 可用于在支持 Java 虚拟机的任何平台上开发地图绘制应用程序。以下是执 行地图绘制应用程序的最低要求: • 支持 servlet/Java 服务器页的 web 服务器,带有支持 servlet/JSP 的插件的 web 服务器,或独立 的 servlet 容器。Servlet 容器或插件必须支持 2.3 Servlet API 规格和 1.1 JSP API 规格。 • 与 Java 2 平台兼容的虚拟机 1.4.1 或更高版本。 • 安装在服务器上的视频卡。在 Solaris 上,或者为视频卡,或者为 X11 服务器(根据 Java 2D 增 强图形功能的要求)。 • 200 MB 硬盘空间,用于 MapXtreme Java(~760 MB 用于安装)。 • 400 MB 硬盘空间,用于存放示例地图数据。 • 256 MB RAM,供 MapXtreme 使用。 支持的环境 Java:JDK 1.4, JDK 5.0 操作系统 Solaris 9 & 10 Linux 2.6 Kernel, Redhat 4 Windows 2000 Server Edition Windows Server 2003 Enterprise Edition Windows Server 2003 Enterprise Edition X64 IBM AIX 5.3 HP-UX 11i 应用程序服务器 Apache-Tomcat 5.0, 5.5 JBOSS 4.0.x Oracle 10g Application Server 10.2 Weblogic 8.1, 9.0 WebSphere 6.0 Sun Java System Application Server 8第 2 章:入门 开发人员指南 17 © 2006 MapInfo Corporation. 保留所有权利。 数据库 Oracle 9i, 10g SQL Server 2000 w/SpatialWare 4.8 IBM DB2 Spatial Extender SQL Server 2005 w/SpatialWare 4.9 Informix 9.4 w/SpatialWare 4.5 安装 MapXtreme Java MapXtreme Java 可安装在支持 Java 2 虚拟机(1.4.1 或更高版本)的任何系统上。安装程序将安装 MapXtreme 服务器、客户端、示例、文档和示例部署环境 (Apache-Tomcat)。 安装 MapXtreme Java: 1. 根据安装平台选择适当的 MapXtreme 光盘: 光盘 1 包含用于 Windows、Solaris 和 Linux 的文件。 光盘 2 包含用于 IBM AIX、HP-UX 和其它 UNIX 的文件。 2. 将 MapXtreme Java 软件光盘放入 CD-ROM 驱动器。 3. 从光盘根目录运行 install.htm,然后选择所用平台的链接。为所用平台:Windows、Solaris、Linux 或 HP-UX 选择链接。 对于适当的平台也可以使用另一种方法: • Windows — 在光盘 1 根目录下,转到 \InstData\Windows\VM 并运行 install.exe。 • Solaris — 在光盘 1 根目录下,转到 /InstData/Solaris/VM 并运行 install.bin。 • Linux — 在光盘 1 根目录下,转到 /InstData/Linux/VM 并运行 run install.bin。 • IBM AIX — 在光盘 2 根目录下,转到 /InstData/AIX/VM 并运行 install.bin。 • HP-UX — 在光盘 2 根目录下,转到 /InstData/HPUX/VM 并运行 install.bin。 • UNIX — 在光盘 2 根目录下,转到 /InstData/GenericUnix 并运行 install.bin。安装 MapXtreme Java 18 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 4. 在主 MapXtreme 对话框中,选择安装语言(中文简体)并单击 OK。 5. 在“简介”对话框中,阅读面板中的信息,并单击下一步以继续。第 2 章:入门 开发人员指南 19 © 2006 MapInfo Corporation. 保留所有权利。 6. 选择“本人接受许可协议条款”。单击下一步。 7. 在“选择一个文件夹”对话框中,接受安装 MapXtreme Java 的默认位置,或浏览到另一个位置。 Windows 上的默认位置为 \Program Files\MapInfo\MapXtreme-4.8.0。在 Solaris、 Linux 和 HP-UX 上,默认位置为 /user/home/mapinfo/MapXtreme-4.8.0。单击下一步。安装 MapXtreme Java 20 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 注: 如果尝试使用的安装位置已经安装了某一版本的 MapXtreme Java,则将收到以下警告: 8. 在“选择捷径文件夹”对话框中,接受安装应用程序图标的默认位置或选择其它可用选项。单击 下一步。第 2 章:入门 开发人员指南 21 © 2006 MapInfo Corporation. 保留所有权利。 9. 在“选择 Java 虚拟机”对话框中,可以选择安装 Java 虚拟机,也可以从已安装的 Java 虚拟机 中选择一个(已安装的 Java 虚拟机必须是 1.4.2 或更高版本)。单击下一步。 注: 如果尝试选择低于 1.4.2 的 JVM,则会显示以下对话框。 10. 在“设置 Web 环境”对话框中,验证主机名和端口号。默认端口为 8080。单击下一步。 安装 MapXtreme Java 22 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 11. 显示“预安装摘要”对话框。复查信息并单击安装,或单击上一步进行更改。 12. 启动“正在安装 MapXtreme Java Edition”对话框。第 2 章:入门 开发人员指南 23 © 2006 MapInfo Corporation. 保留所有权利。 13. 在“安装完毕”对话框中,单击完成退出软件安装程序。 将 JDBC 驱动程序添加到 Classpath 必须手工将适当的驱动程序添加到 MapXtreme Java Manager .lax 文件的 classpath 中,才能使用 JDBC 访问远程数据库中的数据(有关 .lax 文件的更多信息,请参阅第 30 页)。 例如,若正在使用 MapXtreme Java Manager Standalone 版本并且要访问 Oracle 数据库中的数据, 则转到 \MapXtreme-4.8.0\bin\MapXtremeJavaManager-StandAlone.lax,然后将到 classes12.zip 的 路径添加到 classpath 的列表中。若使用 MapXtreme Java Manager Web Server,则将该路径信息 添加到 \MapXtreme-4.8.0\bin\MapXtremeJavaManager-WebServer.lax。 卸载 MapXtreme Java 要从 Windows 中卸载 MapXtreme Java,在“程序”菜单上选择 MapXtreme Java 下的卸载快捷方 式,或从目录 \Uninstall MapXtremeJava 4.8 下运行 uninstall.exe。 要从 Solaris、Linux 或 HP-UX 卸载 MapXtreme Java,从目录 /UninstallMapXtremeJava-4.8.0 下运行 uninstall.sh。Apache-Tomcat 部署环境 24 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Apache-Tomcat 部署环境 MapXtreme Java 使用 servlet 模型处理请求。MapXtreme Java 需要使用 web server/servlet 容器才 能运行,例如 Apache-Tomcat、WebLogic、Oracle 等。为了方便用户,我们安装了 Apache-Tomcat 并与 MapXtreme Java 相集成,作为产品安装的一部分。 安装完成后,可以在 \MapXtreme-X.x.x\apache-tomcat-Y.y 目录下找到 Apache-Tomcat 的目录,其中 X.x.x 是 MapXtreme Java 的当前版本,Y.y 是 Tomcat 的当前版本。 \MapXtreme-X.x.x\apache-tomcat-X.x\webapps 目录中将包括用于 MapXtreme Java 的 servlet 上下文、Mapviewer JSP 示例、其它示例应用程序以及兼容 OGC 1.1.1 的 WMS 服务器。 多个 Apache-Tomcat 实例 使用多个 Apache-Tomcat 实例可提高 MapXtreme Java 的性能。在某些具有四个或更多 CPU 的 Solaris 服务器上,当同时运行三个 Tomcat 实例时,MapXtreme 的性能会得到提高。例如,服务器 可能运行 Apache 和三个 Tomcat 实例,而 Tomcat 设置(例如 mod-jk.conf)可在 Tomcat 实例之间 执行负载平衡。 如果在同一台计算机上有多个 Tomcat 实例,则需要修改 Tomcat 配置,使每个实例监听不同的端口 号。例如,可能需要有 server.xml 文件的多个副本(例如 server2.xml、server3.xml),每个副本都 指定唯一的端口号和唯一的 workDir 设置,这样才能使多个 Tomcat 实例之间不发生冲突。还需要使 用可选的 -f 参数启动每个 Tomcat 实例,以指定所要使用的 xml 文件。例如: tomcat start -f ../conf/server2.xml 请注意,负载平衡并不必局限于一台计算机。例如,可以使 Tomcat 运行在几台计算机上,利用 Apache 执行负载平衡。 在其它 Web 服务器环境中部署 MapXtreme 作为安装过程的一部分,将会创建 web 存档 (war) 文件并将其放置在 \MapXtreme-X.x.x\wars 目录中。war 文件有: • mapxtremeXx.war — 主 mapxtreme 上下文 • mapviewerXx.war — JSP 示例 MapViewer web 应用程序 • samplesXx.war — servlet 示例应用程序 • wmsserver111.war — Web 地图服务 (WMS) 的上下文 这些 war 文件可部署到支持 WAR 文件的任何 servlet 容器中。 注: 这些文件中的信息将它们与其所在的主机联系起来。第 2 章:入门 开发人员指南 25 © 2006 MapInfo Corporation. 保留所有权利。 已安装的组件 下面概要介绍 MapXtreme Java 中包括的主要组件。每个组件后面有一个简短说明。 MapXtreme Java Manager 这是一个 GUI 工具,可用来管理 MapXtreme Java 的若干方面,包括创建和加载地图定义、管理命 名资源、管理 JDBC 与 RDBMS 的连接、以及在向导的帮助下构建原型和应用程序。MapXtreme Java Manager 将在第 5 章:管理 MapXtreme Java 中加以讨论。 MapJ API 和 Java 类库 MapJ API、类库和 Javadocs 提供了构建自定义的应用程序、applet、servlet 和 JavaBeans 所需的 所有内容。本《开发人员指南》中的第二部分对 MapJ API 进行了讨论。 JSP 标记库 MapXtreme Java 包括一组自定义 JSP 标记,可帮助您快速构建原型和应用程序。有关详细信息, 请参阅第 6 章:Web 应用程序构建器。 自定义符号 MapXtreme Java 安装一个自定义符号 GIF 图像的文件夹。关于每个图像的缩略图,请参阅附录 E: 图像符号。有关在应用程序中使用这些符号的信息,请参阅第 14 章:标注和样式。 MapXtreme Java 还提供了画笔、画刷和符号字体的预定义样式。使用这些样式可自定义地图图层。 相应样式位于 /resources/mistyles 下的 mapxtreme480 servlet 上下文中。 示例 MapXtreme Java 包括各种 servlet 和 applet 示例,展示了 MapXtreme Java 的关键组件。其中大多 数在安装后位于 /examples 目录中。这些示例应用程序中的若干程序包括说明其特性和代码的 HTML 教程。此外,也可以在 MapXtreme-4.8.0/lib/client/mxjclientsamples.jar 和 MapXtreme-4.8.0/lib/server/mxjserversamples.jar 中找到预编译的版本。 字体 MapXtreme Java 安装了 11 个 unicode TrueType 字体集,用作地图符号。这些字体自动安装在 Windows 上。在 Solaris、Linux 和 UNIX 上不会安装这些字体,它们会在运行时从 \MapXtreme-4.8.0\lib\common\mifonts.jar 加载。 Windows 用户可以卸载这些字体。在这种情况下,MapXtreme 将在运行时从 mifonts.jar 中加载这些 字体。 若 Unix/Solaris 用户要安装字体,请遵循下面的指示。已安装的组件 26 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 在 Solaris 上安装字体 在 Windows 以外的平台上,安装程序将把这些字体复制到 //fonts 目录 中。安装之后,必须在操作系统中注册这些字体,然后才能使用它们。下面是针对 Solaris 的说明。 对其它平台的说明与此相似。此说明假定您已成功地安装了 Java 2 和 MapXtreme Java。 1. 以 ROOT(即超级用户)身份登录 Solaris。 2. 执行 Solaris 命令 xset -q,该命令可显示系统用于字体存储 / 使用的所有目录。 3. 将 MapXtreme Java 字体复制到其中某个目录中(即 /usr/openwin/lib/X11/fonts/TrueType)。 4. 通过执行以下命令,重新指定对这些字体文件的权限: chmod 644 Map*.ttf chmod 644 map*.ttf 5. 编辑 fonts.dir 文件。转至存放字体的目录,并为每个 MapXtreme Java 字体提供一个条目。可以 从 fonts_sample.dir 文件复制这些条目,该文件在安装后位于 mapxtremejava/server/fonts 目录 中。这些条目为: mapiau__.ttf -unknown-mapinfo arrows unicode-regular-r-normal--0-0- 0-0-p-0-iso8859-1 mapicuc_.ttf -unknown-mapinfo cartographic unicode-regular-r- normal--0-0-0-0-p-0-iso8859-1 mapimu__.ttf -unknown-mapinfo miscellaneous unicode-regular-r- normal--0-0-0-0-p-0-iso8859-1 mapiogu_.ttf -unknown-mapinfo oil&gas unicode-regular-r-normal--0- 0-0-0-p-0-iso8859-1 mapireu_.ttf -unknown-mapinfo real estate unicode-regular-r-normal- -0-0-0-0-p-0-iso8859-1 mapisu__.ttf -unknown-mapinfo shields unicode-regular-r-normal--0- 0-0-0-p-0-iso8859-1 mapitu__.ttf -unknown-mapinfo transportation unicode-regular-r- normal--0-0-0-0-p-0-iso8859-1 mapiwu__.ttf -unknown-mapinfo weather unicode-regular-r-normal--0- 0-0-0-p-0-iso8859-1 mapsu___.ttf -unknown-mapinfo symbols unicode-regular-r-normal--0- 0-0-0-p-0-iso8859-1 mapsymu.ttf -unknown-map symbols unicode-regular-r-normal--0-0-0-0- p-0-iso8859-1 mapispu___.ttf -unknown-map symbols unicode-regular-r-normal--0-0- 0-0-p-0-iso8859-1第 2 章:入门 开发人员指南 27 © 2006 MapInfo Corporation. 保留所有权利。 6. 在 fonts.dir 文件的第一行中,对数字加 11 以包括要增加的新字体条目。 7. 退出 Solaris,并以任意用户身份再次登录。 8. 执行 Solaris 命令 xlsfonts,该命令将读取所有现有的 fonts.dir 文件并显示系统可使用的所有 字体列表。 9. 在启动 X 服务器之前启动字体服务器(如果您正在使用的话)。 注: 没有 ROOT 访问权的用户也可以通过以下方法使 MapXtreme 字体生效。 假定字体位于 /data/my_data/MXTJ480/fonts 中,将环境变量 JAVA_FONTS 设置为: /usr/openwin/lib/X11/fonts/TrueType:/data/my_data/MXTJ480/fonts 在 Linux 上安装字体 要在 Linux 上安装 MapInfo 字体: 1. 使用下面的命令将字体从 MapXtreme Java 复制到您的 Java JDK: 2. cp mapinfo/MapXtreme-4.8.0/support/fonts/*.ttf mapinfo/jdk/lib/fonts 3. 复制 mapinfo/MapXtreme-4.8.0/support/fonts/fonts_sample.dir 的内容并粘贴到 mapinfo/jdk/lib/fonts/fonts.dir 4. 对位于 fonts.dir 顶部的数字加 11 。 5. 启动 / 重新启动 MapXtreme Java 4.8。 静默安装模式 MapXtreme Java Edition 提供了 silentinstall.properties 文件,在不使用 GUI 安装 MapXtreme 时使用。 该文件位于 CD-ROM 的根文件夹。 必须自定义 silentinstall.properties 文件中的变量才能满足您的特定需求。该文件的格式为简单的 = 形式。必须使用有效值填充这些变量才能保证安装正确执行。 要运行静默安装: 1. 将 silentinstall.properties 文件从光盘复制到本地计算机的某个文件夹中,在该文件夹中,可以使 用文本编辑器打开并编辑该文件。 2. 在 silentinstall.properties 文件中,按需更改以下变量: • USER_INSTALL_DIR — 应用程序文件的安装位置 • WEB_ENV_1 — 主机服务器名 • WEB_ENV_2 — 端口 • JAVA_HOME — JAVA_HOME 目录(若不想安装已绑定 JRE 的话) • USER_SHORTCUTS — 安装符号链接的位置 注: 需要除 JAVA_HOME 和 USER_SHORTCUTS 之外的所有变量。配置故障排除 28 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 3. 运行安装程序,将修改的 silentinstall.properties 文件传递到其中。例如,运行下面的命令在 Linux 上执行静默安装: /cdrom/InstData/Linux/VM/install.bin -f COPIED_FILE_PATH/ silentinstall.properties 注: COPIED_FILE_PATH 必须是到该文件的完整路径。 配置故障排除 在安装 MapXtreme Java 并在一个 servlet 容器中进行设置之后,如果遇到配置问题而令 MapXtremeServlet 无法处理地图绘制请求,可使用以下信息。例如,如果尝试部署示例 applet - SimpleMap,该 applet 可能会报告一个 FileNotFoundException,指出 MapXtremeServlet 的 URL 有问题。 如果遇到了这样的问题,那么主要可能有两个原因: • MapXtremeServlet 的配置可能不正确。 • 可能未指定正确的 URL 来访问 MapXtremeServlet。 要解决此类故障,应确保服务器已启动,并运行“调试”URL。此时将显示一个状态页,指示 MapXtremeServlet 正在运行且 URL 正确。在浏览器的 URL 文本字段中,键入指向 MapXtremeServlet 的 URL,后面跟 "?debug=true"。例如: http://[hostname:portnumber]/mapxtreme480/mapxtreme?debug=true 状态页将显示基本的诊断信息,包括 Java VM 的版本和正在使用的 MapXtreme 的版本。如果看不 到此状态页,则要么没有运行 servlet,要么 URL 不正确。 验证 MapXtremeServlet 是否运行 除了运行调试 URL 的方法之外,还可通过查看开始过程来检查 MapXtremeServlet 是否运行。当 servlet 容器启动时,查看是否有任何错误迹象。例如,如果 servlet 容器具有可查看的控制台窗口或 日志,则查看控制台或日志,检查是否有任何消息包含“MapXtremeServlet”或“mapxtreme”。 如果 servlet 容器提供了管理员工具,则可通过运行管理员来检查 MapXtremeServlet 的状态。如果 servlet 容器没有提供管理员工具,则尝试查看控制台窗口或日志来检查 MapXtremeServlet 是否启动。 显示在控制台窗口或日志中的具体文本部分取决于您使用了哪个 servlet 容器。一般来说,如果 MapXtremeServlet 初始化成功,即会看到初始化消息。例如,如果已使用 Tomcat 正确配置了 MapXtreme,则 Tomcat 控制台或日志文件会显示以下文本: Context log path="/mapxtreme480" :mapxtreme: init 这些消息表示已处理了 MapXtreme 的 web.xml 文件,并正确初始化了 MapXtremeServlet。请注 意,上面的消息包含了“mapxtreme: init”而不是“com.mapinfo.mapxtreme.MapXtremeServlet: init”。 这是因为 MapXtreme 的安装程序为 MapXtremeServlet 分配了一个注册名称“mapxtreme”;请参 阅 /mapxtreme480/WEB-INF 中的 MapXtreme web.xml 文件。第 2 章:入门 开发人员指南 29 © 2006 MapInfo Corporation. 保留所有权利。 如果当启动 servlet 容器时 MapXtremeServlet 没有初始化,这并不一定表示存在问题。它只是表示 MapXtremeServlet 配置没有将“Load On Startup”选项设置为“True”(因此,未初始化 MapXtremeServlet 是因为还没有对此发出请求)。MapXtreme 的 Tomcat 安装程序不会将“Load On Startup”设置为“True”,因此当启动 Tomcat 时,Tomcat 用户应当看到如上所述的初始化消息。 如果在验证 MapXtreme 配置是否正确时有困难,则应配置 MapXtreme,使其设置为“Load On Startup”,然后重新启动 servlet 容器。在 Tomcat 中,“Load On Startup”选项是在 mapxtreme/ WEB-INF/web.xml 中使用 标记指定的。如果 servlet 容器提供了管理员工具,则 可以在管理员中设置“Load On Startup”选项。 如果 MapXtremeServlet 部署说明符设置为“Load On Startup”,但您仍然没有在 servlet 容器的控 制器或日志中看到 MapXtremeServlet 初始化消息,那么可能是 MapXtreme 的配置方式出现问题; 在这种情况下,复查配置 MapXtreme 的步骤,确保所有配置步骤均已正确执行。 验证 MapXtremeServlet 的 URL 是否正确 在利用 MapXtremeServlet 之前,需要知道其准确的 URL。例如,在运行示例 applet - SimpleMap 之前,需要编辑加载 applet 的 HTML 文件,并指定 MapXtremeServlet 的 URL。 注: URL 区分大小写。 MapXtremeServlet URL 的一般形式如下: http://hostname:portnumber/path/registeredname hostname:这取决于服务器的名称或 IP 地址。如果在一台计算机上执行所有任务(例如,测试或 开发),则可以使用“localhost”作为主机名。 portnumber:这取决于您如何设置 servlet 容器。如果运行了 MapXtreme 的安装程序并接受了默认 设置,这应该是端口 8080,指定 MapXtreme URL 时可以忽略端口号(和冒号)。 path:这取决于 servlet 容器,还可能取决于创建了哪些子目录。请参阅下面的示例。 registeredname:这是一个可以指定的名称,例如“mapxtreme”,它是 com.mapinfo.mapxtreme.MapXtremeServlet 类的快捷方式。并非严格要求使用快捷方式;此时可以 指定 com.mapinfo.mapxtreme.MapXtremeServlet 作为 URL 的最后一部分。但是,如果已设置了 MapXtremeServlet 的注册名称,则应使用此注册名称。(您在部署说明符中指定的任何配置选项 (比如“Load On Startup”选项)与此注册名称相关联;如果使用指定类名称而不是注册名称的 URL,那么这些选项将不起作用。) 示例:Tomcat 如果正在使用随 MapXtreme Java 提供的示例部署环境 (Tomcat),并且接受了默认设置,那么 MapXtremeServlet URL 应当是: http://stockholm:8080/mapxtreme480/mapxtreme 在此示例中,URL 的 /mapxtreme480 分段表示 mapxtreme 目录创建在 Tomcat 目录中。结束分段 / mapxtreme 表示安装程序使用 标记将其放置在 [tomcat directory]/mapxtreme480/ WEB-INF/web.xml 中的注册名称。软件复制保护 30 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 LAX 文件 MapXtreme Java 安装程序在系统中安装若干配置文件,这些文件与 MapXtreme Java Manager 的可 执行文件和卸载程序相关联。这些文件的扩展名为 .lax(如 MapXtreme Java Manager.lax),提供 了有关系统的重要配置信息: • lax.class.path — 将所需的任何 JDBC 驱动程序添加到此处的 jar 文件列表中。例如,要访问有空 间选项的 Oracle,将 classes12.zip 添加至 classpath。 • lax.stderr.redirect — 在调试时,将 "=console" 放在最后以便发送信息至控制台窗口。 • lax.stdout.redirect — 在调试时将 "=console" 放在最后,同上。 • lax.nl.current.vm — 如果 VM 不工作,则检查其版本。 软件复制保护 如果您的 MapXtreme Java Edition 副本受到复制保护(即在 MapXtreme Java Manager 中显示的地 图上可见水印 "Protected Software - Key Required for Permanent Use"),则需要申请许可文件,以 便去除水印,使 MapXtreme Java 能够长期使用。 从地图显示中去除水印: 1. 执行以下操作之一: 填写 MapXtreme Java 产品包内提供的名为“重要须知”(Important Please Read) 的复制保 护密钥申请。 从 MapXtreme 网站下载申请表,网址为: http://www.mapinfo.com/support/documentation/manuals.cfm。单击有链接标记的 MapInfo MapXtreme Java,然后从当前产品版本中选择 Software Copy Protection License Application。 2. 将完成后的表格提交给经销商或分销商。查看表格以获得联系信息。经销商会处理相应申请,并 将许可文件通过电子邮件发送给您。 3. 收到名为 mapxtremejava.key 的许可文件之后,将其放在 classpath 上的目录中,例如 C:/Program Files/MapInfo/MapXtreme-4.8.0/lib/client。此文件还需要放在服务器的 classpath 上,因此对于 MapXtremeServlet 来说,也要放在 mapxtreme480/WEB-INF/classes 目录中。如 果还没有 /classes 目录,则需创建该目录。此时地图即可正常显示,不带水印。应用程序规划 本章介绍基于 Web 部署基础架构的要求和必要技巧,同时还提供了 MapXtreme Java 组件和公共配置概览。 本章内容:  Web 部署 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32  部署选项. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33  MapXtreme Java 概览. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33  设计时的考虑因素. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35Web 部署 32 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Web 部署 基于 Web 的部署提供了众多优点,其中有: • 降低所有者成本:通过 Web 分发应用程序的成本比较经济,因为消除了为访问应用程序而在每台 计算机上安装组件的需求。 • 可扩展性:Web 系统通过功能强大的服务器提供服务。如果用户数量增加,那么可以随之添加更 多的服务器。 • 数据和软件的访问:应用程序的每个用户均可访问最新的版本。对于所有用户而言,软件和数据 更新只需针对服务器操作即可。 • 安全:由于对安全采用了集中式的管理,因此对于具体实施方案可以具有更多控制。 一般而言,基于 Web 部署的工作如下所示。在客户端,用户通过 HTML 页面和 / 或其浏览器中的 applet 与地图绘制应用程序交互。交互是以请求 / 响应方案为基础的。例如,用户发出请求,要求放 大地图上的某一区域。该请求将传送到 Web 服务器。服务器端的应用程序将与地图服务器通信,提 供请求的信息。更新的地图将返回至嵌入到 HTML 页面或 applet 中的客户端浏览器。创建地图所需 的任意数据都将驻留在 RDBMS 之中,数据库调用经由 JDBC 检索数据完成。有关基于 Web 部署的 更多详细说明,请参阅第 107 页第 8 章的编写定制 Servlet。 无线通信业就是基于 Web 的应用服务器的一个实例。潜在的客户经常需要知晓其位置是否位于通信 公司的覆盖范围之内。通过提供嵌入到 HTML 页面中的覆盖区域地图并经由因特网部署,电讯公司 即为客户采用自助方式提供及时的响应。客户可以通过使用放大或平移等导航工具,对地图进行交 互操作。每次点击均相当于一个发送到电讯应用程序的请求,用于重新生成地图。 基础架构要求 通常,基于 web 的地图绘制部署利用标准的组件,其中包括运行 web 服务器的服务器、应用服务器 (可以和 Web 服务器是同一服务器)和用于背景地图的地图数据数据库、以及特定于应用程序的定 制数据。 MapXtreme Java 基于 Web 的部署需要 Java 2 的支持。此外,由于用于 MapXtreme Java 的地图绘 制服务器是作为 servlet 部署的,因此 Web 服务器必须支持 servlet。地图数据可在本地存储,也可 以经由 JDBC 从 RDBMS 访问。要构建的应用程序可以采用 servlet、JavaServer 页、Enterprise JavaBean 或 applet 等多种形式。 必要技巧汇总 MapXtreme Java 是一个面向编写 servlet 和 applet 的 Java 开发人员的产品。在构建应用程序时, 有必要了解创建 Java GUI 的技巧。 此外,由于是在 Web 上部署 MapXtreme Java,因此还应具备项目所需的 web 开发和 HTML 专业知 识。所需具体内容将取决于所用的开发工具。 如果要访问 RDBMS 中的数据,则还需要数据库使用和管理方面的技巧。 最后,由于正在创建的是地图绘制应用程序,熟悉地图绘制的概念和 / 或 MapInfo 地图绘制产品也会 对开发有所助益。有关地图绘制的基本知识,请参阅第 4 章:地图绘制概念。第 3 章:应用程序规划 开发人员指南 33 © 2006 MapInfo Corporation. 保留所有权利。 部署选项 用于 MapXtreme Java 的部署选项可以划分为以下三类:瘦客户机、中型客户机和胖客户机。其间 的区别在于软件和向客户机发送的数据的多少。 各种类型的概览如下所示,后续内容中还提供了构成 MapXtreme Java 的组件的有关讨论。相关的 结构图位于第 108 页第 8 章的瘦客户机 / 胖服务器的开头部分。 瘦客户机 在瘦客户机的部署中,用户将在浏览器中与 HTML 页面交互。地图通常是嵌入到 HTML 中的 GIF 图 像。地图请求处理在服务器端完成。这是典型的因特网部署,客户机上无需 Java。 要构建此类应用程序,需要了解如何开发生成 HTML 的服务器端应用程序。 胖客户机 胖客户机是备选的另一种方案。客户机下载一个 Java applet,由其提供比直接的 HTML 更加复杂的 用户界面。此外,MapXtreme Java 可以返回向量数据来取代栅格数据。由于增加了用于 applet 的下 载时间,因此这一方案更加适合于在内网系统部署,以便可以更好地控制客户端。 要构建此类应用程序,需要了解如何构建 Java applet,并可以选择使用 JavaBeans。 中型客户机 中型客户机是介于瘦客户机和胖客户机之间的选项。与胖客户机相同,中型客户机下载 applet,因此 客户机必须支持 Java。类似瘦客户机,中型客户机接收地图的栅格图像。applet 可以提供比直接 HTML 更加复杂的用户界面和附加的地图工具,例如选取框工具。 要构建此类应用程序,需要了解如何开发 applet 和服务器端的应用程序交互。 MapXtreme Java 概览 MapXtreme Java Edition 有 4 个主要组件,如下所示:MapXtremeServlet、MapJ 对象、数据提供 方和渲染器。这些组件协同工作,可用于访问地理数据、控制数据并为应用程序提供地图或数据。 MapXtremeServlet MapXtremeServlet 是在 MapXtreme Java 产品中提供的地图绘制服务器。该服务器处理 3 类客户机 请求: • 地图图像请求 • 向量地图数据请求 • 地图元数据请求(如地图中图层的列名)。 MapXtremeServlet 对源自 MapJ 对象的 HTTP POST 请求作出响应。此外,还可使用 MapXtreme Java 的 XML 协议编写定制客户端,用于和 MapXtremeServlet 通信。MapXtreme Java 概览 34 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapXtremeServlet 设计利用其父级 servlet 容器的功能。MapXtremeServlet 为无状态,依赖客户机 请求来完全说明地图状态。图像请求在 MapXtremeServlet 之中由多线程的渲染器服务器处理。与此 类似,地图数据请求由多线程的 DataProvider 服务器处理。这些因素令 MapXtremeServlet 在父级 servlet 容器中部署时,具有相当高的可扩展性。 在 MapXtremeServlet 侧重于完成地图绘制任务的同时,其父级 servlet 容器处理负载平衡、安全和 容错等其它问题。Servlet 容器可见于类似 Sun 的 JavaWebServer 的 Web 服务器,以及类似 BEA 的 WebLogic 的应用服务器。类似 Apache 的 Web 服务器或 Microsoft IIS 的 Web 服务器不含 servlet 容器。此时必须使用单独的 servlet 容器插件,JRun 或 Tomcat。 MapJ 对象 MapJ 对象管理地图的状态。该对象维护地图中心和缩放、坐标系、距离单位和共同构成地图的图 层。MapJ 位于 MapXtreme 客户机 API 的最顶层。 MapJ 对象可以配置用于与不同类型的渲染器和数据提供方协同工作。在最为典型的配置中,MapJ 是 MapXtremeServlet 的客户机。MapJ 向 MapXtremeServlet 实例发送请求,请求的一部分为 servlet 提供了其当前状态。MapJ 从 servlet 获取地图图像和数据。 MapJ 还可以独立工作,直接获取地图数据并生成地图图像。MapXtreme 允许 MapJ 配置为与其它 变更版本协同工作,这正是 MapXtreme 基于组件的设计方案的强大之处。例如,MapJ 可配置为通 过一个或多个 MapXtremeServlet 实例访问地图数据,同时仍然可以显示地图图像。 由于 MapJ 的主要目的是维护地图状态,因此其占用的内存较小。MapJ 正是由此成为在中间层或 n 层体系结构中实现的理想之选。有关部署配置的详细信息,请参阅第 35 页的设计时的考虑因素。 渲染器 渲染器显示地图数据。共有以下 5 种类型的渲染器:LocalRenderer、MapXtremeImageRenderer、 EncodedImageRenderer、IntraServletContainerRenderer 和 CompositeRenderer。 LocalRenderer 可从任意 Java Graphics 2D 对象创建,通常从 AWT 组件或 BufferedImage 获取。 LocalRenderer 位于“本地”或在与其关联的 MapJ 对象的同一处理空间之内。其使用数据提供方来 直接获取地图中每个图层的图元。LocalRenderer 随后将图元绘制到其组件的图形对象中。 MapXtremeImageRenderer 可以从 MapXtremeServlet 实例的 URL 引用创建。当 MapJ 使用 MapXtremeImageRenderer 时,表示其将令 MapXtremeServlet 的实例控制地图渲染。servlet 通过 向 MapJ 客户端返回栅格图像来满足这一请求。MapXtremeServlet 支持包含 GIF、JPEG 和 PNG 之 内的多种栅格格式。此外,MapXtremeServlet 的渲染器服务器还通过使用 LocalRenderer 的实例来 满足渲染请求,并将图像导出为所需的栅格格式。 MapXtreme Java 还提供有关 MapXtremeImageRenderer 的各种变更版本。IntraServletContainerRenderer 在 servlet 转发中使用。EncodedImageRenderer 可用于渲染图层的动画图像。CompositeRenderer 可用于请求只重新绘制带有变更数据的图层。这对于创建动画图层非常实用。有关详细信息,请参 阅第 167 页第 11 章的渲染涉及的考虑因素。第 3 章:应用程序规划 开发人员指南 35 © 2006 MapInfo Corporation. 保留所有权利。 数据提供方 数据提供方是介于 MapJ 对象和地图数据之间的关键链接。每个作为 MapJ 组成部分的图层对象均有 其自己的内部数据提供方。数据提供方用于访问数据源并返回向量数据。此外,在 MapJ 使用 LocalRenderer 渲染时也将调用数据提供方。 MapXtreme 中的数据提供方用于访问以下数据源: • MapInfo 表 • 有空间选项的 Oracle • IBM DB2 Spatial Extender • Informix Universal Server SpatialWare DataBlade • 有 SpatialWare 的 SQL Server • JDBC 兼容的表,包含经度和纬度列 • ESRI Shapefiles • 数据绑定(将源自 TAB 文件的数据和 JDBC 数据源关联在一起) • ECW 和 MrSID 栅格文件 • MapInfo 网格 MapJ 对象有如下两种访问数据源的方式:第一种方法是直接使用 LocalDataProviderRef 访问数据源。 第二种方法是请求 MapXtremeServlet 的实例来获取数据。MapXtremeServlet 随后将使用 MapXtremeDataProviderRef 从其数据提供方服务器来直接访问数据源。由于 MapXtremeServlet 从 数据源获取数据,它将数据以流方式传递回客户机的 MapJ 对象。MapXtremeServlet 采用极其高效 的压缩方案来传递流数据。而且还会考虑数据所需的分辨率因素。例如,当数据用于渲染 640 x 480 图像时,数据可采用远远高于其存储分辨率的形式来传输。 每个与 MapJ 关联的图层均指定如何通过数据提供方引用来访问其底层数据源。LocalDataProviderRef 表示数据访问应该是“本地”还是在包含 MapJ 的处理空间之内。MapXtremeDataProviderRef 说明 MapXtremeServlet 实例将在访问数据源时充当中介。 有关数据提供方的详细信息,请参阅第 137 页第 10 章的在图层中绘制地图。 设计时的考虑因素 在规划地图绘制应用程序时切记以下因素。 客户端 • 是通过因特网部署,还是通过公司内网部署? • 网络带宽是多少? • 客户端是 applet 还是独立的应用程序?客户机是否需要类似 JDBC 驱动程序的附加软件或资源来 运行? • 是为特定的平台设计应用程序,还是为任意平台或混合环境设计应用程序? • 用户将使用什么浏览器?是否需要 Swing 支持或其它浏览器插件? • 客户端需要多少地图绘制功能?就具体需求而言,类似 AddThemeWizard 和 LegendContainer 的 JavaBean 有多大用途?设计时的考虑因素 36 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 服务器端 • 正在构建的应用程序有多复杂?是否具备必要的硬件? • 预期有多少用户使用相应应用程序?预期的用户峰值负载是多少? • 需要从 Web 服务器和 / 或应用服务器获取什么服务? • 对于正在构建的应用程序类型而言,是否具备适当的必要技巧?其中可能包括 Java 编程、数据库 管理、Web 开发等技术。 • 是否考虑到任何安全或网络问题? • 应用程序需要与哪些其它软件交互? • 要使用的 Java 是什么版本?所有组件是否支持共同的版本?地图绘制概念 本章概要介绍使用 MapXtreme 创建地图绘制应用程序所要涉及到的众多概念。 本章内容:  组织数据和地图:表的概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38  地图定义格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39  地图图元. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40  样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40  标注 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40  地图数据分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40  将数据置于地图中. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41组织数据和地图:表的概览 38 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 组织数据和地图:表的概览 使用 MapXtreme Java 需要涉及到包含记录和地图的文件。数据既可采用 MapInfo 格式,也可采用 支持空间数据的格式。本章将介绍 MapInfo 文件格式 (.tab)、地图定义,以及可以存储源自 JDBC 数 据库的数据或 MapInfo 数据的基于 XML 的文本文件。 文件如何构成表 MapInfo .tab 文件可以组织成为一组用于构建图层的文件。MapInfo 表包含以下类型的关联文件: • *.tab:此文件说明 MapInfo 表的结构。这是一个说明数据文件格式的小文本文件。 • *.dat(.mdb, .dbf, .txt, .xls or .wks):这些文件包含制表数据。 • *.map:此文件说明图形对象(如果表没有地图对象,则该文件将不存在)。 • *.id:此文件是一个交叉引用文件,链接数据和对象(如果表没有地图对象,则该文件将不存 在)。 • *.ind:这是一个索引文件。使用该索引文件,可搜索地图对象(如果表没有索引,该文件将不存 在)。 这些文件在一起构成 MapXtreme Java 中的单一 .tab 图层。 MapInfo 表和 MapXtreme 图层 每个可绘图 MapInfo 表均可在 MapXtreme 应用程序显示为地图中的图层。例如,籍此可以显示客户 图层、街道图层和县界图层。 这些图层可视为透明,其中每个图层包含地图的不同组成部分。图层相互叠加在一起,以便可以看 到地图的全貌。图层自下而上绘制。这些图层均在“图层控制”对话框中列出,最上面的图层列在 首位。第 4 章:地图绘制概念 开发人员指南 39 © 2006 MapInfo Corporation. 保留所有权利。 地图定义格式 地图定义说明了构成地图的数据,包括所要显示的数据、存储位置、数据组织为图层的方式、数据 的显示方式(如所用颜色、标注图元、地图缩放设置)。 MapXtreme Java 附带了多种涵盖全球地理和人口统计信息的示例数据。这些数据以两种格式提供: .mdf 和 .gst。各种类型的说明如下。 MapInfo Geosets MapInfo .tab 文件集称为 geoset。如果熟悉 MapInfo Professional,可以注意到 geoset 和工作空间 的概念类似。工作空间是一个已保存的 MapInfo 表 (.tab) 和窗口的配置。无需打开单个的 .tab 文 件,即可使用其特定的显示设置来打开 geoset (somefile.gst) 和所有图层。 但是,Geosets 在 MapXtreme Java 中的功能受到了限制。这些限制主要是指不可以保存到远程数据 库的 MapInfo .tab 文件。 MapXtreme 不能打开 MapInfo 工作空间(.wor 文件类型)。如果正在使用的是 MapInfo Professional, 则可以使用 MapInfo Geoset 实用程序将工作空间另存为 geoset,然后可以使用 MapXtreme Java Manager 将其加载到 MapXtreme Java。 地图定义 MapXtreme Java 提供了比 geoset 更加出色的数据格式。地图定义是基于 XML 的文本文件,其中包 括可以另存为文件或 JDBC 数据库记录的地图图层信息。这些文件可以向前兼容众多格式,并可轻 松编辑,符合正在发展中的用于数据传输的 XML 标准。我们强烈建议使用地图定义而非 geoset 。 地图定义是使用 MapXtreme Java Manager 创建并随 MapXtreme Java 提供的文件。在第 5 章:管 理 MapXtreme Java 中提供了有关的详细说明。在保存时,这些文件可以使用扩展名 .mdf 保存,存 储为 JDBC 数据库记录,或是可以轻松检索的命名地图。 在 MapXtreme Java 3.x 中创建的地图定义将自动导入到 MapXtreme Java 4.x 之中。不支持在 3.x 之前 的版本中创建的地图定义。此时需要创建新的地图定义,或者通过使用 MapXtreme Java Manager,或 者通过 MapDefContainer 接口以编程方式创建。有关详细信息,请参阅第 131 页。 注: MapXtreme Java 3.x 不能打开 4.x 版的地图定义。 要熟悉地图和 MapXtreme,可以在 MapXtreme Java Manager 中打开示例 .mdf。采用不同的图层设 置进行实验(有关详细信息,请参阅第 5 章:管理 MapXtreme Java)。在准备就绪可以保存工作 时,可将其另存为地图定义文件,在此既可另存为远程数据库表中的一条记录,也可另存为命名地图。地图图元 40 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 地图图元 MapXtreme 中的地图由地图对象的图层构成。这些地图对象可通过图元对象在 MapXtreme 中访 问。此处有三种基本图元类型: • 区域:覆盖给定区域的闭合对象。其中包括多边形、椭圆和矩形。区域包括国界、邮政编码边界 和销售区域等。 • 点对象:表示数据的单一位置。其示例包括客户位置、饭店和停车计时器等。 • 线对象:覆盖给定距离的开放对象。包括直线、折线和弧线等。其示例有街道、河流和电力线路等。 可以将各种不同类型的对象置于单独的图层之中(最常见),或者也可以在同一图层中组合不同的 对象。借助于 MapXtreme,可以定制和显示这些对象,令地图满足具体的需求。 样式 MapXtreme Java 地图中的所有图元均显示特定的可见特征,例如颜色或符号类型。相应的特征也称 为样式。MapXtreme Java 包括使用 Java2D API 渲染能力的众多显示属性,其中有直线和区域的符 号刷、虚线和平行线、矢量符号和缩放符号和标记。 样式可以通过编程设置,也可以通过 MapXtreme Java Manager 的“图层控制”对话框设置。有关 样式 API 的详细信息,请参阅第 14 章:标注和样式。有关图层控制的详细信息,请参阅第 5 章:管 理 MapXtreme Java。 标注 标注是 MapXtreme Java 中功能强大的特性之一,可用于增强地图功能,并向用户提供正确的消 息。标注不仅仅局限于添加文本来说明地图的特性。使用 MapXtreme Java,可以控制字体类型、大 小、颜色、位置,并使用光晕和轮廓线等富有创意的效果,为每个图层创建不同的标注。标注内容 可以通过从图层数据源的一个或多个列获取数据的表达式来生成。如果需要区分相同图层中的标 注,还可以创建标注专题。 有关标注的详细信息,请参阅第 14 章:标注和样式。 地图数据分析 分析地图以进一步了解行列格式数据之外的更多信息,也是 MapInfo 公司地图绘制软件的强大功能 之一。通过在地图上显示数据,可以对数据进行可视化的比较,这将有助于作出更出色的业务决策。 MapXtreme Java 提供了分析地图的众多方式,从使用地图工具到点击图元,创建显示图元相互关系 的专题地图,乃至根据自定义条件搜索底层数据不一而足。第 4 章:地图绘制概念 开发人员指南 41 © 2006 MapInfo Corporation. 保留所有权利。 将数据置于地图中 借助于数据提供方,可从其它来源向地图添加数据。例如,如果有一个按照县划分销售额的 Oracle 空间数据库表,则可以将相应数据显示在地图上,按照县查看销售模式的点趋势图。 MapXtreme 支持访问多种不同类型的数据源,其中包括: • Oracle Spatial • Informix Universal Server SpatialWare DataBlade • IBM DB2 Spatial Extender • SQL Server with SpatialWare • JDBC 兼容的数据库(存储在 X,Y 列的空间数据) 此外,MapXtreme Java 支持数据绑定,即实现了将 .tab 文件中的数据关联到 JDBC 数据以构成图层。 有关从这些数据源添加数据的详细信息,请参阅第 10 章:在图层中绘制地图。 有关如何将 .tab 文件加载到远程数据库管理系统的详细信息,请访问 www.mapinfo.com,下载免 费的实用程序 EasyLoader 和用户指南。将数据置于地图中 42 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 管理 MapXtreme Java 本章介绍如何使用 MapXtreme Java Manager 管理数据和命名资源。 本章内容:  MapXtreme Java Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44  地图定义面板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45  Web 应用程序面板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46  命名资源面板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46  连接管理器面板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46  向 MapXtreme Java Manager 添加服务 . . . . . . . . . . . . . . . . . . . . . .46  使用 MapXtreme Java Manager 管理数据 . . . . . . . . . . . . . . . . . . . .47  Geosets 和地图定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48  加载现有的地图定义. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49  创建地图定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50  保存地图定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56  使用地图工具控制图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59  图层控制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64  通过图层控制显示选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68  经由图层控制的标注选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72  管理命名资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77MapXtreme Java Manager 44 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapXtreme Java Manager MapXtreme Java Manager 是一个 Java 服务器和客户机 GUI,可用于全方位管理各种 MapInfo 企业级 产品,其中包括 MapXtreme Java 地图服务、MapMarker J Server 地图编码服务和 Routing J Server 线 路规划服务。目前上述服务中只启用了 MapXtreme Java 服务,但是用户可以自行添加地理编码和线 路规划服务。有关详细信息,请参阅第 46 页的向 MapXtreme Java Manager 添加服务。 MapXtreme Java Manager 服务器和客户机通过 XML 相互通信。客户机可以作为应用程序或浏览器中 的 applet 运行。作为应用程序运行时可采用 Web 服务器模式或单机模式。MapXtreme Java Manager 客户机可用于: • 管理和配置地图图层(地图定义面板) • 管理命名资源,其中包括地图、图层和样式(命名资源面板) • 快速构建原型 Web 应用程序(Web 应用程序面板)。 • 管理 JDBC 连接(连接管理器面板)。 关于 MapXtreme Java Manager 元素 MapXtreme Java Manager (MJM) 使用预置组件执行特定的地图绘制任务。地图定义面板上的按钮 均为 JavaBean,可添加至用户自行开发的应用程序。有关详细信息,请参阅第 7 章:MapXtreme JavaBeans。 Web 应用程序构建器使用 Java 服务器页技术实现快速的原型开发。定制标记库中的 JSP 标记也可 供用户自行使用。请参阅第 6 章:Web 应用程序构建器和附录 C:定制 JSP 标记库。 运行 MapXtreme Java Manager 由于 MapXtreme Java Manager 需要与 Web 应用服务器通信,因此在启动之前,确保 Web 应用服 务器(如 Apache/Tomcat)正在运行。采用单机模式运行 MapXtreme Java Manager 无需启动应用 服务器,但是将无法使用某些功能(如 Web 应用程序构建器向导)。 要运行 MapXtreme Java Manager 服务器,请执行以下操作: • 启动 MapXtreme 服务器。对于 Windows 用户,从“程序”菜单或从 \MapXtreme-4.8.0\bin 目录下运行 startup.bat 文件均可启动 MapXtreme 服务 器。UNIX 用户可运行 startup.sh。 在 MapXtreme 服务器运行之后,可启动 MapXtreme Java Manager 客户端,将其作为 applet 或应 用程序运行。 要启动 MapXtreme Java Manager 客户端作为 applet 运行,可执行以下操作: • 打开 Web 浏览器,然后指向 MapXtreme Java Manager servlet 的 URL。例如: http://stockholm:8080/mapxtreme480/manager。 要启动 MapXtreme Java Manager 作为应用程序运行,请执行以下操作: • 在 Windows 环境下,从“程序”菜单选择 MapXtreme Java Manager 快捷方式。对于其它环境, 若要从命令行来进行启动,使用以下语法。 java com.mapinfo.mjm.client.MJMClient 第 5 章:管理 MapXtreme Java 开发人员指南 45 © 2006 MapInfo Corporation. 保留所有权利。 安全考虑因素 如果部署的是直接和 MapXtremeServlet 对话的胖 MapXtreme Java 客户机应用程序,则由于处于同 一上下文中,该应用程序还可以访问 MapXtreme Java Manager servlet。如果在防火墙之外公开 mapxtreme480 servlet 的上下文,那么这将会同时公开 MapXtreme Java Manger。某些访问者通过 访问 http://host/mapxtreme480/manager,即可浏览文件系统甚至是保存在该处的文件。 对于这些胖客户机,只需将 Web 服务器配置为不允许访问 /manager servlet 即可解决上述问题。 地图定义面板 在地图定义面板中可构建地图。从地图定义面板还可以: • 以两种格式加载和保存地图图层:mdf(地图定义)或 .gst (Geosets) 格式 • 从文件、数据库或命名资源添加图层,并编辑其属性设置 • 平移和缩放,更改显示和标注设置 • 对地图上显示的图层重新排序 • 创建专题图层,并保存所有设置,用于在必要时加载到应用程序 默认情况下,所有图层均由 MapXtreme Java Manager 使用 MapXtremeDataProviders 创建;但是 也可选择使用 MapXtremeDataProviders 或 LocalDataProviders 来创建。 下图显示了已加载地图定义的 MapXtreme Java Manager 客户端界面。要加载或创建地图定义,请 参阅第 49 页的加载现有的地图定义中的说明。Web 应用程序面板 46 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Web 应用程序面板 MapXtreme Java Manager 的 Web 应用程序面板为开发人员提供了向导,指导开发人员轻松快捷地 构建定制 Web 应用程序。借助于 Sun 的 Java 服务器页技术这一 Java 2 平台企业版的关键组件,开 发人员使用这一快捷原型即可独立于平台,创建和维护 Web 页面中的静态和动态内容。JSP 技术将 用户界面和内容生成隔离开来,设计人员借助于此,更改整体页面布局时无需更改底层的动态内容。 这一原型构建器使用的标记类似于 JSP XML 自定义标记,其行为类似于窗口部件,只需从列表中选 择即可将其添加到构建器的布局框架中。我们在 JSP 库(将在附录 C:定制 JSP 标记库中详细讨 论)中提供了各种典型绘图插件,例如工具栏、地图、图层控件和图例插件。此外还包括有关说 明,说明如何构建定制 JSP 标记,并将其添加到向导以增大从中构建应用程序的插件池。 有关使用 Web 应用程序面板的说明,请参阅第 6 章:Web 应用程序构建器。 命名资源面板 MapXtreme Java Manager 的命名资源面板可用于管理已经给定唯一名称或别名的资源。在此可创建 用于命名地图和命名图层的上下文,并从安装期间创建的 mistyle 上下文访问命名样式。有关命名资 源的详细信息,请参阅第 56 页的保存地图定义。 连接管理器面板 连接管理器提供了管理 JDBC 连接的用户界面(如编辑 miconnections.properties 的内容)。这些连 接由 miconnections.properties 文件处理,并在连接管理器面板上管理。有关详细信息,请参阅第 12 章:访问远程数据。 向 MapXtreme Java Manager 添加服务 采用标准安装,将自动为 MapXtreme Java Manager 预配置有关 MapXtremeServlet 服务的信息,并 且该服务可以直接使用(如使用 Web 应用程序向导创建的应用程序将使用 MapXtremeServlet 来绘 制地图)。 MapXtreme Java Manager 还可以配置有关于其他服务的信息,例如地理编码(通过 MapMarker J 服务 器)或线路规划(通过 Routing J 服务器)。但在利用相应的其他服务之前,必须手动配置 MapXtreme Java Manager,如下所示。 注: MapMarker J 服务器和 Routing J 服务器均是可从 MapInfo 公司购买的产品。第 5 章:管理 MapXtreme Java 开发人员指南 47 © 2006 MapInfo Corporation. 保留所有权利。 向 MapXtreme Java Manager 添加 MapMarker 支持 在完成配置有效的 MapMarker 服务器后,可通过将以下初始化参数添加到 webapps/mapxtreme480/WEB-INF/web.xml 的 MapXtreme Java Manager servlet 部分,令 MapXtreme Java Manager 意识到该服务器的存在。 mapmarker mapmarker://testbed:4141 该参数名为 mapmarker。注意其参数值是一个伪 URL(起始为 mapmarker:// 而非 http://)。使用这 一 URL 指定 MapMarker 服务器的主机和端口(中间用冒号分隔)。 预计下一版本的 MapMarker 可以使用常规 HTTP URL,而不需要再使用主机和端口号。在将来的 MapMarker 版本发布之后,即可使用 MapMarker 服务器的 http:// 常规 URL 来取代 mapmarker:// 的 伪 URL。 重新启动 servlet 容器。再次运行 MapXtreme Java Manager 时,Web 应用程序向导将包括附加的插 件(如添加到工具栏插件中的按钮),这些插件可用于向 JSP 应用程序添加地理编码支持。 向 MapXtreme Java Manager 添加 Routing J Manager 支持 在配置的 Routing J 服务器有效工作之后,可将以下初始化参数添加到 webapps/mapxtreme480/WEB-INF/web.xml 的 MapXtreme Java Manager servlet 部分, 令 MapXtreme Java Manager 意识到路线规划服务器的存在。 routing http://testbed:85/routing/servlet/ RoutingServlet 该参数的名为 routing。其参数值是指向 Routing J 服务器 servlet 的 URL。 重新启动 servlet 容器。再次运行 MapXtreme Java Manager 时,Web 应用程序向导将包括附加的插 件(如添加到工具栏插件中的按钮),这些插件可用于向 JSP 应用程序添加路线规划操作。 使用 MapXtreme Java Manager 管理数据 管理要在地图中显示的数据是 MapXtreme Java Manager 的主要功能之一。MapXtreme Java 将此数 据显示为图层集合,每个图层(理想情况)均由一种类型的图元构成,例如行政边界、客户位置、 无线网络或高速公路等图元。 这些图层可以保存,并可通过使用 MapXtreme Java Manager 创建地图定义得以复用。地图定义说 明将要纳入地图的地图图元以及相应的显示设置。地图定义是基于 XML 文本,提供有关图层集合的 说明。地图定义可作为远程数据库中的记录或命名资源档案库中的命名地图,保存为 .mdf 格式。 使用 MapXtreme Java Manager 来创建适当的基础地图,以便用作地图的参考信息。例如,可能需 要区域边界、街道图层和商店位置图层以资参考。Geosets 和地图定义 48 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 此外,还需要包括和应用程序相关的特定地图数据,例如客户位置、基站位置或送货路线。任何记 录只要具有类似客户地址的位置组件,即可用作地图数据,。 构建地图集,可从加载 MapXtreme Java 附带的预定义地图定义(.mdf 格式)作为开始。有关详细 说明,请参阅第 49 页的加载现有的地图定义。/examples/server/data/machine-name 目录中还提供 了一个示例 world.mdf。 注: 示例基础地图数据集的说明位于 MapInfo 的网站上,网址为 http://www.mapinfo.com/support/documentation/manuals.cfm。 在打开某些图层之后,可自定义显示图层的方式,并可添加或删除图层或对其重新排序。有关图层 自定义工具的说明,请参阅第 59 页的使用地图工具控制图层。 在对图层显示特征满意之后,可将其保存为地图定义,用于在必要时加载到应用程序之中。 Geosets 和地图定义 本节提供有关 geosets 和地图定义的说明。 Geosets MapXtreme Java 的示例数据集包括 MapInfo 的 .tab 格式文件,这些文件划分到类似于工作空间概 念的 geoset(扩展名为 .gst)组。例如,示例数据中有一个 world.tab 文件和一个 world.gst 文件。 geoset World.gst 是一种元数据文件,用于说明一个包括 world.tab 和其他文件的 .tab 文件集合。 Geosets 是一类可以加载到 MapXtreme Java Manager 中的文件。但是需要注意的是,这些文件限 定为 MapInfo .tab 格式,不能存储到远程数据库或命名资源档案库中。此外,geosets 中的样式不能 更改。第 5 章:管理 MapXtreme Java 开发人员指南 49 © 2006 MapInfo Corporation. 保留所有权利。 地图定义 为了打破 geosets 的限制条件,MapXtreme Java 还提供了采用 .mdf 格式的示例数据集。基于 XML 的地图定义是说明地图图元和设置的文本文件。地图定义可以保存为文件(扩展名为 .mdf)或存储 为 RDBMS 中的记录,或存储为命名资源档案库中的命名地图。我们强烈建议使用地图定义。如果 使用 geosets,那么可在使用之后将地图设置另存为地图定义。 可以在 MapXtreme Java 3.x 中打开的地图定义将会自动导入到 MapXtreme Java 4.x 之中。将不再 支持 3.0.x 之前的版本中创建的地图定义。要创建新的地图定义,必须通过使用 MapXtreme Java Manager 或者通过 MapDefContainer 接口以编程方式来创建(请参阅第 131 页的通过编程保存地 图)。 加载现有的地图定义 用户可以打开采用以下 4 种方式存储的地图数据: • 存储为 .mdf 或 .gst 文件 • 存储为命名地图(此前给定唯一名称的图层集合和设置) • 存储为最近访问的地图定义 (MRU) • 存储在远程数据库中 后续说明对上述各种存储方式分别作出了解释。 要显示现有地图定义,可执行以下操作: 1. 按照第 44 页的运行 MapXtreme Java Manager 中的说明,运行 MapXtreme Java Manager Servlet 和客户端。此时将显示地图定义面板。 2. 单击地图定义面板上的打开按钮。此时将显示加载地图定义屏幕。其中提供了以下选项卡:文 件、最近使用的、命名和数据库。 3. 要加载存储为文件的地图定义,可单击文件选项卡,并导航至存放 .mdf 或 .gst 文件的位置。单击 加载。 注: 相应文件存储在 MapXtreme Java 服务器上,因此即使正在将 MapXtreme Java Manager 作为 applet 在远程计算机上运行,也可以导航至服务器的相应目录。无需在该服务器 计算机上即可访问地图文件。 4. 要加载此前打开过并且保存到“最近使用的”选项卡中的地图定义,可单击最近使用的,然后选 择适当的地图定义,再单击加载。 5. 要加载此前的命名地图,可单击命名选项卡。如有必要,可在左侧窗格中单击适当上下文,导航 至命名地图的存储位置。突出显示资源列表中的地图,然后单击加载。(有关创建命名地图的说 明,请参阅第 78 页的命名地图。)创建地图定义 50 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 6. 要从 RDBMS 加载地图定义,可单击数据库选项卡。 在连接框中,从此前保存的连接(如有)列表选择连接。在将地图定义保存到命名连接之前, 必须先定义该命名连接。有关创建命名连接的详细信息,请参阅第 12 章:访问远程数据。 7. 在表或查询组中,从以下选项中选择: 使用 MAPINFO.MAPDEFINITIONS 表(默认) 使用表:提供表名、名称列和地图定义列。 使用 SQL:自行提供 SQL 查询语句 8. 在地图定义组中,单击刷新按钮以显示现有地图定义的列表。从中选择一个地图定义文件,然后 单击加载。此时将显示一个地图定义,用户可直接对其进行自定义操作。 创建地图定义 下一节说明如何使用 MapXtreme Java Manager 创建地图定义。 使用添加图层向导 可以通过添加新图层,或采用新设置和新名称保存现有地图定义或 geosets 来创建地图定义。 MapXtreme Java 提供了添加图层向导来帮助用户完成相关的操作。每次可在一个图层上构建地图定义。 注: 在添加图层向导中,“远程”表示可能潜在地浏览远程计算机,尽管数据可能就在本地。 以下步骤说明如何使用该向导从基于文件的数据源、JDBC 数据源、命名图层和数据界限图层添加新 图层。要从现有的地图定义或 geoset 创建新的地图定义,可使用“另存为 ...”按钮。第 5 章:管理 MapXtreme Java 开发人员指南 51 © 2006 MapInfo Corporation. 保留所有权利。 添加 MapInfo TAB 文件和其他基于文件的地图数据 要使用基于文件的数据创建新的地图定义,可执行以下操作: 1. 从地图定义面板,单击新建按钮。从地图中删除任意现存的图层都将留下一个空地图。单击图层 控制按钮。 2. 从“图层控制”对话框,单击添加。此时将显示增加远程图层向导。 3. 要添加 MapInfo .tab 文件,可从“选择数据源”面板提供的列表中选择 MapInfo TAB 文件。单击 下一步。 4. 在“指定 MapInfo 表信息”对话框中,单击添加按钮,导航至文件位置,然后选择一个或多个文 件。单击打开以返回到添加图层向导,然后单击下一步以继续。 5. 在“指定其他图层设置”对话框中,根据需要可提供图层名称。 6. 单击完成。此时将返回到“图层控制”对话框。该对话框的图层 / 专题列表中显示了 .tab 文件。 单击确定以查看地图中的图层。 7. 通过设置显示、图层属性和标注属性、重排图层显示方式、删除或添加图层以及图层是否可见或 包含标注,自定义所需图层。有关详细信息,请参阅第 64 页的图层控制。 8. 在对设置感到满意之后,单击确定以离开“图层控制”对话框。此时将显示新建的地图。如有必 要,返回到图层控制面板,更改显示设置或返回到添加图层向导以添加更多图层。 在完成创建地图之后,需要将其另存为地图定义。请参阅第 56 页的保存地图定义。 注: 上述操作步骤适用于类似的添加 GeoTIFF Raster 或 ESRI Shape。要添加 MapInfo 网格文 件,可选择 TAB 数据源,然后打开与所要添加的网格文件关联的 .tab 文件。创建地图定义 52 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 添加 JDBC 地图数据 要使用 JDBC 数据创建新的地图定义,可执行以下操作: 1. 从地图定义面板,单击新建按钮。从地图中删除任意现存的图层都将留下一个空地图。单击图层 控制按钮。 2. 从“图层控制”对话框,单击添加。此时将显示添加图层向导。 3. 从列表选择 JDBC 数据源,例如有空间选项的 Oracle。选择默认属性值或此前的设置。单击下 一步。 4. 输入数据源的连接信息。 5. 在用于数据源的“指定表或查询”面板中,选择添加表或可选查询数据库。单击下一步。 6. 指定 MapXtreme Java 是否应该查询 MAPINFO_MAPCATALOG 以获取相关设置或自行执行设 置。单击下一步。 如果图元或标注级别的样式信息存储在表中,可从其存储的 MAPCATALOG 中指定信息的存 储方式和样式列的名称。默认行为为无。单击下一步。 7. 在指定其他图层设置面板,指定图层名(可选)。单击完成。此时将返回到“图层控制”对话 框。您所添加的图层将显示在列表中。 8. 重复执行上述步骤可添加更多 JDBC 图层。 9. 通过设置显示、标注属性、重排图层显示方式、删除或添加图层以及图层是否可见或包含标注, 自定义所需图层。有关详细信息,请参阅第 64 页的图层控制。 10. 在对设置感到满意之后,单击确定以离开“图层控制”对话框。此时将显示新建的地图。如有必 要,返回到“图层控制”对话框,更改显示设置或返回到添加图层向导以添加更多图层。 在完成创建地图之后,需要将其另存为地图定义。请参阅第 56 页的保存地图定义。 将 QueryBuilder 附加到 JDBC 图层 Mapxtreme Java Manager 可以将 QueryBuilder 附加到在 Mapxtreme Java Manager 中创建的 JDBC 查询图层,并且可以在 Mapxtreme Java Manager 读取现在地图定义时,将附加的 QueryBuilder 更 改为 JDBC 查询图层。可在 Mapxtreme Java Manager 中附加到图层的 QueryBuilder 仅限于在 querybuilderxmlhandler.xml 中定义的 QueryBuilder。第 5 章:管理 MapXtreme Java 开发人员指南 53 © 2006 MapInfo Corporation. 保留所有权利。 要将 QueryBuilder 附加到在 MapXtreme Java Manager 中创建的查询图层: 1. 添加或编辑查询图层。 2. 若指定查询,则选中“使用 QueryBuilder(键)”复选框,然后使用该复选框旁的下拉列表选择 要用于查询图层的 QueryBuilder。 3. 按需完成添加或编辑图层。 在 MapXtreme Java Manager 中使用 OracleQueryBuilder 示例 要部署用于 MapXtremeJava Manager 的 OracleQueryBuilder 示例。 1. 将以下 .class 文件从 \MapXtreme-4.8.0\examples\client\querybuilders 文件夹复 制到 \MapXtreme-4.8.0\lib\client 文件夹: • IdentityQueryBuilder.class • OracleQueryBuilder.class • OracleQueryBuilderXMLHandler.class 2. 编辑 \MapXtreme-4.8.0\lib\client 下的 querybuilderxmlhandlers.xml 文件。取消 QueryBuilderXMLHandlerMapping 的注释标记。 现在,OracleQueryBuilder 示例就可在 MapXtremeJava Manager 中使用了。 要部署用于 Tomcat 的示例,将上述的类文件和 querybuilderxmlhandlers.xml 添加到 \MapXtreme-4.8.0\apache-tomcat-5.5\webapps\mapxtreme480\WEB-INF\classes。创建地图定义 54 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 添加命名图层 命名图层是此前使用唯一名称保存的图层。您可以通过添加图层向导,象检索其他任何图层一样检 索命名图层。有关创建命名地图的说明,请参阅第 79 页的命名图层。 要添加命名图层,请执行以下操作: 1. 从地图定义面板,单击新建。从地图中删除任意现存的图层都将留下一个空地图。单击图层控制 按钮。 2. 从“图层控制”对话框,单击添加。此时将显示添加图层向导。 3. 从“选择数据源”面板提供的数据源列表中选择命名图层。单击下一步。 4. 单击选择命名图层按钮,显示命名资源对话框。在左侧窗格中,单击包含命名图层的上下文。在 资源面板中突出显示命名图层,然后单击加载。 5. 在“选择命名图层”面板中,单击完成。此时将返回到“图层控制”对话框,该框中显示了所添 加的图层。单击确定以查看地图中的图层。 6. 继续添加其他图层来构建地图 。通过设置显示、标注属性、重排图层显示方式、删除或添加图层 以及图层是否可见或包含标注,自定义所需图层。有关详细信息,请参阅第 64 页的图层控制。 7. 在对设置感到满意之后,单击确定以离开“图层控制”对话框。此时将显示新建的地图。如有必 要,返回到“图层控制”对话框,更改显示设置或返回到添加图层向导以添加更多图层。 在完成创建地图之后,需要将其另存为地图定义。请参阅第 56 页的保存地图定义。 添加数据绑定图层 数据绑定图元允许您通过将 MapInfo .tab 文件中的图元几何对象与 JDBC 数据库中的属性信息联接 在一起来构建地图。 要通过添加数据界限图层来创建新的地图定义,可执行以下操作: 1. 从地图定义面板,单击新建按钮。 2. 从“图层控制”对话框,单击添加。此时将显示添加图层向导。 3. 从可用数据源列表中选择数据绑定。单击下一步。 4. 在指定 MapInfo 表信息面板上,单击 ... 按钮,导航至 .tab 文件位置。单击打开以返回到添加图 层向导,然后单击下一步以继续。 5. 指定绑定图层数据源信息(JDBC 驱动程序类名、连接 URL、用户名和口令)。单击下一步。 6. 提供您要使用 MapInfo .tab 几何信息构建的表或查询。可选择提供用于该表的所有者名称或用于查 询的 ID 列。单击下一步。 7. 在“地理和连接图层列”面板,输入用于地理图层(MapInfo .tab 文件)的列名,然后单击添加。 对于源自 JDBC 数据源的联接图层,可指定和地理列相关的列名,然后单击添加。如果要使用附 加列进行联接,可在此处添加相应的列。单击下一步。 8. 可以选择给出图层名称。单击完成。此时将返回到“图层控制”对话框。数据绑定图层将显示在 图层 / 专题列表中。单击确定以查看地图中的图层。 9. 通过设置显示、标注属性、重排图层显示方式、删除或添加图层以及图层是否可见或包含标注, 自定义所需图层。有关详细信息,请参阅第 64 页的图层控制。第 5 章:管理 MapXtreme Java 开发人员指南 55 © 2006 MapInfo Corporation. 保留所有权利。 10. 在对设置感到满意之后,单击确定以离开“图层控制”对话框。此时将显示新建的地图。如有必 要,返回到“图层控制”对话框,更改显示设置或返回到添加图层向导以添加更多图层。 在完成创建地图之后,需要将其另存为地图定义。 创建分析图层 您可以使用添加图层向导创建饼图或条形图作为分析图层。要创建分析图层,请执行以下操作: 1. 从地图定义面板,单击打开按钮。打开要向其添加分析图层的文件。单击图层控制按钮。 2. 从“图层控制”对话框,单击添加。此时将显示添加图层向导。 3. 从可用数据源列表中选择分析图层。单击下一步。 4. 在“指定图层和要分析的列”面板,选择图层、要分析的列和分析类型。并行条形图垂直显示, 而堆叠条形饼图则水平显示。单击下一步。 5. 在“指定饼图属性”面板,选择插件颜色、字符大小、方位和位置。单击下一步。保存地图定义 56 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 如果已在步骤 4 中选择了一个条形图类型,则选择直方条颜色、字符大小和方向。单击下一步。 6. 在“指定其他图层设置”对话框,指定新图层的名称。单击“完成”。 保存地图定义 保存地图定义时,有若干种不同的选择。此时既可保存到文件,保存为命名地图,也可保存到远程 数据库。 1. 要保存地图,可从地图定义面板单击保存按钮。此时将显示带有 4 个选项卡的保存地图定义对话框: 文件、最近使用的、命名和数据库。转至适合于您要保存的地图定义类型所在的适当选项卡。 保存到文件 2. 要保存到文件,可单击文件选项卡,提供文件名和存储文件的位置。第 5 章:管理 MapXtreme Java 开发人员指南 57 © 2006 MapInfo Corporation. 保留所有权利。 3. 如果需要,选中“使用相对路径保存 mdf”复选框。默认的行为是使用绝对路径保存 mdf。请参阅 第 9 页第 1 章的地图定义允许数据的绝对或相对路径。 4. 单击保存。地图将存储为 .mdf 格式。 另存为命名地图 5. 要将地图保存为命名地图,可从“命名”选项卡,单击要将地图定义保存到的上下文。 6. 为“名字”框中的地图定义提供名称。保存地图定义 58 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 7. 单击保存。相应信息现在将保存为指定上下文中的 XML 格式的地图定义。 如果没有保存命名地图的上下文,则必须设置相应的上下文。转至 MapXtreme Java Manager 客 户端的命名资源面板。详细信息,请参阅第 77 页的管理命名资源。 保存至远程数据库 8. 要将地图定义保存到远程数据库,可单击数据库选项卡。 9. 在“连接”框中,从此前保存的连接(如有)列表选择连接。在将地图定义保存到命名连接之 前,必须先定义该命名连接。有关创建命名连接的详细信息,请参阅第 12 章:访问远程数据。 10. 在表或查询群组中,从以下选项中选择: 使用 MAPINFO.MAPDEFINITIONS 表(默认) 使用表:提供表名、名称列和地图定义列 使用 SQL:提供自己的插入 / 更新 SQL 语句 11. 在地图定义群组中,指定地图名,然后单击保存。相应信息现在将保存为数据库中 XML 格式的 地图定义。第 5 章:管理 MapXtreme Java 开发人员指南 59 © 2006 MapInfo Corporation. 保留所有权利。 使用地图工具控制图层 在 MapXtreme Java Manager 中打开地图图层之后,可以根据具体需要自定义其显示。使用地图工 具栏上的按钮来控制地图的显示。 我们将在此介绍以下组件:放大、缩小、平移、标尺、信息、选择工具、首选项、地图选项、查看 整个图层和添加专题。 放大工具 使用放大工具可获取地图或图层的较近的区域视图。 要使用放大工具,可在要放大的区域中心处点击“放大”光标。这一操作将通过两个线性因素放大 该区域。该点将位于放大视图中的地图中心。重复此操作步骤,直至得到适当的放大级别。 要放大一个矩形区域,可在地图或图层上,通过对角拖动放大光标画出一个选取框。选取框中的区 域即可放大。 缩小工具 使用缩小工具可获取地图或图层的较宽的区域视图。 要使用缩小工具,可在要缩小的区域中心处点击缩小光标。这一操作将通过两个线性因素放大该区 域。该点将位于缩小视图中的地图中心。 平移工具 使用平移工具将地图重新定位于其窗口之中。 要移动或调整地图显示,可单击地图中的区域,同时按住鼠标按钮,以适当的方向拖动地图。在释 放鼠标按钮之后,地图将在其新的位置上重画。 标尺工具 使用标尺工具可测量两点之间的距离和多点之间的总距离。 要使用标尺工具,可单击地图上的起点。双击终点。标尺窗口将显示两点之间的距离。 要显示一条路线的中间点的距离,可单击起点,然后继续单击其他点。“标尺”窗口将显示最后一 段距离和总计的距离。要结束该操作,可双击所要测量的最后一点,或按下 Esc 键。使用地图工具控制图层 60 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 信息工具 信息工具提供了与存在于给定点的地图对象关联的属性视图。 要使用信息工具,可单击地图图元。此时将显示信息工具窗口。 如果选中的是用于唯一图层的对象,则“信息工具”窗口将显示与该点处的地图对象关联的属性。 用于该记录的每个属性均可查看。要查看完全列表,需要放大该窗口。 如果地图包含多个图层,“信息工具”窗口将显示图层列表。突出显示图层,然后双击即可查看图 层级别的属性信息。单击“列表”按钮以返回到图层列表。 选择工具 通过 MapXtreme Java,可选择地图图层中的一个或多个图元,以在其上执行附加的操作。MapXtreme Java Manager 提供 5 种选择工具。选择工具可用于选择单独的图层。其他 4 个工具在所选图元区域 中提供不同的限定区域(矩形、半径、多边形、范围)。 5 个选择工具公共的行为是可通过使用 Shift 键添加所选图元的操作。例如,单击选择工具以选择图 元,按住 Shift 键同时单击另一个要包含在第一个选择中的图元。 所有图元均从地图最顶部的可选图层中选择。在默认情况下,图层是不可选择的。为此必须在对应 于所要选择的图层的“图层控制”对话框中选中“可选”框。 在选中图元之后,可将其保存为选择专题。有关选择专题详细信息,请参阅第 15 章:专题地图绘制 和分析。 选择工具 要使用选择工具,可通过首选方法选取“选择工具”,然后单击要选的图元。按住 Shift 同时单击以 选择附加图元。 炬形选择工具 要使用“矩形选择”工具,可选择工具,然后单击并拖动鼠标,在要选择的对象周围形成一个矩 形。按住 Shift 键同时单击鼠标,在此拖动鼠标以选择要包含在第一个选择中的、位于另一个矩形中 的图元。 半径选择 要使用“半径选择”工具,可选择工具,然后单击并拖动鼠标,在要选择的对象周围形成一个圆。 按住 Shift 键的同时单击鼠标,创建另外一个圆,将所选图元添加到第一个选择中。第 5 章:管理 MapXtreme Java 开发人员指南 61 © 2006 MapInfo Corporation. 保留所有权利。 多边形选择工具 要使用“多边形选择”工具,可选择工具,然后单击地图以开始创建多边形,即在要选择的图元周 围形成一个多边形。继续单击附加的点以形成多边形。通过在起点附近单击或双击来完成多边形。 务必确保该多边形具有至少三个节点。 范围选择工具 钥匙“范围选择”工具,可选择工具,单击边界对象,选择其中所有图元。按住 Shift 键的同时单击 其他范围,将所选图元添加到该几何对象。 其他地图工具 本节说明可用的其他工具,例如首选项和地图选项。 首选项 单击“首选项”按钮设置缺省地图目录、MIME 类型(默认为 image/gif),以及 MapXtreme Java 是进行远程(默认)还是本地渲染。 本地渲染主要用于测试目的,例如确认应用程序可有效完成本地渲染工作。如果客户机不具备可用 于应用程序或 applet 的所有必须资源,则不应使用。例如,如果客户机没有安装必需的字体,则某 些地图可能无法正确显示。 使用地图工具控制图层 62 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 地图选项 要更改距离单位设置和投影,可以使用地图选项按钮。 从“地图选项”对话框的下拉菜单中选择距离单位。 要更改坐标系,可单击显示坐标系下拉菜单,显示“选择坐标系”对话框。 坐标系数据存储在一个名为 micsys.txt 的投影文件中。此文件列出了数百种支持的坐标系以及其相 应的定义参数。 文件 micsys.txt 包含在 micsys.jar 之中。当 MapXtreme Java Manager 作为应用程序运行时,micsys.jar 将从 MapXtreme 的 lib/common 目录中加载。当 MapXtreme Java Manager 作为 applet 运行时, micsys.jar 将从 servlet 容器的 webapps/mapxtreme480/client 目录中加载。 查看整个图层按钮 使用“查看整个图层”按钮可查看所选图层的范围。在“查看整个图层”对话框中选择图层,然后 单击“确定”。地图在重新计算的缩放级别重画,以便所选图层的范围在地图上可见,可以查看整 个图层。 注: 您可能无法使用“查看整个图层”来查看查询图层的范围。如果图层定义为查询,并且该图 层没有 QueryBuilder,则尝试在该查询图层上执行“查看整个图层”时,将会看到错误消息。第 5 章:管理 MapXtreme Java 开发人员指南 63 © 2006 MapInfo Corporation. 保留所有权利。 添加图层工具 增加专题图向导是一个向导工具,用于帮助您将图元专题或标注专题添加到地图。 对于图元专题,可以创建范围主题,根据一段范围内的值来划分图元;也可以创建独立值专题,根 据值来以影线表示图元。 该专题可以基于任何支持的列和当前地图中的图层。目前支持基于数字、字符串和日期列数据创建 专题,以及基于点、线和区域图层创建专题。 可以为每个范围或独立值定义特定的样式。 部分操作将用于创建与新专题相关联的默认专题图例。可以自定义图例以更改标题、字体、插入信 息、说明文本和颜色。 对于标注专题,MapXtreme Java 支持以下三种类型:范围、独立值和选择。例如,要区分同一图层 中的主要和次要城市,可使用范围标注专题根据其相应的数据来对城市分组,例如人口数据。 有关标注专题的详细信息,请参阅第 14 章:标注和样式。 有关添加专题向导的详细信息,请参阅第 93 页的 AddTheme Bean。图层控制 64 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 图层控制 对于地图显示的真正控制能力存在于“图层控制”对话框之中。使用其中的选项,可显示、删除、 添加、编辑、选择、缩放图层和标注图层。您还可以更改地图图层和专题的顺序。 要访问“图层控制”对话框,可单击地图工具栏上的图层控制按钮。 “图层控制”对话框显示了构成当前地图的所有图层和图层属性的状态。这些属性如下所示:可视 性、可选和自动标注。每个复选框列上的图标都表示了相应属性。使用这些复选框,可以轻松更改 一个或多个图层的属性。 在此还提供了更改显示、标准和专题设置的选项,以及重排、添加、编辑或移除图层的选项。保存 地图定义,即可保留这些设置。此外还可以通过图层控制对话框的“保存”按钮将图层保存为命名 图层。 后续内容将讨论“图层控制”对话框中的特性。 图层 / 专题可视性 “图层控制”对话框中的可视性属性控制图层或专题在地图上是否可见。例如,要令图层不可见, 可取消选中图层的“可视性”复选框。相应图层将不再显示在地图中(但在保存地图定义时,其中 仍然包括该图层)。如果要关注的只是多图层地图中的一个或多个图层,则这一特性将尤为实用。 图层可选择性 通过 MapXtreme Java,可以选择用于控制和分析的地图对象。“可选”复选框用于控制图层的地图 对象是否可供选择。默认情况下,已添加到地图的图层为不可选。 这一特性在要从较低图层选择对象时非常实用。关闭要从中进行选择的图层上的所有图层的可选状态。第 5 章:管理 MapXtreme Java 开发人员指南 65 © 2006 MapInfo Corporation. 保留所有权利。 自动标注 如果用于标注的缩放级别设置适当,则选中“自动标注”复选框的任意图层都将显示标注。对于不希 望显示标注的任意图层,可取消选中该复选框。默认情况下,添加到地图的图层不是自动标注的。 有关设置和控制标注显示的详细信息,请参阅第 72 页的经由图层控制的标注选项。 重排图层和专题 图层和专题按照其在“图层控制”对话框中列示的顺序显示,地图最先绘制底层图层,最后绘制顶 层图层。图层正确排序才可以避免意外隐藏所需的图元。 例如,当前有一个客户地点图层和一个人口普查地点图层。如果图层在地图中的排序不正确,应用 程序将先绘制客户地点图层,然后再绘制人口普查地点图层。这样客户地点将由于人口普查地点图 层的存在而变得模糊。 要更改图层显示的顺序,可以使用上移、下移按钮。选择要重新排序的图层,然后单击上移或下移 按钮,将图层移至当前位置之上或之下的新位置。要将专题重新排序,必须对关联的基础图层重新 排序。如果该基础图层有多个专题,则可在专题列表中对专题重新排序。 图层对象排序 MapXtreme 不允许在单一地图图层中控制对象的前后排序。如果需要控制此类排序(如需要确保某 些线条显示在区域之上),可在各个图层中放置不同的对象类型。将线对象置于一个图层之中,然 后将区域对象置于另一个图层之中。然后使用“图层控制”对话框来对图层排序。 添加图层:添加图层向导 图层控制提供了添加图层向导来令添加图层的操作更加轻松。可以从多种来源来添加图层,其中包括: • 文件 • 远程数据库 • 此前保存的命名图层 • 数据边界图层(两个来源)图层控制 66 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 要向地图添加图层,可单击“添加”按钮,然后遵循系统提示(有关说明请参阅第 50 页的使用添加 图层向导)。 数据源信息源自向导初始化的属性文件。数据源列表可以通过 addlayerwizard.properties 文件中的 设置更改。此文件还包括用于向导中特定控件的默认值。其中还保存了用户为特定数据源输入的 值,提供了下次运行添加图层向导时使用这些值的选项。 文件 addlayerwizard.properties 位于 MapXtreme-4.80/lib/client 之下。按需对其作出修改,即更改添 加图层向导的配置来满足具体的需求。上述操作假定 MapXtreme Java Manager 客户端正在作为独 立的应用程序运行。 addlayerwizard.properties 的另一个副本存储在 webapps/mapxtreme480/client 目录的 mjmappletsup.jar 文件之内,该副本在运行作为 applet 的 MapXtreme Java Manager 时使用。当作为 applet 运行 MapXtreme Java Manager 时,将会使用略有不同的安全设置,因此需要自己的属性文件副本。 如果需要编辑 addlayerwizard.properties 文件,确保编辑的是计划运行的应用程序的适当文件副本。 有关自定义 addlayerwizard.properties 文件的详细信息,请参阅第 17 章:定制 AddLayer 向导。第 5 章:管理 MapXtreme Java 开发人员指南 67 © 2006 MapInfo Corporation. 保留所有权利。 编辑图层:编辑图层向导 单击“图层控制”对话框中的“编辑”按钮即可显示编辑图层向导。使用该向导可查看和 / 或编辑图 层属性,例如 JDBC 连接信息、坐标系和几何设置以及图层名称。“图层控制”对话框中并未显示 图层类型,因此如要查看相应类型,可使用编辑图层向导。使用编辑图层向导,既可作出微小改 动,例如将显示“图层控制”对话框中的图层名称;也可作出较大的改动,例如远程数据源的主机 名和端口。除注释图层(Annotation 图层)之外的所有其他图层类型均可编辑。 编辑图层向导中的字段已置入相应信息,除此之外,其外观和操作与添加图层向导类似。除了图层 的类型之外,可更改图层的任意其他属性。例如,不能将 TAB 图层重定义为 JDBC 图层。 在随向导操作完毕之后,所选图层将采用新的属性构建,并将取代此前所选的图层。 注: 编辑图层向导有时将忽略图层专题和定制标注表达式。如果是使用该向导完全重新定义图 层,则可能会出现这一情况,同时导致所生成的表和原始的表具有不同的列。 如果关注可能缺失的专题,可在使用过编辑图层向导之后在“图层控制”对话框中进行检查。如果 专题处于维护之中,则将会看到相应专题列出(可能需要单击图层的展开 / 压缩图标以进行显示)。 如果这些专题并未列出,但是您需要保留相应专题,可单击图层控制的“取消”按钮,以取消在编 辑图层向导中所做的更改。 移除图层和专题 要移除图层,可选择要移除的图层,然后单击“移除”按钮。所选的图层将从图层列表中移除。在 “图层控制”对话框中,单击“确定”或“应用”,重新显示该地图。这些图层并未保存为地图定义。 注: 移除操作并未删除任何文件。只是阻止图层在这一特定地图中显示。 专题按钮 如果已经创建图层专题或标注专题,则可以通过图层控制的“专题”按钮控制缩放范围。此外,在 此还可以更改距离单位。(使用地图定义界面上的添加专题工具即可创建专题。)通过图层控制显示选项 68 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 保存按钮 要将图层保存为命名图层,可使用图层控制的“保存”按钮。此时将转至保存命名图层对话框,在 其中可指定图层名称及其存储位置。 显示按钮 “显示”按钮用于打开“显示选项”对话框,在其中可以自定义每个图层在地图中的显示,包括设 置缩放范围和覆盖样式。 标注按钮 “标注选项”对话框可通过图层控制的“标注”按钮打开,在该对话框中可创建多种用于地图图层 的标注样式。有关标注选项的说明,可参阅第 68 页的通过图层控制显示选项。 通过图层控制显示选项 在“显示选项”对话框中,可以自定义地图中每个图层的显示,包括设置图层缩放范围和覆盖样 式。在“图层控制”对话框中,选择图层然后单击“显示”按钮,打开显示选项对话框。 缩放范围 在此对话框中设置图层显示的缩放级别。此外还可以设置用于图层的单位。缩放图层控制图层的显 示,以便只在地图的缩放级别处于预设距离之内时显示。 例如,假设有一个街道图层和一个邮政编码边界图层。当缩小到 30 公里左右的距离时,街道的外观 将会消失。这是因为缩放(窗口宽度)太宽,无法显示街道地图的细节。 借助于缩放图层,MapXtreme 即可只在缩放设置为允许正确看到街道细节的距离的情况下显示街道 图层,例如设置为小于 8 公里的距离。 同一地图中的不同图层可以显示在不同的缩放级别上。例如,假设有街道图层、县界图层和州界图 层。我们希望只有在缩放级别小于 8 英里时令街道图层可见。在缩放级别处于 20 英里和 200 英里之 间时显示县界图层。并且希望只有在缩放级别大于 100 英里的时候令州界图层可见。第 5 章:管理 MapXtreme Java 开发人员指南 69 © 2006 MapInfo Corporation. 保留所有权利。 样式覆盖 使用不同样式来覆盖图层的显示是可用的显示选项之一,例如采用新的颜色用于区域、新的符号用 于点、新的线形用于线段或区域边界等样式。这些样式覆盖均在“显示选项”对话框中设置。 可以使用 MapXtreme 附带的预定义样式来覆盖相应的显示。或者,可以采用多种方式来自定义这些 命名样式,为地图图元提供所需的确切外观。将地图保存为地图定义,即可保存相应的样式更改。 设置样式覆盖 要更改地图图元的样式,可在“图层控制”对话框中突出显示图层,然后单击“显示“按钮。在“显 示选项”对话框中,单击“选择样式”按钮以打开“选择样式”对话框。单击左窗格中的 mistyles 上 下文,显示可用样式的文件夹,然后选择适当的文件夹:画刷、符号或画笔。 使用画刷样式来更改地图图元的图案、填充或前景色。选择 Brush_002 可选取实填充,选择 Brushes_003-175 可用于图案。要设置透明填充,可选择 Brush_001。画刷编号在光标悬停在样式 样本上时将显示工具提示。 使用字体样式可覆盖符号样式,其中包括符号类型、颜色、大小和单位。此处的单位可以是类似毫 米的地图单位,也可以是类似英里的地理单位;借助于此,符号可在不同缩放级别上重新自行调整 符号的大小。随 MapXtreme Java 安装了 11 种字体集。 使用画笔样式可更改线形、颜色、道路宽度或其他线形图元。画笔样式还可用于更改多边形图元的 边界。通过图层控制显示选项 70 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 使用预定义的命名样式覆盖 要使用预定义的命名样式覆盖图层的显示样式,可从样板面板选择相应样式。样式将在名称框中保 持其预定义的名称。单击“加载”以返回到“显示选项”对话框。点击“确定”两次,查看地图上 的样式覆盖效果。 例如,要将所有星型更改为三角形,可从地图符号字体集选择三角形符号。单击“加载”,然后点 击“确定”两次,即可查看地图。此时该符号将以其原始的磅值大小显示为三角形。注意此处的更 改仅限于符号。符号仍然使用相同的磅值大小显示,因为覆盖的并非磅值大小(否则将视为是定制 样式更改,有关说明如下所示)。 使用定制样式覆盖 使用定制样式覆盖图层的显示样式,可先选择预定义的样式,然后作出所需更改。对颜色、大小和 单位以及线宽所作更改会将预定义的样式更改为定制样式。 例如,要将邮政编码边界从画刷样本,更改为带有粗框和蓝色阴影的图元,可选择所需的阴影图 案。(如果此时加载这一图案,则该图案仍将视为预定义的命名样式)。单击填充颜色框,然后从 颜色拾取器中选择蓝色。名称框中的样式名称将从 brush_001 更改为“定制样式”。在线宽框中, 指定要应用于边框的新宽度。单击“加载”,然后点击“确定”两次,即可查看样式更改。 用于带有多种图元类型的图层的样式覆盖 同一图层中有多个图元类型也可设置样式覆盖。例如,要更改邮政编码边界的颜色和用于显示同一 图层中的邮局符号的颜色,可先设置用于边界的样式覆盖。选择画刷图案和颜色。 要更改符号样式的颜色,可单击“符号”选项卡来访问符号颜色选择器。选择新的颜色。注意所选 样式窗口中的符号样式显示了采用新颜色的方形符号。这是表示颜色更改的默认符号样式。本例中 该符号样式不会更改。将两种图元类型更改完毕之后,单击“加载”,然后单击“确定”两次,以 查看在地图上所做更改。 使用渐变填充或单笔填充 可设置样式来使用渐变填充或单笔填充。可选择使用线性或半径颜色渐变。线性渐变沿直线通过一 系列颜色过渡。半径颜色渐变沿圆通过一系列颜色过渡。有关渐变的详细信息,请参阅第 218 页的 渐变。第 5 章:管理 MapXtreme Java 开发人员指南 71 © 2006 MapInfo Corporation. 保留所有权利。 要使用渐变填充或单笔填充,可在选择样式对话框中选择半径颜色渐变或线性颜色渐变用于所要覆 盖的填充或单笔属性。此后可以单击省略号按钮,显示“指定半径颜色渐变”或“指定线性颜色渐 变”对话框。 此时即可指定满足特定需求的渐变特性。在对指定渐变满意之后,单击“确定”。 保存新的命名样式 MapXtreme 附带有大量分类的标准命名样式,例如 brush_002 和 pen_118。此外,用户还可以自行 创建定制命名样式。例如,可创建名为 BigBlueStar 的命名样式,表示 24 磅的蓝色星型符号。 要保存新的命名样式资源,可执行以下操作: 1. 运行 MapXtreme Java Manager 客户端。 2. 转至“命名资源”选项卡。 3. 单击创建新样式按钮。此时将显示“选择样式”对话框。 4. 选择类似 brush_002 的现有命名样式之一作为定制样式的起点。 5. 应用所需的定制样式属性(颜色等)。 6. 在左侧的上下文树形结构中,单击用于保存新的命名样式的文件夹。 7. 在“名称”文本框中,键入要用于新样式的名称。在此最好使用简洁明了的名称,例如 bluestar。 8. 单击保存按钮。此时新的命名样式即保存到服务器上。 注: 在从“命名资源”选项卡启动之后,选择样式对话框只提供了“保存”按钮。如果从类似 “图层控制”对话框的其他位置启动选择样式对话框,则所选样式将只能应用于地图,而不 能保存到命名样式资源。(这一限制是出于安全原因而设置的。如果“选择样式”对话框始 终允许用户保存命名样式,则任意使用图层控制 bean 的应用程序或 applet 都将允许任意用 户创建或覆盖服务器上的命名样式)。经由图层控制的标注选项 72 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 符号的颜色替换模式 MapXtreme Java Manager 中的“选择样式”对话框包括“颜色替换模式”下拉列表。使用该下拉列 表选择要用于位图符号的颜色替换类型("MAPXTREME" 或“无”)。默认的行为是 MAPXTREME,表 示 MapXtreme Java Edition 将执行颜色替换。若选择“无”,位图符号的显示保持不变。 图像符号中的颜色将通过下面的算法替换:使用 SYMBOL_FOREGROUND 替换原始图像中黑色的 像素,使用 SYMBOL_BACKGROUND 替换原始图像中黑色以外的像素。 此项特性只适用于“符号”选项卡。 经由图层控制的标注选项 MapXtreme Java 提供了多种标注属性,用于在地图上实现精确复杂的明了外观。要更改图层的标注 属性,可选择图层,然后单击“标注”按钮以显示标注选项对话框。 标注选项对话框中有三个面板,用于启用不同的标注特性: • 文本(列名或表达式、多行显示、字体属性) • 可视性(缩放设置、重复 / 重叠标注 • 位置(自锚点的偏移量,水平和垂直对齐)第 5 章:管理 MapXtreme Java 开发人员指南 73 © 2006 MapInfo Corporation. 保留所有权利。 标注文本选项卡 要从“文本”选项卡设置用于标注的列,可从“标注”下拉列表中选择列。表的第一列为此列表的 默认值。 此外,还可以使用列数据、静态文本或这两者的组合来创建表达式。要组合列信息和静态文本,需 要为标注创建一个表达式。 例如,要创建一个标注,其起始为静态文本 "Pop:",接下来是源自名为 POP_2000 的列的实际人口 值。从样式下拉列表中,选择“表达式”。此时将显示“表达式”对话框。 在“表达式”窗口键入 "Pop:"。确定该文件位于引号之内。从列的列表中选择 POP_2000 列。该列 将自动输入到表达式窗口中。注意在静态文本和列输入之间将插入 + " " +。单击“确定”,离开表达 式对话框。单击“确定”,离开图层控制,以查看标注表达式的结果。 如果要创建用于标注的表达式,并且希望以多行方式显示该表达式,可在表达式窗口中,于表达式 的换行处添加字符 "\n"。 例如: Pop_2000 + " " + \n + Pop_Grw_Rate 将显示两行文本,说明每个特性的人口和增长率。经由图层控制的标注选项 74 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 标注样式 要更改标注的样式,可单击样式框来显示“字体”选项对话框。从样式分类各种选项中进行选择, 其中包括:字体、尺寸、象素点、颜色、背景(光晕或方框)、轮廓、黑体、下划线和斜体。 单击“选择颜色”框,打开颜色拾取器。此时既可从样本拾取颜色,也可在 RGB(红、绿、蓝)或 HSB(色调、饱和度、亮度)选项卡指定所需的确切颜色值。注意拾取颜色样本时,RGB 和 HSB 值将在其各自的选项卡中更新。第 5 章:管理 MapXtreme Java 开发人员指南 75 © 2006 MapInfo Corporation. 保留所有权利。 标注可视性选项卡 标注可以配置为只在特定的缩放范围之中显示,即采用在特定缩放范围中显示图层的相同方式。要 指定标注的缩放范围,可选中“在视野范围内显示”复选框。随后可设置标注的最大和最小视野。 要在标注所有图层时避免地图混杂无序,可将标注设置为采用其他值缩放,以便在缩放时显示适当 的标注。例如,将世界地图图层的缩放范围设置为最小视野为 0 英里,最大视野为 2000 英里。设置 首都城市图层,以便在 200 和 500 英里之间显示标注。设置该城市图层,只在放大到 50 英里之下的 范围中时显示标注。 选中或清除控制是否允许重复或重叠标签的复选框。如果需要使用同一标注在多个位置标注地图对 象,则可选中“允许文本重复”。如果不允许标注重复或重叠,MapXtreme Java 将只标注没有违反 此设置的对象。切记如果地图上的重复或重叠标注过多,将令地图难于辨识。 多个图层的标注将根据优先级和是否设置了重复和重叠文本来执行。最后绘制的图层比最先绘制的 图层具有更高的优先级。要覆盖此优先级,可选中“覆盖标注优先”复选框,然后为该图层提供新 的优先级编号。编号越高,优先级就越高。标注的默认优先级将通过(图层数量 - 图层排位)* 10 计 算。以上说明显示了世界地图的优先级为 30,因为它是 4 个图层之一并列在第 2 位(图层位置 = 1) (位置 0 是最顶层)。 组间优先用于绑定标注之间的标注优先级。 要设置标注在多行显示,可将多行文本模式设置为开。标注文本中现有的换行仍将保留。关闭(默 认)表示所有文本均将显示为一行。计算表示 MapXtreme Java 将在进程中确定相应文本是否需要 多行显示。计算操作是三个操作中速度最慢的操作,因为其要占用较多的运行时开支。经由图层控制的标注选项 76 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 “标注位置”选项卡 要控制标注位置,可在“位置”选项卡中设置偏移距离,该距离是标注距离地图对象的标注点的距 离。在 X 和 Y 框中,输入要用于新的标注位置的屏幕坐标,该坐标采用像素为单位。 此外,还可以设置用于该标注的水平和垂直对齐。标注可以水平居于地图中心的左、中或右位置, 或者可以垂直于地图中心的基线、顶部、底部或中心。对齐特指最靠近标注点的标注边框的边。左 对齐表示标注边框的左边缘最靠近标注点,即标注显示在右侧。 此外,还可以设置标注绕直线旋转。在“标注选项”对话框中,该迷你面板将会更新以显示新设置 相对于锚点的位置。 除了直线型的标注之外,还可以设置用于折线或多边形的标注,以遵循对象的曲线路径。选择此选 项之后,标注即可沿折线或多边形的边界绘制。切记曲线标注是基于进程之中所有标注设置计算 的,例如水平对齐、创意效果和可视性等标注设置。第 5 章:管理 MapXtreme Java 开发人员指南 77 © 2006 MapInfo Corporation. 保留所有权利。 某些设置不用于曲线标注。多行文本模式目前尚不支持曲线标注。由于曲线标注的布放位置始终是 动态计算的,因此将忽略地理计算模式。 地理计算模式可用于在更改地图视图时控制标注的布放。例如,如果放大到非常接近的距离,则设 置为对象近似中心的标注点将有可能位于视野之外。要解决这个问题,可将计算模式设置为计算, 以便 MapXtreme Java 在进程中于新的位置重绘标注。相应位置是根据剪切视图矩形来计算的。默 认的行为(静态)是不对标注点进行重新计算。原始标注点将用于每个视图。 管理命名资源 对于命名资源而言,一个资源将会附带一个名称。这提供了如下所示的众多优点: • 允许资源以其名称所知,而非其属性。 • 允许资源位于一点即可从众多位置引用,资源管理更轻松。 • 要更改应用程序或数据的外观或行为,只需更改资源,而非每个应用程序或数据文件。 MapXtreme Java 支持若干种可以更加轻松地存储和检索地图信息的命名资源。MapXtreme Java Manager 提供了命名资源面板用于管理命名地图、命名图层和命名样式。连接管理器是用于命名数 据库连接的管理工具。后续内容中介绍了命名资源面板、命名地图、图层和样式。在第 12 章:访问 远程数据中,也提供了命名数据库连接和连接管理器面板的说明。 命名资源面板 MapXtreme Java Manager 上的命名资源面板可用于管理所有可支持的命名资源。下图显示了该面 板,其中带有用于三个命名资源的上下文。mistyles 上下文在安装 MapXtreme Java 之后自动可用, 其中包括了用于填充、直线和符号的多种预定义样式。命名图层和命名地图的上下文是由用户创建 的。如果要将任何图层或地图保存为命名资源,必须先在此创建其上下文。管理命名资源 78 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 面板顶部“命名资源库位置”默认为 MapXtremeServlet 的 URL。如果在其他位置创建资源库,则 可以在此设置路径,以便显示相应位置的命名资源。该位置可以是基于文件的 URL (如 file:///c:/mapdata/mymaps)或指向正在运行的 NamedResourcesServlet 的 HTTP URL。 上下文面板提供了用于创建和删除上下文的按钮。资源面板显示了用于突出显示的上下文的命名资 源。要查看命名资源的属性,可单击“信息”按钮。要删除资源,可单击“删除”按钮。要创建新 的上下文,选择位置,然后单击“创建新的上下文”按钮。 注: mistyles 上下文中的资源为只读,不可删除。 命名地图 命名地图是通过别名表示的唯一图层集合,例如采用别名 myeurope 或 salesterr。用于定义命名地 图的信息存储为 XML 地图定义。命名地图既可在 MapXtreme Java Manager 中创建,也可通过编程 创建,如下所示(请参阅第 9 章:MapJ API)。 创建命名地图 要使用 MapXtreme Java Manager 创建命名地图,可执行以下操作: 1. 从 MapXtreme Java Manager 客户端的地图定义面板,打开现有地图定义或 geoset 来显示地图。 此外,还可以通过单击图层控制按钮并添加图层来构建地图。 2. 要对地图的显示作出调整,例如缩放、标注、添加专题图层等,均可使用在 MapXtreme Java Manager 中提供的工具来完成。 3. 单击保存按钮,将该地图保存为命名地图。此时将显示“保存地图定义”对话框。如果该对话框 没有出现,可单击命名选项卡。第 5 章:管理 MapXtreme Java 开发人员指南 79 © 2006 MapInfo Corporation. 保留所有权利。 4. 单击位于左侧的子文件夹,位于存储命名地图的根上下文之下。 如果没有用于存储命名地图的上下文,必须在保存命名地图之前,先在 MapXtreme Java Manager 的命名资源面板中创建相应的上下文。请参阅第 77 页的命名资源面板。 5. 在“名字”文本字段中,键入地图名称。单击保存。 命名图层 命名图层是已经指定唯一名称的图层,可通过相应名称在将来调用该图层。要将图层保存为命名图层, 可单击“图层控制”对话框中的“保存”按钮,然后在“保存命名图层”对话框中为其提供名称。 要从“图层控制”对话框检索命名图层,可单击“添加”按钮,以显示“添加图层向导”。从提供 的数据源列表中选择命名图层,然后遵循向导中的相关提示。管理命名资源 80 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 命名样式 MapXtreme Java 提供了众多填充、线形和符号样式,从中可选择用于覆盖图层的现有样式。单击 “图层控制”对话框中的“显示”按钮,即可访问这些样式。有关“显示选项”对话框的详细信 息,请参阅第 68 页的通过图层控制显示选项。 用于绘制直线和边界、填充区域和表示点位置的画笔、画刷和符号样式均为 XML 文件,这些文件默 认情况下保存在 mapxtreme480/resources/mistyles 目录中。 这些样式与在 MapInfo Professional/MapBasic 中使用的标准样式相对应。要查看这些样式的缩略 图,请参阅第 325 页附录 D 的 理解 MapBasic 样式字符串。 通过更改颜色、线宽和符号大小,即可自定义预定义的样式,具体取决于样式的元素。要保存这些 定制样式,必须保存地图定义,该操作将编写用于定制样式的 XML 代码。定制样式不能在命名资源 库中保存为新的命名样式,以便在其他地图定义中复用。 要通过编程保存定制样式,请参阅 MapJ API 和 第 14 章:标注和样式以获取详细信息。 命名数据库连接 命名数据库连接只连接到通过别名引用的远程数据库,而不是通过例如驱动程序、URL、用户名和 口令等繁杂的 JDBC 详细信息引用的数据库。这些命名连接将存储在 miconnections.properties 文件 中,该文件创建了一个 MapXtremeServlet 或 MapJ 可以访问的连接池。 命名数据库连接由 MapXtreme Java Manager 的连接管理器面板管理。有关详细信息,请参阅第 12 章:访问远程数据。Web 应用程序构建器 本章详细介绍 MapXtreme Java 的 Web 应用程序原型开发向导。 本章内容:  使用 Web 应用程序构建器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82  定制 JSP 标记库. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85使用 Web 应用程序构建器 82 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 使用 Web 应用程序构建器 MapXtreme Java Manager 的 Web 应用程序构建器面板为开发人员提供了向导,指导开发人员轻松 快捷地构建定制 Web 应用程序。借助于 Sun 的 Java 服务器页技术这一 Java 2 平台企业版的关键组 件,开发人员使用这一快捷原型即可独立于平台,创建和维护 Web 页面中的静态和动态内容。JSP 技术将用户界面和内容生成隔离开来,设计人员借助于此,更改整体页面布局时无需更改底层的动 态内容。 这一原型构建器使用的标记类似于 JSP XML 自定义标记,其行为类似于窗口部件,只需从列表中选 择即可将其添加到构建器的布局框架中。我们在定制的 JSP 库中,提供了各种典型绘图窗口部件, 例如工具栏、地图、图层控件和图例窗口部件(将在第 85 页的定制 JSP 标记库中详细讨论)。有 关构建定制 JSP 标记以及将其添加到向导的说明信息,请参阅第 17 章:定制 AddLayer 向导。 您所创建的应用程序将另存为 Web 存档文件 (.war) 中的 .JSP 文件。 Web 应用程序构建器向导将提供创建原型 Web 应用程序的逐个步骤说明。要开始创建,请执行以下 操作: 1. 启动 MapXtreme Java Manager 客户端(确保 MapXtreme Java Manager Servlet 正在运行)。 2. 单击 Web 应用程序选项卡,显示 Web 应用程序构建器向导的第一个对话框。单击新建 Web 应 用程序按钮。为原型提供名称和说明,然后单击下一步。 3. 在“应用程序的布局”对话框中,单击对话框右侧的布局框架,以激活布局操作。 4. 从左侧列表框中选择窗口部件,然后单击增加窗口部件按钮。相应窗口部件将出现在“布局”框中。 5. 要添加其他窗口部件,可单击单元分割按钮,然后选择拆分布局框架的方式,垂直或者水平。此 外还可调整拆分单元的大小以满足具体的需求。 6. 在新单元处于激活状态时,突出显示窗口部件,然后单击增加窗口部件按钮。第 6 章:Web 应用程序构建器 开发人员指南 83 © 2006 MapInfo Corporation. 保留所有权利。 7. 继续拆分单元,然后添加窗口部件,直至目标应用程序包含所需的全部元素。单击下一步。 8. 通过选择特定窗口部件,然后单击编辑窗口部件按钮;或者直接双击特定窗口部件,均可编辑布 局之内任意窗口部件的属性。有关详细信息,请参阅第 84 页的编辑窗口部件。 9. “应用程序部署”对话框中提供了创建应用程序的有关信息,其中包括 Web 存档的名称 (somefile.war)、主 JavaServer 页(mymapapp.jsp)以及关联的地图文件(单击 ... 按钮,浏 览至具体位置)。 注: 要更改部署目录,先选择选择自定义部署位置选项。 10. 如果部署到与 MapXtreme Java Manager servlet 相同的容器之内,可以选择启用 Servlet 转发, 采用这种优化方式来渲染地图。有关这一特性的详细信息,请参阅第 180 页的代码示例 : Servlet 转发。 11. 单击结束以创建应用程序。 12. 要对应用程序进行测试,可重新启动 servlet 容器,令新的应用程序可用。在 Web 浏览器中,键 入在部署对话框中列出的 URL。 注: 如果使用的是 Tomcat 并且在默认位置创建 .war 文件,部署 .war 文件只需重新启动 Tomcat 即可。对于其他应用程序服务器而言,在部署 .war 文件之前,可能需要采取 其他附加的操作步骤。 使用原型构建器模板 您可以保存所创建的任意布局,并在将来构建应用程序时将其用作新模板。对应用程序布局感到满 意之后,单击另存模板为按钮,然后提供模板名称。下次构建原型时,即可从下拉列表中选择模板 名称,并在必要时对布局进行进一步的修改。使用 Web 应用程序构建器 84 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 编辑窗口部件 Web 应用程序构建器的“应用程序布局”对话框包含编辑窗口部件按钮,可用于打开每个窗口部件 的编辑器对话框。在该对话框中可控制多种属性,这些属性将影响到地图窗口部件的外观和行为。 在向布局框架添加窗口部件之后,可单击编辑窗口部件按钮,以显示编辑器对话框。 例如,要从工具栏窗口部件对工具进行添加、删除或重新排序操作,请执行以下操作: 1. 单击“布局”框中的工具栏窗口部件,然后单击编辑窗口部件按钮或双击布局单元中的窗口部 件。此时将显示“工具栏标记编辑器”对话框。 2. 在左侧窗格中突出显示特定工具,然后单击 按钮,即可将其添加到工具栏。 3. 要从工具栏删除工具,可在“工具包括”列表中将其突出显示,然后单击 按钮,将其从列表 中删除。 4. 如有必要,可以继续添加或删除工具。使用对话框右侧的 和 按钮,即可根据需要对工 具进行重新排序。 5. 如有必要,可将工具栏布局从水平更改为垂直,也可调整工具图标在工具栏上的间距。 6. 完成后单击确定。 有关定制 JSP 标记库的后续内容提供了可以自定义的标记属性的详细信息。 使用原型构建器部署应用程序开发版本 如果要将应用程序部署到与 MapXtreme Java Manager servlet 相同的容器之内,可以选择启用 Servlet 转发,采用这种优化方式来渲染地图。相应操作可以通过 IntraServletContainerRenderer 来完成, MapXtremeServlet 借助于此,即可将其栅格数据直接写回到客户端。请参阅第 179 页第 11 章的 Intra-Servlet 容器渲染器。第 6 章:Web 应用程序构建器 开发人员指南 85 © 2006 MapInfo Corporation. 保留所有权利。 定制 JSP 标记库 MapXtreme Java 提供了定制 JSP 标记库,使用文本编辑器或 IDE 即可将相应标记插入到 .JSP 文件 中。这些标记在 MapXtreme Java Manager 的 Web 应用程序构建器中显示为窗口部件;在 Web 应 用程序构建器中可选择所需元素,并将其添加到将要另存为 .JSP 文件的布局框中。在运行时,.JSP 将与执行应用程序业务逻辑的 servlet 通信。如需更改应用程序的显示,可在 Web 应用程序构建器中 轻松重排、添加或删除窗口部件,创建新的 .JSP,而不会影响到生成 servlet 内容的操作。 这些定制标记设计可用于 MVC(模型/视图/控制器)JSP-servlet 体系架构。所生成的 .JSP(视图) 包含表单,相应表单将提交到一般 servlet(控制器)。控制器 servlet 重定向至执行创建专题、执行 半径搜索等必要业务逻辑的适当 Java Bean(模型),然后将相应请求转发回 .JSP 文件,由该文件 显示更新的地图。 有关随 MapXtreme Java 提供的定制 JSP 标记库的列表和说明,请参阅附录 C:定制 JSP 标记库。 使用 JSP 标记库 所有 MapXtreme 定制 JSP 标记均包含在一个名为 mapapp 的主标记之内,该标记嵌入到 标记块内。 在使用 MapXtreme 定制 JSP 标记构建定制应用程序时,务必注意如下所示的客户端浏览器有关要求: • JavaScript 必须启用(不需要客户端 Java)。 • 浏览器版本相对较新(例如 Netscape 4.7、Internet Explorer 4.0 或更高版本)。 在服务器端,使用这些标记部署定制应用程序的 Web 服务器 / 应用服务器 /Web 应用服务器必须兼容 J2EE,即必须支持 JSP 1.1 API 和 Servlet 2.3 API。 要获取必要的初始化参数,可运行 Web 应用程序构建器向导在由该向导创建的 web.xml 中进行查找。定制 JSP 标记库 86 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 JSP 标记库示例:MapViewer MapXtreme Java 提供了使用定制 JSP 标记构建的地图查看器应用程序作为示例。该应用程序即 mapviewer.war,在安装之后可见于 examples/client/jsp/mapviewer。这一示例可使用 JSP 库中可用 的所有特性,并可显示自定义标记行为的具体方式。此外,这一示例还显示更高级的布局,相应布 局不能使用 MapXtreme Java Manager 创建。 注: 此应用程序没有启用地理编码和线路规划特性。要启用相关特性,必须删除 web.xml 和 map.jsp 中的注释。此外,还必须令 MapMarker J 服务器和 Routing J 服务器运行相应特性。MapXtreme JavaBeans MapXtreme Java Edition提供了 MapXtreme JavaBeans 帮助用户在 Java applet 或应用程序中轻松嵌入活动的向量地图。 本章内容:  概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88  VisualMapJ Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88  MapTool Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89  MapToolBar Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90  LayerControl Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91  AddTheme Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93  SimpleMap Applet 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98  在 Applet 或应用程序中包含 MapTools . . . . . . . . . . . . . . . . . . . . . .99  配置和控制标准地图工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101  创建定制 MapTools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104概览 88 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 概览 MapXtreme JavaBeans 利用最新的 Java 技术,并采用 Java 2 标准版平台中的 Java Swing 组件作 为基础。在发布使用这些 JavaBeans 的 applet 时,如果最终用户的浏览器不支持 J2SE,那么将需 要适当的插件。 MapXtreme JavaBeans 的自定义轻松便捷。既可构建在用户浏览器中运行的 applet,也可构建到独 立的应用程序之中。MapXtreme Java 附带的 MapXtreme Java Manager 就是一个使用本章所介绍的 众多 JavaBeans 的应用程序示例。 MapXtreme JavaBeans 在类似 Eclipse、NetBeans 和 IntelliJ 的可视化开发环境中易于使用。创建 地图绘制 applet 所需的组件可以轻松拖放到窗体之中。随后即可设置属性。 使用 MapXtreme JavaBeans 开发,不仅可以迅速创建地图绘制 applet ;而且与嵌入地图的常规 HTML 相比,还提供了更加强健的功能。这尤其适用于具备功能强大的服务器的内网环境,相应网络 可以更好地处理由于加载 applet 所增加的下载时间。有关使用 applet 配置选项的详细信息,请参阅 第 3 章:应用程序规划。 此外,使用 MapXtreme JavaBeans 还可以更加迅速地进行原型开发。 在 applet 或应用程序开发中,共有如下 8 种类型的 MapXtreme JavaBeans 可供使用 : • VisualMapJ Bean • MapToolBar Bean • MapTool Beans • LayerControl Bean • AddTheme Wizard Bean • LegendContainer Bean • ViewEntireLayer Bean • ZoomPanel Bean 后续内容将对上述各个 MapXtreme JavaBean 分别进行说明。 VisualMapJ Bean VisualMapJ Bean 是在内容窗格中显示地图的主要地图绘制组件。该 Bean 构建在现有 MapJ 类库的 顶部。使用 VisualMapJ,可在可视化开发环境中完成最常见的地图绘制操作,而无需通过编程。相 应操作包括添加地图定义或 geoset、控制缩放、控制中心、控制边界等。此外,有些较为复杂的操 作可使用源自 API 的底层 MapJ 对象来完成。 VisualMapJ 基于由其内部 MapJ 引用维护的状态来显示地图图像。VisualMapJ 维护了一个注册地图 工具的列表,并管理工具的选择和取消选择。它将鼠标和键盘活动转发到当前所选地图工具,然后 依靠相应工具来控制其状态。 VisualMapJ 既可和 MapXtremeServlet 协同工作,也可单独使用。StartupMapDefinition 属性可用 于指定初始化 VisualMapJ (MapJ) 所用的地图定义或 geoset 文件。在此文件中定义的图层将指定是 直接进行数据访问还是通过 MapXtremeServlet 实例来完成。在 applet 中使用 VisualMapJ 时,需要 设置通过 MapXtremeServlet 来完成数据访问,以便符合由 applet 环境所强制的安全约束条件。第 7 章:MapXtreme JavaBeans 开发人员指南 89 © 2006 MapInfo Corporation. 保留所有权利。 MapRenderer 属性用于指定地图是本地渲染(在嵌入 VisualMapJ 的 applet 或应用程序的处理空间 之内),还是通过 MapXtremeServlet 实例远程渲染。 ShowToolTips 属性指定当鼠标在 VisualMapJ 范围内悬停时,是否显示弹出式文本。这取决于设置 弹出式文本内容的单独 MapTool。 最后,VisualMapJ 提供的 Center 和 Zoom 属性还可指定地图的初始界限。 MapTool Beans MapTool Beans 是可用于执行基本地图导航和选择操作的工具集合。可实现包括平移、重定中心、 缩放、测量距离,以及在给定点或限定边界内获取信息和选择图元在内的众多操作。下表提供了相 应的工具列表。 所有 MapTool Beans 均扩展 Swing 的操作接口。这一点令其可以更加轻松地添加到工具栏或菜单。 如果将其同时添加到工具栏和菜单,那么其间将会保持同步。 MapTools 在 VisualMapJ 上的工作领域如下所示: • 指定要显示的工具提示 • 指定要使用的光标 • 在地图图像顶部提供定制渲染(如选取框、标尺弹性线) • 修改任意 MapJ 属性(中心、缩放、图层、专题) • 提示 VisualMapJ 重画。 下表列示并说明了可用的 MapTools。 MapTool 目的 PanMapTool 用于通过在窗口中拖放地图来重新定位地图在 窗口中的位置。 RecenterMapTool 用于将地图中心重新定位到点击点。 RulerMapTool 用于获取两点或多点之间的距离。 InfoMapTool 用于获取点击点的属性信息。 ZoomInMapTool 用于获取更近的地图或图层区域视图。在用户 拖动鼠标时,将出现黑色的小选取框。 ZoomInMapTool2 用于获取更近的地图或图层区域视图。在用户 拖动鼠标时,将出现成斜角的选取框。 ZoomOutMapTool 用于获取地图的较宽视图。MapToolBar Bean 90 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 选择 MapTools 允许用户通过单独的鼠标单击和通过更加复杂的鼠标拖动操作来选择多个图层中的图 元。这些鼠标交互操作可在每个图层的基础上创建 SelectionThemes,表示使用 VisualMapJ 地图中 的工具所做的选择。有关 SelectionThemes 的详细信息,请参阅第 13 章:图元和搜索。 MapToolBar Bean 可将地图工具添加到任意 Swing JToolbar 中。MapXtreme JavaBeans 附带有一个特殊的 MapToolBar 组件。默认情况下,MapToolBar 包括 ZoomInMapTool2、ZoomOutMapTool、PanMapTool、RulerMapTool 和 InfoMapTool。工具栏还包括一个用于激活 LayerControl Bean 的按钮。这些默认项目均可删除, 并且也可以将其它附加工具添加到工具栏。 使用 MapToolBar Bean 的要求之一是 VisualMapJ 和 MapToolBar 具有相同的父级组件,并且两者都 必须以特定顺序添加以便正确注册。必须先将 VisualMapJ 对象添加到窗体,然后再添加 MapToolBar Bean。按此顺序添加组件时,MapToolBar Bean 将其所有 MapTools 注册到 VisualMapJ 组件。如果 先添加的是 MapToolBar Bean,则还需要手动关联 MapTools 和 VisualMapJ。 在添加工具栏之后,即可通过单击其相应按钮,令一个工具成为当前所选的工具。 有关使用 MapTools 的详细信息,请参阅第 99 页。 ObjectSelectionMapTool 在鼠标单击位置选择单独的图元。 BoundarySelectionMapTool 选择包含在最顶部可见图层中唯一区域图元的 边界多边形中的图元。 RadiusSelectionMapTool 选择包含在通过鼠标拖动操作形成的边界圆圈 中的图元。 RectangleSelectionMapTool 选择包含在通过鼠标拖动操作形成的边界矩形 中的图元。 PolygonSelectionMapTool 选择包含在通过一系列鼠标拖动操作形成的边 界多边形中的图元。 MapTool 目的第 7 章:MapXtreme JavaBeans 开发人员指南 91 © 2006 MapInfo Corporation. 保留所有权利。 LayerControl Bean 为赋予用户控制地图图层的功能,可将 Layer Control Bean 包含在应用程序或 applet 的 ToolBar 中。 Layer Control Bean 提供了一个用户界面,可用于设置图层可见性、可选性和自动标注,以及添加、 编辑、删除或重排图层。此外,还可设置图层显示特征和标注属性以及管理专题。 如果在 GUI 中包含了默认的 MapToolBar,则可通过单击图层控制按钮来显示图层控制。 有关图层控制构成元素的完全说明,请参阅第 64 页的图层控制。LayerControl Bean 92 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 AddLayer 向导 向地图添加图层是图层控制的主要功能之一。单击添加按钮显示添加图层向导,该向导将指导用户 完成从数据源添加图层的各个步骤;其中的数据源既可是本地存储的 tab 文件,也可是经由 JDBC、 命名图层或数据绑定图层访问的数据源。 注: 在 applet 中,不能添加某些图层类型,其中包括 .TAB 文件图层,原因在于 applet 的安全性 阻止了 applet 访问本地文件系统。这一限制并不适用于应用程序。 可以配置添加图层向导,以便协助您为用户轻松添加图层提供帮助。配置信息存储在 /MapXtreme-4.8.0/lib/client 目录下的 addlayerwizard.properties 文件中。在该属性文件中,可定 义用于公共设置(如 Oracle Spatial 主机和端口)的预设值。该向导将记住每个数据提供方最后使用 的值。通过属性文件,可从向导增减特定的数据提供方和命名资源。在该文件中存储口令为可选 (默认为不存储口令)。 有关 addlayerwizard.properties 文件的详细信息,请参阅第 17 章:定制 AddLayer 向导中有关 addlayerproperties.file 的介绍。有关在 MapXtreme Java Manager 中执行添加图层向导的逐步说 明,请参阅第 65 页的添加图层:添加图层向导。有关命名资源的详细信息,请参阅第 12 章:访问 远程数据。 EditLayer 向导 将图层添加到地图后,即可通过 EditLayer 向导来查看或更改定义该图层的属性。从图层控制,单击 编辑按钮来显示该向导。继续在相应面板(与 AddLayer 向导中的面板相同)执行适当操作,以查看 和 / 或作出任意更改。在单击完成之后,将使用指定的新属性来重建图层。第 7 章:MapXtreme JavaBeans 开发人员指南 93 © 2006 MapInfo Corporation. 保留所有权利。 AddTheme Bean AddTheme Bean 是一个向导工具,用于将图元专题或标注专题添加到地图。 图元专题 对于图元专题,可以创建范围主题,根据一段范围内的值来划分图元;也可以创建独立值专题,根 据值来以影线表示图元。 图元主题可以基于任何支持的列和当前地图中的图层。目前支持基于数字、字符串和日期列数据创 建专题,以及基于点、线和区域图层创建专题。 可以根据需要自定义范围或独立值的样式。 部分操作将用于创建与新专题相关联的默认专题图例。可以自定义图例,以更改标题、字体、插入 信息、说明文本和颜色。 通过向导 Bean,用户可以选择专题名称。对于 RangedThemes,用户还可以选择范围 (bin) 数量、 分布方法(等计数或等范围),以及所有分断值(bin 的上限值)的舍入值。用户还可以指定将要通 过起止范围样式的设置,根据专题来以影线表示的点、线或区域的样式(颜色)。随后将计算适当 的样式,用于起止范围之间的对象。 对于 IndividualValueThemes,用户可以选择将图层中的哪些值进行有所区别的影线表示,以将它们 与其它值区分开来。 在运行时,AddTheme Bean 关联到现有 VisualMapJ 实例。为此,VisualMapJ 必须是 AddTheme Bean 所要添加到的组件的子级。例如,如果将 AddTheme Bean 添加到已添加 VisualMapJ 实例的 JPanel,则将会发现 VisualMapJ 实例并与之关联。如果无法进行自动关联,则必须使用 AddTheme Bean 的 setVisualMapJ(VisualMapJ) 方法来将 VisualMapJ 的工作实例置入 Bean 中。 AddTheme Bean 扩展 AbstractAction,因此可以添加到 JMenu 或 JToolbar(菜单和工具栏将保持同 步)。在单击菜单项或工具栏之后,将会显示 AddTheme 向导。 有关通过编程来创建范围主题和独立值图元专题的详细信息,请参阅第 15 章:专题地图绘制和分析。AddTheme Bean 94 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 标注专题 MapXtreme Java 支持 4 种类型的标注专题:范围、独立值、覆盖和选择。当要在同一图层中为标注 采用不同属性时,可使用标注专题。 例如,假设正在使用人口增长率标注世界各国图层。对于增长率较高的国家,需要其比增长率较低 的国家更加突出。通过 Add Theme Bean 创建范围标注专题,划分图层值的范围,将颜色和 / 或字体 大小传递到标注即可实现上述目标。 有关标注专题的详细信息,请参阅第 14 章:标注和样式。第 7 章:MapXtreme JavaBeans 开发人员指南 95 © 2006 MapInfo Corporation. 保留所有权利。 自定义专题样式 可以为专题的每个范围定义特定样式或扩展范围值。还可以为独立值范围创建自定义样式。该操作 同样适用于图元和标注专题。 要自定义专题样式(假定专题已创建): 1. 从添加专题向导的图例预览面板,单击样式按钮。是为范围值还是为独立值显示自定义样式对话 框,取决于自定义的专题类型。AddTheme Bean 96 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 2. 对想要自定义的范围值或独立值,单击编辑按钮。此时将显示“选择样式”对话框。该对话框将 在第 69 页第 5 章的设置样式覆盖中加以讨论。 注: 若自定义范围值(不包括第一个和最后一个值)的样式,将会清除“自动扩展”复选框。若 想要从第一个值的样式自动扩展到最后一个值的样式,选中“自动扩展”复选框。使用自动 扩展后,定义的任意自定义样式都转换为默认的样式。 3. 按需自定义样式,然后单击加载以在自定义样式对话框中显示样式。 LegendContainer Bean 作为管理图例布局和显示的一种方式,MapXtreme Java 包括了 LegendContainer Bean。 LegendContainer Bean 可以拖至侧边的 VisualMapJ 对象中,然后显示和 VisualMapJ 中的图层关联 的任意图例。如果 LegendContainer 检测到专题的添加或删除,则将对其显示作出相应更新。 图例是 Swing JPanels。因此,图例可布置在 LegendContainer 中,并自行渲染到 LegendContainer 中。第 7 章:MapXtreme JavaBeans 开发人员指南 97 © 2006 MapInfo Corporation. 保留所有权利。 ViewEntireLayer Bean ViewEntireLayer Bean 可用于迅速重定地图的中心以及缩放地图,以便充分缩小地图,看到图层全 貌。ViewEntireLayer Bean 可以添加到 MapToolBar。单击 MapToolBar 上的查看整个图层按钮,可 显示查看整个图层对话框。用户从中可以选择要查看的图层。 SimpleMap 示例 applet 提供了使用 ViewEntireLayer Bean 的示例。可见于 /examples/client/Java/ simplemap。有关 SimpleMap applet 的详细信息,请参阅第 98 页的 SimpleMap Applet 示例。 ZoomPanel Bean ZoomPanel Bean 提供了一个显示当前地图缩放的文本字段。可用于用户键入新的缩放宽度。 有关 ZoomPanel bean 的其它示例,请参阅 /examples 文件夹下的 SimpleMap 示例 applet。 缩放面板SimpleMap Applet 示例 98 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 SimpleMap Applet 示例 随 MapXtreme Java 作为示例应用程序提供的是一个名为 SimpleMap 的 applet 示例,该示例使用 MapXtreme JavaBeans。此 applet 需要 MapXtreme 在 web 服务器上运行。 本节提供了该示例的概览。有关配置和运行 SimpleMap 的详细信息,请参阅位于 /examples/client/ Java/simplemap 目录下的 readme.html 文件。 SimpleMap 是一个 applet,提供了以下地图查看基本功能: • 显示地图(使用 MapXtreme JavaBean 和 VisualMapJ)。 • 显示包含地图导航工具、信息工具和图层控制工具的工具栏(使用 MapToolbar Bean)。 • 允许用户通过单击“添加专题”按钮来添加专题影线表示(使用 AddTheme Bean)。 • 在地图右侧的面板中显示相应的专题图例(使用 LegendContainer Bean)。 • 提供一个文本字段,显示当前地图的缩放,允许用户键入新的缩放宽度(使用 ZoomPanel Bean)。 SimpleMap 示例包含以下文件: • Readme.html — 说明 applet 及其部署步骤的文档。 • SimpleMap.java — 主代码模块。由于使用了 MapXtreme Beans,尤其是使用 VisualMapJ Bean、 Map Toolbar Bean 和 AddTheme Bean 来完成大部分工作,因此其源代码非常简单。 • simplemap.html — 示例 HTML 文件,显示如何运行使用 Sun Java 插件的 applet。这一 HTML 页不再使用 标记,而是使用 Sun Java 插件所使用的 标 记。若没有安装 Java 插件,查看此 HTML 页时,系统将提示您下载相应插件。第 7 章:MapXtreme JavaBeans 开发人员指南 99 © 2006 MapInfo Corporation. 保留所有权利。 SimpleMap Applet 安装 以下提供了安装 SimpleMap 所需步骤的概要。有关完整的详细信息,请参阅 SimpleMap 目录中的 readme.html。 1. 配置和启动用于运行 MapXtremeServlet 的 servlet 容器。(第 2 章:入门提供了具体步骤。) 2. 复制以下文件:将 simplemap*.class 文件、simplemap.html、addlayerwizard.properties、 resources-config.xml、encoding-map.xml、地图定义文件(例如 world.mdf 和 MapXtreme jar 文 件)复制到可通过 Web 服务器访问的目录。 3. 如果已选择使用地图,而不是 world.mdf,那么修改 simplemap.html 中的标记,指定要使用的地 图文件的名称。 4. 通过在浏览器中打开 HTML 文件来加载 applet。 切记必须正确配置以下项目才能运行 SimpleMap: • MapXtremeServlet 必须正在运行(即 servlet 容器必须正在运行)。 • applet 必须正确编译。 • Web 浏览器必须安装 Java 插件。 • 用于加载 applet 的 HTML 文件必须指定适当的 param 标记。 地图定义和 SimpleMap 如果配置 SimpleMap 来加载地图定义,务必确保该地图定义是使用“添加图层向导”对话框中的由 远程 MapXtremeServlet 访问数据选项来构建的。如果尝试访问本地资源,则将会报告有关安全问 题的错误消息。有关创建地图定义的详细信息,请参阅第 5 章:管理 MapXtreme Java。 在 Applet 或应用程序中包含 MapTools 大部分地图绘制应用程序都允许用户通过鼠标动作(如单击甚至拖动)与地图进行交互,执行各种 任务。如果要支持此类地图交互,则需要向应用程序或 applet 添加地图工具。 如果开发环境支持可视化的 GUI 设计,还可采用可视化的方式创建和控制 GUI 元素,例如工具栏和 工具。例如,JDeveloper 用户在设计模式中可以将 GUI 元素绘制到窗体中。如果开发环境不支持可 视化的 GUI 构建,则需要手动键入如下所示代码创建地图工具。 创建 MapToolBar 借助于实例化 MapToolBar 对象,可轻松和迅速地向代码添加一组地图工具,然后将其添加到布局。 默认的 MapToolBar 对象提供几种公共的地图工具,其中包括放大、缩小、平移、信息和标尺以及一 个启动“图层控制”对话框的按钮。 实例化 MapToolBar 简便轻松,无需参数即可实现: MapToolBar mapToolBar1 = new MapToolBar(); 或者,如果要对这组包括在工具栏内的地图工具作出重要更改,还可使用采用地图工具向量的其它 MapToolBar 构造器。在 Applet 或应用程序中包含 MapTools 100 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 在创建 MapToolBar 之后,将其添加到已添加 VisualMapJ 对象的同一容器中。 this.getContentPane().add(visualMapJ1, BorderLayout.CENTER); this.getContentPane().add(mapToolBar1, BorderLayout.NORTH); 将地图工具与地图相关联 MapToolBar 中的工具必须与 VisualMapJ 对象相关联。如果没有正确关联,那么工具对于地图不起 作用。 将工具与 VisualMapJ 对象相关联最简单的方式是将 MapToolBar 对象添加到 VisualMapJ 所在的同 一容器(例如,同一 JPanel)。当 MapToolBar 和 VisualMapJ 对象位于同一容器中时,工具将自动 与该地图相关联。 如果地图工具没有和地图自动关联(例如,因为 GUI 布局需要将工具栏置于其它 JPanel 中),则需 要调用 VisualMapJ 对象的添加方法,将地图工具注册到地图,如下所示。 添加单独工具 如果发现随默认 MapToolBar 对象提供的工具无法满足所需地图工具的要求,则可自行添加更多工 具。例如,默认的 MapToolBar 对象不包括诸如 RadiusSelectionMapTool 的选择工具,此时需要将 该工具添加到工具栏。要将单独的工具添加到工具栏,可执行以下操作: 1. 创建计划使用的任意工具对象。 RadiusSelectionMapTool radTool = new RadiusSelectionMapTool(); 2. 如有必要,可调用 VisualMapJ 的添加方法将工具与地图相关联。(如上所示,如果 MapToolBar 与 VisualMapJ 位于相同的容器中,即无需该步骤)。 myVisualMapJ.add(radTool); // may not be required... 3. 将工具和 / 或工具栏添加到 GUI。通常,将工具添加到 MapToolBar,并将 MapToolBar 添加到已 经添加 VisualMapJ 对象的同一组件(如同一 JPanel)。 mapToolBar1.add(radTool); 语句的顺序也很重要。如果要地图工具与地图自动关联,则需要创建地图工具,将其添加到 MapToolBar, 然后以该顺序将 MapToolBar 与 VisualMapJ 添加到同一容器中。 此外,还可以将地图工具添加到菜单(如通过调用 JMenu 对象的添加方法)。有关菜单上的地图工 具如何显示的示例,请参阅在其地图菜单上显示工具的 MapXtreme Java Manager。如果已向工具栏 和菜单添加了工具,则相应工具栏和菜单将保持同步;当用户选择工具栏上的工具时,相同的工具 在菜单上也将显示为选中。第 7 章:MapXtreme JavaBeans 开发人员指南 101 © 2006 MapInfo Corporation. 保留所有权利。 删除单独工具 删除单独工具可在 MapToolBar 中完成,方法是调用其 removeMapTool 方法。例如,如果要使用默 认的 MapToolBar 对象,但是不想包含标尺工具,则可删除标尺工具,如下所示: for (Enumeration e = mapToolBar1.getMapTools(); e.hasMoreElements(); ) { MapTool mt = (MapTool) e.nextElement(); if (mt instanceof RulerMapTool) { mapToolBar1.removeMapTool(mt); break; } } 此外,还可以构建只包含所要使用的地图工具的列表,然后将该列表传递到 MapToolBar 构造器。 配置和控制标准地图工具 在将地图工具包括在应用程序之中后,可能需要调整工具的行为。配置选项的部分示例如下: • 禁用地图工具。 • 重新配置 InfoMapTool,不显示其辅助“信息工具”窗口。 • 控制是否将 RadiusSelectionMapTool 在注释图层(Annotation 图层)中另存为圆。 一般而言,可通过设置地图工具的属性来控制其行为。可以设置的地图工具属性如下所示。如果使用 支持属性页的可视化开发环境,则可通过使用适当的属性页编辑器来设置工具属性。否则,可以通过 调用属性的适当设置方法,以编程方式来调整属性。例如,要配置启用的属性,可调用 setEnabled 方法。 常规设置 所有地图工具共享某些公共属性: • enabled — 启用或禁用工具,调用其 setEnabled 方法。 • cursor — 指定定制光标,调用 setCursor 方法。 • selected — 选择工具,调用其 setSelected 方法。运行应用程序时,该工具将自动显示为选定。 但是,这不会妨碍用户选择其它工具。 radTool.setSelected(true); 放大 / 缩小设置 三个缩放工具(ZoomInMapTool、ZoomInMapTool2 和 ZoomOutMapTool)可以通过以下属性自定义: • zoomFactor — 此属性控制用户单击地图时地图缩放的程度。默认设置为 2,换言之,如果地图 显示 500 英里宽的范围,然后单击缩小,生成的地图将显示 1000 英里宽的范围。 • zoomMode — 控制地图是否在用户点击的点重定中心,以及地图是否只在相同位置保持对中时进 行缩放。配置和控制标准地图工具 102 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 RulerMapTool 设置 标尺工具提供以下属性: • calculationMethod — 控制是使用笛卡尔坐标还是使用球面坐标计算距离。 • distanceUnit — 指定用于显示距离的单位,例如英里或公里。 • distanceWindowVisible — 控制标尺工具是否打开显示测量距离的辅助窗口。要禁用辅助窗口, 可调用 setDistanceWindowVisible(False)。 RulerMapTool 还具有一个限定“距离”属性,用于在距离变更时通知监听程序。 InfoMapTool 设置 信息工具提供以下属性: • searchMode — 控制 InfoMapTool 搜索哪些图层。例如,要搜索所有地图图层,可调用: myInfoMapTool.setSearchMode(SearchMode.FULL); • infoWindowVisible — 控制是否打开辅助“信息工具”窗口以显示由信息工具返回的文本。在某 些情况下,可能想要禁用辅助窗口,在 GUI 中的其它地方显示生成的文本。要避免在辅助窗口中 显示信息工具,可调用: setInfoWindowVisible(false) 在禁用信息工具窗口之后,想要在其它位置显示结果。创建一个实现 InfoObtainedListener 接口的对象 (表示该对象提供 infoObtained 方法),然后将监听程序注册到 InfoMapTool。在用户选择 InfoMapTool 并单击地图之后,将调用 infoObtained 方法,并传递 InfoObtainedEvent 对象。此外还可在 InfoObtainedEvent 对象上使用该方法,提取由 InfoMapTool 所返回的信息。此后,是否在 GUI 中的 其它地方显示信息即取决于您。 SelectionMapTool 设置 MapXtreme 提供了若干选择工具:BoundarySelectionMapTool、PolygonSelectionMapTool、 RadiusSelectionMapTool、RectangleSelectionMapTool 和 ObjectSelectionMapTool。如果在应用程 序中包括上述一个或多个工具,则用户即可选择选择工具,然后单击(单击或拖动取决于工具)地 图,选择地图上的一个或多个图元。 选择地图工具具有若干个可以配置的属性,如下所示。(并非所有属性均适用于 ObjectSelectionMapTool)。 • saveAnnotation — 布尔值,用于允许或禁止自动创建注释图层(Annotation 图层),该图层的 单一图元说明了所执行的选择区域边界。除 ObjectSelectionMapTool 之外的所有选择工具均允许 保存注释。例如,RadiusSelectionMapTool 可以保存圆注释,表示用户选择的搜索半径。第 7 章:MapXtreme JavaBeans 开发人员指南 103 © 2006 MapInfo Corporation. 保留所有权利。 • searchType — 控制用于确定是否应该选择一个图元的搜索标准。例如,如果一个区域只是部分位 于搜索半径之内,则可能需要选择该区域,也可能不选择该区域。要控制这一选项,可调用选择 工具的 setSearchType 方法,然后指定以下值之一: SearchType.mbr — 返回其最小边界矩形与搜索区域交叉的图元。这是限定性最弱的搜索类 型限制条件,返回的图元数量最多。 SearchType.partial — 返回至少有一部分与搜索区域交叉的图元。 SearchType.entire — 返回完全包含在搜索区域之内的图元(默认),这是限定性最强的搜索 类型。 部分和全部都是绝对的,有效的搜索会比较图元的真实几何范围和搜索区域。在需要真实和 精确的结果时,必须使用这些搜索类型。mbr 搜索是一个快捷的近似方法,简化了几何对 象,允许更加快速的比较。在诸如 Oracle Spatial 的特定数据源中,mbr 搜索 (SDO_FILTER) 实际上是通过将图元的最小边界矩形和区域的最小边界矩形交叉来实现的,这样可以产生的 “命中数”比使用实际搜索区域更高。 • selectionMode — 此属性控制搜索图层的数量。要控制搜索哪些图层,可以调用 setSelectionMode 并指定以下属性之一: SelectionMode.VISIBLE — 搜索当前可见的所有可选图层。此选项将跳过由于缩放而在当前 不可见的图层。 SelectionMode.FULL — 搜索所有可选图层。 SelectionMode.FIRST — 搜索所有可见的和可选的图层,但是当某一图层具有该搜索区域中 的图元时,将会停止搜索。 • selectionThemeType — 控制是否创建 SelectionTheme 来突出显示所选图元,同时还控制专题 如何给所选图元指定颜色。要控制所选图元的影线表示,可使用以下选项之一调用 setSelectionThemeType: SelectionMapTool.SELECTIONTHEME_OVERRIDE — 所选图元以影线表示,使用由 themeOverrideColor 属性显式指定的颜色。 SelectionMapTool.SELECTIONTHEME_NONE — 不创建专题,所选图元的外观在选定之后 不会更改。 SelectionMapTool.SELECTIONTHEME_DEFAULT — 所选图元将使用和原始图元颜色相反的 颜色以影线表示。 • themeOverrideColor — 设置覆盖颜色(用于显示在 selectionThemeType 设置为 SELECTIONTHEME_OVERRIDE 时所选图元的颜色值)。例如,如果希望所有所选图元均显示 为绿色,可调用 setThemeOverrideColor(Color.green),然后调用 setSelectionThemeType (SelectionMapTool.SELECTIONTHEME_OVERRIDE)。 • coordinateType — 半径和矩形选择地图工具可用于指定选择区域(用户绘制的圆或矩形)是使用 屏幕坐标还是使用地图坐标。将此属性设置为以下值之一: ConfiningSelectionMapTool.COORD_MAP — 半径和矩形搜索工具将以地图坐标(即在屏幕 上并非可见的圆的半径,该半径取决于地图投影,正如在某些地图投影中,地球本身并不显 示为圆形一样,但是相应半径精确表示了距离中点指定距离中的全部区域)创建图元。 ConfiningSelectionMapTool.COORD_SCREEN — 半径和矩形搜索工具将以屏幕坐标(即在 屏幕上可见的圆的半径)创建图元。 在选择之后,所有 SelectionMapTools 均触发 SelectionToolEvents,以便在您创建和注册 SelectionToolListener 时,可以进一步进行自定义。创建定制 MapTools 104 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 创建定制 MapTools 如果所有标准 MapXtreme 地图工具均未提供所需的功能,您可以自行创建定制工具。要定义定制工 具,您必须实现自己的 Java 类来满足 MapTool 接口的要求。在创建了此类之后,可以将定制工具实例 化,然后将其添加到应用程序,其添加方式和添加标准工具的方式相同(例如,上述的半径工具)。 定制工具示例:SimpleRulerMapTool 在 /examples/client/beans 目录中提供了如何创建定制工具的示例,其中包含以下模块。 • SimpleRulerMapTool.java — 定制地图工具的示例。此类实现自定义的标尺工具,用于测量地图 上的距离。和标准的标尺工具不同,这一定制工具在您停止移动鼠标时,将当前距离显示为 ToolTip。 • SimpleRulerMapToolBeanInfo.java — 一个 BeanInfo 类,控制如何展示工具属性(例如,在使 用可视化开发环境检查属性的时候)。 • SimpleToolFrame.java — 一个扩展 JFrame 的类。这是显示地图和工具栏的类。同时还是初始 化 SimpleRulerMapTool 对象的地方。 • SimpleToolApp.java — 一个非常简单的类,提供主要的方法。 在开始研究定义 SimpleRulerMapTool 的源代码之前,需要熟悉这些工具的具体操作。在此通过编译 所有 4 个 Java 类,然后再运行 SimpleToolApp 类,即可看到定制工具的操作行为。 注: 在编译之前,可能需要编辑 SimpleToolFrame.java 来更改在 loadGeoset 调用中指定的文件 名和 / 或路径,以便相应信息可以确定系统上的文件的名称和位置。 在该应用程序运行时,定制 SimpleRulerMapTool 将出现在工具栏末端。用户可以选择该工具,单击 地图一次以开始测量距离、移动鼠标,然后暂停;用户暂停时,当前距离将显示为 ToolTip。用户可 以再次单击,从其它位置开始测量。通过按下 Esc 键,用户可以取消当前线段。 MapTool 的基本要求 地图工具是操作对象,因此,可以将其添加到 JMenu 或 JToolBar 对象。由于地图对象是操作,因此 对于您所创建的任意地图工具都必须定义 actionPerformed 方法。在用户选择定制工具之后,无论 是从工具栏还是从菜单,均将调用定制工具类的 actionPerformed 方法。 此外,您所创建的任意地图工具类都必须实现 MapTool 接口 (com.mapinfo.beans.tools.MapTool)。 这意味着必须提供以下方法: • getCursor — 返回和此 MapTool 关联的 java.awt.Cursor 对象。 • isSelected — 返回 True 或 False,表示当前是否选定此 MapTool。 • setCursor — 设置工具的光标对象。 • setSelected — 设置当前是否选定该工具。 注: 选择一个工具将自动取消选中此前所选的地图工具。 有关这些方法的示例,请参阅 SimpleRulerMapTool.java。 在构建满足这些基本要求的定制工具之后,可以考虑向定制工具添加更多的功能。后续内容对可以 添加的其它功能作出了说明。第 7 章:MapXtreme JavaBeans 开发人员指南 105 © 2006 MapInfo Corporation. 保留所有权利。 用户使用地图工具可以和地图交互,为此大部分地图工具实现了 MapMouseListener 接口 (com.mapinfo.beans.vmapj.MapMouseListener)。实现此接口意味着提供以下响应各种鼠标操作的 方法: • mouseClicked — 在用户完成单击操作时调用(按下然后释放鼠标按钮) • mouseDragged — 在用户按住鼠标按钮并移动鼠标时调用 • mouseEntered — 在鼠标进入 VisualMapJ 显示区域时调用 • mouseExited — 在鼠标退出 VisualMapJ 显示区域时调用 • mouseMoved — 在移动鼠标且没有按住鼠标按钮时调用 • mousePressed — 在用户按下鼠标按钮时调用 • mouseReleased — 在用户释放鼠标按钮时调用 SimpleRulerMapTool 类展示如何使用这些鼠标事件方法。此工具允许用户单击以设置测试距离的起 点,因此 mouseClicked 方法包含存储起始坐标的代码。 接下来,用户可以移动鼠标,导致 SimpleMapRulerTool 显示弹性线。要生成这一弹性线效果, mouseDragged 和 mouseMoved 方法均调用 handleStretch 方法。 在 SimpleRulerMapTool 示例中,所包含的其它鼠标方法只用于满足 MapMouseListener 接口,因此 相应方法为空。例如: public void mouseEntered(MapMouseEvent e){} 根据想要定制工具具备的具体行为,可向上述空的方法添加代码。 键盘输入响应 在某些情况下,可能需要定制地图工具来处理键盘输入。例如 SimpleMapRulerTool 可用于在用户按 下 Esc 键时取消弹性线的显示。 如果定制地图工具需要对键击作出响应,可实现 KeyListener 接口 (java.awt.event.KeyListener), 即实现以下方法: • keyPressed — 在用户按下按键之后调用 • keyReleased — 在用户释放按键之后调用 • keyTyped — 在用户完成键的输入时调用(按下然后释放一个键) SimpleMapRulerTool 检查 keyReleased 方法中是否有 Esc 键。如果已经按下该键,则 keyReleased 方法调用 cleanup 方法,令工具重置。 在 SimpleRulerMapTool 示例中,所包含的 keyPressed 和 keyTyped 方法只用于满足 KeyListener 接 口,因此相应方法为空。 对点击和拖动操作的响应创建定制 MapTools 106 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 显示 ToolTip 文本 地图工具可以采用两种不同类型的 ToolTip 文本: • 当用户将鼠标置于工具栏的工具之上时,将出现 ToolTip 显示工具的名称。要设置显示在此类 ToolTip 中的文本,可调用 putValue,例如: putValue(SHORT_DESCRIPTION,"Ruler"); • 当用户选择定制工具之后,光标位于地图之上,即可显示 ToolTip 文本。这一点可以通过提供 getToolTipText 方法,实现 ToolTipTextSetter 接口 (com.mapinfo.beans.tools.ToolTipTextSetter) 来完成。 例如,SimpleMapRulerTool 使用 ToolTip 文本显示当前光标位置和用户上次点击位置之间的距离。 与此类似,SimpleMapRulerTool.java 提供了 getToolTipText 方法,该方法只返回表示距离测量结果 的字符串(如 123.45 米)。 注:即使定制工具实现 ToolTipTextSetter 接口,若不调用 VisualMapJ 对象的 setShowToolTips 方 法,也将无法看到 ToolTips。有关示例,请参阅做出以下调用的 SimpleToolFrame.java: visualMapJ1.setShowToolTips(true); 在地图顶部绘制 某些地图工具会在用户使用相应工具时对地图的外观作出临时的更改。要以此方式在地图上进行绘 制,可实现 MapPainter 接口 (com.mapinfo.beans.vmapj.MapPainter) 及其 paintOnMap 方法。 例如,SimpleMapRulerTool 在地图顶部绘制一条弹性线,并当用户在其 paintOnMap 方法中移动鼠 标时更新此线。编写定制 Servlet 本章介绍如何使用 servlet(服务器端 Java 程序)部署地图绘制应用程序。 本章内容:  Servlet 概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108  使用 Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108  瘦客户机 / 胖服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108  胖客户机 / 瘦服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110  中型客户机 / 中型服务器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .112  MapXtremeServlet 数据流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115  Servlet 转发 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .117  示例 Servlet:HTMLEmbeddedMapServlet . . . . . . . . . . . . . . . . .117  带有专题功能的样例 Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120  使用 Servlet 实用程序库 (MapToolkit) . . . . . . . . . . . . . . . . . . . . . .120Servlet 概览 108 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Servlet 概览 Servlet 是用于扩展 Web 服务器功能的 Java 组件。Servlet 面向服务器,applet 面向浏览器,但是 servlet 没有图形用户界面。 MapXtreme Java 中的地图绘制引擎部署为 servlet。它符合 Java 2 企业版体系结构,并且必须自 J2EE 验证的容器之内运行。借助于此,servlet 容器将管理负载平衡、线程以及容错等非地图绘制任 务,并使 MapXtremeServlet 能够发挥最大效能来处理地图请求。 使用 Servlet servlet 可以包含多种地图绘制功能,用于满足具体应用的需求。例如,可以构建提供基础地图导航 的 servlet,提供平移、缩放和测量两点距离等功能。如果需要更加复杂的应用程序,可以考虑提供 选择功能或专题地图绘制的功能。 注: 在编译 servlet 源程序之前,需要配置 Java IDE,以便在 IDE 的 classpath 中包括 J2EE servlet 类文件(如 servlets.jar)。 MapXtreme Java 适用于两至三层的 Web 应用程序。两者之间的区别在于 MapJ 组件的位置是在服 务器还是在客户机。后续内容介绍了各种不同的配置选项。servlet 体系结构的示例可参阅位于以下 网址的 MapInfo 知识库:http://testdrive.mapinfo.com/kbase_by_product。 瘦客户机 / 胖服务器 以下说明介绍了最常见的配置 — 浏览器作为客户机,用户定义的 servler 使用中间层的 MapJ 对象, MapXtremeServlet 位于中间层,数据库位于最后一层。应用程序可利用 servlet、Java 服务器页或 Enterprise JavaBean 的任意组合。 当客户机通过浏览器发出请求之后,Web 服务器将该请求转发至用户定义的 servlet,然后即可更新 MapJ 对象的状态。MapJ 对象随后将用于与 MapXtremeServlet 通信地图绘制请求。如果是图像请 求,MapXtremeServlet 将地图的栅格图像返回给用户定义的 servlet。用户定义的 servlet 随后即可 将此图像嵌入到 HTML 页面,并将该页面返回给最终用户的浏览器。 在中间层,用户定义的 servlet 还可以利用 MapXtreme 的 servlet 库来帮助您构建 HTML 页面。例 如,现有可以使用基于图层控制的方式,利用库方法来创建 HTML。 这个三层的体系结构具有以下特征: • MapJ 部署在用户定义的 servlet 的中间层中。 • MapXtremeServlet 部署在中间层。 • 客户端不需要 Java。客户机可以发送 HTTP 请求,并接收作为响应的 HTML 页面。 • 生成的网络流量最低:无需 Applet,即不用下载 applet。向量数据不发送到客户机,发送到客户机 的只是嵌入栅格图像的 HTML 页面。类似 GIF 的栅格格式通常生成大小为 15ñ25K 的地图图像。 这些特征令三层体系结构成为适用于因特网部署的理想方案,此时 Web 应用程序开发人员对客户端 配置具有的控制最少。这一部署使“公共特征最少”,可用于来满足那些不支持 Java 的浏览器和 / 或 网络带宽太小的客户机的需求。第 8 章:编写定制 Servlet 开发人员指南 109 © 2006 MapInfo Corporation. 保留所有权利。 此外,MapXtreme Java 提供了定制 JSP 标记库,可用于在快速应用程序开发 (RAD) 环境下创建中 间层 servlet,例如在 MapXtreme Java Manager 中的 Web 应用程序构建器环境下。 瘦客户机体系结构 本节介绍瘦客户机的体系结构。 下表列出了这一体系结构的要点。 以下步骤和瘦客户机体系结构图中的编号相对应: 1. 在使用本地数据提供方访问本地数据源的服务器上创建 MDF 文件。 2. 为每个连接客户机创建的 MapJ 对象将使用 MDF 文件初始化。 客户端 通信 服务器端 HTML 浏览器 HTTP 协议 MapXtreme Java servlet • 使用服务器资源远程渲染 用户定义的 Servlet • 接受并发客户机连接 • 每个连接客户机均分配有专用的 MapJ 对象 • MapJ 保存到会话 • 采用带有 LocalDataProviders 的 MDF 文件胖客户机 / 瘦服务器 110 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 3. 用户定义的 servlet 使用 MapXtremeServlet 来构建地图图像。 4. 地图图像返回到用户定义的 servlet。 5. 用户定义的 servlet 地图将图像集成到 HTML 中,用于返回到客户机。 有关瘦客户机体系结构的要点小结如下: • 无需为客户机编程。只是返回由浏览器解释。 • 通信通过 HTTP POST 请求完成。唯一的例外是第一个请求,该请求是 HTTP GET 请求。 • MapJ 驻留在服务器上用户定义的 servlet 之中。 • 远程渲染在服务器端完成。 • 服务器上的 MDF 文件使用 LocalDataProviders。 胖客户机 / 瘦服务器 在两层或胖客户机配置中,MapJ 对象和业务逻辑均在客户机端部署,通常是作为浏览器中的 applet。 此类部署的主要优点是可使用 MapXtreme Java Edition的 JavaBean。与使用低级 MapJ API 相比,在 可视化的 RAD 环境中,使用 MapXtreme Java Edition JavaBean 可以更加迅速地创建应用程序。 MapXtreme Java Edition 的 JavaBean 提供了可视化的地图工具、工具栏、向导,可直接纳入到应用 程序之中使用。 在两层部署中,客户机将从 Web 服务器先下载一个包含 JavaBean 的 applet。该两层体系结构具有 以下特征: • MapJ 部署在客户端的 applet 中。 • MapXtremeServlet 将部署在中间层,用于地图渲染和数据获取。 • 客户机上需要 Java:客户机浏览器必须支持 Java 2 平台 VM 1.4.0 或更高版本(或具有适当的插 件)。 • 网络流量较大:必须下载包含 JavaBean 的 applet。向量数据可发送到客户机;此外,与栅格文件 的大小相比,向量数据的大小变化较大。 由于存在这些特征,两层体系结构最适合用于内网部署,此时的部署环境更加趋于一致并且易于控制。 当渲染和数据访问由 applet 完成时,需要较高的网络带宽。客户机也需要采用性能较高的计算机。第 8 章:编写定制 Servlet 开发人员指南 111 © 2006 MapInfo Corporation. 保留所有权利。 胖客户机体系结构 本节介绍胖客户机的体系结构。 下表列出了这一体系结构的要点。 以下步骤和胖客户机体系结构图中的编号相对应: 1. 在使用 MapXtremeDataProvider 访问本地数据源的服务器上创建 MDF。 2. 将 MDF 文件置于 applet 所在的 Web 服务器的公共访问目录中。 3. 从 Web 服务器将 MDF 内容传递到 applet。 注: MDF 必须使用每个图层的 MapXtremeDataProviderRefs。 4. 将 MapJ 设置发送到服务器,用于数据源访问和地图图像创建。 5. 使用服务器上的数据源来创建地图图像。 6. 将图像传送回客户机用于显示。 客户端 通信 服务器端 • HTML 浏览器 • applet 采用 VMapJ • MapJ 在客户端 • HTTP 协议 • 用于远程渲染 • 用于远程数据访问 MapXtreme Java servlet • 使用服务器资源远程渲染 • 通过 MapXtremeDataProvider 获取数据 • 采用下载到客户端的 MDF 文件中型客户机 / 中型服务器 112 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 有关胖客户机体系结构的要点小结如下: • 客户机包含地图绘制功能并需要大量编程。 • MapJ 驻留在客户端。 • MDF 文件下载到客户端 applet,以便只使用 MapXtremeDataProviders 定义其图层。 • 远程渲染在服务器上完成,生成的图像发送回客户机。 中型客户机 / 中型服务器 在中型客户机/中型服务器配置中,可配置 applet 遍历用户定义的 servlet 以获取其数据和地图图像。 这一配置专用于 applet 充当客户机和图层数据源数据包含在 RDBMS 中的情况。在上述情况下,中 间层中由用户定义的 servlet 将提供一个间接层面,以便允许 RDBMS 访问。 中型客户机体系结构 本节介绍中型客户机的体系结构。第 8 章:编写定制 Servlet 开发人员指南 113 © 2006 MapInfo Corporation. 保留所有权利。 下表列出了这一体系结构的要点。 以下步骤和中型客户机体系结构图中的编号相对应: 1. 在服务器上创建的 MDF 文件为每个图层使用本地数据提供方。 2. HTML 浏览器下载 applet HTML 页以开始执行 applet。 3. 串行化 Java 对象用于在 applet 和用户定义的 servlet 之间发送信息。 4. 将为每个连接的客户机使用用户定义的 servlet 创建 HTTPSession,用于保存客户端的 MapJ 对象。 有关中型客户机体系结构的要点小结如下: • 客户机需要编程,但是仍然绘制 / 修改通过编程方式方式保存在服务器上的地图。 • 通信通过串行化对象完成。在客户机 / 服务器之间传递更多具有实际意义的数据。 • MapJ 驻留在服务器端。 • 远程渲染在服务器端完成。 • 服务器上的 MDF 文件使用 LocalDataProviders。 客户端 通信 服务器端 • HTML 浏览器 • applet • HTTP 协议 • 获取 sessionID 的 握手请求 • 采用串行化对象 传递数据 MapXtreme Java servlet • 使用服务器资源远程渲染 用户定义的 Servlet • 接受并发客户机连接 • 每个连接客户机均分配其自己的 MapJ 对象 • MapJ 保存到会话 • 采用带有 LocalDataProviders 的 MDF 文件中型客户机 / 中型服务器 114 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 中型客户机通信 本节介绍在中型客户机 / 中型 servlet 体系结构下,在客户机 applet 和用户定义的 servlet 之间的通信 过程。 以下步骤和中型客户机通信示意图中的编号相对应:步骤 1-4 只执行一次,步骤 5-8 可以根据需要重 复多次。 1. 当 index.html 文件下载到浏览器之后,将强制浏览器(通过特殊 HTML 标记)下载 applet 的类文 件并开始执行相应文件。 2. 所要下载的文件仅限于 Java 2 平台标准版 SDK 1.4.0. 版中的文件。在客户端 applet 中不使用与 MapInfo 相关的专有类文件。第 8 章:编写定制 Servlet 开发人员指南 115 © 2006 MapInfo Corporation. 保留所有权利。 3. 握手请求是从客户机发送到用户定义的 servlet 的第一个请求。该请求告知 servlet 为有关客户机 创建新的 servlet 会话,返回特殊的 URL,以便客户机在进行后续请求时使用。这一特殊的 URL 包含嵌入的会话 ID 值,服务器将使用该值来获取客户机的特定 servlet 会话。servlet 会话只是存 储在内存(或者如果会话是永久性的,则为文件系统上的文件)中的数据段,其中包含客户机的 状态信息。 4. 握手响应将从用户定义的 servlet 发送回客户机。其中包含具有嵌入会话 ID 值的特殊 URL,以便 客户机在对服务器发出后续请求时,使用这一新的 URL。 5. 在从客户机发送第一个请求 — 握手请求之后,每个发送的请求都将是 MapImage 请求。MapImage 请求包含图像的说明,该图像将由 MediumServer 创建和返回。此外,该请求中还提供了更多详细 信息,例如要创建的图像的像素尺寸,以及需要预先应用的任意图像导航操作(缩放、平移等)。 6. 在根据需要修改 MapJ 对象之后,用户定义的 servlet 将向 MapXtremeServlet 请求地图渲染。这 称为远程渲染。 7. 在 MapXtremeServlet 已经生成地图图形之后,它会将图像数据发送回用户定义的 servlet 以便返 回给客户机。 8. 用户定义的 servlet 将 MapImage 响应发送回客户机,其中包含地图图像本身的数据。客户机 applet 随后将从响应消息中提取图像数据,并在 GUI 上绘制地图图像。 MapXtremeServlet 数据流 在开发 MapXtreme Java 4.x 支持的客户机应用程序时,用户地图的状态将保存在类类型 com.mapinfo.mapj.MapJ 的对象中。在运行时,可对该对象执行渲染操作和搜索操作,以便在应用 程序中实现真正的地图绘制功能。基于 MapJ 对象中的设置以及 MapJ 对象的使用方式的不同,介于 客户机应用程序和 MapXtremeServlet 之间的数据流情况将有所差异。 导致数据流情况有所差异的一般因素如下所示: • 在 MapJ 对象的图层中使用的是何种类型的数据提供方? • 是否正在渲染地图图像? • 是否正在对图层执行搜索? • 如果渲染地图图像,那么是采用本地渲染,还是采用远程渲染? 数据提供方操作 本节介绍与数据提供方类型和执行操作有关的各种数据流情况。 LocalDataProviderRef:远程渲染 使用 LocalDataProviderRef 进行远程渲染的步骤如下。 1. 客户机将其 MapJ 对象发送到 MapXtremeServlet。 2. MapXtremeServlet 直接读取数据源数据。 3. MapXtremeServlet 使用此数据创建地图图像。 4. MapXtremeServlet 将地图图像数据返回客户机。MapXtremeServlet 数据流 116 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 LocalDataProviderRef:本地渲染 使用 LocalDataProviderRef 进行本地渲染的步骤如下。 1. 在客户机之内,MapXtreme Java 类直接读取数据源数据。 2. 在客户机之内,MapXtreme Java 类使用此数据创建地图图像。 3. 在客户机之内,地图图像随后将转录到图形上下文。 LocalDataProviderRef:图层搜索 使用 LocalDataProviderRef 进行图层搜索的步骤如下。 1. 在客户机之内,MapXtreme Java 类直接读取数据源数据。 2. 在客户机之内,MapXtreme Java 类使用此数据执行图层搜索。 3. 在客户机之内,MapXtreme Java 类生成搜索结果。 MapXtremeDataProviderRef:远程渲染 使用 MapXtremeDataProviderRef 进行远程渲染的步骤如下。 1. 客户机将其 MapJ 对象发送到 MapXtremeServlet。 2. MapXtremeServlet 通过 MapXtremeServlet 间接读取数据源数据,此时 MapXtremeServlet 是通 过 MapXtremeDataProviderRef 的 URL 定位的。 这些 MapXtremeServlet 实例可能会有所不同,并驻留在不同的计算机上。如果 MapXtremeDataProviderRef URL 只引用当前的 MapXtremeServlet 实例(如引用 MapJ 对象 所发送的实例),那么直接访问数据源数据的将是当前的 MapXtremeServlet 实例。 3. MapXtremeServlet 使用此数据创建地图图像。 4. MapXtremeServlet 将地图图像数据返回客户机。 MapXtremeDataProviderRef:本地渲染 使用 MapXtremeDataProviderRef 进行本地渲染的步骤如下。 1. 在客户机之内,MapXtreme Java 类通过 MapXtremeServlet 间接读取数据源数据,此时 MapXtremeServlet 是通过 MapXtremeDataProviderRef 的 URL 定位的。 2. 在客户机之内,MapXtreme Java 类使用此数据创建地图图像。 3. 在客户机之内,地图图像随后将转录到图形上下文。 MapXtremeDataProviderRef:图层搜索 使用 MapXtremeDataProviderRef 进行图层搜索的步骤如下。 1. 在客户机之内,MapXtreme Java 类通过 MapXtremeServlet 间接读取数据源数据,此时 MapXtremeServlet 是通过 MapXtremeDataProviderRef 的 URL 定位的。 2. 在客户机之内,MapXtreme Java 类使用此数据执行图层搜索。 3. 在客户机之内,MapXtreme Java 类生成搜索结果。第 8 章:编写定制 Servlet 开发人员指南 117 © 2006 MapInfo Corporation. 保留所有权利。 Servlet 转发 为了利用在 J2EE 2.2 应用程序中提供的 servlet 转发功能,MapXtreme Java 提供了 IntraServletContainerRenderer。这一特性为将栅格图像返回到客户机提供了一种可选途径。这一渲 染器在渲染器和 MapXtremeServlet 之间不需要套接字连接,但是这对于 MapXtremeImageRenderer 而言却是不可或缺的。 这一部署选项的优点在于栅格图像可以直接发送到客户机。MapXtremeServlet 不需要将图像写入到中 间层,然后再令中间层将其重写回客户机。但是其限制是应用程序必须部署在与 MapXtremeServlet 相同的容器之中。在规划应用程序时,务必考虑这一因素。 IntraServletContainerRenderer 构造器需要输入该信息,以便中间层 servlet 获取 MapXtremeServlet 的 RequestDispatcher 对象。RequestDispatcher 对象处理 servlet 转发。必需的信息如下所示: • 由 com.mapinfo.mapxtreme.MapXtremeServlet 使用的别名,例如 "mapxtreme480" • MapXtremeServlet 的 ServletContext 对象,或是 servlet 上下文的 URI,例如 "/mapxtreme480" • MapXtremeServlet 将使用 HttpServletRequest 和 HttpServletResponse 对象满足该请求 • 栅格图像的 mime 类型 • 图像是否应该为多个部分,以及多个部分的更新间隔 有关 IntraServletContainerRenderer 的详细信息,请参阅第 11 章:渲染涉及的考虑因素。 示例 Servlet:HTMLEmbeddedMapServlet HTMLEmbeddedMapServlet 是 MapXtreme Java 附带的示例 servlet。该文件可见于 /examples/server/Java/servlet。此外,mxjserversamples.jar 中还提供了预编译的版本。 HTMLEmbeddedMapServlet 提供了嵌入这些基本地图绘制元素的 HTML 页面。 • 显示地图的地图框架 • 用于缩小、放大、平移的单选按钮 • 地图宽度框,用户用于键入新地图的宽度 • 应用按钮,用于应用地图宽度 • 图层设置链接,显示可以启用或禁用的图层的表 • 切换,用于放大或缩小地图 • 比例尺 通过打开浏览器,然后键入如下所示的 MapXtremeServlet URL,即可运行 HTMLEmbeddedMapServlet: http://stockholm:8080/samples480/htmlmap示例 Servlet:HTMLEmbeddedMapServlet 118 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 URL 可能会因具体设置方式而有所不同。 要自定义这一 servlet,可通过修改 HTMLEmbeddedMapServlet.java 中的适当变量并重新编译来更 改地图的宽度或高度。在修改和重新编译 servlet 时,需要将其 类文件复制到适当目录。例如,对于 Tomcat,可能需要将 .class 文件复制到 Tomcat 的 webapps/samples480/WEB-INF/classes 目录(如 果是从 jar 运行,可能需要将类复制到 WEB-INF/lib/mxjserversamples.jar)。 如果编译示例,务必要删除、移动或重命名 mxjserversamples.jar。否则,相应的 servlet 容器可能 会使用源自 jar 文件的 HTMLEmbeddedMapServlet.class 文件,而不是使用您所编译的类文件。 HTMLEmbeddedMapServlet 代码示例可更改众多设置而无需重新编译。servlet 使用标准的 servlet 初始化参数加载其众多设置。例如,要加载的地图名称(如 world.gst)可使用初始化参数覆盖。这 样,如果只需更改要加载的地图的名称,则只要编辑 init 参数即可,无需修改 servlet 源代码,。第 8 章:编写定制 Servlet 开发人员指南 119 © 2006 MapInfo Corporation. 保留所有权利。 下表介绍 HTMLEmbeddedMapServlet 示例预期将要用到的最重要的初始化参数。有关由示例 servlet 所用的初始化参数的完全列表,请查看 HTMLEmbeddedMapServlet.java 中的注释。 如果所用 servlet 容器提供管理员工具(如 JRun 或 JavaWebServer),可使用该工具来设置初始化 参数,如上所示。某些 servlet 容器可能需要在 XML 文件中指定初始化参数,后续内容对此作出了 有关说明。 在 Tomcat 中编辑初始化参数 修改用于 Tomcat 的初始化参数可通过使用文本编辑器编辑 web.xml 文件来实现。以下示例显示了定 义 HTMLEmbeddedMapServlet 的三个初始化参数的 块,这三个参数分别是 mappath、filetoload 和 mapxtremeurl init。 htmlmap HTMLEmbeddedMapServlet mappath C:\mxt\maps filetoload C:\mxt\maps\world.gst mapxtremeurl 初始化参数 说明 示例 filetoload 将要显示的地图文件(.gst 或 .mdf 文 件)的完全路径。 C:/mxt/maps/world.gst mappath geoset (.gst) 地图文件在服务器上安装 目录的路径。不适用于地图定义。 C:/mxt/maps mapxtremeurl MapXtremeServlet URL /mapxtreme480/mapxtreme带有专题功能的样例 Servlet 120 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 http://hostname/mapxtreme480/mapxtreme 带有专题功能的样例 Servlet 在位于 /examples/server/java/thematic 的示例目录下还提供了增加版本的示例 servlet HTMLEmbeddedMapServlet,该示例集成了专题影线表示功能。有关向 servlet 添加专题支持的详 细信息,请参阅 HTMLThemeServlet.java 文件。 使用 Servlet 实用程序库 (MapToolkit) MapXtreme Java 为构建 servlet 提供了帮助程序方法库。借助于 MapJ 对象,MapToolkit 类可以帮助 您构建支持地图的网页公共元素,例如图层控制表单。在示例应用程序 HTMLEmbeddedMapServlet 中使用的方法就取自此类。 注: 此库只适用于编写 servlet 源代码的用户。大部分开发人员喜欢使用 JSP 应用程序,如果计划 在 JSP 中编写应用程序,就无需再使用 servlet 实用程序库。但如果出于某些原因无法使用 JSP 库(如客户机无法符合 JSP 库所强制的 JavaScript 要求),那么就可能需要使用到 servlet 实用程序库。第 8 章:编写定制 Servlet 开发人员指南 121 © 2006 MapInfo Corporation. 保留所有权利。 使用此类来简化 servlet 的开发。该库中包括以下元素: 地图工具 — 单选按钮,确定地图导航元素(缩、放、平移) 缩放框 — 文本字段,显示当前的地图缩放,允许用户键入新的缩放。 图层控制 — HTML 页面,显示地图中的图层,允许用户选中或清除用于可选性、可见性和自动标注 的设置。 比例尺 — 可查看的元素,显示地图的比例。 地图大小切换 — 用于放大或缩小地图大小的链接。 Servlet MapToolkit 中的方法 MapToolkit 提供了以下方法。有关 MapToolkit 类的完全说明,请参阅安装在计算机的 mapxtremejava/docs/devsupport 目录下的 HTML 参考资料。 方法说明 getHTMLLayerListControl 返回表示用作图层控制对话框的 HTML 页的字符串。 applyLayerSettings 更新地图以反映用户在图层控制页中选择的所有选项。 getHTMLZoomControl 返回表示缩放控制的字符串 — 一组 HTML 标记,提供文本字段 用于显示当前地图缩放宽度;以及“提交”按钮,应用用户所键 入的新缩放宽度。 getHTMLMapToolsControl 返回字符串表示一组用于缩、放、平移的单选按钮。 getHTMLScaleBar 返回的字符串表示定义地图比例尺的 HTML 语法。指定特定宽度, 或指定 0,此时比例尺将调整并舍入至大约地图图像宽度的 1/4。 getToolNumber 返回整数,表示相应于工具名称的工具编号。 getStr 从资源包返回字符串资源。使用 Servlet 实用程序库 (MapToolkit) 122 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 第 B 部分:MapJ API 简介 本《开发人员指南》的 B 部分介绍如何使用 MapJ API 以编程方式来创建和控制用于应用程序的地图信息。 主题:  第 9 章:MapJ API 本章介绍所有 MapXtreme Java Edition 地图绘制应用程序的起点:MapJ 对象。本 章定义 MapJ,如何创建基本地图、渲染图像、控制地图视图,此外还介绍图元、样 式和专题。  第 10 章:在图层中绘制地图 本章介绍地图的基本元素,即存储地图图元和信息的图层的集合。此外还介绍了特 殊图层:Annotation 和 Raster 图层。  第 11 章:渲染涉及的考虑因素 本章提供了有关 MapXtremeImageRenderer 和 LocalRenderer 以及其它渲染选项的 更多信息。  第 12 章:访问远程数据 本章介绍更加有效的远程数据访问方式,即数据库连接池。  第 13 章:图元和搜索 本章定义 Features 和 FeatureSets,同时提供了在寻找信息时可以采用的多种搜索 方法。  第 14 章:标注和样式 此外还提供了有关定制标注以及控制标注可见性和位置的详细信息。并介绍了用于 图元和标注的样式。  第 15 章:专题地图绘制和分析 要获取有关地图的更多详细信息,可使用功能强大的专题地图绘制图元,以便对数 据作出可视化的比较,进而作出适当的决策。MapJ API 本章介绍 MapJ API 和要在后续章节中详细说明的主题。 本章内容:  MapJ 对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .126  创建第一个地图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .126  控制地图视图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129  添加图层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131  通过编程保存地图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131  命名地图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134  基本地图之外的其它特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135MapJ 对象 126 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapJ 对象 MapJ 是一个便捷小巧的组件,提供了通过 MapXtremeServlet 或通过其本身来创建地图的界面。 MapJ 可以发出两种类型的请求。一种请求为向量格式数据(称为图元),一种请求为地图图像文 件。MapJ 的使用目的在于维护地图状态,其中包括保持图层、坐标系、距离单位和地图边界等记录。 MapJ 对象可以配置用于与不同类型的渲染器和 DataProvider 协同工作。在最为典型的配置中, MapJ 是 MapXtremeServlet 的客户机。MapJ 向 MapXtremeServlet 实例发送请求,请求的一部分为 servlet 提供了其当前状态。MapJ 从 servlet 获取地图图像和数据。 MapJ 还可以独立工作,直接获取地图数据并生成地图图像。MapXtreme 采用了基于组件的设计方 案,其强大之处在于可配置为与其它变更版本协同工作。例如,MapJ 可配置为通过一个或多个 MapXtremeServlet 实例访问地图数据,同时仍然可以显示地图图像。有关配置选项的详细信息,请 参阅第 3 章:应用程序规划。 几乎每个对象、属性和方法都是从 MapJ 对象派生的。每个 MapJ 对象主要由 Data Provider、Layers 和 Feature 对象定义。MapXtreme API 中的其它对象均将有助于创建和渲染 MapJ 对象,例如 Data Provider 对象和 Renderer 对象。 创建第一个地图 后续内容将介绍使用 MapJ API 创建地图的一般过程。在此情况下,MapJ 通信时将其请求发送到 MapXtremeServlet。以下提供了相关的说明步骤以及其所在的页码。 1. 第 126 页的 MapJ 对象初始化。 2. 第 126 页的加载地图数据。 3. 第 128 页的设置地图设施边界。 4. 第 128 页的渲染地图。 MapJ 对象初始化 在应用程序中使用 MapJ 对象及其方法之前,必须先初始化 MapJ。要初始化 MapJ,只需采用以下 Java 代码即可: myMap = new MapJ(); 加载地图数据 在创建 MapJ 对象之后,还必须加载地图数据。 此时可加载 geoset 或地图定义。有关打开和创建地图定义和 geosets 的详细信息,请参阅第 5 章: 管理 MapXtreme Java。 在 MapXtreme Java Edition 中,没有默认的地图定义。因此,作为初始化过程的组成部分,必须设 置默认的地图定义。第 9 章:MapJ API 开发人员指南 127 © 2006 MapInfo Corporation. 保留所有权利。 加载 Geoset 以下是加载 geoset 文件的示例: myMap.loadGeoset(geosetName, dataDir, servletURL); 其中 geosetName 是到 geoset 的完整路径 dataDir 是 geoset 中引用的 .tab 文件在服务器计算机上的位置(可能和 MapXtremeServlet 不 在相同的计算机) servletURL 是 MapJ 使用远程 DataProviderRef 时到 MapXtremeServlet 的路径(如果使用 LocalDataProviderRef,参数为空)。 例如: myMap.loadGeoset("c:\\mapxtreme\\maps\\world.gst", "c:\\mapxtreme\\maps", "http://stockholm:8080/mapxtreme480/ mapxtreme"); 加载地图定义 此时要加载的既可以是存储在文件中的地图定义,也可以是存储在数据库中的记录或存储命名资源 库中的命名地图。 要加载地图定义,必须先创建 MapDefContainer,MapDefContainer 是地图定义存储位置的抽象表 示。创建的 MapDefContainer 类型取决于正在加载的地图定义的类型: • FileMapDefContainer • JDBCMapDefContainer、IusMapDefContainer 和 OraSoMapDefContainer • NamedMapDefContainer 请参阅第 132 页的 MapDefContainer 接口。 要为存储在文件中的地图定义创建 MapDefContainer,可使用以下代码: MapDefContainer mdc = new FileMapDefContainer(dir) 其中 dir 是到包含地图定义文件目录的完整路径。 例如: MapDefContainer mdc = new FileMapDefContainer("c:\\mapxtreme\maps") 要为存储为 RDBMS 记录的地图定义创建 MapDefContainer,可使用以下代码: MapDefContainer mdc = new JDBCMapDefContainer( driver, url, user, password) 其中 driver、url、user 和 password 均为数据库连接参数。创建第一个地图 128 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 以下是从 Oracle RDBMS 进行加载的示例: MapDefContainer mdc = new OraSoMapDefContainer( "oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@machinename:1521:dbSid", "username", "password", "tableName", "Name", "Map_Definition"); 要创建用于命名资源库中存储的地图定义的 MapDefContainer,可使用以下代码: MapDefContainer mdc = new NamedMapDefContainer(providerUrl, path); 其中 providerUrl 为 file:/// 或指向命名资源库根目录的 http:// URL,path 为到命名地图的路径,相对 于命名资源库的根目录。 例如: MapDefContainer mdc = new NamedMapDefContainer( "http://torpedo:8080/mapxtreme480/namedresource", "mymaps"); 将通过以上 URL 所指的 NamedResourceServlet 引用 mymaps 中的命名地图。 要加载命名地图定义,可使用以下代码: myMap.loadMapDefinition(mapDefContainer, name) 其中 mapDefContainer 是以上定义的容器类,name 是要从容器加载的地图(在 saveMapDefinition 命令中使用的名称)。 例如: myMap.loadMapDefinition(mdc, "Asia"); 设置地图设施边界 使用 MapJ.setDeviceBounds() 设置渲染的地图图像的大小。这是在地图渲染之前设置的。设施边 界设置从渲染器返回的图像的尺寸(按像素数计)。例如,需要返回的是 800x600 的地图。默认的 图像大小是 640x480。 要设置设施边界,可使用 MapJ 对象的 setDeviceBounds 方法。如果接受默认边界,则无需调用此 方法。 myMap.setDeviceBounds(new DoubleRect(0, 0, 800, 600)); 渲染地图 要渲染地图,必须将 renderer 对象实例化。以下示例使用 MapXtremeImageRenderer,并将图像渲 染为 GIF 文件。 指定指向 MapXtreme servlet 的 URL,该 servlet 将远程连接到地图引擎。 String mapxtremeServletUrl = "http://stockholm:8080/mapxtreme480/mapxtreme";第 9 章:MapJ API 开发人员指南 129 © 2006 MapInfo Corporation. 保留所有权利。 创建 ImageRequestComposer: ImageRequestComposer imageRC = ImageRequestComposer.create (myMap, 256, Color.blue, "image/gif"); 创建 MapXtremeImageRenderer: MapXtremeImageRenderer renderer = new MapXtremeImageRenderer( "http://localhost:8080/mapxtreme480/mapxtreme"); 渲染地图: renderer.render(imageRC); 将渲染的地图导出到文件: renderer.toFile("comp.gif"); MapXtremeServlet 返回所有指定图层的图像。在调用 Renderer 对象的 render() 方法时,将向 MapXtremeServlet 发送请求,随后用于在服务器上生成图像。该图像将只在调用 toFile、toStream 或 toImage 方法时返回给用户。 此外,如果配置 MapJ 取代 MapXtremeImageRenderer,单独工作以直接获取地图数据和生成图 像,则可使用 LocalRenderer 来在本地渲染图像。 无需使用渲染器,即可在 MapJ 客户端和 MapXtremeServlet 之间进行交互。但是,渲染器是地图图 像返回给用户的唯一途径。用户可以创建和初始化 MapJ 对象并执行控制对象或查询地图的若干种方 法,但是要查看当前地图,必须使用 render 方法。如果要采用多个步骤创建地图,然后再显示该地 图,则上述方法尤为实用。 第 11 章:渲染涉及的考虑因素中对 MapXtremeImageRenderer 和 LocalRenderer 作出了进一步的 讨论。 控制地图视图 在显示地图之后,可能需要更改其视图,采用更近的距离来查看地图细节,或获取更宽的视图。 MapJ 具有若干种用于控制地图视图的方法:setZoom()、setCenter() 和 setZoomAndCenter()。 设置地图缩放级别 缩放级别相当于地图之上的距离。缩放级别可以更改为任意距离。所用的单位将是当前的距离单 位。缩放级别最初在加载 geoset 或地图定义文件时设置。要更改地图的缩放级别,可使用 setZoom 方法。以下是设置缩放级别的示例: // Assuming that the current distance units are kilometers, // this command will set the map zoom to 500 kilometers. myMap.setZoom(500);控制地图视图 130 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 重定地图中心 设置地图的中心是控制地图视图的必要步骤之一。使用地图时,可能需要将地图中心定位于一个特 定的位置或坐标。此时可以借助于 setCenter 方法。为此必须将 DoublePoint 传递到 setCenter 方 法。DoublePoint 由一对 XY 坐标定义。 如果点的位置是通过用户点击地图上特定位置生成的,则返回时通常采用像素为单位表示。MapJ 需 要采用以数字坐标表示的位置,为此需要使用转换方法 transformScreenToNumeric。MapXtreme Java 使用数字坐标系作为内部计算的基础坐标系。 以下示例展示创建屏幕点,并将其转换为“现实世界”的点和设置地图中心的完整过程。DoublePoint 是一个通过 x 和 y 坐标定义的点。 // Create the screen point DoublePoint screenpoint = new DoublePoint(event.getX(), event.getY()); // Create the real world point DoublePoint worldpoint = myMap.transformScreenToNumeric(screenpoint); // Set the center of the map myMap.setCenter(worldpoint); 设置缩放级别和地图中心 setZoomAndCenter 方法设置当前缩放级别和地图的中心。缩放级别采用距离单位来设置。地图中 心使用数字坐标系。以下是设置缩放级别和地图中心的示例。 // Create the screen point DoublePoint screenpoint = new DoublePoint(event.getX(), event.getY()); // Create the real world point DoublePoint worldpoint = myMap.transformScreenToNumeric(screenpoint); // Set the zoom to be twice the current zoom // and center on the point where the user clicked myMap.setZoomAndCenter(myMap.getZoom() * 2, worldpoint); 设置地图边界 使用 setBounds 可设置地图的边界矩形。该方法取用的 DoubleRect 由表示两个对角或其中点、宽 度和高度的坐标定义。后续内容对此作出了进一步的说明。 本例使用对角来设置放大地图区域的边界。 DoubleRect bounds = new DoubleRect (-1.969272, 50.560410, 1.443363, 52.315529); 本例使用中点、宽度和高度来设置世界地图的边界。 DoubleRect bounds = new DoubleRect(new DoublePoint(0,0),360,180); myMap.setBounds(bounds);第 9 章:MapJ API 开发人员指南 131 © 2006 MapInfo Corporation. 保留所有权利。 设置坐标系 坐标系数据存储在名为 micsys.txt 的投影文件中,该文件位于 MapXtreme-4.8.0/lib/common 目录下 的 micsys.jar 中。micysys.txt 文件列出了数以百计的支持坐标系以及相关的定义参数。有关最新的 附加详细信息,请参阅第 8 页第 1 章的新增和更新的坐标系支持。 坐标系可通过 MapJ 方法 setDisplayCoordSys 来设置。 String csProj = new String( "\"Azimuthal Equidistant (North Pole)\", 5, 62, 7, 0, 90, 90"); CoordSys ts = CoordSys.createFromPRJ(csProj); myMap.setDisplayCoordSys(ts); 此外,还可以使用 createFromMapBasic 来读取 MapBasic 字符串并通过某些预定义的常数来设置 坐标系。 有关详细信息,请参阅 HTML API 参考资料中的 CoordSys 类。 设置地图距离单位 地图单位可通过 MapJ 方法 setDistanceUnits 来设置。 LinearUnit distUnit = LinearUnit.kilometer; myMap.setDistanceUnits(distUnit); 添加图层 对于向地图添加额外的数据而言,Layers 对象的 addLayer 方法是最常用的 MapJ API 方法之一。尽 管 addLayer 方法简单且便于调用,但是还是需要采用若干步骤来说明所要添加的数据、取用数据的 位置和方法。数据可以采用文件形式或数据库记录形式,从本地或远程数据源取用。MapXtreme Java 使用数据提供方管理相应操作,有关说明请参阅第 10 章:在图层中绘制地图。 要访问 Layers 对象,可使用 MapJ 的 getLayers 方法。 通过编程保存地图 地图可以通过编程保存以供日后使用。此时既可选择存储为文件或数据库中的地图定义,也可选择 存储为命名地图,后者为地图的图层集合赋予唯一的名称。 将地图定义保存到文件 要将地图定义保存到文件,可象在加载地图定义时一样创建一个 FileMapDefContainer 容器 , 然后调 用 saveMapDefinition 方法 , 并向其传递所创建的容器和地图定义名称 .通过编程保存地图 132 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 以下代码展示如何将地图定义保存到文件。 String tabDir = "c:\\maps\\"; FileMapDefContainer fmdc = new FileMapDefContainer(tabDir); myMap.loadGeoset("c:\\maps\\asia.gst", "c:\\maps", null); myMap.saveMapDefinition(fmdc, "Asia"); 将地图定义存储到数据库表 在远程数据库中,地图定义采用长文本字符串(采用 XML 格式)的形式,存储在远程数据库任意表 的任意 Character Large Object (CLOB) 类型字段中。MapXtreme Java 可以在大小足以存储地图定 义的任意列中存储地图定义。在 VARCHAR 列中,存储的地图定义可能非常有限。列必须可以存储 地图定义大小的字符串。CLOB 列最大可以存储 2 或 4Gb 的数据,具体大小取决于数据库类型。所 有主要的数据库均具有 CLOB 类型列或与其非常类似的列。 MapXtreme Java 需要任意可存储地图定义的表至少具备以下条件: 1. 用于存储地图定义名称的 CHAR、VARCHAR 或类似类型的列。 2. 可以存储实际 XML 文本的 CLOB 列。 当然,除了上述列出的类型之外,还有其它众多的列可用。 以下示例展示了创建名为 MAPDEFINITIONS 表的 CREATE TABLE 语句(当前用户为该表的所有 者): CREATE TABLE MAPDEFINITIONS (NAME VARCHAR(40), MAPDEF CLOB) 执行此语句将在远程数据库中创建 MAPDEFINITIONS 表。本语句指定 NAME 列存储最多 40 个字符 的字符串,指定 MAPDEF 列存储 CLOB(大文本)值。 MapXtreme Java 安装程序安装的示例 SQL 脚本可用于在远程数据库中创建表 MAPDEFINITIONS, 该表的所有者为 MAPINFO(示例位于 /MapXtreme-4.8.0/examples/server/scripts 目录中)。这些 脚本执行的 CREATE TABLE 语句与此前所述语句非常相似,但是其创建的表 MAPDEFINITIONS 有 所不同,该表具备以下荐用结构: MapDefContainer 接口 通过编程方式存储地图定义调用了 MapDefContainer 接口,该接口提供了三个容器实现,具体取决 于信息存储的方式: • FileMapDefContainer 将地图定义存储到文件。 • JDBCMapDefContainer 将地图定义存储到数据库。 • FileMapDefContainer 将地图定义存储到命名资源库。 列类型 NAME VARCHAR(40) MAPDEF CLOB第 9 章:MapJ API 开发人员指南 133 © 2006 MapInfo Corporation. 保留所有权利。 此外,还有两个与特定数据库相关的实现用于 JDBCMapDefContainer:OraSoMapDefContainer 用 于 Oracle,IUSMapDefContainer 用于 Informix。所有其它 JDBC 数据库(如 SQL Server)均应该 使用 JDBCMapDefContainer。有关命名地图进一步的讨论,请参阅第 134 页。 MapXtreme Java Manager 中“保存地图定义”对话框的数据库面板将提示用户指定如何构建 FileMapDefContainer、JDBCMapDefContainer 或 NamedMapDefContainer,如下所示: 要将 XML 地图定义写入到 MapDefContainer,可使用 MapJ 类中的 saveMapDefinition() 方法。指 定要将地图定义保存到的容器的名称,以及所要保存的地图的名称。 以下代码展示如何将地图定义保存到 MAPINFO.MAPINFO_MAPDEFS 表。 String driverName = "oracle.jdbc.driver.OracleDriver"; String dbUrl = "jdbc:oracle:thin:@machinename:1521:dbSID"; String username = "mary"; String password = "mary123"; OraSoMapDefContainer mdc = new OraSoMapDefContainer (driverName, dbUrl, username, password); myMap.loadGeoset("c:\\maps\\asia.gst", "c:\\maps", null); myMap.saveMapDefinition(mdc, "Asia"); 命名地图 134 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 命名地图 为了便于检索保存的地图,可能需要通过唯一的名称来调用地图。本节介绍如何将地图保存为命名 地图并通过编程来检索相应的地图。要通过 MapXtreme Java Manager 命名资源面板来管理命名地 图,请参阅第 5 章:管理 MapXtreme Java。 使用 NamedMapDefContainer 存储命名地图 要通过编程方式保存命名地图,所用的 MapJ.saveMapDefinition() 版本必须可以接受 MapDefContainer 和地图名称。对命名地图,需要创建 NamedMapDefContainer。要创建 NamedMapDefContainer, 需要使用 JNDI Context (javax.naming.Context)。这既可以是 InitialContext (javax.naming.InitialContext), 也可以是 InitialContext(通过 lookup() 经由 InitialContext 获取)的子上下文。有关上下文和 InitialContexts 的详细信息,请参阅 Javadoc 中有关 JNDI API 的介绍。 要创建初始上下文,需要知道提供方的 URL,该 URL 是(最可能是)NamedResourceServlet 的 URL。 然后调用 NamedResourceContextFactory 类的 createInitialContext(providerURL) 工厂方法,如下 所示: Context initCtx = NamedResourceContextFactory.createInitialContext ("http://torpedo:8080/mapxtreme480/namedresource"); 此时可以使用 InitialContext 来创建 NamedMapDefContainer: NamedMapDefContainer container = new NamedMapDefContainer(initCtx); 现在要决定在何处存储命名地图,该位置是相对于命名资源库根目录的位置。(切记: NamedResourceServlet 已知命名资源库根目录的位置。) 例如,在名为 mymaps 的库的根目录下创建目录之后,需要将 MapJ 的当前状态作为 "my map" 保存 到该子目录。这一操作如下所示: // mapJ was previously initialized mapJ.saveMapDefinition(container, "mymaps/my map"); 本例中,"mymaps/my map" 表示一个复合名称。在指定复合名称时,名称的每个组成部分均必须以 /(正斜线)间隔。 注: 建议始终将命名资源(图层)保存在库的根目录的子目录中。 请求命名地图的图像 在将命名地图存储在命名资源库中之后,可以从 MapXtremeServlet 请求图像。为此,可使用接受地 图名称而非整个 MapJ 的 ImageRequestComposer 构造器。 // bounds represents the desired bounds for the resulting map image ImageRequestComposer imgReq = ImageRequestComposer.create( "http://localhost:8080/mapxtreme480/namedresource", "mymaps/my map", CoordSys.longLatWGS84, new DoubleRect(-72, 42, -73, 41),第 9 章:MapJ API 开发人员指南 135 © 2006 MapInfo Corporation. 保留所有权利。 640, 480, 256, Color.white, "image/gif"); 相应代码将创建一个对 640x480 的 256 色的白色背景 GIF 的请求。 要将此图像请求发送到 MapXtremeServlet,可执行以下操作: // create the remote renderer MapXtremeImageRenderer renderer = new MapXtremeImageRenderer( "http://localhost:8080/mapxtreme480/mapxtreme"); // render the map renderer.render(imgReq); // export to a file renderer.toFile("c:/temp/my map.gif"); 基本地图之外的其它特性 MapXtreme Java 提供的 API 可以实现对地图的全方位控制。本节摘要介绍其中的主要特性。 图元 记录是一组相关的信息列。例如,客户数据库中对于每个客户均有一条记录,其中包含了姓名、地 址、爱好等列。图元只是一条包含制表数据和几何信息的记录。 例如,MapXtreme 示例数据中的 World.tab 文件就是一个 MapInfo 格式数据库。对于数据库中的每 个国家或地区,均有一条记录。每个记录包括若干制表数据列,以及一个指向描述每个国家或地区 形状和位置的地理信息的引用。这样一条记录即可显示在地图之上。制表数据也称为属性数据,而 几何数据也称为几何对象。这两种类型的数据构成图元。 图元并不与 MapJ 对象直接相关,但是出于某些原因,图元还是相当重要的。正如此前所述,MapJ 是程序中所有地图函数的基础。它位于对象示意图的顶部。 Feature 对象位于程序的最底层,用于处理特定信息。该对象是对象模型中最为明确的对象,并且与 记录级别的信息相关。在 Feature 级别,可以为图形对象赋予不同的显示特性。指定图像对象外观的 特性是由 Rendition 对象设置的。有关 Feature 对象的详细信息,请参阅第 13 章:图元和搜索。 样式 每个图元均具备与其相关的样式,用于描述其在地图上的外观。Rendition 属性可分为如下 3 个一般 类别:填充、单笔填充和符号。填充属性控制区域的填充方式。单笔属性控制线条(或直线几何对象 或区域的边缘)的绘制方式。符号属性控制如何绘制用于点几何对象、线标记或符号填充的符号。 控制样式的 MapJ API 部分是 Rendition 类。由于有众多方法可用,因此组合使用可用样式的方式实 际上没有任何限制。样式可以指定给图元、图层、标注和专题,并可用于覆盖象征符号。有关样式 的详细信息,请参阅第 14 章:标注和样式。基本地图之外的其它特性 136 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 专题 无论是通过图层的 addLayer 方法、MapJ loadGeoset 方法,还是通过 loadMapDefinition 方法添 加图层,每个图层均具有其自己的特征,例如线条颜色、线条宽度等。这些特征是以数据源中的信 息为基础的。通常相应设置对于整个图层而言是一致的。例如,如果要从示例数据加载 World.tab, 每个国家或地区均将显示为一个由绿色填充的实体图案。图层中的每个图元显示的方式均相同。 专题可通过编程,基于某些条件来更改图层中部分或全部图元的外观。例如,如果要更改人口超过 5 千万的所有国家或地区的颜色,可以通过使用专题来实现。此处提供了 4 种可用的 Theme 类: • OverrideTheme — 更改整个图层的样式 • RangedTheme — 划分数据范围,并根据范围值来确定影线表示 • IndividualValueTheme — 通过影线表示共享特定属性值的图元组 • SelectionTheme — 对用户定义的选定图元列表应用样式 各个专题中的图元均具有与其关联的样式。Rendition 对象封装了用于图形和文本显示的样式属性。 专题还可创建用于标注,以区分同一图层中的标注。例如,创建范围标注专题用于显示和增长率相 关的定制大小的标注,此时即可令较大的标注表示较高的增长率。有关专题地图绘制的详细信息, 请参阅第 15 章:专题地图绘制和分析。在图层中绘制地图 本章介绍表和地图之间的关系以及两者如何通过图层创建所需级别的细节。 本章内容:  作为图层的地图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138  图层类型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138  Layers 集合:构建地图的模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . .139  使用数据提供方定义图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139  创建定制数据提供方. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142  定义 JDBC 图层的注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142  将图层添加到 MapJ Layers 集合. . . . . . . . . . . . . . . . . . . . . . . . . . .143  从远程数据库访问 TAB 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148  数据绑定. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148  注释图层(Annotation 图层). . . . . . . . . . . . . . . . . . . . . . . . . . . . .152  分析图层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152  命名图层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153  Layers 集合的方法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .154  缩放图层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .158  生成图层标注 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159  栅格图像. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .160  导入栅格图像的考虑因素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162  栅格样式标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163  MapXtreme Java 中的网格图像 . . . . . . . . . . . . . . . . . . . . . . . . . . .166作为图层的地图 138 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 作为图层的地图 我们此前已经介绍了作为图层集合的计算机地图概念。每个包含图形对象的表均可显示为地图图像 中的图层。 这些图层可视为透明,其中每个图层包含地图的不同组成部分。图层上下叠加在一起即可展现地图 的全貌。例如,第一个图层包含国界,第二个图层包含表示首都的符号,第三个图层包含高速公 路。这些透明图层上下叠加,即可构成一个完整的地图。 图层由地理图元和关联数据构成。例如,国界图层中的区域定义了每个国家的边界,其中可能具有 表示各国人口、文化程度或平均家庭收入的属性。通过使用具有附加信息的图层来创建地图,除了 可以创建精美的地图 , 还可查询图层信息进行分析和显示。此类地图在显示地图数据之间的关系时尤 为高效。 本章侧重于如何通过编程方式处理图层,例如定义图层和向地图添加新图层。本章还介绍包括注释图 层(Annotation 图层)和栅格图像在内的特殊类型的图层。要了解如何使用 MapXtreme Java Manager 的地图定义 GUI 加载图层,请参阅第 5 章:管理 MapXtreme Java。 图层类型 MapJ API 提供了多样的类,分别用于各种类型的图层,每个类表示不同方面的信息。位于顶级的类 是 com.mapinfo.mapj.AbstractLayer,它是表示一般图层的基础类。从 AbstractLayer 类中,可以 获得有关图层的信息,包括图层的类型和名称、缩放设置、几何边界和特定于应用程序的属性。 AbstractLayer 的子类是 com.mapinfo.mapj.DataLayer,它表示依赖于数据源信息的图层。该类可 用于从多种数据源中检索数据信息,包括 MapInfo 原始 TAB 格式、RDBMS 等。DataLayer 会仔细 检查数据提供方以获取数据信息。每种数据源都有其自己的数据提供方。请参阅第 139 页的使用数 据提供方定义图层。 MapXtreme Java Edition 中 DataLayer 有以下两种子类:FeatureLayer 和 AnalysisLayer。 FeatureLayer 包含 Feature 对象,如表示边界图元的区域对象;可以表示街道、网络或流程的折线; 以及可以表示各种项目(如手机信号基站、消防栓和路点)的点。该类包括可按某些标准(例如, 按属性、在某个区域内或在某点)搜索图元的方法。您将会经常使用这些方法。请参阅第 195 页第 13 章的搜索。 DataBind 图层是一种特殊类型的 FeatureLayer,其中空间图元的 MapInfo TAB 图层与包含那些空间 图元属性数据的 JDBC 数据源相关联。请参阅第 148 页的数据绑定。 AnalysisLayer 是一种 DataLayer,显示对图层中数据分析处理的结果。MapXtreme Java Edition 支持以 下三种类型的分析图层:饼图、并行条形图和堆叠条形图。这些图层对要分析的底层数据至少需要两 个变量才能生成有意义的结果。请参阅第 152 页的分析图层。在 com.mapinfo.mapj.AnalysisLayer 类下的 Javadocs 中,单击“代码示例”链接以显示创建饼图的示例。 其它特殊图层包括注释图层(驻留在内存中供存储搜索结果临时使用的表)、用于其它用途的图层 以及命名图层(该图层只是一个与命名资源相关联的图元或分析图层)。请参阅第 152 页的注释图 层(Annotation 图层)和第 153 页的命名图层。第 10 章:在图层中绘制地图 开发人员指南 139 © 2006 MapInfo Corporation. 保留所有权利。 栅格和网格图像也是 MapXtreme Java Edition 支持的图层类型。这两种图层是实际图元的位图而不 是这些图元的向量表示。这两种图层在作为地图的参考背景图层时非常有用。网格图像是一种特殊 的栅格图像,插入实际值(如某区域上某些点的海拔或降雨量)以在单元格值的范围内生成连续渐 变颜色。MapXtreme Java Edition 可以为进一步的分析返回单元格值。请参阅第 160 页的栅格图像 和第 166 页的 MapXtreme Java 中的网格图像。 Layers 集合:构建地图的模块 com.mapinfo.mapj.Layers 类是另一种类型的图层集合,不同于上述的图层集合。使用 Layers 类 的方法将图层添加到 Layers 集合、从 Layers 集合中删除图层以及对 Layers 集合中的图层重新排序。 实际上,每个 Layers 集合都包括 FeatureLayer。这些图层包含诸如邮政编码边界、建筑网络或选举 投票点的图元。FeatureLayer 具有的搜索方法可用于定位图层上的特定信息,这是将对数据频繁执 行的操作。 Layers 集合中的每个图层的行为都相互独立。其样式、缩放图层均可单独更改,而不会影响到任何 其它图层。 如何构建 Layers 集合 要构建地图,可以从向 Layers 集合添加图层入手。在前一章,我们介绍了使用 MapJ.loadMapDefinition 和 MapJ.loadGeoset 加载地图数据的代码。Layers 集合是通过相应地图定义的图层来确定的。在 加载地图定义之后,坐标系的显示将会更新,并删除此前的任何图层。 在创建 Layers 集合之后,即可添加更多图层。使用 Layers.addMapDefinition 方法时,在地图定义 中定义的所有图层都将添加到当前地图。图层现有的坐标系设置维持不变。 也可以使用 Layers.addLayer 或 Layers.addNamedLayer 方法单独添加图层。这些方法会将图层置于 集合的末端。位于集合末端的图层是底层图层,会最先绘制。Layers.insertLayer 或 insertNamedLayer 用于控制图层的位置。 如何绘制图层 Layers 集合中的地图图层将按照从 0 开始的索引以升序显示。FeatureLayer(0) 是顶层的图层, FeatureLayer(1) 是 FeatureLayer(0) 下面的图层,依此类推,底层图层最先绘制,顶层图层最后绘 制。正确排列图层的顺序很重要。 例如,当前有一个客户地点图层和一个人口普查地点图层。如果图层在 Layers 集合中的排序不正 确,MapXtreme 将最先绘制客户点,然后再显示人口普查地点图层。这样客户地点将由于人口普查地 点图层的存在而变得模糊。有关解释图层定位的代码示例,请参阅第 154 页的 Layers 集合的方法。 使用数据提供方定义图层 要将图层添加到 Layers 集合,必须先对其进行定义。数据提供方是定义图层的关键所在。 每个图层均有一个负责数据访问的内部对象,这个对象就是数据提供方。数据提供方不是由用户直 接创建的,而是其说明定义了图层。以下三个接口用于说明数据提供方(进而说明图层):使用数据提供方定义图层 140 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 • TableDescHelper — 说明数据 • DataProviderHelper — 定义数据源 • DataProviderRef — 说明如何获取数据 MapXtreme Java 的数据提供方可用于为以下数据源创建地图图层: • MapInfo 制表格式 (.tab) • 有空间选项的 Oracle • IBM DB2 Spatial Extender • Informix Universal Server SpatialWare DataBlade • SQL Server for SpatialWare • JDBC 兼容的表,包含经度和纬度列 • GeoTIFF 和 MIGrid 栅格 • ESRI Shapefiles • 分析图层 • ECW 栅格 • MrSid 栅格 • WMS 栅格 • 军事栅格(ADRG、CADRG、CIB、ASRP、USRP、NITF 和 DTED 0,1,2,3) • 数据绑定1 • 注释2 TableDescHelpers TableDescHelper 是一个用于说明所要访问的数据的接口。对于 MapXtreme 可以访问的每种不同类 型的数据源,都有一个 TableDescHelper 与之相对应。并且都具有一个和相应数据源相关的构造器 参数。 1. 可用于从 .tab 和 JDBC 数据源接检索数据,以便显示为单个图层。 2. 不是一个典型的数据提供方,其原因在于信息并未存储在数据库中,而是保存在内存中。有关详细信 息,请参阅第 152 页的注释图层(Annotation 图层)。第 10 章:在图层中绘制地图 开发人员指南 141 © 2006 MapInfo Corporation. 保留所有权利。 例如,用于说明 MapInfo 表(例如, world.tab)的 TABTableDescHelper 只需要一个表名来进行说 明。用于说明 Oracle 数据的 OraSoTableDescHelper 通过表名或 SQL 查询定义。本章的后续内容提 供了相应的代码示例。有关每个 TableDescHelper 的更多详细信息,请参阅联机 Javadoc 参考资料。 DataProviderHelpers DataProviderHelpers 定义数据源。如果是 MapInfo TAB 文件,则包含 .tab 文件的目录就是该文件的 数据源。因此,用于 tab 文件的 DataProviderHelper,即 TABDataProviderHelper,会将目录作为其 唯一的参数。 如果是由若干个表构成的地图,并且这些表都保存在 Oracle 数据库的一个实例中。那么此数据库将 成为每个表的数据源。OraSoDataProviderHelper 采用说明数据源的参数,例如服务器主机名、服务 器端口号、用户名和口令等。同一 DataProviderHelper 可用于同一数据源的不同表。有关每个 DataProviderHelper 的更多详细信息,请参阅联机 Javadoc 参考资料。 DataProviderRef 数据提供方内置远程操作的功能。DataProviderRef 说明了用于访问数据源的对象。此处有两种可 能:1) 包含 MapJ 的应用程序(进程)和此 FeatureLayer 可以直接访问数据源,或者 2) 应用程序可 以通过 MapXtremeServlet 的实例来间接访问数据源,然后由 MapXtremeServlet 将数据传输回应用 程序。直接的方法是通过 LocalDataProviderRef 来执行,间接的方法使用 MapXtremeDataProviderRef。 使用 LocalDataProviderRef 表示应用程序将直接与数据源通信。这意味着该应用程序必须可以使用 访问数据源所需的任意资源。例如,JDBC 驱动程序必须位于应用程序的 classpath 中,以便用于直 接访问 RDBMS 中的数据。创建定制数据提供方 142 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 客户端借助于 MapXtremeServlet 获取数据时将会使用 MapXtremeDataProviderRef。在使用三层 部署的体系结构时,这是最为典型的情况。此时,客户机只存在一个“存根”数据提供方,而实际 的数据提供方将通过 MapXtremeServlet 创建,并随后从数据源访问数据。采用这一部署,访问数据 源所需的资源就仅限于中间层。这样无需在客户机内部署 JDBC 驱动程序,MapXtremeServlet 即可 访问 RDBMS 中的数据。 何时访问数据? TableDescHelpers、DataProviderRefs 和 DataProviderHelpers 用于定义数据提供方。在最先定义和 创建图层时,并没有发生数据访问。作为对特定请求(例如,调用图层的 getTableInfo、图层的搜索 方法或渲染请求)的响应,DataProviderRef 只访问其底层数据源。 创建定制数据提供方 MapXtreme Java 还支持定制的数据提供方。有关如何构建定制数据提供方的详细信息,请参阅第 18 章:创建定制数据提供方。另请参阅 /examples/client/dataproviders 中读取逗号分隔数据的样本 数据提供方。 定义 JDBC 图层的注意事项 每个 JDBC 数据源都具有若干个相应的 DataProviderHelper 构造器。尽管有些构造器使用起来比较 方便,但是我们仍强烈建议设置 JDBC 图层使用连接池。这需要使用最普通的 DataProviderHelper 构造器。有关连接池的详细信息,请参阅第 12 章:访问远程数据。另请参阅位于任意 JDBC DataProviderHeleper 下的 Javadoc 所含的代码实例。 用于 JDBC 图层的 TableDescHelper 对象均具有某些共同的参数。当 JDBC 图层定义为表而不是 SQL 语句时,这些参数中的部分参数将成为可选。其中包括空间列、几何坐标系、几何尺寸和表级 别的样式。如果这些参数均未出现,则将搜索 MapInfo.MAPINFO_MAPCATALOG 查找相应信息。 如果已知相应的值,我们强烈建议在构建该对象时提供相应信息。这将避免对 MAPCATALOG 进行 额外的查询,从而提高应用程序的性能。第 10 章:在图层中绘制地图 开发人员指南 143 © 2006 MapInfo Corporation. 保留所有权利。 在没有指定主键列的情况下,MapXtreme 将在数据库中查询表的方案定义,查找适合于用作键的 列。首先将尝试找到正式定义为表的主键列的列;如果没有主键列,MapXtreme 将选择一个数据库 可确保其对于每行都唯一的列,该列不是伪列,且其类型应该为字符或数字。在 TableDescHelper 中确认主键列避免了因上述操作所耗费的资源,同时确保使用主键(如在选择类中)时出现预期的 行为。此外,在向 JDBC 列添加图元时,还将会对主键列进行特殊处理(请参阅第 202 页的注释图 层图元的主键),因此在此指定主键列十分重要。 JDBC 图层支持每图元的样式,即可为每个存储在数据库中的图元提供单独的样式。用于数据库表的 样式列包括在 MAPINFO_MAPCATALOG 中,位于名为 RENDITIONCOLUMN 的列之下。如果使用 EasyLoader 将 TAB 文件上载到远程数据库,系统即会创建此列。MapInfo 网站上提供了 EasyLoader 供您使用。请参阅第 148 页的从远程数据库访问 TAB 文件。 此外也可以为 JDBC 图层指定每图元标注样式。以便可为单个图层创建不同的样式标注。实际的样 式存储在定义图层的表的列中。但在这种情况下,EasyLoader 和 MAPCATALOG 将不支持每图元标 注样式。此时必须提供列,并在创建用于数据源的 TableDescHelper 时键入。 将图层添加到 MapJ Layers 集合 这是添加图层的常规步骤: 1. 创建 TableDescHelper 2. 创建 DataProviderHelper 3. 创建 DataProviderRef(需要 DataProviderHelper 作为输入) 4. 使用 Layers.addLayer 方法(采用 DataProviderRef 和 TableDescHelper 作为输入)。默认情况 下,这将该图层置于集合的底部。此外还可以使用 Layers.insertLayer。 各类 MapXtreme Java 支持的数据源都具有 TableDescHelper 和 DataProviderHelper 实现。相关摘 要如下表所示。有关详细信息,请参阅 Javadoc 中的 HTML 参考资料。 数据源 TableDescHelper DataProviderHelper MapInfo 表 TABTableDescHelper TABDataProviderHelper 有空间选项的 Oracle OraSoTableDescHelper OraSoDataProviderHelper IBM DB2 Spatial Extender DB2SETableDescHelper DB2SEDataProviderHelper Informix Universal Server SpatialWare DataBlade IusSpwTableDescHelper IusSpwDataProviderHelper SQL Server for SpatialWare SQLServerSpwTableDescHelper SQLServerSpwDataProvider Helper JDBC 兼容的表,包含经度 和纬度列 XYTableDescHelper XYDataProviderHelper 注释图层(Annotation 图层) AnnotationTableDescHelper AnnotationDataProviderHelper GeoTIFF 栅格 GeoTIFFTableDescHelper GeoTIFFDataProviderHelper将图层添加到 MapJ Layers 集合 144 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 用于 TAB、Oracle、IBM DB2 Spatial Extender 和 JDBC 兼容的数据源的代码示例如下。联机 Javadocs 参考资料中也提供了这些示例和其它相关示例。 TAB 数据提供方示例 以下是创建 TABDataProvider 并将图层指定给 MapJ 的示例。 // create the tab TableDescHelper TableDescHelper tableDescHelper = new TABTableDescHelper( new File("mytab.tab").getName()); // create the tab DataProviderHelper DataProviderHelper dataProviderHelper = new TABDataProviderHelper("d:\\maps"); // Create the Remote DataProviderRef needed to access the Data DataProviderRef dataProviderRef = new MapXtremeDataProviderRef( dataProviderHelper, "http://localhost:8080/mapxtreme480/mapxtreme"); // assign it to MapJ myMap.getLayers().addLayer(dataProviderRef, tableDescHelper, "tabLayer"); Oracle 数据提供方示例 以下是创建 OracleDataProvider 并将图层指定给 MapJ 的示例。务必确保 JDBC 驱动程序位于 classpath 中。 // Using Database specific DataProviderHelper DataProviderHelper dataProviderHelper = new OraSoDataProviderHelper( "dbName", 1521, "dbSid", "mary", "mary123", DriverType.thin, "oracle.jdbc.driver.OracleDriver"); ECW 栅格 ECWTableDescHelper ECWDataProviderHelper MrSID 栅格 MrSIDTableDescHelper MrSIDDatProviderHelper ESRI Shapefiles ShapeTableDescHelper ShapeDataProviderHelper 分析图层 AnalysisTableDescHelper AnalysisDataProviderHelper 数据绑定 * DataBindingTableDescHelper DataBindingDataProviderHelper MapInfo 网格 MIGridTableDescHelper MIGridDataProviderHelper Northwood 网格 NWGridTableDescHelper NWGridDataProviderHelper * 用于绑定源自同一 MapJ 图层中 .tab 和 JDBC 数据源数据的特殊数据提供方。有关详细信息,请参 阅第 148 页的数据绑定。 数据源 TableDescHelper DataProviderHelper第 10 章:在图层中绘制地图 开发人员指南 145 © 2006 MapInfo Corporation. 保留所有权利。 // Create a String array with the name(s) of the column(s) to use as a // unique key for records in the table String[] idColumn = {"mi_prinx"}; // Create a TableDescHelper // Required constructor when using a tablename TableDescHelper tableDescHelper = new OraSoTableDescHelper( "states", false, idColumn, "geoloc", null, RenditionType.none, null, RenditionType.none, CoordSys.longLatWGS84, 2, "mary"); // Required constructor when using a query TableDescHelper tableDescHelper2 = new OraSoTableDescHelper( "select pop_1980, pop_1990, state_name, geoloc, mi_prinx from states where pop_1990 < pop_1980 * 1.03", idColumn, "geoloc", null, RenditionType.none, null, RenditionType.none, CoordSys.longLatWGS84, 2); // Reference the remote DataProvider needed to access the data DataProviderRef dataProviderRef = new MapXtremeDataProviderRef( dataProviderHelper, "http://localhost:8080/mapxtreme480/mapxtreme"); //Add the layer myMap.getLayers().addLayer(dataProviderRef, tableDescHelper, "Oracle Spatial Layer"); IBM DB2 Spatial Extender Data Provider 示例 以下是创建 IBM DB2 Spatial Extender 的数据提供方并将图层指定给 MapJ 的示例。务必确保 JDBC 驱动程序位于 classpath 中。 // Using Database specific DataProviderHelper DataProviderHelper dataProviderHelper = new DB2SEDataProviderHelper( "dbHost", 1521, "dbName", "mary", "mary123", DriverType.thin, "com.ibm.db2.jcc.DB2Driver"); // Create a String array with the name(s) of the column(s) to use as a // unique key for records in the table String[] idColumn = {"mi_prinx"}; // Create a TableDescHelper // Required constructor when using a tablename TableDescHelper tableDescHelper = new DB2SETableDescHelper( "states", false, idColumn, "geoloc", null, RenditionType.none, null, RenditionType.none, CoordSys.longLatWGS84, 2, "mary"); // Required constructor when using a query将图层添加到 MapJ Layers 集合 146 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 TableDescHelper tableDescHelper2 = new DB2SETableDescHelper( "select pop_1980, pop_1990, state_name, geoloc, mi_prinx from states where pop_1990 < pop_1980 * 1.03", idColumn, "geoloc", null, RenditionType.none, null, RenditionType.none, CoordSys.longLatWGS84, 2); // Reference the remote DataProvider needed to access the data DataProviderRef dataProviderRef = new MapXtremeDataProviderRef( dataProviderHelper, "http://localhost:8080/mapxtreme480/mapxtreme"); //Add the layer myMap.getLayers().addLayer(dataProviderRef, tableDescHelper, "Oracle Spatial Layer"); XY 数据提供方示例 这一代码示例创建用于 JDBC 数据源的数据提供方,此时空间信息存储在 X, Y 列中。务必确保 JDBC 驱动程序位于 classpath 中。 // Create the DataProviderHelper // Using pooled connections (Recommended) // Using database specific DataProviderHelper (in this case the XY data // is located in an Oracle database) DataProviderHelper dataProviderHelper = new XYDataProviderHelper( "oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@serverName:1521:dbSid", "mary", "mary123"); // Create a String array with the name(s) of the column(s) to use as a // unique key for records in the table String[] idColumn = {"city_name"}; // Create a TableDescHelper // Required constructor when using a tablename: TableDescHelper tableDescHelper1 = new XYTableDescHelper( "city125", "mary", false, "longitude", "latitude", null, RenditionType.none, null, RenditionType.none, idColumn, CoordSys.longLatWGS84); // Required constructor when using a query: TableDescHelper tableDescHelper2 = new XYTableDescHelper( "select longitude, latitude, city_name from city125 where pop_1990 > 50000", idColumn, "longitude", "latitude", null,第 10 章:在图层中绘制地图 开发人员指南 147 © 2006 MapInfo Corporation. 保留所有权利。 RenditionType.none, null, RenditionType.none, CoordSys.longLatWGS84); // Reference the remote DataProvider needed to access the data DataProviderRef dataProviderRef = new MapXtremeDataProviderRef( dataProviderHelper, "http://localhost:8080/mapxtreme480/mapxtreme"); //Add the layer myMap.getLayers().addLayer(dataProviderRef, tableDescHelper1, "XY Layer"); SQL Server 数据提供方示例 以下是创建 SQL Server DataProvider 并将图层指定给 MapJ 的示例。务必确保 JDBC 驱动程序位于 classpath 中。 // Create the DataProviderHelper // Using pooled connections (Recommended) // Using database-specific DataProviderHelper DataProviderHelper dataProviderHelper = new SQLServerSpwDataProviderHelper( "machineName", 1526, "mary", "mary123", "com.merant.datadirect.jdbc.sqlserver.SQLServerDriver"); // Create a String array with the name(s) of the column(s) to use as a // unique key for records in the table String[] idColumn = {"sw_member"}; // Create a TableDescHelper // Required constructor when using a tablename: TableDescHelper tableDescHelper1 = new SQLServerSpwTableDescHelper( "states", "mary", false, idColumn, "sw_geometry", null, RenditionType.none, null, RenditionType.none, CoordSys.longLatWGS84); // Required constructor when using a query: TableDescHelper tableDescHelper2 = new SQLServerSpwTableDescHelper( "select state, statecap, sw_member, sw_geometry from states where pop_1990 > 2000000", idColumn, "sw_geometry", null, RenditionType.none, null, RenditionType.none, CoordSys.longLatWGS84); // Reference the remote DataProvider DataProviderRef dataProviderRef = new MapXtremeDataProviderRef( dataProviderHelper, "http://localhost:8080/mapxtreme480/mapxtreme"); //Add the layer myMap.getLayers().addLayer(dataProviderRef, tableDescHelper1, "SQLServer Layer");从远程数据库访问 TAB 文件 148 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 从远程数据库访问 TAB 文件 若要将 MapInfo 原始格式的 .TAB 表存储到 RDBMS 中,可以使用免费的实用程序 EasyLoader 上载 文件。 EasyLoader 实用程序可从 MapInfo 公司获得,用于将 MapInfo .TAB 文件上载到远程数据库,如 MapInfo SpatialWare for SQL Server。.TAB 文件中的空间信息在数据库中维护,用于在 MapInfo 公 司的产品(包括 MapXtreme Java Edition 和 MapXtreme 2005 (.NET))中执行查看和分析。 EasyLoader 支持以下数据库: • Oracle Spatial 8.17 或更高版本 1 • Informix Universal Server with SpatialWare DataBlade(IUS 驱动程序 2.8 或更高版本) • Microsoft SQL Server w/SpatialWare 4.6 和更高版本 2 • Microsoft Access 对于空间数据库支持,DBMS 必须由自身(如 Oracle Spatial)或借助附加的 SpatialWare Datablade/Extentions(如 MapInfo SpatialWare for IUS 和 SQL Server)来处理空间几何信息。 如果上述 DBMS 没有空间对象类型支持,则该表只能作为 XY 数据(XY 或带有 MapInfo 键的 XY (MICode))上载。 注: EasyLoader 不支持 IBM DB2 Spatial Extender。使用数据库提供的工具将 TAB 文件上载到数 据库。 有关如何将 .tab 文件上载到远程数据库管理系统的信息,请访问 www.mapinfo.com 下载免费的实 用程序 EasyLoader 以及用户指南。 数据绑定 MapXtreme Java 支持数据绑定,其中的 MapInfo .tab 文件可以与 JDBC 数据源合并为 MapJ 之中的 单一图层。使用数据绑定访问 .tab 文件中的几何数据,将其与数据库记录(缺少空间信息)的属性 数据相结合。属性数据可定义为表或查询。 执行数据绑定(或联接)操作的条件是 JDBC 表中的每条记录只与 TAB 表中的一条记录匹配。但 是,TAB 表中的记录可以匹配 JDBC 表中的任何记录(TAB 到 JDBC 的记录可以是 1 对多的关 系)。将会忽略与 TAB 记录不匹配的 JDBC 记录。 MapXtreme 支持以下两种形式的数据绑定: • 对于已从 JDBC 表绑定的数据列,与 JDBC 记录不匹配的 TAB 记录将返回空值(这类似于数据库 外部联接)。这是默认的行为。 • 若 setReturnNonBoundTABRecord(boolean) 方法设置为 false,则返回匹配的 TAB 记录(这相当 于数据库内部联接) 数据绑定通过位于 com.mapinfo.dp.databinding 文件包之内的数据提供方处理。 1. MapXtreme Java Edition 支持 Oracle Spatial v9i 以及更高版本。 2. MapXtreme Java Edition 支持 SQL Server 2000 with SpatialWare 4.8 和更高版本第 10 章:在图层中绘制地图 开发人员指南 149 © 2006 MapInfo Corporation. 保留所有权利。 要通过编程方式合并两个表,可执行以下操作: 1. 为每个表创建 TableDescHelper。 2. 创建 DataBindingTableDescHelper,令其构建器采用在上一步中创建的两个 TableDescHelpers。 此外,需要链接两个表的列名。列名无需相同。一个或多个列均可用于绑定两个数据源。 3. 为每个表创建 DataProviderHelper。 4. 创建 DataBindingDataProviderHelper,令其构建器取用在上一步中创建的两个 DataProviderHelper。 5. 创建在 DataBindingDataProviderHelper 中传递的 DataProviderRef。 6. 将图层添加到 Layers 集合。 DataBindingDataProviderHelper 将 searchXXX 调用分配给适当的 DataProvider,并同步两个结果。 此外,还可通过 Layer Control bean 向 VisualMapJ 添加数据绑定图层。请参阅第 92 页第 7 章的 AddLayer 向导。 有关在添加图层向导中添加数据绑定图层的详细信息,请参阅第 54 页第 5 章的添加数据绑定图层中 的“添加数据绑定图层”一节。 联接时解析列名 提供给图层搜索方法的 columnNames 数组使用以下逻辑来决定是使用源自 TAB 数据的列还是使用 源自 BIND 数据的列。 TAB 文件 + JDBC 数据库表: • 若列名(源自 columnNames 数组)包括一次且列名非限定(未追加 TAB 文件名或 BIND 表名) 以及列名位于 TAB 文件或 BIND 表中(但不同时位于这两者中),那么将使用源自该文件 / 表的值。 • 若列名包括一次且列名非限定以及列名同时位于 TAB 文件和 BIND 表中,那么将使用 TAB 值。 • 若列名包括一次且列名限定(已追加 TAB 文件名或 BIND 表名),那么将使用源自限定文件 / 表 的值。 • 若列名包括两次且列名同时满足 TAB 文件和 BIND 表名的要求,那么将使用 TAB 值。 TAB 文件 + JDBC 数据库查询: • 若列名包括一次且列名非限定以及列名位于 TAB 文件或 BIND 查询中(但不同时位于这两者中), 那么将使用源自该文件 / 查询的值。 • 若列名包括一次且列名非限定以及列名同时位于 TAB 文件和 BIND 查询中,那么将使用 BIND 查 询值。 • 若列名包括一次且列名满足 TAB 文件的要求,那么将使用 TAB 值。 • 若列名包括两次且其中一个列名满足 TAB 文件的要求,那么将使用 TAB 值。 聚合数据绑定图层的数据 聚合用于将所有带有相同联接列值的 JDBC 记录合并到一条记录中。这样就可以确保不会多次返回 TAB 记录。若 JDBC 数据由表名定义,则仅支持聚合属性。若 JDBC 数据由查询定义,则会抛出 UnsupportedOperationException。有关详细信息,请参阅第 150 页的数据聚合。数据绑定 150 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 搜索数据绑定图层的图元 从搜索返回的数据绑定图层上的图元在某些情况下将没有唯一的关键字值。若 TAB 图元的 Mapinfo_ID (若出现在请求列的列表中)用作数据绑定图元的关键字,且 TAB 图元与多个 BIND 图元匹配,则 会有多个数据绑定图元具有相同的关键字(Mapinfo_ID 值)。 但有一个特定情况,尝试将带有非唯一关键字的数据绑定图元添加到注释图层时将会导致故障。若 JDBCTableDescHelper 标识数据库表(而不是查询),通过对表中用来将该表与 tab 文件相联接的 列创建索引可以改善性能。 在地图定义中保存数据绑定图层 DatabindingLayerXMLHandler 更改了地图定义输出的形式以处理 BIND 数据请求并保持内部联接的 请求。这些更改不会引起 DTD 的更改,但会使用与 MapXtreme Java 4.8 不兼容的构建编写地图定 义;表元素现在可以包含 SQL 查询字符串(如下所示)以及指示不返回非边界 tab 记录的属性。该 属性不会引起故障,但查询字符串与 MapXtreme Java 4.8 不兼容。 SELECT * FROM usa.tab, (select state from usplaces where round((sw_member*.01),0)=(sw_member*.01) and state<'M' group by state order by state) AS JDBCQUERY WHERE usa.tab.STATE=JDBCQUERY.STATE
数据聚合 数据聚合是多个记录 / 图元作为两个数据源相关联的结果进行合并的过程。 MapXtreme Java 包含一个类 com.mapinfo.dp.databinding.Aggregation,该类定义属性源的列值如 何聚合到数据绑定图层。例如,对于以下两个表: • 几何 .tab 文件,包含销售区域且带有区域名属性列。 • 属性数据库,包含区域名和每个销售员的销售额。其中每个销售区域有多个销售员。 现在如果对点执行搜索,则将会返回销售区域 A,该区域有两个销售员,相应的 FeatureSet 中将返 回两个图元。以下是可能的结果: 现在定义一个聚合,或是说总计。代码如下所示: dbDesc.addAggregation(Aggregation.SUM); 区域名称 销售额 销售员 A 100000 Smith A 200000 Peterson第 10 章:在图层中绘制地图 开发人员指南 151 © 2006 MapInfo Corporation. 保留所有权利。 如果执行相同的搜索,我们现在将只能获取一个图元。以下是可能的结果: MapXtreme Java 将采用以下方式聚合数据: • 总计 — 返回该组中所有记录值的总和 • 计数 — 返回一组记录中的记录数 • 均值 — 返回该组中所有记录值的平均值 • 最小值 — 返回该组所有记录中最小的值(或非数字列中的第一个值) • 最大值 — 返回该组所有记录中最大的值(或非数字列中的最后一个值) 用于非数字列的有效聚合为最小值、最大值和计数。 可以为每个列定义一个聚合。也可以根据需要删除聚合。 如果执行搜索,并要求返回 columnA 和 columnB,但是只定义了用于 columnB 的聚合,此时将会抛 出异常。要么所有返回的列必须定义聚合,要么所有的列都不定义聚合。 所有和聚合一起使用的方法均位于 DataBindingTableDescHelper 上。 通过特定搜索返回的记录包括所有几何信息,即使数据库(属性表)中没有相应记录。 代码示例:数据绑定 String tabDir = "c:\\maps\\"; TABDataProviderHelper tabDPH = new TABDataProviderHelper(tabDir); String tabFile = "states.tab"; TABTableDescHelper tabDesc = new TABTableDescHelper(tabFile); String dbUrl = "jdbc:oracle:thin:@spatial.mapinfo.com:1521:maps"; String user = "spatial"; String password = "spatial123"; String driverClass = "oracle.jdbc.driver.OracleDriver"; JDBCDataProviderHelper jdbcDPH = new JDBCDataProviderHelper (dbUrl, user, password, driverClass); String tableName = "USA"; JDBCTableDescHelper jdbcDesc = new JDBCTableDescHelper( tableName, false, user); DataProviderHelper dbDPH = new DataBindingDataProviderHelper(tabDPH, jdbcDPH); String[] tabBindCol = {"State", "State_Name"}; String[] jdbcBindCol = {"STATE", "STATE_NAME"}; TableDescHelper dbDesc = new DataBindingTableDescHelper( tabDesc, jdbcDesc, tabBindCol, jdbcBindCol); DataProviderRef dataProviderRef = new MapXtremeDataProviderRef( 区域名称 销售额 A 300000注释图层(Annotation 图层) 152 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 dbDPH, "http://localhost:8080/mapxtreme480/mapxtreme"); myMap.getLayers().addLayer(dataProviderRef, dbDesc, "DataBinding Layer"); 注释图层(Annotation 图层) 注释图层(Annotation 图层)是特殊的地图图层,该图层包含在特定地图区域上标记或放置为重点 的图元。通常,从搜索方法返回的图元将添加到注释图层(Annotation 图层)。 例如,在特定的点半径中选择和突出显示图元,可使用 FeatureLayer.searchWithinRadius 方法, 返回该点的圆图元。要显示搜索半径,可使用 FeatureFactory 的 createCircularRegion 方法。在创建图 元之后,可使用 addFeature 方法来向注释图层(Annotation 图层)添加新图元。注释图层(Annotation 图层)在搜索之前或搜索之后创建均可。 可以具有多个注释图层(Annotation 图层)。用于注释图层(Annotation 图层)的表驻留在内存中。 该表使用 AnnotationDataProviderHelper、Annotation TableDescHelper 和 LocalDataProviderRef 创 建。该表在创建之后,可以象其它图层一样处理。 注释图层(Annotation 图层)的保存和任意其它图层的保存相同。添加到注释图层(Annotation 图 层)的任意图元将作为具有符合 GML 2.0 规格存储的几何信息的 OGC SimpleFeature,存储在地图 定义中。 以下是创建注释数据提供方并将其添加到 MapJ Layers 集合的示例: // create the annotation table desc helper TableDescHelper tableDescHelper = new AnnotationTableDescHelper("annLayer"); // create the annotation data provider DataProviderHelper dataProviderHelper = new AnnotationDataProviderHelper(); // An Annotation layer requires the use of local memory space, so we // create a Local DataProvider Ref DataProviderRef dataProviderRef = new LocalDataProviderRef(dataProviderHelper); //assign it to MapJ - note getLayers() myMap.getLayers().addLayer(dataProviderRef, tableDescHelper, "AnnLayer"); 分析图层 MapXtreme Java 提供了包括饼图、并行条形图和堆叠条形图的功能。并行条形图垂直显示,而堆叠 条形图则水平显示。这些图均通过 AnalysisLayer 类表示。详细信息,请参阅第 242 页第 15 章的使 用分析图层。第 10 章:在图层中绘制地图 开发人员指南 153 © 2006 MapInfo Corporation. 保留所有权利。 命名图层 命名图层是给定唯一名称的一种图层类型。命名图层和 MapXtreme Java 中的其它命名资源具有相 同的优点: • 该资源以其名称所知,而非其属性。 • 该资源驻留在一个位置,但是可从多个位置引用。 • 要更改应用程序或数据的外观或行为,只需更改资源即可,不需要更改每个应用程序或数据文件。 此外,正如其它命名资源(地图、样式)一样,命名图层使用 Java 命名和目录接口 (JNDI) 应用程 序编程接口 (API)。NamedLayer 对象透明处理所有和 JNDI 的交互。 要通过 MapXtreme Java Manager 命名资源面板来管理命名图层,请参阅第 5 章:管理 MapXtreme Java。 使用 NamedResource 存储命名图层 任意图层(TAB、注释、JDBC)均可通过 JNDI API 以编程方式存储为命名图层。JNDI 上下文 (javax.naming.Context) 包括两种用于将命名资源保存到命名资源库中的方法。如下所示: • bind(String name, Object obj) • rebind(String name, Object obj) 使用 bind() 方法可将全新的资源(以前不存在)保存到库中。使用 rebind() 方法可更新库中已经存 在的资源。 所需的第一个对象是 JNDI 上下文。既可以是 InitialContext (javax.naming.InitialContext),也可以是 InitialContext(通过 lookup() 经由 InitialContext 获取)的子上下文。有关上下文和 InitialContexts 的 详细信息,请参阅 Javadoc 中有关 JNDI API 的介绍。 要创建初始上下文,需要知道提供方的 URL,该 URL(最可能)是 NamedResourceServlet 的 URL, 负责处理所有命名资源请求的 MapXtreme Java 类。然后调用 NamedResourceContextFactory 类的 createInitialContext(providerURL) 工厂方法,如下所示: Context initCtx = NamedResourceContextFactory.createInitialContext( "http://localhost:8080/mapxtreme480/namedresource"); 现在只需要决定在何处存储命名图层,该位置是相对于命名资源库根目录的位置。 在名为 "my layers" 的库的根目录下创建目录之后,即可在 "my states" 子目录中保存特定图层。这一 操作如下所示: // fetch the "states" layer from the Layers collection FeatureLayer states = (FeatureLayer) myMap.getLayers().get("states"); // create a named resource out of the layer NamedResource resource = new NamedResource(states); // Now save it via the container we obtained above initCtx.bind("my layers/my states", resource);Layers 集合的方法 154 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 本例中,"my layers/my states" 表示一个复合名称。在指定复合名称时,名称的每个组成部分都必须 以 /(正斜线)间隔。 注: 命名资源(图层)必须始终保存在库的根目录的子目录中。这些资源绝对不能直接存储在根 目录中。 将命名图层添加到 Layers 集合 要将此前存储的命名图层添加到 Layers 集合,必须使用 Layers 集合的以下方法之一: • AbstractLayer addNamedLayer(String providerURL, String path, String resourceName) • AbstractLayer addNamedLayer(Context context, String resourceName) • AbstractLayer insertNamedLayer(String providerURL, String path, String resourceName, int pos) • AbstractLayer insertNamedLayer(Context context, String resourceName, int pos) 采用 addNamedLayer() 和 insertNamedLayer() 时,接受的是 providerURL 和路径而非 JNDI 上下 文,根本无需作出任何 JNDI 调用。因此,要添加名为 "my states" 的图层(位于命名资源库的根目 录的 "my layers" 子目录中),可执行以下操作: // mapJ was previously initialized Layers layers = myMap.getLayers(); layers.addNamedLayer("http://localhost:8080/mapxtreme480/namedresource", "my layers", "my states"); 路径参数为可选(可指定为空)。如果指定路径,那么 resourceName 参数必须相对于给定路径。 如果没有给定路径,那么 resourceName 必须相对于命名资源库的根目录。因此可使用上述调用来 替代这一 addNamedLayer() 调用,如下所示: layers.addNamedLayer("http://localhost:8080/mapxtreme480/namedresource", null, "my layers/my states"); 此前接受 JNDI 上下文的 addNamedLayer() 和 insertNamedLayer() 的版本需要先获取有效的 JNDI 上下文。有关如何获取 JNDI 上下文的详细信息,请参阅上述的存储命名图层一节。 Layers 集合的方法 在添加某些图层之后,可能需要对 Layers 集合作出某些更改。本节说明有助于进行修改的若干种方 法。在应用程序中,将会通过 Layers 集合来频繁引用对象和方法。 获取集合中的图层名称 本例说明的项数是集合中的图层数。例如,如果要遍历集合中的各项以获取各项的名称,这一示例 将会非常有用。 Layers layers = myMap.getLayers(); for (int i = 0; i < layers.size(); i++) { AbstractLayer layer = layers.get(i); String layerName = layer.getName(); }第 10 章:在图层中绘制地图 开发人员指南 155 © 2006 MapInfo Corporation. 保留所有权利。 从集合获取图层 get(string name) 方法从集合获取特定的 Layer 对象。get(string name) 方法将一个图层返回为对 象。可以通过图层名称对其进行引用,例如 Highways 或 Cities。此外还可以通过其位置来对其进行 引用。get(index at) 方法返回集合中给定位置的图层,例如 0、1、2 等。索引基于 0。以下示例展示 了上述两种途径: AbstractLayer myLayer = myMap.getLayers().get("highways"); myLayer = myMap.getLayers().get(5); //gets the 6th layer 插入图层 insertLayer 方法将图元图层添加到 Layers 集合,该集合提供 DataProvider 信息和放置图层的位 置。类似于添加图层,插入图层时必须提供 DataProviderRef 和 TableDescHelper。集合中插入图层 之后的任意图层的位置都将下移一位。 DataProviderRef dataProviderRef = null; TableDescHelper tableDescHelper = null; // inserting a layer at position 5 myMap.getLayers().insertLayer(dataProviderRef, tableDescHelper, 5, "newLayer"); 移动图层 move 方法在 Layers 集合中重新定位图层。第一个参数是 From 位置(顶级图层 = 0),第二个参数 是 To 位置。 // moving a layer from the bottom to the top myMap.getLayers().move(myMap.getLayers().size() - 1, 0); 删除图层 remove 方法从地图删除指定图层。 //removing a layer by position (top layer) myMap.getLayers().remove(0); //removing a layer by name myMap.getLayers().remove("highways"); 删除所有图层 removeAll 方法从地图删除所有图层。 //removing all layers myMap.getLayers().removeAll(); MapJ HTML 参考资料中提供了 Layers 集合方法和属性的完全列表。Layers 集合的方法 156 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 检索图层的界限 使用 getBounds() 方法可检索图层界限,以便可以查看整个图层。 此前,检索图层的界限是一个大量占用计算机资源的操作,对于 JDBC 和栅格图层尤其如此。该操 作需要查询所有图元,然后合并其界限。 在 TAB 图层上执行调用之后,getBounds() 查询 .map 文件以获取边界信息。对于 JDBC 图层, getBounds() 查询 MapCatalog(如果没有边界信息,则将返回空)。如果成功,将返回地图的数字 CoordSys 中的 DoubleRect。随后,可用于将地图边界设置为图层边界,这一方式比此前查看整个 图层的效率更高。 此方法还在新的 ViewEntireLayer MapTool bean 中提供了底层功能。在 MapXtreme Java Manager 接口中可以见到 ViewEntireLayer bean 的工作示例。 代码示例 以下是使用 Layer.getBounds() 对 MapJ 中一个图层或所有图层设置地图边界的示例应用程序。 // setting the MapJ's bounds to the DoubleRect that encompasses all of the // features in a particular layer obtain a reference to a layer in the // MapJ DataLayer lyr = (DataLayer) myMap.getLayers().get(0); //get the layer's bounds DoubleRect lyrBounds = lyr.getBounds(); //check if the layer's bounds are null if (lyrBounds != null) { myMap.setBounds(lyrBounds); } // setting the MapJ's bounds to the DoubleRect that encompasses the // bounds of all of the layers in the MapJ //get all of the layers in the MapJ Layers ls = myMap.getLayers(); //create the bounds for all the layers in the MapJ DoubleRect allLayerBounds = new DoubleRect(); //initialize it allLayerBounds.initBounds(); for (int layerCount = 0; layerCount < ls.size(); layerCount++) { //get the next layer DataLayer l = (DataLayer) ls.get(layerCount); //get the bounds of the layer lyrBounds = l.getBounds(); //if the layer's bounds are not null, merge it with the bounds for //the entire MapJ第 10 章:在图层中绘制地图 开发人员指南 157 © 2006 MapInfo Corporation. 保留所有权利。 if (lyrBounds != null) { allLayerBounds.merge(lyrBounds); } } myMap.setBounds(allLayerBounds); 如果 getBounds() 返回为空 但如果 getBounds() 返回为空?如果获取边界信息对您很重要,则可能需要考虑使用此前提及的“强 制”方法,查询所有图元并合并边界信息。但是,对于较大的 JDBC 表或查询或栅格图像,此操作 将会对性能造成明显影响。例如,对不是 gif、jpeg、png 或 tiff 的栅格图像,MapXtreme Java 必须 将整个图像读取到内存中,然后获取宽度和高度,为此要占用大量的 CPU 时间。此时必须确定是否 值得占用大量 CPU 时间来查看整个图层。 要使用强制方法获取图层边界,可执行以下代码示例: DoubleRect layerBounds = new DoubleRect(); // create a new queryparams that returns geometry only QueryParams qp = new QueryParams(SearchType.entire, true, false, false, false, false); FeatureSet fs = null; try { // return geometries only fs = myLayer.searchAll((List) null, qp); // initialize layerBounds layerBounds.initBounds(); // get next feature in fs Feature feat = fs.getNextFeature(); while (feat != null) { // get the bounds of each geometry in the FeatureSet Geometry geom = feat.getGeometry(); if (geom != null) { // build the bounds of the layer by merging the // bounds of the feature... with the total // rectangle layerBounds.merge(geom.getBounds()); } // get next feature in fs feat = fs.getNextFeature(); } } finally { try {缩放图层 158 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 if (fs != null) { fs.dispose(); } } catch (Exception ex1) { } } // add a bit of padding if (layerBounds != null && layerBounds.area() != 0.0 && layerBounds.area() != Double.POSITIVE_INFINITY) { layerBounds.set( layerBounds.center(), layerBounds.width() * 1.05, layerBounds.height() * 1.05); } 缩放图层 有时可能只需在特定的缩放级别显示地图图层。缩放图层控制地图图层的显示,以便只在地图的缩 放级别处于预设距离之内时显示。各个图层可设置不同的缩放图层级别。 例如,如果地图包括街道图层,则可能会发现在用户将地图缩至太小时街道变得过于模糊。使用缩放 图层设置地图,以便 MapXtreme 在用户将地图缩小至特定距离(例如 5 英里的距离)时不显示街道。 注: 缩放图层是提高渲染地图性能最重要的因素之一。 以下示例代码通过修改 Layer 对象的属性设置缩放图层,以便该图层只在地图缩放介于 10 和 30 km 之间时显示。 // set layer for zoom layering from 10 to 30 kilometers myLayer.setZoomLayer(true); myLayer.setMinZoom(new Distance(10.0, LinearUnit.kilometer)); myLayer.setMaxZoom(new Distance(30.0, LinearUnit.kilometer));第 10 章:在图层中绘制地图 开发人员指南 159 © 2006 MapInfo Corporation. 保留所有权利。 此外还可以为地图的各个图层设置不同的缩放级别。例如,有街道图层、县界图层和州界图层。我 们希望只有在缩放级别小于 8 英里时令街道图层可见。在缩放级别处于 20 英里和 200 英里之间时显 示县界图层。并且希望只有在缩放级别大于 100 英里的时候令州界图层可见。 生成图层标注 如果没有说明图元的标注,地图就无法体现其实际的用途。MapXtreme 支持多种标注属性,赋予地 图易于区别的外观并提供了帮助信息。 直线标注是根据地理对象的标记锚点位置来绘制的。该标注的位置与对象的中点接近,但不一定非 是对象的中点。曲线标注贴合多边形或多边形路径的曲线。 标注是动态连接到其地图对象的。如果数据或地理信息改变,则标注也会随之改变。标注内容由与 地理对象关联的数据确定。 图层可设置为使用 FeatureLayer.setAutoLabel 方法自动标注。如果图层为自动标注,则 isAutoLabel 方法将返回 True 或 False。 除了标注内容之外,还可以通过使用 LabelProperties 类的方法来控制自动标注的显示和样式。也可 设置用于显示标注的条件、显示的样式及其对图层中所有对象的优先级。 标注是 MapXtreme 的强大功能之一,我们专门对其进行了介绍。请参阅第 14 章:标注和样式。栅格图像 160 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 栅格图像 栅格图像是可以包含在地图中的另一种图层。栅格是计算机化的图片,其中包含一行一行的小点 (像素)。有时也称其为位图。航拍照片和卫星成像是 GIS 中最常见的栅格数据。 在 MapXtreme Java 应用程序中,可以将栅格图像显示为所创建的地图的背景幕。随后,即可在图 像上覆盖附加数据,例如街道地图和客户位置。 注: 本节介绍将栅格图像引入 MapXtreme Java 的有关信息。不要将这一点和完整地图的栅格图像 输出混为一谈,该输出由 MapXtremeServlet 在 HTML 页面中返回。有关栅格输出的详细信 息,请参阅第 11 章:渲染涉及的考虑因素。 要将栅格图像显示为地图图层,该图像必须包含地理注册信息,即相应于地理位置的坐标。以便定 义地图图像的正确位置。 要将图像注册为地理信息正确的图像,可以将图像引入 MapInfo Professional 并进行注册。许多 USGS 地图图像都带有关联的 .tab 文件。 栅格可直接或通过从 MapInfo 本地表 (TA) 的引用加载到 MapXtreme 应用程序中。栅格的加载方式 取决于栅格注册所需的格式和信息(栅格在地球上所在的位置)。 版本 4.8 支持以下栅格格式: • ECW • MrSID • 军事栅格:ADRG、CADRG、CIB、DTED 和 NITF • GeoTIFF • TIFF、GIF、JPEG、PNG 和 Java ImageIO 支持的任何格式第 10 章:在图层中绘制地图 开发人员指南 161 © 2006 MapInfo Corporation. 保留所有权利。 所有格式(除 GeoTIFF 之外)都包含 TAB 文件中的地理参考。GeoTIFF 图像文件本身就存储了地 理参考信息。 若不是栅格格式,WMS 支持使用 MapXtreme Java 的栅格引擎以显示从 WMS 服务器返回的图像。 有关 WMS 的详细信息,请参阅第 19 章:Web 地图服务。 MapXtreme Java 还可以加载显示为栅格的 MapInfo Grid 和 Vertical Mapper Grid 文件。这些格式也 包括数据,因此可以使用 searchAt Point 并为拐点表创建基本图例。请参阅第 166 页的 MapXtreme Java 中的网格图像。 将栅格图层添加到 MapJ 栅格图像引入地图的方式和添加其它地图图层的方式相同 — 通过创建说明图像及其位置的数据提供 方。如果栅格带有关联的 .tab 文件,则需要创建 TABDataProvider。对于 GeoTIFF 图像,则需要创 建 GeoTIFFDataProvider。 以下代码说明了如何创建 GeoTIFFDataProvider 以及将 GeoTIFF 图像添加到地图。此时,图像将存 储在本地系统之中,并将由 LocalDataProviderRef 进行检索。 // Create a TableDescHelper that points to the Tiff image TableDescHelper tableDescHelper = new GeoTIFFTableDescHelper("e:\\image\\dcquad.tif"); // Create DataProviderHelper // (**note this constructor takes no parameters) DataProviderHelper dataProviderHelper = new GeoTIFFDataProviderHelper(); // If the data is local, use a LocalDataProviderRef DataProviderRef dataProviderRef = new LocalDataProviderRef(dataProviderHelper); // Insert the layer into the map layer collection myMap.getLayers().addLayer(dataProviderRef, tableDescHelper, "GeoTIFF Layer"); MapXtreme Java 实现灵活的栅格处理方案,可用于动态创建数据提供方。如果栅格注册到 TAB 文 件,则 TABDataProvider 将读取 RasterDataProviderFactory.xml,确定在加载栅格文件时所要使用 的栅格数据提供方。RasterDataProviderFactory.xml 提供栅格数据提供方信息的读取规则。 支持的栅格数据提供方是 JaiDataProvider。JaiDataProvider 用于读取 GIF、JPG、PNG 和 JPEG2000 栅格文件。此类使用 Java 高级图像 (JAI) API,用于加载栅格文件。与 RasterDataProviderFactory.xml 中的 JaiDataProvider 关联的后缀列表并非完全列表,用户可以通过参数来读取 JAI 可以读取的任意 栅格格式。 注: 如果图像无法由支持的栅格数据提供方处理,则将会抛出异常,表示无法处理的特定文件。导入栅格图像的考虑因素 162 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 添加自定义栅格数据提供方 MapXtreme Java Edition 将在栅格数据提供方可用时读取任意格式的图像。MapXtreme 支持多种常 用图像格式。但是,也可以编写自己的图像格式。请参阅第 263 页第 18 章的创建定制数据提供方。 创建定制栅格数据提供方后,必须将其添加到 \MapXtreme-4.8.0\lib\client\RasterDataProviderFactory.xml。以下是要遵循的 DTD: ]> 例如,要添加名为 MyDataProvider 的栅格数据提供方,请构建类似如下的 RasterDataProviderFactory.xml: mdp com.yourapplication.MyDataProvider 导入栅格图像的考虑因素 以下内容介绍导入栅格图像时的注意事项。 设置栅格坐标系的显示 在向地图添加栅格图像之后,确保将 MapJ 的显示坐标系设置为栅格图层的坐标系,其原因在于 MapXtreme Java 不会对栅格图像进行再次投影。 以下代码示例显示了如何确定用于栅格图层的坐标系,以及设置相应坐标系的显示方法。 TableInfo ti = myLayer.getTableInfo(); CoordSys cSys = ti.getCoordSys(); myMap.setDisplayCoordSys(cSys); 栅格和性能 由于在显示和使用栅格图像时增加了对系统的要求,因此我们强烈建议使用 64 MB 或更大内存来扩 展堆大小的上限(具体取决于所用应用程序和栅格文件类型)来启动服务器或应用程序。第 10 章:在图层中绘制地图 开发人员指南 163 © 2006 MapInfo Corporation. 保留所有权利。 例如,要在使用 MapXtreme Java Manager 加载图层时增加堆大小的上限,可在命令行键入: java -mx64M com.mapinfo.mjm.client.MJMClient 本地渲染栅格图像 所有栅格图像的任意处理都必须在本地完成。Renderer 对象和图像文件必须位于同一计算机上,因 为两者都需要作为随机访问文件读取。 栅格样式标记 栅格样式标记包含在保存栅格注册信息的同一 .tab 文件之内。这些标记说明图像的特定显示效果, 其中包括亮度、对比度、灰度、透明度、半透明度和网格。 注: MapXtreme Java 只能读取这些样式标记。要对样式作出任何更改,必须在 MapInfo Professional 打开栅格图像,并在“调整图像样式”对话框中更改样式。保存这些图像时,.TAB 文件将使 用新的样式信息更新。 栅格样式可以影响到渲染进程的速度。在 MapXtreme Java 中,样式是通过向渲染链添加过滤器来 进行渲染的。透明和半透明效果是耗时最多的操作。 务必不要将这些栅格图像和 MapXtreme Java 渲染的输出栅格图像相混淆。输出栅格图像由图元所 在的图层构成,相应的图元可能包含注册的栅格图像,也可能不包含注册的栅格图像。 以下是栅格图像注册文件的示例。栅格样式标记显示为粗体。下表说明了标记的编号和值。 !table !version 300 !charset WindowsLatin1 Definition Table File "conus13.tif" Type "RASTER" ... RasterStyle 1 62 RasterStyle 2 40 RasterStyle 3 1 RasterStyle 4 1 RasterStyle 7 1525779 RasterStyle 8 221栅格样式标记 164 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 下表说明了有效的栅格样式标记编号和相应的值。如果在 .TAB 文件中没有出现用于该样式的标记, 则将使用默认值。 亮度和对比度 亮度和对比度影响栅格图像的整体显示。更改亮度和 / 或对比度可有助于更好地区分图像图元。亮度 影响图像显示的明暗。亮度值越高,图像显示就越亮。对比度影响区域之间的阴影。较高的值表示 图像的特定区域比其它区域更加突出。 亮度和对比度值介于 0 至 100% 之间。如果该标记没有出现,则默认值为 50。这意味着对栅格图像 不应用任何对比度或亮度。 灰度 以黑白阴影显示的图像称为灰度图像。如果栅格图像 .TAB 文件包括栅格标记 3 1,MapXtreme Java 将彩色图像显示为灰度。如果要将该图像打印到灰度打印机,则这一特性非常实用。 透明度 MapXtreme Java 支持单色透明度,此时栅格图像的一种颜色在图像显示时可成为透明或不可见。如 果要在其它图层上显示图元,而这些图元在正常情况下被图像中的相应颜色所遮盖,那么这一特性 将会非常实用。 栅格样式 说明 标记编号 值 亮度 影响图像显示的明暗。 1 0 -100,默认为 50。 对比度 影响阴影区域之间差 异的大小。 2 0 -100,默认为 50。 灰度 切换:确 定图像是显 示为黑白影线还是彩 色表示。 3 0 = off, 1 = on,默认为 0。 透明度 切换:确 定 颜 色是否 渲染为透明。 4 0 = off, 1 = on,默认为 0。 网格确定栅格是否为网格。 6 * 1 = yes, 0 = no. 默认为 0。 透明度 BGR 确定将哪一颜色渲染 为透明。 7 BBGGRR 是分别用于蓝色、绿 色和红色的颜色值,表示要渲染 为透明的颜色。无默认值。 半透明度 确定显示图像的 透明度。 8 0-255,由图像的 alpha 通道值 确定。0 = 100 半透明百分比 (不可见),255 = 0 半透明百 分比(不透明)。无默认值。 * 标记 5 已经逐渐停用。第 10 章:在图层中绘制地图 开发人员指南 165 © 2006 MapInfo Corporation. 保留所有权利。 透明度通过两个样式标记在 .TAB 文件中表示:标记 4 1 表示该透明度打开,标记 7 加 BBGGRR 形 式的数字表示要显示为透明的颜色。BBGGRR 是表示为整数的十六进制值,用于表示构成颜色的蓝 色、绿色和红色值。例如,用于 RasterStyle 标记 7 的 1525779 表示暗绿色的影线表示。 注: 数字 1525779 是十六进制值 174813 的十进制表示形式,分别表示蓝色 23(0x17)、绿色 72(0x48) 和红色 19(0x13)。 左下方图像表示地图中间从上至下的高速公路,右图所示是在 MapInfo Professional 中显示为透明之 后的效果。 网格 网格是一个采用连续渐变颜色的图像,通常可用于表示海拔或温度的变化。MapXtreme Java 可以在 关联 .TAB 文件中提供栅格样式标记 6 1 的情况下,确定注册栅格图像是否为网格。如果该标记没有 出现,则图像将按照常规处理。 半透明度 半透明度是图像的透光量,图像将显示为半透明或透明。它由 RasterStyle 标记 8 后跟 0 至 255 之间 的数字来表示。该数字表示作为图像组成一部分的 alpha 通道值,说明其透明的程度。图像的 alpha 通道值越低,图像显示的半透明效果就越强。alpha 数值为 0 时,将图像渲染为完全不可见(100% 半透明)。采用 alpha 值 255,图像将完全不透明(0% 半透明)。 对于 MapXtreme Java 中支持的所有栅格样式,半透明对于图像渲染速度的影响最大。这是因为该 操作影响图像的每个像素,无论该像素是什么颜色。对于 Java 而言,0 至 255 之间的值的渲染本身 就较慢。MapXtreme Java 中的网格图像 166 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapXtreme Java 中的网格图像 网格图像是一种特殊类型的栅格图像,显示表示特定值的连续渐变颜色。网格地图通过在网格单元 集合中插补取自源表的点数据创建。 网格图像和常规栅格图像有所不同的是,MapXtreme Java 可以返回存储在单元中的值,无论相应的 值是连续网格中的插补值,还是与分类网格中的单元关联的名称。使用 FeatureLayer.searchAtPoint() 或 InfoTool 来检索该信息。此外,若数据随网格一起提供,MapXtreme 将为网格创建图例以显示拐点。 支持两种类型的网格图像: • MI 网格 • Vertical Mapper 网格 MI 网格栅格 MI 网格栅格文件 (.MIG) 是通过 MapInfo Professional 创建的专题影线表示的网格地图。MIG 文件既 可通过使用 TAB 数据提供方加载引用 MIG 文件的 TAB 文件添加到 MapJ,也可直接使用 MIGrid 数 据提供方来添加到 MapJ。MapXtreme Java 示例数据中已包含用于美国降雨量、温度和海拔的网格 文件。有关创建 MI 网格文件的详细信息,请参阅 MapInfo Professional 文档。 Vertical Mapper 网格支持 MapXtreme Java 可读取和显示 Vertical Mapper 网格文件。这些文件在 MapInfo Professional 中使 用 MapInfo 的 Vertical Mapper 插件来进行创建和修改。 要在 MapXtreme Java 中显示 Vertical Mapper 网格文件,可使用 TAB 数据提供方或 NWGrid 数据提 供方。没有 Vertical Mapper 网格的 .TAB 文件,就无法进行加载。务必确保 NwSGridReader.jar 和 rfgrid.jar 均位于系统 classpath 之中。ABDataProvider 将该文件识别为 Vertical Mapper 网格,并调 用 NWGridDataProvider。 Vertical Mapper 网格可以采用以下两种类型之一:连续 (.grc) 或分类 (.grd)。连续的网格在表示单元 之间变化的地图上显示为颜色渐变,例如在海拔地图上。连续的网格可用于估计实际的数据集合点 之间的位置值。 分类网格地图包含单元,单元地图中的值直接成为表示图元类的颜色。例如,在显示树的种类分布 的造林网格地图上,可以采用蓝色表示蓝云杉树,用红色表示橡树,用黄色表示桦树。 网格的图例 MapXtreme 显示表示网格栅格拐点的图例。MapXtreme 使用网格拐点表中的信息来创建制图图例。 该图例显示表示每个拐点的颜色块。拐点通常反映数据值中明显的中断,例如正负值。 网格专题图可在 MapInfo Professional 中创建和修改,可在 MapXtreme 应用程序中查看。MapXtreme 不执行任何网格插补操作。渲染涉及的考虑因素 渲染特指生成地图图像的过程。渲染图像是创建基本地图的最后一个步骤。本章 介绍各种渲染选项和考虑因素。 本章内容:  MapXtremeImageRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168  LocalRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168  EncodedImageRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168  使用命名地图渲染附加图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168  动画图像. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170  渲染速度与渲染质量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172  栅格输出格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172  SVG 输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173  WBMP 支持 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174  复合渲染器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176  渐进渲染. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178  Intra-Servlet 容器渲染器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179MapXtremeImageRenderer 168 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapXtremeImageRenderer 远程渲染使用 MapXtremeImageRenderer 来处理。 远程渲染表示包含 MapJ 对象的应用程序将服从 MapXtremeServlet 的实例来创建地图。MapJ 客户 机将其请求(如何渲染和渲染什么)发送到 MapXtremeServlet,由后者处理请求,然后将结果返回 给 MapXtremeImageRenderer,可能的三种结果如下所示: • 本地系统上使用 toFile() 的位图文件(GIF、JPEG 等)— 通常用于在中间层上存储图像,然后 令浏览器从服务器请求文件。 • 使用 toStream() 的 Java 输出流对象 — 流可以表示为文件(与以上相同)或者内存存储的信息 (作为 Java 图像对象,如下);两层结构使用 toStream,客户机可将图像存储在内存中。 • 使用 toImage() 的 Java 图像对象 — 将栅格保存在内存中,可直接用于显示。 由于要依赖于客户机系统可能没有的 JVM 和字体等系统资源,因此 MapXtremeImageRenderer 是 渲染地图最普通的方式。 LocalRenderer LocalRenderer 将地图渲染为 Java2D Graphics2D 或 BufferedImage 对象。Graphics2D 对象通常源 自 BufferedImage 或 Swing 组件。所有的渲染均在客户端计算机完成。由于所有渲染均在客户端计算 机完成,渲染地图所需资源必须驻留在客户端计算机(字体、视频卡等)。默认情况下,VisualMapJ 将使用 LocalRenderer。 EncodedImageRenderer MapXtreme Java 提供特殊渲染器来帮助用户使用动画图像创建地图。有关详细信息,请参阅第 170 页的动画图像。 使用命名地图渲染附加图层 命名地图最初于 MapXtreme Java 4.0 中引进。借助于命名地图,可采用便于日后记忆的名称来保存图层 集合。相应操作可通过 MapXtreme Java Manager 的保存地图定义(请参阅第 5 章:管理 MapXtreme Java)或使用 NamedMapDefContainer(请参阅第 9 章:MapJ API)编程来完成。 改进的编程接口可用于再次调用命名地图,并包括一个在命名地图顶部渲染的图层列表。如果要在 注释图层(Annotation 图层)中突出显示特定图元,例如两点之间的路线,那么这一特性尤为实 用。与此同时,这还是请求地图最为经济的方法,因为其向服务器发送的渲染请求“较瘦”。此前 的进程需要在客户机渲染命名地图,然后将图层列表添加到地图,再将所有要渲染的图层发送到服 务器。 通过编程,客户端使用 ImageRequestComposer 的工厂方法,可创建 Enterprise XML 的地图图像请 求,其中包括命名地图的名称、MapJ 和 overlayIndex,后者是一个源自客户机需要在命名地图上渲 染的 MapJ 对象的图层列表。图层可以采用可支持类型(注释、TAB、数据库、查询构建器或数据绑 定图层)的任意组合。第 11 章:渲染涉及的考虑因素 开发人员指南 169 © 2006 MapInfo Corporation. 保留所有权利。 代码示例 在本例中,已经创建基础地图并将其另存为命名资源。此外还创建了另一个包含多个图层的地图并 将其另存为地图定义文件。MDF 将加载到 MapJ 对象之中。在创建 ImageRequestComposer 对象之 后,命名资源将被构建器中传递的整数值所指定编号的图层所覆盖。 以下源代码段摘自 Java servlet。 HttpServlet servlet = new HttpServlet() { // Set mime type private String mimeType = "image/gif"; // Specify a map private String mymapPath = "C:\\CODE_SAMPLES\\NAMEDMAPS\\POINTS.mdf"; private String mapName = "RENSS_CTY"; private String providerURL = "file:///C:/cat3345/webapps/ mapxtreme480/resources/codesample"; private static final int ovrlayIndex = 1; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("image/gif"); ServletOutputStream sos = response.getOutputStream(); myMap.loadMapDefinition(mymapPath); myMap.setDeviceBounds(new DoubleRect(0, 0, 800, 600)); try { //myMap.setZoom(zoom); ImageRequestComposer irc = ImageRequestComposer.create( providerURL, mapName, myMap, ovrlayIndex, ImageRequestComposer.MAX_COLORS_ TRUECOLOR, Color.white, mimeType); MapXtremeImageRenderer renderer = new MapXtremeImageRenderer("http://localhost:8080/ mapxtreme480/mapxtreme"); renderer.render(irc); renderer.toStream(sos); renderer.dispose(); } catch (Exception e) { throw new ServletException(e); } } };动画图像 170 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 动画图像 MapXtreme Java 提供了使用动画图像构建地图所需的类。相应功能只适用于点图元。 按照 MapXtreme Java 术语,动画图像称为覆盖图像。覆盖图像是 Rendition 对象的属性。当 Rendition.SYMBOL_MODE 属性设置为 Rendition.SymbolMode.OVERLAY_IMAGE 时, Rendition.SYMBOL_URL 属性将用于从指定 URL 检索图像。(对于生成任意类型的图像符号而言均 为同样的行为。) 为表明所需的动画图像信息,Enterprise XML 协议中的 MapImageRequest 已经改进,以返回图像 (image/gif、image/jpeg 等)和 MapImageResponse。响应为包含基础地图的 XML 文档和点覆盖 的列表。每个点覆盖元素均包含说明其样式和相对于基础地图位置的有关信息。MapImageResponse 将通过新的渲染器 EncodedImageRenderer 生成。MapImageResponse 采用名为 application/encodedimage+xml;image/xxx 的新 MIME 类型,其中 xxx 可以是 gif、jpg、png 等类型。 使用 MapJ API 的操作步骤如下: 1. 将点图元的样式设置为动画(样式 SYMBOL_MODE 属性设置为 Rendition.SymbolMode.OVERLAY_IMAGE)。 2. 指定渲染响应是 application/encodedimage+xml;image/xxx, MIME 类型为 application/encodedimage+xml。 3. 使用 EncodedImageRenderer 渲染。 4. 检索包含基础静态地图和覆盖图层列表信息的 MapImageResponse 文档。 具备这一信息,即可开始创建地图。 由于 MapJ API 符合公共的 Enterprise XML 协议,因此还可以完全在 MapJ API 之外生成这一信息。 此时的操作步骤与此前类似,如下所示: 1. 将点图元的样式设置为动画(样式 SYMBOL_MODE 属性设置为 Rendition.SymbolMode.OVERLAY_IMAGE)。 2. 指定渲染响应为 application/encodedimage+xml。 3. 向 MapXtremeServlet 发送请求。 4. 对 XML 响应进行语法分析。 动画图像的使用情况 为了进一步说明如何使用动画图像,可以考虑以下情况。假定要使用动画 GIF 在 Web 浏览器中显示 飘动的旗帜作为点图元,用于标记全球各地办公室的位置。所创建的 JSP/Servlet 将使用此前通过上 述过程所接收到的 MapImageResponse 信息来渲染地图。静态基础地图以及其动画图像置于要在此 后访问的“图像服务器”中。随后 JSP/Servlet 将创建一个带有图层的 DHTML 页面。最底层图层将 具有静态基础地图,该地图包含指向图像服务器的 URL。第二个图层将具有包含访问图像服务器的 URL 动画图像。浏览器中的效果是该图像显示在基础地图之上。第 11 章:渲染涉及的考虑因素 开发人员指南 171 © 2006 MapInfo Corporation. 保留所有权利。 以下是说明相应图层的 DHTML 页面示例。 Animated Icons Test
这一 DHTML 文件在中间层创建,用于通过 Web 浏览器显示。此应用程序具有若干个已经注册到用 户创建的“图像服务器”的标准动画图像。在通过中间层渲染之后,生成的静态地图已经注册到图 像服务器,可在此后由客户机的 Web 浏览器下载。由于静态地图图像对于客户机应该是唯一的,因 此其应该采用唯一的名称。DHTML 页面将返回到客户机的浏览器,此后浏览器将尝试下载在页面的 标记中引用的图像。此时由于
标记的存在,可产生动画效果,该标记允许 HTML 图层 覆盖基础 HTML。 代码示例 在 examples/server/java/servlet 目录中提供的是一个示例应用程序,展示覆盖图像如何显示在瘦客 户机方案的地图上。在本例中,动画图像是突出显示各国首都的星型符号。要运行该 servlet,可打 开位于 webapps/samples480 中的 index.htm,然后单击指向覆盖图像示例 Servlet 的链接。渲染速度与渲染质量 172 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 渲染速度与渲染质量 目前,MapXtreme 地图图像使用 Java 2D API 的反锯齿支持。输出的质量越高,显示的线条和边缘 越平滑。反锯齿是一种平滑线条和边缘外观的技术,通过增加颜色或灰度的像素并与原始像素混合 来实现。 现在可以在地图请求中指定 MapXtreme 是应按最佳绘制质量优先于绘制速度(使用反锯齿支持)还 是按绘制速度优先于绘制质量来渲染地图。可以对每个请求分别设置,也可以在服务器上设置所有 请求的渲染操作。 为了执行该操作,已将下面的渲染增强功能添加到 MapJ API: • com.mapinfo.xmlprot.mxtj.Rendering:这是类型安全的枚举,使用以下三个值:QUALITY、 SPEED 和 DEFAULT(使用服务器默认值)。 • com.mapinfo.xmlprot.mxtj.ImageRequestComposer:该类使用两种新的方法来获取和设置 渲染类型。ImageRequestComposer 是用于请求地图图像的主要类。 • com.mapinfo.render.quality:该系统属性允许服务器管理员设置用于所有地图渲染请求的渲染 操作。值为 true 时将按最佳质量渲染地图。值为 false 时将按最佳速度渲染地图。 请参阅 Javadocs 获取有关渲染类的示例。 栅格输出格式 MapXtreme Java 支持多种栅格输出格式,其中包括 GIF、JPEG、PNG 和 WBMP。栅格图像的输 出格式在 ImageRequestComposer 中通过 MIME 类型指定。MIME 是一种用于图像数据等非文本数 据的格式标准。以下指南将帮助您确定最适合具体需求的格式类型。 • image/jpeg — JPEG — 适用于多于 256 色的图层。 • image/gif — GIF — 适用于最多 256 色的图层。 • image/png — PNG — 是 GIF 格式的替代格式,适用于多于 256 色的图层。 • image/wbmp — WBMP — 用于在类似手机和 PDA 的手持设备中生成图形的专用格式。 • image/svg+xml — SVG — 用于在 XML 中说明二维向量图形的格式。 例如,要输出 JPEG,可使用如下所示的 ImageRequestComposer: ImageRequestComposer.create(mapj, maxColors, bgColor, "image/jpeg"); 在使用栅格文件时,建议使用 PNG 输出。GIF 输出限定为最高 256 色,但栅格文件通常至少具有 256 RGB 或灰度颜色。添加向量图层可能会引入 256 种以上的颜色,此时必须减少颜色种类,这是 一个相当耗时的操作。第 11 章:渲染涉及的考虑因素 开发人员指南 173 © 2006 MapInfo Corporation. 保留所有权利。 设置 JPEG 图像的质量 要在服务器上控制 JPEG 输出质量,需要在 servlet 容器中设置 jpegQuality 参数。例如在 Tomcat 中,可编辑 /mapxtreme480/WEB-INF 目录下的 web.xml 文件,纳入一个用于 JPEG 质量的值。 jpegQuality 85 jpegQuality 值介于 0-100 的范围之间,默认值为 75。图像的质量随该值的减小而降低,此时将生成 较小的图像。 SVG 输出 MapXtreme Java Edition 支持采用 SVG 格式导出地图图像,此图形格式用于在 XML 中描述二维图 形。要将导出格式指定为 SVG,可在 ImageRequestComposer 中设置 MIME 类型。例如: ImageRequestComposer.create(myMap, ImageRequestComposer.MAX_COLORS_256, Color.WHITE, "image/svg+xml"); MapXtreme Java Edition 中的 SVG 兼容 SVG 1.0。SVG 为在小型设备上渲染地图提供了便利,并且 提供了一个独立于分辨率的渲染格式。 使用 Rendition.SYMBOL_URL 属性,可将栅格数据直接嵌入到 SVG 文档中。有关 MapXtreme Java Edition 中嵌入式栅格数据的详细信息,请参阅第 223 页的图像符号。有关数据 URL 方案的详 细信息,请访问 http://www.ietf.org/rfc/rfc2397.txt。 向 SVG 添加 JavaScript 事件 SVG 文档还具有一个与 HTML 文档中的事件处理程序类似的事件处理程序工具。SVG 文档可以提供 若干种事件类型的信号,例如鼠标移动、重新调整大小等。这一特性可用于实现交互操作,例如通 过浏览器使用 JavaScript 实现交互。为使用 SVG 事件,SVG 文档应该嵌入到其他文档中,例如嵌 入到提供实际处理程序实现的 HTML 文档中。MapXtreme Java 允许用户通过 com.mapinfo.xmlprot.mxtj.SvgConditions 类指定用于所有 SVG 事件的事件处理程序。以下示例展示 了如何为 SVG onmouseover 事件指定具体的功能: // create a Map that associates a function with an SVG event Map eventMap = new HashMap(); eventMap.put("onmouseover", "OnMouseOver_Event"); // create an SvgConditions object SvgConditions svgConditions = new SvgConditions(eventMap); // create an ImageRequestComposer that signifies we want SVG as ourWBMP 支持 174 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 // render format ImageRequestComposer irc = ImageRequestComposer.create( mapj, 257, Color.RED, "image/svg+xml"); // set the SvgConditions irc.setSvgConditions(svgConditions); // render renderer.render(irc); 有关如何控制 SVG 事件功能的更多示例,请参阅 MapXtreme Java 的 SVG JSP 地图查看器。 MapXtreme Java 的 SVG 文档兼容 SVG v1.0。 MapXtreme Java 中 SVG 的限制 在使用 SVG 和 MapXtreme Java 时,具有以下限制: • MapXtremeImageRenderer 的方法 toImage() 不能与此版本的 MapXtreme Java 中的 SVG 一起 使用。 • 渐进渲染不能和此版本的 MapXtreme Java 中的 SVG 一起使用。 WBMP 支持 MapXtreme Java Edition支持采用 WBMP 格式导出地图图像,此图形格式用于类似手机和 PDA 的手 持设备。要将导出格式指定为 WBMP,可在 ImageRequestComposer 中设置 MIME 类型。例如: ImageRequestComposer.create(mapj, maxColors, bgColor, "image/wbmp"); MapXtreme Java 中的 WBMP 支持包括两种输出模式:快速地图显示阈或抖动显示。后者效果好但 速度慢。各种类型的说明如下。 WBMP 输出的阈方法 阈方法是一项基本技术,采用该技术时,地图中每个颜色的像素都将转换为灰度,然后与设置阈比 较,生成 0(黑)或 1(白)的表示。阈值可在 servlet 初始化例程中配置。 该算法用于确定是否将特定像素转换为 0 或 1,如下所示:颜色转换为灰度 (R+B+G/3),其中 R、B 和 G 分别表示像素的红、绿、蓝三色的色值 (0, 255)。如果值大于阈值,则像素设置为 1(白)。如 果值小于或等于阈值,则像素颜色为 0(黑)。默认阈值为 127。 默认情况下,如果将 MapXtremeImageRenderer MIME 类型指定为 image/wbmp,则 MapXtreme Java 将自动执行地图阈的转换。 要更改默认阈值 127 以生成其他图像质量,必须在 servlet 容器的初始化例程中指定新值。第 11 章:渲染涉及的考虑因素 开发人员指南 175 © 2006 MapInfo Corporation. 保留所有权利。 例如,以下是使用 Tomcat 时所添加的代码。 mapxtreme com.mapinfo.mapxtreme.MapXtremeServlet 1 wbmpThreshold 95 下图近似显示了原色 GIF 图像(左)和使用阈方法导出为黑白 WBMP 的相同图像。 WBMP 输出的抖动方法 与阈方法相比,抖动地图图像将生成较高质量的地图显示,但是其绘图速度较慢。 抖动考虑了像素颜色的转换因素,创建了一种应用于使用该颜色的区域的抖动模式。抖动是一个调 整不同颜色相邻元素,为位于浏览器当前调色板颜色之外的颜色提供虚拟色的过程。MapXtreme Java 中当前使用的抖动例程是 Floyd-Steinberg 错误抖动例程。此方法将像素量化(颜色减少)期间 的错误分布在相邻的像素之间。这样增加了图像透明色的分辨率,这是纯粹抖动无法实现的效果。复合渲染器 176 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 要将图像导出设置为抖动格式,必须在 servlet 的初始化例程中设置抖动参数。例如,用于 Tomcat servlet 的代码示例如下: mapxtreme com.mapinfo.mapxtreme.MapXtremeServlet 1 wbmpDither 1 下图近似显示了原始在线彩色 GIF 图像(左)和使用抖动方法导出为黑白 WBMP 的相同图像。 复合渲染器 MapXtreme Java 的渲染器称为复合渲染器,可用于指定在图形更新时需要重画的图层。这在只有部 分图层包含更改信息的时候尤为实用。CompositeRenderer 可用于将 MapJ 中的图层划分为静态和 动态渲染的图层。静态图层将只能重画一次,并在本地存储为位图。动态图层将根据每个渲染请求 重画。 复合渲染器提供实用的应用程序,例如实现了在地图上显示地理编码的点或是显示沿公路移动的车 辆等功能。第 11 章:渲染涉及的考虑因素 开发人员指南 177 © 2006 MapInfo Corporation. 保留所有权利。 要在地图上显示地理编码的点, 可在基础地图上创建一个注释图层(Annotation 图层),保存表示 地理编码位置的图钉符号。采用 CompositeRenderer,可渲染带有标注的基础地图图层,图钉将出 现在这些标注之上。如果不采用 CompositeRenderer,标注将始终最后绘制,即存在令其下面的信 息变得模糊的可能。 在地图上显示移动的对象。GPS 应用程序可以显示一辆沿地图上的高速公路移动的卡车。基础地图 只需绘制一次,而卡车符号将在需要时随时绘制(如每个位置改变)。 使用 CompositeRenderer 时切记以下信息: • 静态图层将绘制为本地存储的位图。此时将使用大量内存,一个 640 x 480 的图像将至少占用 2.7MB 内存。 • 更改 MapJ 上的缩放将导致静态图层变形。直线将显示为阶梯状或锯齿状。 • 更改 MapJ 的中心将导致静态图层的边缘平移。此时,可以重新生成静态图层。 代码示例 : Animation 图层 本示例显示如何在地图上创建移动的对象。有关代码示例也可参阅 CompositeRenderer 下的联机 Javadoc。 HttpServletResponse res = null; / // Add annotation layer - this layer will consist of one image symbol // to "animate" TableDescHelper tableDescHelper = new AnnotationTableDescHelper("Animation_Layer"); DataProviderHelper dataProviderHelper = new AnnotationDataProviderHelper(); DataProviderRef dataProviderRef = new LocalDataProviderRef(dataProviderHelper); // Add the annotation layer FeatureLayer animate_layer = (FeatureLayer) myMap.getLayers().insertLayer(dataProviderRef, tableDescHelper, 0, "Animation_Layer"); // Create the rendition for the point Rendition r = RenditionImpl.getDefaultRendition(); r.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.IMAGE); r.setValue(Rendition.SYMBOL_URL, "file:///C:/images/car.gif"); //nCreate the label rendition for the point Rendition lr = RenditionImpl.getDefaultRendition(); //Create the point FeatureFactory ff = myMap.getFeatureFactory(); // An array containing a single int Attribute Attribute[] aAIntAttribute = {new Attribute(33)}; //create a new Primary Key an an integer PrimaryKey pkey = new PrimaryKey(aAIntAttribute); Feature f = ff.createPoint(new DoublePoint(-72, 42), r, lr,渐进渲染 178 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 aAIntAttribute, pkey); PrimaryKey pk = animate_layer.addFeature(f); // Create the ImageRequestComposer ImageRequestComposer imageRC = ImageRequestComposer.create( myMap, ImageRequestComposer.MAX_COLORS_TRUECOLOR, Color.blue, "image/ gif"); // Create the composite renderer CompositeRenderer compositeRenderer = new CompositeRenderer ("http://localhost:8080/mapxtreme480/mapxtreme", 0); // Render the image compositeRenderer.render(imageRC); // Stream the image back to the client javax.servlet.ServletOutputStream sos = res.getOutputStream(); compositeRenderer.toStream(sos); // Set this attribute to false so that the bottom image is not rendered // next time compositeRenderer.setRedrawBottom(false); 渐进渲染 渐进渲染是 MapXtreme Java 提供的强大功能之一,用于先将部分地图图像发送到客户机,并随之 在指定的时间间隔之内,发送更加完全的图像,直至完整图像接收完毕。与在整个地图图像完成渲 染之后再发送图像相比,这一特性可以更快地实现接收图像的某些部分。 渐进渲染在需要重新生成花费大量时间访问底层数据的图层时非常实用。那么采用渐进渲染与发送 一个最终的图像相比,显示整个图像所用的总时间会略有增加。 客户机控制图像是否采用渐进渲染,以及采用多长的时间间隔来通过 ImageRequestComposer 使用 的特殊 MIME 类型返回。这一 MIME 类型采取以下形式: multipart/image;imagetype=xxx;interval=yyy 其中 xxx 是要返回的图像的 MIME(如 image/gif、image/jpg 等),yyy 是以毫秒为单位的更新时间 间隔。 渐进渲染由 MapXtremeImageReneder 类上的 isDone() boolean 方法启用。若将 isDone() 设置为 ture,那么 MapXtremeImageRenderer 上的 toStream()、toFile() 和 toImage() 方法在流中返回下一 图像数据块。isDone() 方法可用于遍历并检索流中的每个后续图像,直至检索不到为止。以下代码 示例说明了 isDone() 的用法。第 11 章:渲染涉及的考虑因素 开发人员指南 179 © 2006 MapInfo Corporation. 保留所有权利。 // create a MIME that tells the MapXtremeImageRenderer // to render the map to PNG every three quarters of a second. String progressiveMime = "multipart/image;imagetype=image/png;interval=750"; // standard ImageRequestComposer using MapJ ImageRequestComposer irc = ImageRequestComposer.create( myMap, ImageRequestComposer.MAX_COLORS_256, Color.WHITE, progressiveMime); // create MapXtremeImageRenderer MapXtremeImageRenderer renderer = new MapXtremeImageRenderer ("http://localhost:8080/mapxtreme480/mapxtreme"); // while we are not rendering while (!renderer.isDone()) { // get an image from the MapXtreme Servlet Image image = renderer.toImage(); // do something with the image // ... } Intra-Servlet 容器渲染器 为了利用在 J2EE 2.2 应用程序中提供的 servlet 转发功能,MapXtreme Java 提供了 IntraServletContainerRenderer。这一特性为将栅格图像返回到客户机提供了一种可选途径。这一 渲染器在渲染器和 MapXtremeServlet 之间不需要套接字连接,但是这对于 MapXtremeImageRenderer 而言却是不可或缺的。 这一部署选项的优点在于栅格图像可以直接发送到客户机。MapXtremeServlet 不需要将图像写入到中 间层,然后再令中间层将其重写回客户机。但是其限制是应用程序必须部署在与 MapXtremeServlet 相同的容器之中。 IntraServletContainerRenderer 构造器需要输入该信息,以便中间层 servlet 获取 MapXtremeServlet 的 RequestDispatcher 对象。RequestDispatcher 对象处理 servlet 转发。必需的信息如下所示: • 由 com.mapinfo.mapxtreme.MapXtremeServlet 使用的别名,例如 "mapxtreme480" • MapXtremeServlet 的 ServletContext 对象,或是 servlet 上下文的 URI,例如 "/mapxtreme480/ servlet" • MapXtremeServlet 将使用 HttpServletRequest 和 HttpServletResponse 对象满足该请求 • 栅格图像的 mime 类型 • 图像是否应该为多个部分,以及多个部分的更新间隔Intra-Servlet 容器渲染器 180 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 代码示例 : Servlet 转发 如果 IntraServletContainerRenderer 部署在 MapXtremeServlet 之外的其他 servlet 上下文中,那么 在调度请求时,有可能会出现安全问题。 HttpServletRequest req = null; HttpServletResponse res = null; ServletConfig thisServletConfig = null; // Retrieve the current servlet's ServletContext object from the //thisServletConfig object ServletContext thisServletContext = thisServletConfig.getServletContext(); // NOTE: Retrieve the MapXtremeServlet's ServletContext object from the // thisServletContext object. The value of getContext is dependent on how // you deploy the MapXtremeServlet in your servlet container, and is the // URI of the MapXtremeServlet. To access the MapXtremeServlet in this // deployment you would use http://stockholm:8080/mapxtreme480/mapxtreme. ServletContext mxtServletContext = thisServletContext.getContext("/ mapxtreme480/mapxtreme"); // Check to make sure the mxtServletContext is not null // (This may be null due to servlet container security) if (null == mxtServletContext) { // Take appropriate error handling steps } // Create the IntraServletContainerRenderer // NOTE: The argument of "mapxtreme" on the next line is the name of the // MapXtremeServlet, as defined by the deployment of the servlet IntraServletContainerRenderer isRenderer = new IntraServletContainerRenderer(mxtServletContext, "mapxtreme", req, res); // Create the ImageRequestComposer ImageRequestComposer imageRC = ImageRequestComposer.create(myMap, 256, Color.blue, "image/gif"); // Render the image isRenderer.render(imageRC); 访问远程数据 使用 MapXtreme Java 可从远程资源访问数据以进行地图渲染和分析。本章介绍 如何使用命名连接以及连接池这一检索远程数据的有效方式。 本章内容:  命名连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182  命名连接池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182  如何创建命名连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183  访问入池连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .185  管理命名和直接数据库连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .185命名连接 182 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 命名连接 命名连接是一个资源,它使用别名说明到 JDBC 数据库的连接。这些连接可以预先启动并通过 MapXtremeServlet 汇成连接池,以便客户机应用程序随时使用。 要点:我们强烈建议您实现命名连接和连接池,这样将比为每个客户机请求创建单独连接更加高效。 说明命名连接的信息存储在名为 miconnections.properties 的文件之内。有关信息,请参阅第 183 页 的如何创建命名连接。 命名连接的安全受益 连接池除了高效率之外,还提供了重要的安全受益。对于三层部署,存储 JDBC 连接信息的 miconnections.properties 文件仍然保存在服务器之上,并且仅限由 MapXtremeServlet 使用。客户 机通过别名访问 JDBC 连接,说明连接的用户名和口令等敏感信息不会经由网络传送。 命名连接池 建立到远程数据库的 JDBC 连接可能会消耗大量时间和资源。将这些开支最小化的标准方式是使用命 名连接池。在连接池配置方案中,将会创建一组命名数据库连接,然后在众多用户之间复用和共享。 MapXtreme 中的连接池工作机制 通常,连接池将用于 MapXtremeServlet 的服务器端。此外,MapJ 也可配置使用连接池。无论使用 哪一方式,其行为均相同。 当需要使用 JDBC 连接从远程数据库访问数据时,将尝试从连接池检索连接。如果连接池中有可用 连接,该连接将提供用于相应的应用程序。否则,将会创建新的连接。在使用该连接的任务完成之 后,必须将该连接返回到连接池。 MapXtremeServlet 的连接池 MapXtremeServlet 将在其 classpath 中发现 miconnections.properties 文件时使用连接池(在其父 级 servlet 容器中的上下文的 classpath)。此文件列出了可用的命名连接。miconnections.properties 文件中的任意连接均可配置为在 MapXtremeServlet 的初始化方法中预先启动。这一点确保了相应连 接准备就绪,随时可用于第一个访问 MapXtremeServlet 的客户机。 当连接池由 MapXtremeServlet 使用时,所有打开的连接都将在 MapXtremeServlet 为 servlet 容器所破坏 时自动关闭。打开的连接在连接达到预定义的失活时间之后也会关闭,该时间在 miconnections.properties 文件中配置为超时设置。第 12 章:访问远程数据 开发人员指南 183 © 2006 MapInfo Corporation. 保留所有权利。 MapJ 的连接池 如果 miconnections.properties 文件位于使用 MapJ 的应用程序的 classpath 之中,则连接池可以自 动在客户机层创建。每个应用程序只能创建一个连接池,该连接池将由在该应用程序之内创建的所 有 MapJ 实例所利用。MapJ 客户机在以下情况下需要访问远程数据源:1) 在进行本地数据访问的图 层上执行搜索方法; 2) 在进行本地数据访问的图层获取元数据信息;以及 3) 进行本地渲染。如果连 接池准备就绪,则可用于上述各个任务。 如何创建命名连接 命名连接的说明信息包含在名为 miconnections.properties 的文件之内。相应信息中包括用于轻松 引用数据源、数据源名称、主机、端口、用户名或口令等的别名或昵称。在此文件之中可以设置多 个 JDBC 连接。 命名连接可以使用 MapXtreme Java Manager 中的“连接管理器”面板创建,也可以通过在文本编 辑器中手动编辑 miconnections.properties 文件来创建。 创建之后,将 miconnections.properties 文件置于 classpath 之中,以便 MapXtremeServlet 可以在 调用启动方法时预先启动相应连接。 miconnections.properties 文件示例 以下各行展示了可见于 miconnections.properties 文件的示例条目。 Connection1_name=Pantheon Connection1_driver=oracle.jdbc.driver.OracleDriver Connection1_url=jdbc:oracle:thin:@hostmachine:port:sid Connection1_user=mapxtreme Connection1_password=secret Connection1_is_xy=false Connection1_prestart=4 Connection1_max=15 Connection1_timeout=300 Connection1_defaultRowPrefetch=75 第一行指定了连接的名称。客户机将使用此名称从连接池获取连接。 接下来的 4 行指定了建立 JDBC 连接所需的标准信息:所用 JDBC 驱动程序、数据库的连接 URL、 用户名和口令。 再下面一行通知 MapXtreme Java 入池连接所属的数据源是否包含空间对象或空间对象的 X 和 Y 列。 注: MapXtreme Java 不能使用单一命名连接来访问 X,Y 和空间对象数据。 接下来的 3 个设置用于管理要预启动的连接数、连接池可以存储的最大连接数,以及连接关闭并且 其资源返回到应用程序之前,在不加使用的情况下可以保持的连接时间(按秒计)。 有关特定于数据库的附加设置将会出现在列表的末端。例如,以上所示的 Oracle 连接具有特定于 Oracle 的附加键值,名为 defaultRowPrefetch。特定于数据库的键值必须是数据库连接可以理解的 名称 / 值对。如何创建命名连接 184 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 连接管理器 MapXtreme Java Manager 的“连接管理器”面板提供了管理 JDBC 连接的用户界面(如编辑 miconnections.properties 的内容)。 要从“连接管理器”测试 JDBC 连接,务必确保 JDBC 驱动程序位于 classpath 之中。 “连接管理器”将从 miconnections.properties 文件初始化命名连接的列表。此时既可创建新的连 接,也可编辑或删除现有连接。 m “连接管理器”的“编辑”对话框给出了 3 个选项卡用于提供信息。“一般”选项卡收集了名称、 驱动程序、数据源 URL、用户和口令。此外,还提供了“测试连接”按钮,以用于确保连接正常 (如果在 classpath 中没有适当的驱动程序,则测试将会失败)。 在“自定义”选项卡中,可设置定制属性和值,例如在第 183 页示例中使用的 defaultRowPrefetch。 “连接池”选项卡中包含了预启动的连接数和允许的最大连接数,以及空闲连接的超时时间。 .第 12 章:访问远程数据 开发人员指南 185 © 2006 MapInfo Corporation. 保留所有权利。 访问入池连接 MapJ 中单独的 FeatureLayer 对象将以特定方式创建,以利用入池的命名连接。所有用于 JDBC 的 图层 DataProviderHelpers 均共享公共的构造器类型,取用以下输入参数: • 字符串 URL • 属性 connectionProps(用户、口令、预取等) • 字符串 driverClassName 对于从连接池中检索命名连接的图层,必须使用此形式的 DataProviderHelper 构造器并遵循特殊的 命名约定。连接 URL 必须采用以下格式: jdbc:mipool:connection_name 在通过别名引用数据源时,其它输入参数(连接属性和驱动程序名)将被忽略并且应该为空。例 如,要连接设置为 Pantheon 命名资源的 Oracle 数据源,需要使用以下信息: DataProviderHelper dataProviderHelper = new OraSoDataProviderHelper("jdbc:mipool:Pantheon", null, null); 有关使用 DataProviderHelpers 的连接池的更多代码示例,请参阅 Javadoc 中的代码示例链接“连接 池 URL 示例”。 管理命名和直接数据库连接 使用 MapXtreme 创建的应用程序可以和 MapXtreme 共享 JDBC 连接。此前,如果应用程序需要直 接访问连接,将需要创建和管理其自己的连接集。这些直接的连接应该与由 MapXtreme 维护的任意 连接共存。这将导致过量占用资源并且效率低下。 管理连接 现在可通过 ConnectionPool 接口创建和管理两种类型的连接。为此可编写此接口的实现,并在系 统属性 com.mapinfo.connpool 中确定类名。Mapxtreme 将使用此类来获取其数据库连接(两种类 型:命名连接和直接连接)。 当 ConnectionPool 接收到请求之后,命名连接将从连接池检索(假定 miconnections.properties 文 件位于 classpath 之中)。如果请求的是直接连接,则该连接将从头开始创建。 有关 ConnectionPool 接口的详细信息,请参阅位于 com.mapinfo.dp.conn 文件包中的 MapXtreme Javadoc。 命名连接和直接连接之间的区别 命名连接将在用户通过并为下一请求准备就绪之后,返回到连接池中。直接连接将在不再需要时废弃。 命名连接使用以下格式的别名请求:jdbc:mipool:resource_name。直接连接需要每个请求提供完整 的连接信息(URL、连接属性和驱动程序名称)。管理命名和直接数据库连接 186 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 图元和搜索 本章介绍 Feature 对象和可以对图元执行的搜索等操作。 本章内容:  Feature 对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188  使用 FeatureFactory 创建图元 . . . . . . . . . . . . . . . . . . . . . . . . . . . .191  FeatureSet 集合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194  搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195  搜索方法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197  搜索由 SQL 查询定义的图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200  图元编辑. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202Feature 对象 188 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Feature 对象 地图图元是地图上的一个地图对象,如点、线或区域等。例如,世界地图可以包含作为国家或地区 的区域、作为高速公路的线条以及作为城市的点。在 MapXtreme 中,地图图元表示为 Feature 对 象。例如,英国是区域类型的 Feature 对象,A10 高速公路是直线类型的 Feature 对象,伦敦是点类 型的 Feature 对象。 使用数据库的用户对于记录都不会感到陌生。记录是一组相关的信息列。例如,客户数据库中对于 每个客户均有一条记录,其中包含了姓名、地址、爱好等列。图元只是一条包含制表数据和几何信 息的记录。例如,MapXtreme 示例数据中的 World.tab 文件就是一个 MapInfo 格式的数据库。对于 每个国家或地区,均有一条记录与之相对应。每个记录包括若干制表数据列,以及一个指向描述每个 国家或地区形状和位置的地理信息的引用,这样一条记录即可显示在地图之上。制表数据也称为属性 数据,而几何数据也称为几何对象。这两种类型的数据构成图元。下图进一步阐述了图元的概念: Feature 对象的方法 Feature 对象的方法包含有关制表和几何数据的信息。下表对列出了这些方法: 国家或地区首都 Pop_1994 Gr_Rt Pop_Male 几何对象 中国 北京 1,136,429,638 2.2 584,836,207 墨西哥 墨西哥城 81,249,645 2.2 39,893,969 美国 华盛顿特区 257,907,937 0.8 125,897,610 方法说明 getAttribute 获取赋予列索引的指定属性。 getAttributeCount 获取与此图元相关的属性数量。 getGeometry 获取相关的几何对象,如果图元没有几何对象则为空。 getLabelRendition 获取为此图元的标注指定的样式。如果没有用于该标注的样式,则 返回为空。 getPrimaryKey 获取用于此图元的 PrimaryKey 对象(唯一 ID)。如果该图元没有 PrimaryKey,则将会返回空值。 getRaster 如果存在,则返回与该图元关联的栅格对象,如果图元没有栅格则 返回为空。 getRendition 返回此图元的样式。如果没有用于该图元的样式,则返回为空。第 13 章:图元和搜索 开发人员指南 189 © 2006 MapInfo Corporation. 保留所有权利。 属性 每个图元均有一个或多个 Attribute 对象。Attribute 对象表示用于该图元的制表数据列。此对象包含 类型和值信息。例如,某一属性为双精度型,其值为表示增长率的 2.2。 几何对象 每个图元具有一个 Geometry 对象。Geometry 对象可用于访问该图元的所有几何信息。相应的几何信 息可为 VectorGeometry 或 PointGeometry。VectorGeometry 用于折线或区域图元。PointGeometry 用于点。 对 TYPE_TEXT 几何对象的支持仅限于从本地 TAB 文件读取和渲染的文本对象。请参阅 Javadocs 中的 com.mapinfo.dp.Geomtry.MapTextGeometry。 缓冲 MapXtreme Java 提供了创建缓冲区的方法。从任意输入几何对象(点、线或区域)均可创建缓冲 区。该方法将取用要缓冲的几何对象、提供缓冲距离的距离对象以及指定分辨率的整数作为输入参 数。返回的输出始终为 VectorGeometry。相应语法如下所示: public static VectorGeometry buffer(Geometry geom, Distance dist, int resolution) throws Exception 可为此操作提供缓冲距离(标量值和线性单位)。任意坐标系中的几何对象(球面坐标系和笛卡尔 坐标系)均可缓冲。此外还可以指定相应操作的分辨率,以及在初始几何对象中用于拟合每个点周 围的弧的点数。有关详细信息,请参阅联机 Javadocs 中的 GeometryUtils。 Feature 对象和标注样式 每个 Feature 对象可有一个 Rendition 对象。Rendition 对象描述图元的显示特征。Feature 对象可以 只取用现有样式信息。相应信息描述 Feature 对象的显示方式。要更改现有 Feature 对象的样式信 息,应该使用专题,例如 OverrideTheme 对象。与此类似,Feature 对象可以具有标注样式。 栅格 每个 Feature 对象可有一个 MIRaster 对象。当栅格图像与 Feature 对象相关联时,即可检索描述图 像的二进制信息。当对象具有栅格时,该对象还将具有一个几何对象,此时由该几何对象描述栅格 图像的边界。 代码示例 : 从图元获取信息 以下代码示例展示如何使用某些方法来获取有关图元的信息。另请参阅 Javadocs 中的 Feature 主题。 List columnNames = new ArrayList(); Feature ftr; Geometry geom; VectorGeometry vectorGeometry; PointList pntList;Feature 对象 190 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 // Get the Table information from the FeatureLayer TableInfo tabInfo = m_Layer.getTableInfo(); // fill vector with Column names for (int i = 0; i < tabInfo.getColumnCount(); i++) { columnNames.add(tabInfo.getColumnName(i)); } // Perform a search to get the Features(records)from the layer RewindableFeatureSet rFtrSet = new RewindableFeatureSet(myLayer.searchAll(columnNames, null)); // get the first attribute ftr = rFtrSet.getNextFeature(); // then loop through all features in the layer while (ftr != null) { /* get the first attribute (columnData) from the feature Note: If you want to re-use the Attribute object later on (after the getNextFeature loop), you would need to make a copy of the Attribute object, using the copy constructor. */ Attribute attrib = ftr.getAttribute(0); // get a count of all attributes in the layer int attribCount = ftr.getAttributeCount(); // get the reference to the geographic information from // the feature geom = ftr.getGeometry(); // check to see if the geographic object is a Point if (geom.getType() == Geometry.TYPE_POINT) { // Cast the general geometry to a point geometry PointGeometry pntGeometry = (PointGeometry) geom; // get the minimum bounding rectangle for the feature DoubleRect rect = pntGeometry.getBounds(); // get the x,y location where the feature's label will be // anchored DoublePoint dblPnt = pntGeometry.getCentroid(); } else { // Cast the general geometry to a Vector geometry vectorGeometry = (VectorGeometry) geom; // get the minimum bounding rectangle for the feature DoubleRect rect = vectorGeometry.getBounds(); // get the x,y location where the feature's label will be第 13 章:图元和搜索 开发人员指南 191 © 2006 MapInfo Corporation. 保留所有权利。 // anchored DoublePoint dblPnt = vectorGeometry.getLabelPoint(null); double[] pnts; int offset = 0; int numPts; // Loop through all the point groups and then put the // points into an array for (int i = 0; i < vectorGeometry.getPointListCount(); ++i) { // Get the next Point List pntList = vectorGeometry.getNextPointList(); // determine the number of Points in the point group numPts = pntList.getPointCount(); // Create the point array large enough to hold all the // points pnts = new double[numPts]; // Call getNextPoints which will put the points into the // array pntList.getNextPoints(pnts, offset, numPts / 2); } } // Get the next feature ftr = rFtrSet.getNextFeature(); } // Rewind the FeatureSet to prepare for future use rFtrSet.rewind(); 使用 FeatureFactory 创建图元 MapXtreme 可用于创建、修改或删除图元(点、线、折线、区域),也可用于将这些对象添加到注 释图层、TAB 或 JDBC 图层。新建地图图元有两种途径。既可以使用 FeatureFactory 对象来创建图 元(如下所示),也可以通过使用 FeatureLayer 类的搜索方法检索现有图元来创建图元(第 195 页 的搜索部分作出了说明)。 FeatureFactory 方法 FeatureFactory 对象的方法可用于新建表示点、线、折线和区域的地图图元。如下所示: • createPoint • createPolyline • createRegion • createCircularRegion • createEllipticalRegion使用 FeatureFactory 创建图元 192 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 上述方法均返回独立的 Feature 对象。要通过 FeatureFactory 创建任意 Feature 对象,需要指定 Rendition、Label Rendition、与该 Feature 相关的 Attributes 数组、用于该 Feature 的几何对象和 PrimaryKey。 注: 对于 TAB 文件而言,将在图元添加到图层时指定 PrimaryKey。此外,主键不能更改。 创建了要添加到 JDBC 表图层的图元之后,该图元最终将存储为数据库表中的一行。提供给 FeatureFactory 的 Attributes 数组是用于这一新行的列值。这些值必须完全符合从图层的 TableInfo 检索的列名的顺序,即 TableInfo 列名数组中的每个名称均必须在图元的 Attributes 数组中具有相应 的值。如果 JDBC 图元 Attributes 数组包含空引用,则相应的列值将作为空值插入到数据库。对于表 示空值的 Attribute 对象(如新的 Attribute((Double)null) ),也可用于上述情况。 图元还需要指定非空的 PrimaryKey 值。但是对于 TAB 文件则无需指定。确保该 PrimaryKey 的值是 指定用于相应图元的 Attributes 数组的一部分。 用于 JDBC 图元的几何对象必须位于数据库表的坐标系之中,否则将抛出例外。 要创建点,可指定中点,及其符号大小、字体和颜色等样式和 Attributes 数组。 为了说明圆的几何结构,除了指定样式和属性之外,还必须使用其它参数,包括分辨率,以及是否 使用显示或数字坐标对此圆进行说明。分辨率定义绘制近似多边形时使用的节点数和第一个参数, 该参数控制图元为显示或数字圆。可以在屏幕(显示)的坐标系或地图(数字)的坐标系中绘制 圆。在屏幕上,显示版本的外观通常比较精确(例如,更像一个圆),然而数字版本可能显示为椭 圆形,因为它是按照地球的曲线绘制的。 除了用于圆的参数之外,椭圆区域还采用双精度型来说明 x 半径和 y 半径。 创建区域或多边形涉及创建 double point 数组来说明几何对象的操作。 代码示例 此示例说明如何在 FeatureFactory 中创建各个图元类型:点、圆、线、椭圆形和多边形。要创建一 个区域,请按照多边形示例来创建传递到 createRegion() 的点数组。 还可以在 Javadocs 中的 FeatureFactory 类下找到此代码示例。 // Get Feature Factory reference //map is a MapJ object FeatureFactory ff = myMap.getFeatureFactory(); // Set up Attribute object Attribute att[] = new Attribute[1]; att[0] = new Attribute("Feature1"); // Set up rendition object /* This will not work for tab files. For tab files you must use the com.mapinfo.tab.TABStyleFactory to create an appropriate Rendition object. */ Rendition rend = RenditionImpl.getDefaultRendition(); // For circles, specify the edge and fill color. rend.setValue(Rendition.STROKE, Color.cyan); rend.setValue(Rendition.FILL, Color.green);第 13 章:图元和搜索 开发人员指南 193 © 2006 MapInfo Corporation. 保留所有权利。 // For points, specify the symbol size, font, and color rend.setValue(Rendition.SYMBOL_STRING, "@"); rend.setValue(Rendition.FONT_SIZE, 16); rend.setValue(Rendition.FONT_FAMILY, "MapInfo Shields"); rend.setValue(Rendition.SYMBOL_FOREGROUND, Color.blue); // For lines, specify the line color and width rend.setValue(Rendition.STROKE, Color.green); rend.setValue(Rendition.STROKE_WIDTH, 4); // For ellipses, specify the fill color and opacity rend.setValue(Rendition.FILL, Color.blue); rend.setValue(Rendition.FILL_OPACITY, new Float(0.40)); // Set the center point features for the circle DoublePoint dp = new DoublePoint(-104, 45); // Create Circular region int circType=1; int circRadius=25; int circResolution=25; // For Elliptical region // Create an integer variable to set the coordinate system of the // region. 0 sets for map coords, 1 sets screen coords int type = 1; // Create a DoublePoint variable to set the center of the ellipse DoublePoint centerPt = new DoublePoint(-73.702000, 42.682599); // Create a double variable to set the rotation angle of the ellipse in // radians double xRadius = 1.0; double yRadius = 0.25; // Create an integer variable to specify the number of points that will // describe the ellipse. If 0, the default of 12 will be used. int resolution = 0; Feature retFeature; // Create an Annotation layer for storing the features we're // creating TableDescHelper tableDescHelper = new AnnotationTableDescHelper("Annotations"); DataProviderHelper dataProviderHelper = new AnnotationDataProviderHelper(); DataProviderRef dpRef = new LocalDataProviderRef(dataProviderHelper); FeatureLayer annotLayer = (FeatureLayer) myMap.getLayers().insertLayer(dpRef, tableDescHelper, 0, "Annotations"); //PrimaryKey is taken as an argument by all the create methods and //cannot be nullFeatureSet 集合 194 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 PrimaryKey pkey = new PrimaryKey(att[0]); // Create a Circular Region retFeature = ff.createCircularRegion(circType, dp, circRadius, LinearUnit.mile, circResolution, rend, null, att, pkey); // Add the new feature to the annotation layer PrimaryKey pk = annotLayer.addFeature(retFeature); // Create Point retFeature = ff.createPoint(dp, rend, null, att, pkey); pk = annotLayer.addFeature(retFeature); // Create PolyLine using a 2 x 6 double matrix // Row 1 contains 3 points(x,y,x,y,x,y) and 2 line segments. // Row 2 contains 3 points(x,y,x,y,x,y) and 2 line segments. double pts[][] = { {-104, 45, -102, 46, -100, 45}, {-100, 45, -98, 44, -96, 46} }; retFeature = ff.createPolyLine(pts, rend, null, att, pkey); double angle = 0; //Create Elliptical Region retFeature = ff.createEllipticalRegion( type, centerPt, angle, xRadius, yRadius, LinearUnit.mile, resolution, rend, null, null, pkey); pk = annotLayer.addFeature(retFeature); FeatureSet 集合 FeatureSet 是 Feature 对象的集合。在 MapXtreme 中,构成地图的各个图层通常在每个图层中都拥 有相同的图元类型。例如,“世界”图层拥有代表每个国家或区域的区域图元,“高速公路”图层 拥有代表美国主要高速公路的线图元,而“世界首都”图层则拥有代表每个国家或地区首都的点图 元。Layer 对象的搜索方法从图层中返回 FeatureSet 集合。 注: 集合中的图元不按特定的顺序显示。第 13 章:图元和搜索 开发人员指南 195 © 2006 MapInfo Corporation. 保留所有权利。 使用以下方法可控制 FeatureSet 对象: 为了将内存分配降至最低,在从 getNextFeature 方法返回图元时,MapXtreme 可能复用同一内部内 存。如果需要在下一次调用 getNextFeature 之后保留所有或部分图元,则制作要持续使用的对象副 本。这就意味着 FeatureSets 只能正向移动,只要传递了一个图元就无法返回到它。 一些 FeatureSets 可能是可重绕的,这就意味着可将 FeatureSet 重置为它的第一个图元。这是每个 数据提供方的实现细节。如果 FeatureSet 不可重绕,那么可从不可重绕的 FeatureSet 创建可重绕的 FeatureSet,然后再重新移动一次 FeatureSet。 以下是重绕 FeatureSet 的示例: FeatureSet fs = null; if (!fs.isRewindable()) { fs = new RewindableFeatureSet(fs); } 使用 FeatureSets 完成操作后,应始终调用 dispose 方法。 搜索 MapXtreme 最强大的功能之一是搜索功能。使用搜索功能可以按照地理信息检索特定的数据。例 如,如果要查找 25 米半径范围内的所有基站,那么将执行搜索操作。 搜索是 FeatureLayer 对象的方法。它们返回 FeatureSet 对象。MapXtreme 的基本功能是选择地图 上的图元,以便可对其执行其它任务。用户可以单击地图来选择一个或多个图元(点、线、区域 等)。搜索结果通常解释为选择内容。 以下 Layer 对象的方法提供了各种搜索图层并返回 FeatureSet 集合的方式。 • searchAll • searchWithinRadius • searchWithinRegion • searchWithinRectangle • searchAtPoint 方法说明 dispose 处理由 FeatureSet 使用的资源。使用 FeatureSet 完成操作后,将调 用此方法。 getNextFeature 获取集中的下一个图元。 getRendition 获取此 FeatureSet 中所有图元的基础样式。 getTableInfo 获取说明此 FeatureSet 的 TableInfo(元数据)。 isRewindable 决定此对象的可重绕状态。 rewind 在第一个图元之前重绕 FeatureSet。搜索 196 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 • searchByAttribute • searchByAttributes 所有搜索操作都将传递要返回的列的名称和查询参数。从任何搜索操作返回的列的名称应该放在 List 对象中。 限制搜索操作返回的信息 从搜索图层操作返回的图元的特征取决于几种可选参数。默认情况下,将使用查询返回与图元相关 的几何对象、样式、标注样式、首选标注位置和栅格数据。如果您想限制为某个图元返回的信息, 可以使用 QueryParams 类。这样会改善查询性能。 QueryParams 类还指定查询的 SearchType。从查询返回的图元取决于指定作为查询一部分内容的搜 索类型。使用 mbr 搜索类型的查询返回其最小边界矩形和搜索区域交叉的图元。此搜索类型的限制 条件最少,却可以返回最多的图元。 使用 partial 搜索类型的查询返回与搜索区域交叉的图元。 使用 entire 搜索类型的查询返回完全包含在搜索区域中的图元。这是限制条件最多的搜索类型。如 果您未使用 QueryParams,则 SearchType 默认是 mbr。 部分和全部都是绝对的,有效的搜索会比较图元的真实几何范围和搜索区域。在需要真实和精确的 结果时,必须使用这些搜索类型。mbr 搜索是一个快捷的近似方法,简化了几何对象,允许更加快速 的比较。在诸如 Oracle Spatial 的特定数据源中,mbr 搜索 (SDO_FILTER) 实际上是通过将图元的最 小边界矩形和区域的最小边界矩形交叉来实现的,这样可以产生的“命中数”比使用实际搜索区域 更高。 此示例显示 QueryParams 对象如何限制搜索操作所返回的信息: // find all Features entirely within a given search region, return a // single Attribute column and no Rendition information. List cols = new ArrayList(); cols.addElement(“County”); Feature searchFeature = mapj.getFeatureFactory().createRegion(points, rend, attribs,null); QueryParams queryParams = new QueryParams(SearchType.entire, true, false, true, true, false); FeatureSet fs = layer.searchWithinRegion( cols, searchFeature.getGeometry(),queryParams); 注: 由于在实现 SQLServer 数据提供方过程中存在某些限制,因此如果 SearchType 不是 mbr, 则 searchInRegion() 请求可能会降低性能。当要搜索的搜索区域和几何对象是较大的复杂区 域时,这一点尤为明显。第 13 章:图元和搜索 开发人员指南 197 © 2006 MapInfo Corporation. 保留所有权利。 GML 格式的向量响应 MapXtreme Java 提供了以 GML 格式从搜索操作获取向量响应的能力,这种格式是说明地图对象的 几何范围的 XML 编码。 可以由 MapJ 客户端应用程序和非客户端使用 MapVectorRequests。对于从 MapJ 类创建的客户 端,将利用 VectorRequestComposer 类,通过编程方式构建请求。此类包含在 MapJ 图层对象和 命名图层上所有支持的搜索方法的工厂方法。 对于非 MapJ 客户端应用程序,必须通过开发人员自己的途径,按照控制 XML 文档内容的 DTD 语 法和其它策略来创建 MapVectorRequest 文档。 除非将传递到 VectorRequestComposer 的 createFeature() 方法的 QueryParams 对象配置为不返回 几何对象,否则 MapVectorRequest 将返回几何对象,其中 Feature 代表点、多边形或区域。 代码示例 有关在搜索过程中如何使用 VectorRequestComposer 的代码示例,请参阅 VectorRequestComposer 类的 API 联机文档中引用的联机示例。 搜索方法 本节定义了各种可用的搜索方法和展示其用法的代码。 searchAll 返回图层中所有图元的 FeatureSet 集合。如果应用程序需要循环整个图层,可使用此搜索方法。 List columnNames = null; FeatureSet fs = myLayer.searchAll(columnNames, QueryParams.ALL_PARAMS); searchWithinRadius 返回在点对象的指定距离之内构成图元的 FeatureSet 集合。使用此搜索可查找离指定位置最近的经 销商,或者返回一家商店某一半径范围内的客户数。 List columnNames = null; DoublePoint dblPt = new DoublePoint(-73.889444, 42.765555); double dRadius = 10.03; FeatureSet fs = myLayer.searchWithinRadius(columnNames, dblPt, dRadius, LinearUnit.mile, QueryParams.ALL_PARAMS);搜索方法 198 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 searchWithinRegion 此搜索方法返回在一个图元的几何范围内构成图元的 FeatureSet 集合。使用此方法可返回特定区域 (如邮政编码)内的客户数,或返回用 FeatureFactory 创建的区域内包含的图元。 List columnNames = null; Geometry vGeom = null; FeatureSet fs = myLayer.searchWithinRegion(columnNames, vGeom, QueryParams.ALL_PARAMS); searchWithinRectangle 此搜索方法返回指定矩形边界内的 FeatureSet 集合。使用此方法可在给定地图窗口内进行搜索或预 检缩放级别,以查看它是否包含某些要关注的点。 List columnNames = null; DoubleRect dRect = new DoubleRect(-74.092662, 42.765555, -73.668898, 42.856420); FeatureSet fs = myLayer.searchWithinRectangle(columnNames, dRect, QueryParams.ALL_PARAMS); searchAtPoint 此搜索方法返回构成指定点上的图元的 FeatureSet 集合。使用此方法可以测试与某个点交叉的所有 对象。使用此方法可以测试给定的位置是否位于某个覆盖范围之内。 List columnNames = null; DoublePoint dp = new DoublePoint(12.3456, -67.890); FeatureSet fs = myLayer.searchAtPoint(columnNames, dp, QueryParams.ALL_ PARAMS); searchByAttribute 此搜索方法返回其属性与给定属性相匹配的 FeatureSet 集合。使用此方法可以选择带有公用属性信 息的所有图元。例如,如果拥有一张包含家庭收入列的表,即可使用 searchByAttribute 来返回家庭 收入等于 100,000 美元的所有记录。 List columnNames = null; // return Features where "Annual_Income" equals $100,000 Attribute mySearchAttr = new Attribute(100000); String searchCol = "Annual_Income"; FeatureSet fs = myLayer.searchByAttribute(columnNames, searchCol, mySearchAttr, null);第 13 章:图元和搜索 开发人员指南 199 © 2006 MapInfo Corporation. 保留所有权利。 searchByAttributes() 使用 searchByAttributes() 方法可以比较几列中的值,并返回匹配标准的图元。将使用等号运算符 比较当前的值。 此方法将取代 searchByPrimaryKey(现已过时)。定义关键字的列现在包含在 searchByAttributes() 的 attNames 参数中。代表关键字的值将放在 attValues 参数的 AttTuple 对象中。AttTuple 对象替换 主键,作为值的持有者。 采用 searchByAttributes(),当 FeatureSet 中的一个图元满足任何 AttTuple 对象的搜索条件时,会将 其返回。如果使用 OR 运算符计算的多个 AttTuple 对象隐含条件,也可返回图元。 searchByAttributes() 的语法如下所示: public FeatureSet searchByAttributes (List columns, List attNames, List attOperators, List attValues, QueryParams queryparams) throws Exception {...} 搜索方法的常规形式如下: "return the requested columns from all features where (colA = v1 and colB = v2) OR (colA = v3 and colB = v4) OR ... (colA = v9 and colB = v10)". 定义参数的方式如下: attNames = {colA, colB} // string objects attOperators = {"eq", "eq"} //AttOperator objects AttTuple [ ] attValues = {new AttTuple(v1,v2), new AttTuple(v3,v4), ..., new AttTuple(v9,v10)}; // (i.e. where v1, ..., v10 are existing // Attribute objects) //AttTuple objects that contain Attribute objects 列可以是满足以下两个条件的任意列:一是其所在的表中可使用简单运算符,二是其值可以用 Attribute 类表示。 可返回空列表,但不能是空值。 由于 searchByPrimaryKey() 已过时,因此可以使用 QueryParams 接口上的新构造器。无需在 QueryParams 中包含键列,它们现已包含在由 searchByAttributes() 中的 attNames 定义的列列表中。 对于编写定制查询的用户来说,请注意此前使用 PrimaryKey 的 QueryBuilder 接口中的方法已经过 时,不再支持 queryByAttributes。 以下代码示例展示了搜索其 Capital 字段中的值等于 Albany 的图层中的所有图元的过程。 List columnNames = null; // create a search Attribute Attribute mySearchAttr = new Attribute("Albany"); // create a List of columns to search on List namesList = new ArrayList(); namesList.add("Capital"); // create a List of column values to search for List valuesList = new ArrayList();搜索由 SQL 查询定义的图层 200 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 AttTuple myTuple = new AttTuple(mySearchAttr); valuesList.add(myTuple); // create a List of search operators (this example uses 'equal') List operatorsList = new ArrayList(); operatorsList.add(AttOperator.eq); // do the search FeatureSet ftrSet = myLayer.searchByAttributes( columnNames, namesList, operatorsList, valuesList, QueryParams.ALL_PARAMS); 搜索由 SQL 查询定义的图层 MapXtreme Java 执行用户定义的 SQL 查询,无需对此查询进行任何修改。MapXtrem 将在写入查 询时执行它(该查询称为“传递”查询),并检索图层中的所有图元。该查询可以返回很多不显示 的图元,例如在缩小图元密度较高的图层的情况下。 传递查询用于更高级的 MapXtreme Java 用户,这些用户需要定制查询来构造图层数据,并且了解 如何包含相应的限制条件。 QueryBuilder 接口 为了帮助技术型用户通过传递查询制定限制条件,MapXtreme Java 提供了一个接口,您可以使用这 个接口编写您自己的回调对象,以在由传递查询定义的图层上进行渲染或执行搜索时,创建修改的 查询字符串。QueryBuilder 对象将指定到传递图层,其在需要时调用它的方法。 在地图渲染过程中,如果 MapXtreme Java 遇到由包含 QueryBuilder 的传递查询定义的图层,将调用 QueryBuilder 方法 queryInRectangle,以提供传递到渲染器的查询字符串。QueryBuilder 提供了构 造新查询字符串所需的全部数据,这个新的查询字符串中包含的限定性几何条件将返回的图元仅限于 显示视口中可见的图元。如果此图层没有 QueryBuilder,那么渲染它时返回的图元会远远多于显示的 图元,从而严重影响了效率。(对于没有通过使用 INFO 级别或更高级别的 com.mapinfo.util.Logger 类记录输出渲染的返回图元,您可以确定其数量。) 利用调用任何搜索方法搜索传递图层的操作需要通过添加 where 子句和 / 或更改 select 子句中的列修 改的查询。每种搜索方法都在 QueryBuilder 接口上调用它的对应方法,并使用新的查询字符串来执 行搜索。没有 QueryBuilder,传递图层搜索将会报错。QueryBuilder 必须应用于任何由传递查询创 建的图层才能执行搜索。 要在 Layer 对象上设置 QueryBuilder,请遵循以下示例: Layer.setQueryBuilder(QueryBuilder myQB); QueryBuilder 的考虑因素 • QueryBuilder 接口是技术型用户使用的功能,只能在图层的表定义不足的情况下使用。 • 使用 QueryBuilderXMLHandler 接口,可以从地图定义保存 / 存储新的 QueryBuilder 引用。 • QueryBuilder 接口只能在客户端应用程序中使用,也就是说,在哪里进行数据访问就在哪里驻留 MapJ 实例。不会将 QueryBuilder 对象发送到服务器。 • 可以将同一 QueryBuilder 引用用于多个图层。第 13 章:图元和搜索 开发人员指南 201 © 2006 MapInfo Corporation. 保留所有权利。 • 从 QueryBuilder 返回的查询将采用与所有传递查询完全相同的方式执行。 • 使用 QueryBuilder 并不能更改定义图层的任何数据。返回的查询执行一次后就会废弃;它不会替 换用于构造 Layer 对象的 TableDescHelper 中的原始查询。 • 通过 QueryBuilder 查询返回的数据拥有的主键定义、维数、坐标系和空间列(如果有的话)必须 与在 TableDescHelper 中最初确定的值相同。这是 QueryBuilder 的限制。 MapXtreme Java Manager 中的 QueryBuilder 另一种方法是以编程方式创建 QueryBuilder,可以使用 MapXtreme Java Manager 将一个 QueryBuilder 与 JDBC 图层相关联。请参阅第 52 页第 5 章的将 QueryBuilder 附加到 JDBC 图层。 querybuilderxmlhandlers.xml 文件已进行了扩展,可以添加 QueryBuilderXMLHandler 用来实例化 QueryBuilder 的默认属性集的可选定义。QueryBuilder 在 Mapxtreme Java Manager 中确定后,这 些属性创建 QueryBuilder 的实例并将其添加到图层中。 在图层控制中选择 QueryBuilder 键后,应用程序使用该键: 1. 从 QueryBuilderMapper 中获取关联的 QueryBuilderXMLHandler 2. 从 QueryBuilderMapper 中获取关联的默认属性,并 3. 调用 QueryBuilderXMLHandler.createQueryBuilder(Properties) 以获取 QueryBuilder 并将其添加 到图层实例中。 示例代码 在 MapXtreme Java 的 /examples/client/QueryBuilders 目录中提供的是 OracleQueryBuilder 的实现 示例,Oracle 用户可以将此作为入门学习范本。 要部署用于 MapXtremeJava Manager 的 OracleQueryBuilder 示例。 1. 将以下 .class 文件从 \MapXtreme-4.8.0\examples\client\querybuilders 文件夹复 制到 \MapXtreme-4.8.0\lib\client 文件夹: • IdentityQueryBuilder.class • OracleQueryBuilder.class • OracleQueryBuilderXMLHandler.class图元编辑 202 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 2. 编辑 \MapXtreme-4.8.0\lib\client 下的 querybuilderxmlhandlers.xml 文件。取消 QueryBuilderXMLHandlerMapping 的注释标记。 此外还可以找到 IdentityQueryBuilder 的示例代码,其返回未更改的原始输入查询。这对使用基础类 开发新的 QueryBuilder 尤为实用。 图元编辑 MapXtreme 可用于添加、修改或删除构成注释图层的图元(点、线、区域等),注释图层是通过 JDBC 数据源中的表或 TAB 图层植入图层的。使用以下 FeatureLayer 类方法可以完成这些操作: • addFeature • addFeatureSet • replaceFeature • removeFeature 添加到图层中的图元可以在 FeatureFactory 中创建或成为执行搜索的结果(searchWithin、searchBy 等),有关 FeatureFactory 的详细信息,请参阅第 191 页的使用 FeatureFactory 创建图元;有关 搜索图层的讨论,请参阅第 195 页的搜索。 只能在客户端应用程序中执行图元编辑。请务必使用 LocalDataProviderRef 创建计划编辑或可能需 要编辑的所有图层。 以下代码示例说明了如何获取图元的 PrimaryKey,以便替换。切记:访问 FeatureSet 后必须对其正 确处置。 FeatureSet fs = tabLayer.searchByAttributes(columns, attNames, attOperators, attValues, QueryParams.EMPTY_PARAMS); Feature feat = fs.getNextFeature(); if (feat != null) { featurePKey = feat.getPrimaryKey(); System.out.println("PrimaryKey: " + featurePKey.toString()); Feature newFeature = myMap.getFeatureFactory().createPoint( new DoublePoint(-72, 42), myRend, myLabelRend, attValues, null); tabLayer.replaceFeature(featurePKey, newFeature); } fs.dispose(); 编辑注释图层 注释图层包含在特定地图区域上标记或放置重点的图元。注释图层不与任何持久的数据源相关联, 因此对注释图层所做的更改只会影响当前 MapJ。编辑注释图层只更改为该图层渲染的图像。 注释图层图元的主键 添加到注释图层的图元必须拥有非空的主键值,其由一个或多个还指定为图元(非空)Attributes 数 组的一部分的属性值构成。第 13 章:图元和搜索 开发人员指南 203 © 2006 MapInfo Corporation. 保留所有权利。 继第一个图元之后陆续添加到注释图层的图元必须与第一个图元的主键结构相匹配(定义主键值的 属性值的数据和类型相同)。 注释图层图元的坐标系 对于注释图层,图元应该位于 MapJ 对象的数字坐标系中。当使用 FeatureFactory 创建图元时,有 必要指定 MapJ 数字坐标系中的输入坐标数组。当采用通过搜索方法返回的 FeatureSet 中的图元 时,图元已位于 MapJ 数字坐标系中。 编辑 JDBC 表图层 可以由数据库表名或数据库传递查询定义 JDBC 图层。然而,只能编辑由数据库表名定义的图层 (添加、替换或删除图元),因为对图层所做的更改实际是对源数据库表进行的更改。 对该表所做的更改必须符合在表的方案定义中定义的任何约束条件。例如,某些列可能需要是非 空、唯一形式;拥有某一范围之内的数字值;拥有大于零的数字值或拥有某一长度范围内的字符串 值。违反这些约束条件将造成数据库出错。 此外,还必须具备更改数据库表的权限。 对 JDBC 表图层进行更改的持久性 对 JDBC 表图层成功进行更改会引起源数据库表中发生更改。然后,当下一次从数据库刷新图层数 据时,将在 MapJ 中看到所做的更改。MapXtreme 将每个图元编辑请求视为单独的事务处理,并且 在成功完成每个请求之后立即提交对数据库所做的更改(或如果更改失败,则将立即回退)。当请 求是 addFeatureSet 时,集合中的每个单独的图元将发生提交(或回退)。 编辑 JDBC 图层中的图元的规则 向 JDBC 图层添加图元时,必须遵循以下规则。在添加 FeatureSet 和替换图元时,这些规则同样适 用。有关详细信息,请参阅 Javadocs 中的 FeatureLayer.addFeature()。 图元定义 必须按照通过调用 FeatureLayer.getTableInfo() 返回的 TableInfo 准确定义所有要添加的 JDBC 图元。特 别是,图元的 Attributes 数组必须与 TableInfo 的列名数组完全对应,也就是说,TableInfo 列名数组中的 每个名称必须在图元 Attributes 数组中拥有相对应的值。如果 JDBC 图元 Attributes 数组包含空引用,则 相应的列值将作为空值插入到数据库。对于表示空值的 Attribute 对象(如新的 Attribute((Double)null) ), 也可用于上述情况。 图元几何对象 JDBC 图元的几何对象必须位于数据库表的坐标系之中,否则将出错。 图元样式 如果表列的样式类型是 RenditionType.MAPXTREME,则只插入样式;否则将忽略样式。图元编辑 204 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 自动递增列 如果数据库中的任何列是“只读”或“自动递增”列,即只能通过数据库设置它的值,那么 Mapxtreme 将忽略这些列。这些列类型在一些数据库中用于主键值。所有列(包括主键列)都必须以 JDBC 图 元 Attributes 数组表示。MapXtreme 不提供缺失的值。如果整数键列需要唯一值,那么可以使用 getColumnStatistics() 来查找列中的最大值,并添加一个值来获取唯一的值。 编辑 Tab 图层 MapXtreme Java 提供了编辑本地 MapInfo TAB 文件的功能。只能更新 Java 有权编辑的 TAB 文件。 也就是说,不可编辑标记为只读或由其他用户或组拥有的文件。除非在 Java 安全管理器中授予了特 殊的权限,否则也不允许从 applet 修改文件。 添加的图元应该与底层 TAB 文件拥有相同的表结构。 列值必须符合在表中定义的规则。例如,具有字符列或小数精确度列的列。 编辑 Tab 图层中的图元的规则 向 TAB 图层添加图元时,必须遵循以下规则。 图元样式 必须使用 com.mapinfo.tab.TABStyleFactory 类创建图元样式。从而可以使样式与在 MapInfo Professional 中定义的样式保持一致。 图元几何对象 假定所有添加的几何对象与 TAB 文件位于同一坐标系中。 Tab 图层图元的 PrimaryKey 当向 TAB 图层添加新的图元时,将自动分配 PrimaryKey。可以通过两种方式返回 TAB 文件的 PrimaryKey。第一种方式是通过使用过时的 QueryParams。第二种方式是通过请求伪列名 com.mapinfo.dp.tab.TABTableDescHelper.KEY_COLUMN_NAME。此列中的属性值可以放在新的 PrimaryKey 实例中。标注和样式 本章介绍如何使用 API 设置各种标注属性和样式。 本章内容:  标注概览. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .206  专题标注. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .206  每图元标注样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207  LabelProperties 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207  合并标注属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .212  标注代码示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .213  样式概览. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .216  样式属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .217  命名样式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228  每图元样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .230标注概览 206 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 标注概览 标注元素可通过 MapXtreme Java API 控制。此外,还可以通过 MapXtreme Java Manager 中的 “图层控制”对话框上的“标注”按钮或 Layer LayerControl 来控制这些属性。本章侧重于介绍 API。 有关通过图层控制对话框进行标注的详细信息,请参阅第 5 章:管理 MapXtreme Java。 专题标注 标注是基于通过 LabelProperties 对象为其设置的属性来绘制的。在此前的版本中,一个图层只能设 置一个 LabelProperties 对象。因此该图层的所有标注的外观均比较相似。 现在通过引入标注专题,每个图层可以具有多个 LabelProperties 对象。和图元专题的概念类似,标 注专题在 LabelProperties 对象上工作。但是标注专题的功能比图元专题更加强大,其不仅可以修改 标注的 Rendition 对象,还可以影响到标注的位置、优先级、文本和缩放性能。 正如图元专题一样,有多种类型的标注专题可供使用:RangedLabel 专题、IndividualValueLabel 专 题、OverrideLabel 和 SelectionLabel 专题。这些专题的用法和图元专题的用法类似:尤其是在使用 不同类型的样式、位置、标注文本对标注集合进行操作的时候。 例如,要标注一个图层,该图层的每个标注的外观均由与相应图元关联的值控制。此时可创建 RangedLabel 专题来显示相应图元的标注,对于范围之内高端的标注,可采用与低端范围内的标注 不同的颜色或字体大小来表示。 要更改搜索返回的图元的 LabelProperties,可使用 SelectionLabelTheme。这一操作可通过先将 FeatureSet 添加到选择,然后将该选择与 SelectionLabelTheme 相关联来完成。 每个图层可以应用多个标注专题。专题列表顶部的专题可以覆盖排序较为靠后的专题的设置。在 LabelProperties 对象中提供的属性定义了各种标注专题如何一起显示最终的标注特征。 代码示例 : LabelProperties 本例使用默认的位置设置、多行文本,并使用源自表的多列和符合图元路径的标注来进行标注。 FeatureLayer thisLayer = (FeatureLayer) myMap.getLayers().get("States"); LabelProperties labelProps = new LabelProperties(); // Set the Label offset and alignments to their default positions. labelProps.setOffset(LabelProperties.DEFAULT_OFFSET); labelProps.setHorizontalAlignment( LabelProperties.HORIZ_ALIGN_DEFAULT); labelProps.setVerticalAlignment(LabelProperties.VERT_ALIGN_DEFAULT); // Turn the multiline option on and set the columns to be used for // labeling. labelProps.setMultiLineTextMode(LabelProperties.MULTILINE_TEXT_ON); labelProps.setLabelExpression( "\"NAME:[\"+state_name+\"]\\nABBREV:[\"+state+\"]\""); // Set LabelFollowingPath to true to enable label splining第 14 章:标注和样式 开发人员指南 207 © 2006 MapInfo Corporation. 保留所有权利。 boolean bFollowPath = true; labelProps.setLabelFollowingPath(bFollowPath); // Set a Rendition for the Labels and create an OverrideLabelTheme in // order to display the options set. Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FONT_FAMILY, "Arial"); rend.setValue(Rendition.FONT_WEIGHT, 2); labelProps.setRendition(rend); OverrideLabelTheme orLabelTheme = new OverrideLabelTheme( labelProps, "Theme Name"); thisLayer.getLabelThemeList().add(orLabelTheme); // Get the States Layer, set its LabelProperties object, and turn // labeling on. BaseLabelProperties base_label = new BaseLabelProperties(labelProps); thisLayer.setLabelProperties(base_label); thisLayer.setAutoLabel(true); 标注的缩放设置 此前,每个图层只支持一个 LabelProperties 对象,该对象指定了缩放属性。现在,标注专题指定了 其自己的缩放设置,图层的每个专题均可有其自己的缩放设置。在 LabelProperties 上的缩放属性已 经弃用。此外,进一步增强的图元专题还包括了缩放和可见性设置。 每图元标注样式 地图图元部分上是通过使用诸如颜色、线条宽度、填充图案和符号样式等信息渲染的。这些样式通 过调用 Feature 接口的 getRendition 方法返回。在 MapXtreme Java 3.x 中引进之后,每个图元即 可具有其自己的样式。 每图元标注可用于提供预定义的 Rendition 对象来描述每个图元的标注。在为图层创建适当的 TableDescHelper,提供每图元标注样式列和说明如何解释列数据的信息(如 MapBasic 子句和 XML 格式等)的过程中,将会访问这些预定义的对象。getLabelRendition 方法用于返回图元标注的样式 属性。有关样式的说明,可参阅第 216 页的开头部分。 LabelProperties 类 LabelProperties 类包含控制如何绘制用于每个图层的标注的方法。借助于此类中的方法,可以控制 标注的内容、可见性、外观和相对重要性。 标注上下文 标注文本来自于和地图图元关联的属性。这两个元素是动态链接的。如果底层属性更改,则标注文 本也会发生相应的更改。LabelProperties 类 208 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 要控制将哪一属性列用于图层标注,可使用 LabelProperties 类中的 setLabelExpression 方法。 注: 取用表示列索引的整数的 setLabelColumn 方法现在已经弃用,并已替换为 setLabelExpression。 例如,为了让地图更加便于用户理解,可以使用入学年龄段的人口取代学校的名称,来标注学校所 在街区。 标注表达式 MapXtreme Java 可使用信息列、静态文本或两者的组合来对图元进行标注。要组合列信息和静态文 本,需要为标注创建一个表达式。 标注表达式是 Java String 对象,由以下部分组成:(1) 静态文本(位于双引号转移字符 (\") 中并为每 个标注显示),(2) 数据源的一个或多个列名(该数据源的值在运行时读取并在标注上显示)。 例如,要为名为 POP_2000 列的实际人口值创建一个采用静态文本 "Pop:" 的标注。可使用以下方法: labelprops.setLabelExpression("Pop:" + POP_2000) 标注样式 标注样式涵盖了多种字体外观元素,例如用于标注文本、大小、前景和背景色以及特效的字体。 诸如 Type 1 或 TrueType 之类 Java 2D 平台支持的任意字体均可用于标注。与图层的 LabelProperties 对象关联的样式(检索自其 getRendition 方法)用于控制字体、字体颜色和大小,以及标注的效 果,其中包括下划线、斜体和用于框格的背景色、光晕或轮廓。 例如,作为惯例,首都的标注要比其它城市的标注较大。要在绘制地图时突出这些首都,可能需要 使用带有光晕效果的标注,令其有别于周围的其它城市。 本例表示标注文本将更改为红色的粗体斜体文本: //Change the Rendition LabelProperties labelProp = myLayer.getLabelProperties(); Rendition labelRend = labelProp.getRendition(); labelRend.setValue(Rendition.FONT_WEIGHT, 2f); labelRend.setValue(Rendition.SYMBOL_FOREGROUND, Color.red); labelRend.setValue(Rendition.FONT_STYLE, Rendition.FontStyle.ITALIC); labelProp.setRendition(labelRend); 创建可缩放标注 Rendition.FONT_SIZE 取用的距离单位既可以是以纸介单位描述的大小,如毫米;也可以是诸如英 里或公里的地理单位。通过使用地理单位,可以创建能够缩放的标注,在地图缩放时适当自行重调 大小。在放大地图时,标注也将显示为较大的尺寸。这一特性同样适用于符号大小。 上述代码示例使用地理单位。对于其它示例,请参阅本章位于第 222 页的样式一节。第 14 章:标注和样式 开发人员指南 209 © 2006 MapInfo Corporation. 保留所有权利。 以下代码示例展示如何设置字体大小: // This example sets a font size of 18 for the layer's labels Distance distance = new Distance(18, LinearUnit.mile); labelRend.setValue(Rendition.FONT_SIZE, distance); myLayer.getLabelProperties().setRendition(labelRend); 多行文本 目前,增强的文本格式设置可采用附加的多行文本属性。对于多行文本而言,有三种操作模式。 setMultiLineTextMode 方法可用于指定以下模式之一: • MULTILINE_TEXT_OFF — 标注采用单行文本格式。 • MULTILINE_TEXT_ON — 采用标注文本中的现有换行,生成多行标注。 • MULTILINE_TEXT_COMPUTE — 标注文本将由标注引擎来动态评估,确定是否将标注文本格式 设置为多行。此模式占有的系统运行时资源开销最大。 多行文本的默认行为是 off。 在第 206 页提供的代码示例介绍了多行文本标注的使用方法。 标注可视性 MapJ API 提供了若干种控制标注可视性的方式:设置缩放范围、是否允许文本重复或重叠以及设置 标注优先级。 设置标注的缩放范围和设置图层的缩放类似。为此需要确定的是在哪一级别(地图上的平面距离) 显示标注,然后设置 FeatureLayer 的 BaseLabelProperties 的最大值和最小值。 注: 这一缩放设置不适用于与标注专题相关的标注属性。 如果有两个图元采用了同一名称,可使用 setDuplicationAllowed 方法。该方法可用于实现同时标 注两个图元。例如,现有一个名为纽约的州界和一个名为的纽约的市界。 借助于 setOverlapAllowed 方法可在聚焦区域中实现多个标注的可视性。重叠标注的默认行为是 False。在使用重叠标注时务必谨慎,标注过多反而会令地图难于辨识。 要控制某一区域内的标注密度,可设置每个图层的优先级。setOverridePriority 方法设置是使用默认的 优先级还是使用覆盖值。覆盖值通过 setPriority 方法设置。默认情况下,如果 setDuplicationAllowed 或 setOverlapAllowed 设置为 True,图层列表中排位靠前的图层的标注在地图绘制时具有较高的优先 级。标注图层与其它任何图层类型一样在地图中的位置都是基于 0 的。 setPriority 方法可用于更改图层标注的优先级。默认的标注优先级值由以下等式给定:(图层数 ñ 图层位置) * 10。因此,如果 Layers 对象包含 20 个图层,第 5 位图层的默认标注优先级将为 150。 如果图层所在的 Layers 对象增减其它图层,图层的默认标注优先级可能会随之发生变化。较高的值 具有的优先级也高。如果出现重叠或重复,则将会渲染优先级较高的标注。 以下是设置影响标注可视性的若干 LabelProperties 方法的示例: /* This example allows overlap, uses the second column to label, increases the label priority for this layer to 200, and sets zoom labeling from 10 to 30 kilometers. */LabelProperties 类 210 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 LabelProperties labelProp = myLayer.getLabelProperties(); labelProp.setOverridePriority(true); labelProp.setPriority(200); labelProp.setLabelExpression("labelColumn"); labelProp.setOverlapAllowed(true); // create a BaseLabelProperties BaseLabelProperties baseLabel = new BaseLabelProperties(labelProp); baseLabel.setZoom(true); Distance maxDist = new Distance(30.0, LinearUnit.kilometer); Distance minDist = new Distance(10.0, LinearUnit.kilometer); baseLabel.setZoomMax(maxDist); baseLabel.setZoomMin(minDist); myLayer.setLabelProperties(baseLabel); 标注位置 LabelProperties 类提供了用于控制标注位置的多种方法,其中包括: • 与标注点对齐方式 • 自标注点的偏移量 • 标注是否绕直线图元旋转(可选) • 标注是否遵循直线图元的路径(可选) • 在缩放变化时是否重新计算标注位置(可选) 图元的标注位置使用以下算法计算:初始位置位于 Geometry 对象的 getLabelPoint 方法返回的标注 点。若干该方法返回为空(对于某些图元可能出现),与此相应的标注点将粗略计算为区域中心或 直线的中点。初始位置随后将按照对齐和偏移来进行调整。 但是,如果设置了“Follow Path”属性,则标注位置将不从 getLabelPoint 计算,而是从路径动态进 行计算。请参阅第 211 页的沿特定路线标注。 对齐 标注可水平和垂直与标注点对齐。此处的对齐特指最靠近标注点的标注边框的边。左对齐表示标注 边框的左边缘最靠近标注点(标注显示在右侧)。 水平对齐可指定左、中或右对齐,如未指定,则使用默认对齐方式。默认情况下,VectorGeometry 为居中对齐,PointGeometry 为左对齐。 垂直对齐可以设置为基于基线的顶部、底部或居中。基线参考标注文本所在的印刷样式中的假想 线。顶部垂直对齐标识边界框的顶边最靠近标注,以便标注显示在标注点之下。如为指定垂直对齐 方式,则默认的行为是基线。 偏移量 标注定位的第二个元素是偏移量的值。偏移量位置的值采用相对于用户空间的设备单位。请注意在 Java 的标准用户空间中,Y 轴正向位于 X 轴之下(Y 的正值向下)。如未指定偏移量,则将使用默 认值。区域的默认偏移量为 (0, 0),直线的默认值参照线宽而定,具体为 (0, -w/2),其中的 w 为线 宽。点的默认值参照点的符号大小而定,具体为 (s/2 + 2, -s/2 + 2),其中 s 是符号大小。第 14 章:标注和样式 开发人员指南 211 © 2006 MapInfo Corporation. 保留所有权利。 绕直线旋转标注 此外,还有一个标注位置元素控制标注是否遵循插图编号直线的斜率,默认为是。使用 setLineLabelHorizontal 方法即可覆盖该属性。 沿特定路线标注 标注可设置为在渲染时遵循图元几何形状的路线。这称为曲线标注,此操作在运行时计算路线,同 时考虑其它标注属性设置,例如对齐方式、偏移量和样式。曲线标注尤其适用于折线,但是也可用 于多边形。此时标注将遵循多边形的边界所确定的路线。 除了多行文本之外,直线标注的所有属性均可用于曲线标注。此外,诸如强制标注水平属性等不适 用于曲线的属性将会被忽略。标注所遵循的路线始终是基于其几何形状来动态计算的并拟合为当前 视图的。因此,几何输出节点始终默认为计算曲线标注。 如果标注文本比图元几何形状长,则将会截断部分标注。相应的标注只在字词之间的空白字符处截 断。如果标注字符长度不足既定路线的 2/3,则将不绘制标注。这一点和 MapXtreme Java 在不久的 将来即支持的基于 XML 的导出格式,即缩放向量图像规范之中的文本布放规则要求相吻合。 此外,对曲线标注还可应用多种创意效果。光晕、框格和下划线均为可用于曲线标注和直线标注。 曲线标注不支持多行文本。 设置标注沿曲线绘制将影响到地图的绘制速度。曲线标准是在运行时计算的,任意附加的计算都会 影响到渲染速度。因此,在设置标注属性时必须考虑众多因素。要确保曲线标注与其对应的直线标 注不重叠,需要占用大量资源开支。如果标注在特定缩放级别密度较高并出现堆叠现象,并且此时 不允许重叠,则整个地图渲染的性能均会降低。因此对较小的地图应该考虑使用曲线标注,以便在 可视性和快速渲染时间之间获取最佳的折衷。 LabelProperties 类有两种方法支持曲线标注。使用方法 isLabelFollowingPath() 来确定是令标准贴 合标注几何形状的路线,还是令标注置于标注的相对几何中心。返回为 True 表示标注将遵循标注的 几何形状路线。 如果 bFollowPath 对曲线标注设置为 True,可使用 setLabelFollowingPath()。对于标注的默认行 为是使用标注几何形状的中心作为放置点(无曲线标注)。合并标注属性 212 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 代码示例 // Set LabelFollowingPath to true to enable label splining boolean bFollowPath = true; myLayer.getLabelProperties().setLabelFollowingPath(bFollowPath); 几何计算模式 setGeometryCalculationMode 方法指定标注在地图缩放更改时是否重新定位。当相应的值设置为 GEOMETRY_COMPUTED 时,标准将会重新定位。当放大地图,从较宽视图更改为较近的视图 时,这一特性尤为实用。采用该特性时,标注将会重新调整到新位置,此时的计算以新拟合的地图 视图为基础。默认的行为是 GEOMETRY_STATIC,此时在另一缩放级别上不重新计算位置。 以下示例展示了对齐方式、偏移量和几何计算模式属性的应用。 // change the horizontal and vertical alignments and offset and set the // Geometry Calculation Mode to Compute. LabelProperties labelProp = myLayer.getLabelProperties(); labelProp.setHorizontalAlignment(LabelProperties.HORIZ_ALIGN_RIGHT); labelProp.setVerticalAlignment(LabelProperties.VERT_ALIGN_TOP); labelProp.setOffset(new DoublePoint(10, -15)); labelProp.setGeometryCalculationMode( LabelProperties.GEOMETRY_COMPUTED); BaseLabelProperties base_label = new BaseLabelProperties(labelProp); myLayer.setLabelProperties(base_label); 合并标注属性 一个图层可以具有多个标注专题与其关联,这些相关的专题最终确定了图层上标注的外观。当标注 专题排位较低时,其上的每个标注专题都可能对其部分相同属性作出更改。为了适应上述情况,并 获取最终的预期标注结果,标注专题必须合并。 合并特指评估每个设置并确定标注专题在群组中的优先级的过程。每个标注专题均有优先级编号, 该编号基于标注专题的群组中的编号以及其在群组中的排位。 合并时需要考虑以下两个注意事项:哪些设置优先,以及默认设置是表示其继续使用来自底层标注 专题的设置,还是表示回退至标注专题的原始默认设置。 控制哪些设置优先可通过设置较高 IntraGroupPriority 编号来完成。此外,通过使用 isIntraGroupPriorityCumulative 方法,还可以控制优先级视为绝对还是相对值处理。 要确定默认值的含义,可考虑以下示例。最顶部的标注专题设置为默认对齐方式,但是下面的标注 专题将其设置为 HORIZ_ALIGN_LEFT。此时默认值意味着什么?如果该属性设置为空,则将会接收 上一次的底层属性 (HORIZ_ALIGN_LEFT)。如果不为空,则将采用原始默认值,具体取决于所用的 几何形状类型。第 14 章:标注和样式 开发人员指南 213 © 2006 MapInfo Corporation. 保留所有权利。 标注代码示例 本节提供了更改标注样式的示例。该代码还可参见于 MapXtreme Java 的 /codesamples 目录。 // set property to display labels myLayer.setAutoLabel(true); // Retrieve the LabelProperties from the layer and then assign the // Rendition to our rend instance LabelProperties labelProp = myLayer.getLabelProperties(); Rendition rend = labelProp.getRendition(); // Set the new rendition values rend.setValue(Rendition.SYMBOL_FOREGROUND, Color.green); rend.setValue(Rendition.SYMBOL_BACKGROUND, Color.blue); rend.setValue(Rendition.FILTER_EFFECTS, Rendition.FilterEffects.HALO); labelProp.setRendition(rend); BaseLabelProperties base_label = new BaseLabelProperties(labelProp); myLayer.setLabelProperties(base_label); // Create an ImageRequestComposer ImageRequestComposer imageRC = ImageRequestComposer.create(myMap, 256, Color.blue, "image/gif"); // Create a MapXtremeImageRenderer MapXtremeImageRenderer renderer = new MapXtremeImageRenderer ("http://localhost:8080/mapxtreme480/mapxtreme"); // Render the map renderer.render(imageRC); // Render the map to the file: renderer.toFile("comp.gif"); 代码示例 : OverrideLabelTheme 本代码示例展示如何覆盖图层标注。另请参阅 Javadocs 中有关 OverrideLabelTheme 的信息。 // obtain a reference to the target layer FeatureLayer layer = null; // name of the target layer whose labels' appearance will be altered by // the OverrideLabelTheme if ((layer = (FeatureLayer) myMap.getLayers().get("STATES")) != null { /* obtain the target layer's LabelThemeList, and add a new OverrideLabelTheme theme to it */ LabelThemeList labelThemeList = null; if ((labelThemeList = layer.getLabelThemeList()) != null)标注代码示例 214 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 { /* first, create a new LabelProperties object, which will hold the settings that define the characteristics of the new OverrideLabelTheme theme. */ LabelProperties labelProperties = new LabelProperties(); /* next, add a "LabelExpression" format string to our LabelProperties object, which describes how the text of the labels are to be fabricated. Specifically, the below format string forces label creation such that each label will contain field values from both the "state_name" and "state" columns of the underlying table. */ String labelTemplate = "\"NAME:[\"+state_name+\"]\\nABBREV:[\"+state+\"]\""; labelProperties.setMultiLineTextMode( LabelProperties.MULTILINE_TEXT_ON); labelProperties.setLabelExpression(labelTemplate); /* add a new rendition object to our LabelProperties object, which will specify a new font to use when rendering all label text. */ Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FONT_FAMILY,"Arial"); rend.setValue(Rendition.FONT_WEIGHT,2); // NOTE: 2 == bold labelProperties.setRendition(rend); /* create a new OverrideLabelTheme object and add it to the target layer's LabelThemeList. Create a simple description for the OverrideLabelTheme */ String THEME_DESCRIPTION_NAME = "test_for_override_label_theme"; OverrideLabelTheme overrideLabelTheme = new OverrideLabelTheme(labelProperties,THEME_DESCRIPTION_NAME); labelThemeList.add(overrideLabelTheme); } } 第 14 章:标注和样式 开发人员指南 215 © 2006 MapInfo Corporation. 保留所有权利。 代码示例 : 范围 LabelTheme 以下代码示例展示如何创建范围标注专题。本示例也可参阅 Javadocs 中有关 RangedLabelTheme 的信息。 // obtain a reference to the target layer FeatureLayer layer = null; // name of the target layer whose labels' appearance will // be altered by the RangedLabelTheme if ((layer = (FeatureLayer) myMap.getLayers().get("STATES")) != null) { // obtain the target layer's LabelThemeList, and add a // new RangedLabelTheme theme to it LabelThemeList labelThemeList = null; if ((labelThemeList = layer.getLabelThemeList()) != null) { /* generate a column statistics object for a specific column within our target table name of a column in the target layer's underlying table, which the created RangedLabelTheme will be based upon. */ String TARGET_COLUMN_NAME = "POP_1990"; ColumnStatistics columnStatistics = layer.fetchColumnStatistics(TARGET_COLUMN_NAME); /* generate a List of breakpoints, such that each breakpoints represents a specific numeric range into which the records of our table will be logically grouped. */ //number of breakpoint ranges to create for the RangedLabelTheme int NUMBER_OF_BREAKPOINTS = 10; List breakPointSeries = (List) Bucketer.computeDistribution (NUMBER_OF_BREAKPOINTS,columnStatistics, Bucketer.DISTRIBUTION_TYPE_EQUAL_COUNT); /* create two(2) rendition objects that will act as the end-points for a range of renditions object that are to be created */ Rendition rendStart = new RenditionImpl(); rendStart.setValue(Rendition.FONT_FAMILY,"Arial"); rendStart.setValue(Rendition.FONT_WEIGHT,2); // NOTE: 2 == bold rendStart.setValue(Rendition.FONT_SIZE,12); rendStart.setValue(Rendition.SYMBOL_FOREGROUND,Color.black); Rendition rendEnd = new RenditionImpl(); rendEnd.setValue(Rendition.FONT_FAMILY,"Arial"); rendEnd.setValue(Rendition.FONT_WEIGHT,2); // NOTE: 2 == bold rendEnd.setValue(Rendition.FONT_SIZE,24); rendEnd.setValue(Rendition.SYMBOL_FOREGROUND,Color.red);样式概览 216 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 /* using the two(2) rendition objects, create a series of rendition objects that represent a gradation from the start rendition to the end rendition */ List renditionSeries =(List) LinearRenditionSpreader.spread( NUMBER_OF_BREAKPOINTS,rendStart, rendEnd); /* create an ArrayList of LabelProperties objects, such that each LabelProperties object within this vector is assigned a rendition object from our above created series of rendition objects */ List labelPropertiesSeries = new ArrayList(); LabelProperties labelProperties = null; for (int i = 0; i < NUMBER_OF_BREAKPOINTS; i++) { labelProperties = new LabelProperties(); labelProperties.setRendition( (Rendition)renditionSeries.get(i)); labelProperties.setLabelColumn(TARGET_COLUMN_NAME); labelPropertiesSeries.add(labelProperties); } /* create a new RangedLabelTheme object and add it to ourconcerned layer's LabelThemeList object. Create a simple description for the RangedLabelTheme. */ String THEME_DESCRIPTION_NAME = "test_for_ranged_label_theme"; RangedLabelTheme rangedLabelTheme = new RangedLabelTheme( TARGET_COLUMN_NAME, // java.lang.String breakPointSeries, // java.util.List labelPropertiesSeries, // java.util.List THEME_DESCRIPTION_NAME // java.lang.String ); labelThemeList.add(rangedLabelTheme); } } 样式概览 com.mapinfo.graphics.Rendition 对象是一个显示属性的小集合,相应的属性控制地图上显示的图元 或将要显示的标注的某一方面。在这个小集合中,用户只需设置相关的显示属性。其余的属性将借 助于合并或包含其它样式。这同专题在 MapXtreme Java 中的工作机制相同。一个专题包含的一个 样式只更改图元的一两个方面(例如区域填充颜色),而不会更改其它属性(例如区域边缘的颜 色、宽度等)。 MapXtreme Java 支持众多显示属性,可充分利用 Java2D API 的所有渲染功能。其中包括用于直线 和区域的符号图案、虚线和平行线、向量符号等等。第 14 章:标注和样式 开发人员指南 217 © 2006 MapInfo Corporation. 保留所有权利。 此外,改进的 RDBMS 数据源(Oracle Spatial、IBM DB2 Spatial Extender、Informix、SQL Server 等)还支持每图元(记录)样式。借助于这一特性,可以对源自 RDBM 数据源的图元的显示实现更 加精确的控制,以便其在外观上看起来更加和 MapInfo 用户利用 TAB 文件所获取的地图相似。 本节介绍每图元样式和样式属性。 样式属性 样式属性用于说明地图图元的显示方式。样式 API 支持三种类别的属性:填充、单笔填充和符号。 填充属性控制区域的填充方式。单笔属性控制线条(或线几何对象或区域的边缘)的绘制方式。符 号属性控制如何绘制用于点几何对象、线标记或符号填充的符号。 填充属性 区域既可采用实体颜色填充,也可使用符号填充。要设置颜色,可指定表示所需颜色的 Java Color 对象。例如: Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FILL, Color.red); 填充还可以通过使用填充图案的符号来定义。符号可以是支持的任意符号类型(字体、图像或向 量)。符号图案可以填充区域或较宽的直线(可将较宽的直线视为在直径范围中使用 STROKE 画刷 填充的多边形 STROKE_WIDTH 单位)。该符号用于创建重复绘制到该区域的“平铺”。 对于平铺填充,可以作出如下理解。假设构成平铺面的每个块都具有一个图案,该图案与指定用于 区域填充的符号样式相吻合。该区域就像在平铺面上的一张纸上穿个孔。平铺图案将显示穿过这个 孔。如果有多个区域使用相同的符号图案,则符号块将匹配或列成一队,以便其可以显示为穿透同 时绘制的所有图元。 以下是指定沼泽区域的符号图案示例。此时将创建一个 swamp 符号(如表示沼泽草地的 GIF 文 件)。这一 'swamp grass' 符号将用于平铺填充该区域,得到的外观显示为满是沼泽草地的区域。 Rendition rendSymbol = new RenditionImpl(); rendSymbol.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.IMAGE); rendSymbol.setValue( Rendition.SYMBOL_URL, "http://www.myhost.com/image/swamp.gif"); Rendition rendFill = new RenditionImpl(); rendFill.setValue(Rendition.FILL, rendSymbol); 对于实体图案和符号图案,还可以使用 Rendition.FILL_OPACITY 属性来控制画刷的不透明性。值的 范围介于完全透明填充的 0.0 到完全不透明填充的 1.0 之间。 Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FILL, Color.blue); rend.setValue(Rendition.FILL_OPACITY, 0.5f);样式属性 218 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 渐变 MapXtreme Java 可以使用线性或半径颜色渐变填充方式来填充多边形。 线性渐变 线性渐变沿直线通过一系列颜色过渡。颜色端点用于指定在特定位置所需的颜色。线性渐变所遵循 的直线称为渐变线。默认渐变线的方向为从左至右。这一行为可通过构建用于该渐变线的带有特定 起止点的 LinearGradient 来取代。用于该渐变线的所有坐标均使用 0(表示 0%)和 1. 0(表示 100%)之间的数字指定为所要填充的对象的长度和宽度的百分比。这意味着从右向左指定渐变线, 用户将指定起点 (1.0, 0.0) 和终点 (0.0, 0.0)。此外,还存在的其它可能性有对角渐变线,以及完全在 所要填充或单笔填充的对象之中起止的渐变线。此行为在缩放向量图形 (SVG) 中线性渐变之后建 模。如果要着色的点位于渐变线外,则扩展方法将指定用于点的着色的规则。 以下示例创建自区域左侧开始并于区域右侧终止的 LinearGradientat。颜色渐变本身在沿向量 1/4 处 开始,在沿向量 3/4 处终止。 // create two color stops: one a quarter of the way "down" // the vector and the other three-quarters of the way "down" the // vector. List colorStops = new ArrayList(); colorStops.add(new ColorStop(Color.RED.brighter(), 0.25)); colorStops.add(new ColorStop(Color.RED.darker(), 0.75)); // the gradient vector travels from left to right through the middle of // the region DoublePoint startPoint = new DoublePoint(0.0, 0.5); DoublePoint endPoint = new DoublePoint(1, 0.5); // create LinearGradient LinearGradient linearGradient = new LinearGradient( colorStops, SpreadMethod.PAD, startPoint, endPoint); // set the fill to be the LinearGradient Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FILL, linearGradient); 半径颜色渐变 半径颜色渐变沿圆通过一系列颜色过渡。如果所要填充或单笔填充的对象边界框不是方形,则渐变 路径将为椭圆以匹配边界框的纵横比。半径颜色渐变的限制是由圆确定的,中心为 0% 停止点,外部 轮廓是 100% 的停止点。外圈是通过中心和半径指定的。中线和半径是使用 0 和 1 之间的值指定为 所要单笔填充或填充的边界矩形的宽度和高度的百分比。中心和半径的默认值分别为 (0.5, 0.5) 和 0.5。这将圆置于中部,其半径为对象宽度和高度的一半。如果要填充的对象边界框不是方形,则圆 将成为具有两个半径的椭圆。一个半径是宽度的百分比,另一个半径是高度百分比。颜色端点用于 指定在特定位置所需的颜色。如果要着色的点位于圆外,则扩展方法将指定用于点的着色的规则。 以下示例创建始自于对象中心和渐变为所要填充对象一半的半径的 RadialGradient。 // create two color stops: one a quarter of the way "down" // the vector and the other three-quarters of the way "down" the // vector. List colorStops = new ArrayList();第 14 章:标注和样式 开发人员指南 219 © 2006 MapInfo Corporation. 保留所有权利。 colorStops.add(new ColorStop(Color.RED.brighter(), 0.25)); colorStops.add(new ColorStop(Color.RED.darker(), 0.75)); // the gradient vector travels from left to right through the middle of // the region DoublePoint center = new DoublePoint(0.5, 0.5); double radius = 0.5; // create RadialGradient RadialGradient radialGradient = new RadialGradient( colorStops, SpreadMethod.PAD, center, radius); // set the fill to be the RadialGradient Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FILL, radialGradient); 单笔填充属性 单笔填充属性控制如何显示直线或区域的边。这些属性控制单笔填充图案、线宽、线段连接点和端 点、虚线模式和更多特性。 Rendition.STROKE 属性控制在绘制直线或边时使用的图案。属性值可是是实体颜色、用于指定符号 图案的样式或渐变。这与此前所述的 Rendition.FILL 属性非常相似。当值为类似 FILL 属性的样式 时,样式的符号属性将用于创建要用于对直线进行片断填充的符号。通常,直线上的符号填充只有 在 STROKE_WIDTH > 1 时有意义。 Rendition.STROKE_WIDTH 控制直线宽度(单位为磅)和 Rendition.STROKE_OPACITY、不透明 性(0.0 为透明,1.0 为不透明)。 Rendition rend = new RenditionImpl(); rend.setValue(Rendition.STROKE, Color.red); rend.setValue(Rendition.STROKE_WIDTH, 3.2f); rend.setValue(Rendition.STROKE_OPACITY, 0.3f); 平行线 渲染引擎支持渲染和基线平行的一条或多条直线。Rendition.STROKE_PARALLELARRAY 属性可以 包含一个或多个 Rendition.ParallelLine 对象的数组。每个 Rendition.ParallelLine 对象均包含要绘制 的与基线平行的直线的偏移量和样式。 偏移量为渲染引擎确定了距离基线多少个单位来绘制直线。目前所有单位均以打印机点(1/72 英 寸)指定。偏移量可以为任何数字,其中 0 表示在基线上绘制平行线(无偏移),+N 表示在基线右 侧 N 个单位绘制平行线,-N 表示在基线左侧 N 个单位绘制平行线。左右根据基线方向判断。如果直 线的第一个点起自屏幕左侧,而下一个点位于该点右侧,则 +N 偏移量将令平行线位于下方或基线行 程方向的右侧。 每个平行线都具有单独的样式来指定其绘制方式。 平行线始终在基线渲染之后绘制。 铁路线是平行线的典型示例。这相当于有一条透明基线和两条平行线,每侧一条,两者与基线等距。样式属性 220 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Rendition rendParallel = new RenditionImpl(); rendParallel.setValue(Rendition.STROKE, Color.black); Rendition.ParallelLine parallel1 = new Rendition.ParallelLine( 3.0f, rendParallel); Rendition.ParallelLine parallel2 = new Rendition.ParallelLine( -3f, rendParallel); Rendition.ParallelLine[] parallelArray = {parallel1, parallel2}; Rendition rendBaseLine = new RenditionImpl(); rendBaseLine.setValue(Rendition.STROKE_OPACITY, 0f); rendBaseLine.setValue(Rendition.STROKE_PARALLELARRAY, parallelArray); 虚线 虚线由数字 (float[]) 数组定义并指定为数字对。每个数字对均指定短线的长度以及其间距。例如,值 为 [5,3] 的虚线将采用 5 个单位的短线和 3 的单位间距。STROKE_DASHARRAY 属性可以和任意类 型直线或边一起使用。 STROKE_DASHOFFSET 属性控制在虚线数组中采用多少个单位来开始虚线图案。例如,假定 STROKE_DASHARRAY 属性值为 [5, 3]。如果没有设置 STROKE_DASHOFFSET 或者设置为 0, 则虚线图案将采用 5 个单位的短线和 3 个单位的间距。如果 STROKE_DASHOFFSET 设置为 3,则 该线将采用 2 个单位的短线和 3 个单位的间距,然后是 5 个单位的短线和 3 个单位的间距。 显示在建或规划地下电缆是虚线的示例。 // Create a line that draws two points, skips four points, and so on float[] dashArray = new float[]{2, 4}; Rendition rend = new RenditionImpl(); rend.setValue(Rendition.STROKE_DASHARRAY, dashArray); // Create a dashed line that draws two points, skips four, // ... and so on except start drawing 4 points into the // line. This has the effect of starting the line with two // empty points, two drawn, four empty, two drawn, etc. rend = new RenditionImpl(); rend.setValue(Rendition.STROKE_DASHARRAY, dashArray); rend.setValue(Rendition.STROKE_DASHOFFSET, 4); 直线标记 除了符号旋转以匹配直线角度之外,单笔填充标记和符号图案类似。使用直线标记标注带有重复符 号的直线路径。 例如,使用 Rendition.STROKE_MARKERARRAY 和小汽车图像来渲染交通高峰时公路上一个挨一 个的小汽车。此时需要将 Rendition.SYMBOL_MODE 设置为 Rendition.SymbolMode.IMAGE,将 Rendition.SYMBOL_URL 指向透明小汽车图像的栅格文件的 URL。(符号说明如下)。随后将直线 几何对象的 Rendition.STROKE_MARKERARRAY 设置为符号样式。在渲染时,直线几何对象将基 于该对象的其它属性绘制,随后小汽车图像将会旋转并沿每条线段的路径重复绘制(线段是介于直 线几何对象的任意两点之间的路径)。 Rendition rendSymbol = new RenditionImpl(); rendSymbol.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.IMAGE);第 14 章:标注和样式 开发人员指南 221 © 2006 MapInfo Corporation. 保留所有权利。 rendSymbol.setValue(Rendition.SYMBOL_URL, "http://www.myhost.com/image/car.gif"); Rendition.Marker marker = new Rendition.Marker(rendSymbol); Rendition rendLine = new RenditionImpl(); rendLine.setValue(Rendition.STROKE_MARKERARRAY, new Rendition.Marker[]{marker}); 直线端点,连接点 样式 API 提供了多种方式来完成直线的端点和将直线联接在一起。 使用带有 STROKE_LINECAP 属性的 Rendition.LineCap 来完成带有原型或方形端点装饰或没有装 饰的直线(分别使用圆、方或端点属性)。 与此类似,Rendition.STROKE_LINEJOIN 属性有三种连接线段的方式:连接外角(斜角)、延伸外 边连接(斜接)和圆角(圆)。 渐变单笔填充 MapXtreme Java 现在可使用线性或半径颜色渐变单笔填充。有关线性和半径颜色渐变的完全说明, 请参阅第 218 页的渐变。 下列示例显示了如何将单笔属性设置为 LinearGradient。 // create two color stops: one a quarter of the way "down" // the vector and the other three-quarters of the way "down" the // vector. List colorStops = new ArrayList(); colorStops.add(new ColorStop(Color.RED.brighter(), 0.25)); colorStops.add(new ColorStop(Color.RED.darker(), 0.75)); // the gradient vector travels from left to right through the middle of // the region DoublePoint startPoint = new DoublePoint(0.0, 0.5); DoublePoint endPoint = new DoublePoint(1, 0.5); // create LinearGradient LinearGradient linearGradient = new LinearGradient( colorStops, SpreadMethod.PAD, startPoint, endPoint); // set the fill to be the LinearGradient Rendition rend = new RenditionImpl(); rend.setValue(Rendition.STROKE, linearGradient);样式属性 222 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 符号属性:字体、图像和向量 除了标记点位置之外,MapXtreme Java 中的符号还可以执行众多操作。如上所述,符号可以用作样 式来填充区域、较宽的直线或直线标记。符号可分为三种类型:字体、图像和向量。 字体符号 诸如 Type 1 或 TrueType 之类 Java 2D 平台支持的任意字体均可用作符号。MapXtreme 提供了在地 图绘制中的常用众多 TrueType 符号集,其中包括: • MapInfo 制图专用字体 • MapInfo 运输专用字体 • MapInfo 房地产专用字体 • MapInfo 其它字体 • MapInfo 石油和气体专用字体 • MapInfo 天气专用字体 • MapInfo 箭头专用字体 • MapInfo 盾牌 • MapInfo 符号 • 地图符号 在安装之后,这些字体均位于 \Windows\fonts 之下。在 Solaris、Linux 和 一般的 UNIX 上,这些字 体会在运行时从 mifonts.jar 加载。要通过程序访问这些字体,可直接使用其一般名称(例如 MapInfo Arrows、MapInfo Cartographic 和 MapInfo Symbols)。有关字体的预览,可参阅第 339 页附录 D 的 MapInfo 符号字体集。 要查看字体,可使用操作系统的字体查看工具,例如用于 Windows 的 Unicode 字符映射。 将 Rendition.SYMBOL_MODE 属性设置为 Rendition.SymbolMode.FONT,字体属性(如 Rendition.FONT_FAMILY)与 Rendition.SYMBOL_STRING 属性一起指定字体符号。使用字体符号 时,可选择字体系列、大小、背景色和前景色,以及类似粗体、斜体、下划线、光晕、框格和轮廓 线的创意效果。 使用 FONT_SIZE,可借助于表示磅值的数字或表示实际物理高度的距离对象指定大小。本示例显示 的是 12 磅的符号。 Rendition rend = new RenditionImpl(); rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.FONT); rend.setValue(Rendition.FONT_FAMILY, "MapInfo Cartographic"); rend.setValue(Rendition.FONT_SIZE, 12); rend.setValue(Rendition.SYMBOL_STRING, String.valueOf((char)33)); 要将字体符号指定为 12 英里的高度,以便该符号可在不同的缩放级别适当缩放,可参考以下示例: Rendition rend = new RenditionImpl(); rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.FONT); rend.setValue(Rendition.FONT_FAMILY, "MapInfo Cartographic"); Distance fontsize = new Distance(12, LinearUnit.mile); rend.setValue(Rendition.FONT_SIZE, fontsize); rend.setValue(Rendition.SYMBOL_STRING, String.valueOf((char)33)); 第 14 章:标注和样式 开发人员指南 223 © 2006 MapInfo Corporation. 保留所有权利。 图像符号 符号也可通过公司徽标之类的图像(GIF、JPEG、PNG 等)来表示。当 Rendition.SYMBOL_MODE 属性设置为 Rendition.SymbolMode.IMAGE 时,Rendition.SYMBOL_URL 属性将用于从指定 URL 检索 图像。Rendition.SYMBOL_URL 属性包含一个 URL(如 http://myhost.com/image/truck.gif)。 例如,再次使用此前重复透明的小汽车图像的示例。该示例使用 Rendition.STROKE_MARKERARRAY 来指定小汽车符号沿直线重复。 Rendition rend = new RenditionImpl(); rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.IMAGE); rend.setValue(Rendition.SYMBOL_URL, "http://myhost.com/image/car.gif"); SYMBOL_URL 可以是包含数据的任意符合 RFC2397 (http://www.faqs.org/rfcs/rfc2397.html) 规 范中指定标准的 URL。数据 URL 允许数据是 URL 本身的组成部分。借助于此,MapXtreme Java 地图数据本身可以包含更多信息,而不只是依赖于服务器或特定目录结构的存在与否。 MapXtreme Java 提供了可用于标记地图的定制符号 GIF 图像集。在安装之后,该图像集可见于 /server/symbols/custom 目录。有关符号的缩略图,请参阅附录 E:图像符号。 图像符号的颜色替换模式 MapXtreme API 包括 Rendition 属性,该属性指定位图符号的颜色替换类型。这样就可以指示在定义 SYMBOL_FOREGROUND 时是否应更改位图符号的颜色。 Rendition.COLOR_REPLACEMENT_MODE 属性和 Add Rendition.ColorReplaceMode 菜单具有以 下值: • NONE:不执行颜色替换。位图符号的显示保持不变。 • MAPXTREME:执行颜色替换。这是默认值。 图像符号中的颜色将通过下面的算法替换:使用 SYMBOL_FOREGROUND 替换原始图像中黑色的 像素,使用 SYMBOL_BACKGROUND 替换原始图像中黑色以外的像素。 MapXtreme Java Manager 的“选择样式”对话框也提供了颜色替换模式。请参阅第 72 页第 5 章的 符号的颜色替换模式。 用于动画图像的 OVERLAY_IMAGE 图像符号也可表示为动画图像。按照 MapXtreme Java 术语,动画图像称为覆盖图像。覆盖图像是 Rendition 对象的属性。当 Rendition.SymbolMode 属性设置为 Rendition.SymbolMode.OVERLAY_IMAGE 时,Rendition.SYMBOL_URL 属性将用于从指定 URL 检索图像。(对于生成任意类型的图像符号而 言均为同样的行为。) 此属性只适用于点图元。 覆盖图像需要使用名为 EncodedImageRenderer 的特殊渲染器,该渲染器采用 MIME 类型,即 application/encodedimage+xml;image/xxx,其中 xxx 可为 gif、jpg、png 等后缀。为表明所需的动 画图像信息,Enterprise XML 协议中的 MapImageRequest 返回了一个图像(image/gif、image/jpeg 等)和一个 MapImageResponse。MapImageResponse 是一个包含基础地图的 XML 文档和一个点 覆盖的列表。每个点覆盖元素均包含说明其样式和相对于基础地图位置的有关信息。 有关 EncodedImageRenderer 的详细信息,请参阅第 11 章:渲染涉及的考虑因素。有关 MapImageRequest 的详细信息,请参阅第 16 章:XML 协议。样式属性 224 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 向量符号 如果字体和图像符号没有提供所需的符号表示,可以自行绘制所需象征符号。MapXtreme Java 支持 可由 Java2D Shape 接口指定的任意形状的向量符号。 当 Rendition.SYMBOL_MODE 属性设置为 Rendition.SymbolMode.SHAPE 时, Rendition.SYMBOL_SHAPE 属性将用于创建符号。Rendition.SYMBOL_SHAPE 属性包含一个 Rendition.SymbolShape 对象。此对象由 Rendition 对象和实现 java.awt.Shape 接口的对象构成。 例如,java.awt.geom 程序包中的众多对象(如 Rectangle2D、多边形等)实现 Shape 接口。此 外,还可以使用 java.awt.geom.GeneralPath 对象,并借助于 moveTo、lineTo 等命令来指定更复杂的 几何对象。在显示 Shape 接口时,将使用 Rendition.SymbolShape 的 Rendition 对象。即 Rendition 可指定用于区域形状的 FILL 图案。 Rendition rendShape = new RenditionImpl(); rendShape.setValue(Rendition.FILL, Color.red); Rectangle2D rect = new Rectangle2D.Float(0, 0, 10, 10); Rendition.SymbolShape symbolShape = new Rendition.SymbolShape (rect, rendShape); Rendition rend = new RenditionImpl(); rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.SHAPE); rend.setValue(Rendition.SYMBOL_SHAPE, symbolShape); 调整符号大小 MapXtreme Java 支持调整以实际物理距离单位指定的绝对大小。您可能需要为符号设置绝对大小, 以便地图在不同缩放级别重画时,符号以正常的比例显示。此前只能使用相对大小,即符号使用仿射 转换 (SYMBOL_TRANSFORM) 放大为其高度的 2 倍。在缩放级别变化时,这样做并非始终恰当。 符号调整大小是通过 Rendition 类的属性完成的,该类可用于以高度和宽度指定符号的实际物理大 小,例如 2 x 4 英里。符号 SYMBOL_SIZE 属性是以下类型的符号固有属性:图像符号、覆盖图像 符号和形状(向量)符号。字体符号继续使用 FONT_SIZE 用于缩放。 SYMBOL_SIZE 属性将采用 Size 对象,该对象定义符号的高度和宽度以及尺寸的距离单位。 此外还可组合使用符号的相对和绝对大小调整。此时,SYMBOL_SIZE 将与 SYMBOL_TRANSFORM 一起组合使用。例如,如果 SYMBOL_SIZE 设置为 2 x 3 英里,并且 SYMBOL_TRANSFORM 设置 乘以 2,此时该符号的绘制尺寸为 4 x 6 英里。 使用 SYMBOL_SIZE 集绘制地图的速度要比不使用该属性绘制符号稍慢。实际物理尺寸的高度宽度 需要转换为屏幕像素,但其对于地图绘制速度的影响可以忽略不计。 有关详细信息,请参阅 Javadocs 中的 Rendition 和 Size 类。 代码示例:调整符号大小 // The symbol size can be in more than one linear unit Distance symbolWidth = new Distance(50, LinearUnit.kilometer); Distance symbolHeight = new Distance(75, LinearUnit.mile); Size symbolSize = new Size(symbolWidth, symbolHeight); Rendition rend = new RenditionImpl(); rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.IMAGE); rend.setValue(Rendition.SYMBOL_URL,第 14 章:标注和样式 开发人员指南 225 © 2006 MapInfo Corporation. 保留所有权利。 "http://host:8080/locationOfImage/image.gif"); rend.setValue(Rendition.SYMBOL_SIZE, symbolSize); // Transforms are applied after scaling the image the specified size. So // this scales the symbol to 100 kilometers by 225 miles. rend.setValue(Rendition.SYMBOL_TRANSFORM, AffineTransform.getScaleInstance(2, 3)); // now add the rendition to a theme, save to a database, etc.... 代码示例 : 创建用于直线标记的向量符号 本示例代码创建了构成 X 和菱形的标记数组。这意味着在此直线的顶部将有一串标记:X 后跟一个 菱形,直至达到此直线的末端。 此代码也可见于 Javadocs。 // create a shape to represent the first marker (an X) GeneralPath path = new GeneralPath(); path.moveTo(-3, -3); path.lineTo(3, 3); path.moveTo(3, -3); path.lineTo(-3, 3); // each marker is actually a symbol Rendition symbolRend = new RenditionImpl(); symbolRend.setValue(Rendition.STROKE, Color.green); Rendition markerRend = new RenditionImpl(); Rendition.SymbolShape symbolShape = new Rendition.SymbolShape (path, markerRend); // each marker gets its own rendition Rendition marker1Rend = new RenditionImpl(); marker1Rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.SHAPE); marker1Rend.setValue(Rendition.SYMBOL_SHAPE, symbolShape); // create a shape to represent the second marker (an diamond) path = new GeneralPath(); path.moveTo(3, 0); path.lineTo(6, -3); path.moveTo(9, 0); path.lineTo(6, 3); path.closePath(); // each marker is actually a symbol symbolRend = new RenditionImpl(); symbolRend.setValue(Rendition.STROKE, Color.green); symbolShape = new Rendition.SymbolShape(path, markerRend); // each marker gets its own rendition Rendition marker2Rend = new RenditionImpl(); marker2Rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.SHAPE); marker2Rend.setValue(Rendition.SYMBOL_SHAPE, symbolShape);样式属性 226 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Rendition.Marker[] markerArray = { new Rendition.Marker(marker1Rend), new Rendition.Marker(marker2Rend) }; // the rendition with which to draw Rendition rend = new RenditionImpl(); rend.setValue(Rendition.STROKE_MARKERARRAY, markerArray); 代码示例 : 字体属性 以下代码示例展示如何设置样式的 FONT_XXX 属性 Rendition rend = new RenditionImpl(); // Use the MapInfo Miscellaneous font rend.setValue(Rendition.FONT_FAMILY, "MapInfo Miscellaneous"); // Make the font 14 pts rend.setValue(Rendition.FONT_SIZE, 14); // The weight should be greater than 0. 1.0 = normal, 2.0 = bold, etc. rend.setValue(Rendition.FONT_WEIGHT, new Float(2)); // Make it a leaning garbage can rend.setValue(Rendition.FONT_STYLE, Rendition.FontStyle.ITALIC); // indicate that we are using a font for the symbol rend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.FONT); // the number 4 is the garbage can rend.setValue(Rendition.SYMBOL_STRING, "4"); // make the symbol yellow on a red background rend.setValue(Rendition.SYMBOL_FOREGROUND, Color.yellow); rend.setValue(Rendition.SYMBOL_BACKGROUND, Color.red); 代码示例 : 填充属性 /* Create a rendition that is filled blue but allows 60 percent of the background to be visible (40 % transparent). */ Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FILL, Color.blue); rend.setValue(Rendition.FILL_OPACITY, new Float(0.40));第 14 章:标注和样式 开发人员指南 227 © 2006 MapInfo Corporation. 保留所有权利。 代码示例 : 使用符号绘制线条 // define a red line 7.5 pts wide Rendition rend = new RenditionImpl(); rend.setValue(Rendition.STROKE, Color.red); rend.setValue(Rendition.STROKE_WIDTH, new Float(7.5f)); // demonstrate creating a rendition to draw a line with a symbol Rendition symbolRend = new RenditionImpl(); symbolRend.setValue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.FONT); symbolRend.setValue(Rendition.FONT_FAMILY, "MapInfo Symbols"); symbolRend.setValue(Rendition.FONT_SIZE, 8); symbolRend.setValue(Rendition.SYMBOL_STRING, "#"); // create rendition to draw lines using symbols rend = new RenditionImpl(); rend.setValue(Rendition.STROKE, symbolRend); rend.setValue(Rendition.STROKE_WIDTH, new Float(5)); 代码示例 : 虚线和平行线 本示例展示 STROKE、STROKE_DASHARRAY、STROKE_PARALLEL ARRAY、Layers 和 Layer。 所生成的线条为红色的虚线中线,在距其 12 磅处,有一条白线和一条紫线与中线平行。 // rendition for the first parallel line Rendition rend1 = new RenditionImpl(); rend1.setValue(Rendition.STROKE, new Color(1.0f, 0.0f, 1.0f)); // purple line rendition for second parallel line Rendition rend2 = new RenditionImpl(); rend2.setValue(Rendition.STROKE, Color.white); rend2.setValue(Rendition.STROKE_DASHARRAY, new float[]{4, 4}); // Create array of parallel lines for the central line. The red and // white dashed line is created by specifying a 0.0 for an offset. Rendition.ParallalLine[] parallelLines = new Rendition.ParallelLine[] { new Rendition.ParallelLine(12.0f,rend1); new Rendition.ParallelLine(0.0f,rend2); }; // create rendition for Australia's borders. Rendition borderRend = new RenditionImpl(); borderRend.setValue(Rendition.STROKE, Color.red); borderRend.setValue(Rendition.STROKE_PARALLELARRAY, parallelLines); 命名样式 228 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 命名样式 命名样式是一种命名资源,并且其表示的样式具有唯一的名称。NamedRendition 位于 com.mapinfo.graphics 文件包之内。 命名样式和 MapXtreme Java 中的其它命名资源具有相同的优点: • 该资源以其名称所知,而非其属性。 • 该资源位于一点,但可从多个位置引用。 • 要更改应用程序或数据的外观或行为,只需更改资源,而非每个应用程序或数据文件。 正如所有其它命名资源一样,命名样式使用 Java 命名和目录接口 (JNDI) 应用程序编程接口 (API)。 NamedRendition 对象透明处理所有和 JNDI 的交互。 创建命名样式 创建命名样式非常轻松: NamedRendition namedRendition = new NamedRendition( "http://localhost:8080/mapxtreme480/namedresource", "my renditions/blue star"); 或 Context initCtx = NamedResourceContextFactory.createInitialContext( "http://localhost:8080/mapxtreme480/namedresource"); NamedRendition namedRendition = new NamedRendition(initCtx, "my renditions/blue star"); 命名样式是在其访问时才解析的。 如非属性值改变,命名样式将始终保持其名称,在属性值改变之后命名样式将只是一个样式。 命名样式实现 Rendition 接口,以便其可用于任意其它样式可用的场所。 MapXtreme Java 内置的预定义画笔、画刷和符号样式均可视为采用其自带的 brush_008、pen_057 等名称的“命名资源”。这些样式均位于 mapxtreme480/resources/mistyles 目录之中。这些样式可 用作命名样式的起点,用户可以基于此来进行定制,并采用更加简明易懂的名称来进行保存相应的 样式。MapXtreme Java Manager 的命名资源面板提供了一个管理这些样式的 GUI。请参阅第 5 章:管理 MapXtreme Java。 使用 NamedResource 存储命名样式 任意样式均可通过 JNDI API 存储为命名样式。JNDI 上下文 (javax.naming.Context) 使用两种方法来 将命名资源保存到命名资源库。如下所示: • bind(String name, Object obj) • rebind(String name, Object obj) 使用 bind() 方法可将全新的资源(以前不存在)保存到库中。使用 rebind() 方法可更新库中已经存 在的资源。第 14 章:标注和样式 开发人员指南 229 © 2006 MapInfo Corporation. 保留所有权利。 显而易见,所需的第一个对象是 JNDI 上下文。这既可以是 InitialContext (javax.naming.InitialContext), 也可以是 InitialContext(或通过 lookup() 经由 InitialContext)的子上下文。有关上下文和 InitialContexts 的详细信息,请参阅 Javadoc 中有关 JNDI API 的介绍。 要创建初始上下文,需要知道提供方的 URL,该 URL 是(最可能是)NamedResourceServlet 的 URL。 然后调用 NamedResourceContextFactory 类的 createInitialContext(providerURL) 工厂方法,如下 所示: Context initCtx = NamedResourceContextFactory.createInitialContext( "http://localhost:8080/mapxtreme480/namedresource"); Rendition blueStar = new RenditionImpl(); 现在只需要决定在何处存储命名样式,该位置是相对于命名资源库根的位置。切记 NamedResourceServlet 已知命名资源库的根,这一信息是通过 NamedResourceServlet 的初始参数 resourcesdir 指定的。 在名为 "my renditions" 的库的根下创建目录之后,即可在 "blue star" 子目录中保存特定样式。这一 操作如下所示: // blueStar Rendition was previously initialized with the // desired symbol properties // create a named resource out of the blueStar Rendition NamedResource resource = new NamedResource(blueStar); // Now save it via the container we obtained above initCtx.bind("my renditions/blue star", resource); 在上例中,"my renditions/blue star" 表示一个复合名称。在指定复合名称时,每个组件名都必须以 / (正斜线)间隔。 注: 命名资源(样式)必须始终存储在库的根的子目录中。这些资源绝对不能直接存储在根中。 检索命名样式 要从命名资源库检索命名样式,可使用 com.mapinfo.graphics.NamedRendition 类。要检索存储在命名 资源库的根的子目录 "my renditions" 之中的命名样式 "blue star",只需创建一个新的 NamedRendition, 并提供如下所示的提供方 URL 和资源名称(相对于库的根)即可: NamedRendition rendition = new NamedRendition( "http://localhost:8080/mapxtreme480/namedresource", "my renditions/blue star"); NamedRendition 实现 Rendition 接口,因此可用于允许使用样式的任意场所。每图元样式 230 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 每图元样式 MapXtreme Java 可在 MAPINFO_MAPCATALOG 中指定表级别的样式(由 FeatureSet's getRendition 方法返回)。表级别的样式可用作相应表的所有图元的基础显示属性集。 在要用作每图元样式(由图元的 getRendition 方法返回)的空间表中,可以指定一个附加列。这一 每图元样式将与表 (FeatureSet) 的样式合并(覆盖),以确定用于图元显示的属性集。如果没有每 图元样式,则将会使用表级别的样式。 该样式列既可确定为在图层创建时(通过编程或通过 LayerControl Bean)使用的参数,也可确定为 源自 MAPINFO_MAPCATALOG 为的参数。空间表中的这一样式列可为 Null、MapBasic 样式字符串 或 MapXtreme Java 样式。有关 MAPCATALOG 的详细信息,请参阅附录 F:MAPINFO.MAPINFO_ MAPCATALOG。 代码示例 : 每图元样式 /* Programatically create the rendition column at the layer creation * time. * Constructs the objects given the table name and information * describing the Rendition to use for each Feature * Parameters: * tableName - The file name of the table. * renditionColumn - The column containing Rendition information * for each Feature. * renditionType - Object identifying the type of rendition data * found in the rendition column. */ //create the TABTableDescHelper TableDescHelper tableDescHelper = new TABTableDescHelper( new File("States_Rend.tab").getName(), "FeatureRendition", RenditionType.mapxtreme); //create the TABDataProviderHelper DataProviderHelper dataProviderHelper = new TABDataProviderHelper("D:\\maps"); //create the LocalDataProviderRef DataProviderRef dataProviderRef = new LocalDataProviderRef(dataProviderHelper); //add it to the layer myMap.getLayers().addLayer(dataProviderRef, tableDescHelper, "tabLayer");专题地图绘制和分析 本章介绍 MapXtreme Java 中的专题地图绘制。专题地图绘制强大的功能可实现 数据的分析和可视化。 本章内容:  专题地图绘制概览. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .232  用于专题的一般对象. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233  OverrideTheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233  RangedTheme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .234  SelectionTheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .238  IndividualValueTheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .238  专题图例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240  制图图例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .241  使用分析图层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242专题地图绘制概览 232 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 专题地图绘制概览 专题地图绘制特指根据特定专题通过影线表示地图的过程。专题通常是数据的片断。绘制地图时将 使用图层数据,按照特定专题来采用影线表示。气候分布图就是最常见的专题地图示例之一。地图 上的红色表示热(温度高),蓝色表示冷(温度低)。 专题通过颜色、填充图案或符号的影线来表示数据。使用专题地图显示数据可采用多种形式。通过 根据数据中的特定值为地图对象指定颜色、图案或符号,即可创建不同的专题地图。 专题地图绘制实现了数据的可视化,并可突出显示数据趋势,这些信息是通过表格数据难以发现 的。使用 ThemeList 中的方法和 Theme 接口,可以创建并定制专题影线。 专题类型 MapXtreme Java Edition 提供以下 4 种专题地图: • OverrideTheme — 更改整个图层的样式 • RangedTheme — 划分数据范围,并根据范围值来确定影线表示 • IndividualValueTheme — 通过影线表示共享特定属性值的图元组 • SelectionTheme — 对用户定义的选定图元列表应用样式 具有专题的所有图层均使用 ThemeList 集合、Theme 接口和 Rendition 对象。每个特定的专题类型 均可使用附加的对象。本章的后续内容对此作出了详细说明。 专题可以通过程序创建;如果是 RangedTheme 和 IndividualValueTheme,则可通过 AddTheme Wizard Bean 创建。专题可以通过图层控制来显示和控制。 专题图例 MapXtreme Java 可以为范围专题和独立值专题生成图例。图例中的信息直接绑定到相应专题。专题 更改,图例亦随之更新。第 15 章:专题地图绘制和分析 开发人员指南 233 © 2006 MapInfo Corporation. 保留所有权利。 AddTheme 向导 MapXtreme Java 提供了用于帮助创建 RangedTheme 或 IndividualValueTheme 的向导。向导是一 个 JavaBean,可将其添加到 MapToolbar 中以便于使用。请参阅第 242 页的使用分析图层。 用于专题的一般对象 可用于专题的一般对象包括 ThemeList、Theme 和 Rendition。后续内容中对这些对象分别作出了说明。 ThemeList ThemeList 集合可从 Layer 对象访问,并且包含 Theme 对象。ThemeList 集合具有用于执行从集合 添加、删除和重排 Theme 对象等操作的方法。 ThemeList 允许对一个图层存在多个专题影线表示。这些专题需要保持正确的顺序才可以显示在地图 上。和图层相同,专题按照倒序自下而上渲染。例如,两个专题均更改了对象的填充颜色,在渲染 地图时,其中的一个对象将使另一个对象变得模糊。ThemeList 顶部的专题优先。这一排序仅限在一 个图元的上下文中有效,而不是在整个图层有效。 ThemeList 对于特定情况尤为实用。例如,如果要根据人口和文化水平,以影线表示全球各个国家, 那么即可采用 ThemeList。此时可以先根据人口数据,创建要以影线表示的专题,为特定区域使用不 同填充颜色,然后再将其添加到 ThemeList。随后,可以根据文化程度数据,创建要以影线表示的专 题,为特定区域使用有待填充的图案,然后再将其添加到 ThemeList。即使只有一个专题,也可以使 用 ThemeList 对象。 Theme Theme 是一个接口。此接口的方法可用于检索专题所基于的列和专题的说明性名称。如果用于特定 专题的列或列名并不存在,则将返回空值。 Rendition Rendition 对象的使用贯穿整个 MapXtreme。该对象为图元提供了所有样式特征。在创建专题地图 时,将使用 Rendition 来指定对象的外观。 OverrideTheme OverrideTheme 可用于更改整个图层的渲染样式。例如,如果要使用红色填充图案和绿色线条来显 示 World 表,则需要使用到 OverrideTheme。 要制作用于图层的 OverrideTheme,只需在 Rendition 对象的构造器中传递 Rendition 对象即可。 Rendition myRend = new RenditionImpl(); OverrideTheme myOTheme = new OverrideTheme(myRend, "My Theme"); myLayer.getThemeList().add(myOTheme); RangedTheme 234 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 RangedTheme RangedTheme 是一种更加复杂的专题地图。在创建范围专题地图时,所有图元均将划分到不同的范 围中,每个范围均指定有与其范围相应的样式。例如,假定有一个供电视查看地区的气象台表,现 在需要根据其报告的降雪量以影线表示位置。 使用范围地图图元,MapXtreme 将降雪量分为不同范围的组。如在过去的一个月中,所有降雪量为 0 至 5 英寸的气象台均划分到一个范围之内。降雪量为 5 至 10 英寸的气象台划分到另一个单独范 围。降雪量为 10 至 15 英寸的气象台划分到第三个范围,而降雪量超过 15 英寸的气象台则划分到第 四个范围。每个范围均称为一个 Bin。每个 Bin 均有上限和取舍值。 图层中的所有记录均将指定到相应范围,并在随后根据该范围来指定样式。例如,降雪量超过 15 英 寸的气象台将表示为红色。其他范围将以比红色浅的影线表示,其中最后一个范围以灰色表示(默 认色)。在显示地图时,不同位置降雪量多少通过颜色的对比将会一目了然。 注: 如果客户端 VM 在创建较大的表上的范围专题绘图时用尽内存,则可能需要将堆的大小上限设 置为 64MB。用于这一操作的命令行语法为:Java -Xmx64m 。 MapXtreme 还提供了用于帮助创建 RangedTheme 的若干实用程序对象。 ColumnStatistics 在使用 Layer 对象的 fetchColumnStatistics 方法时,将返回 ColumnStatistics 对象。ColumnStatistics 对象包含有关列数据的最大值、最小值、均值和标准偏差。在使用 fetchColumnStatistics 方法时,将 传递以影线显示地图所基于的列。此时无需直接使用 ColumnStatistics 对象的方法来创建 RangedTheme。 在检索到该对象之后,该对象将用于 Bucketer 对象之中,以创建分点值的向量。 Bucketer Bucketer 类负责计算 RangedTheme 中的 Bin 的分点值。继续以上的降雪量示例,我们有 4 个表示 气象台的范围:0-5 英寸、5-10 英寸、10-15 英寸和 15 英寸以上的年降雪量。每个范围均为一个 Bin。 Bucketer 使用 computeDistribution 方法计算这些 Bin 的分点值。这些方法均返回分点值的向量。每 个向量值均为一个属性对象。所有 computeDistribution 方法均传递范围的数量和一个 ColumnStatistics 对象。此外还可以传递分布类型和 RoundOff 对象。 分布类型 DISTRIBUTION_TYPE_EQUAL_COUNT 令每个范围的记录数目大致相同。如果要 Bucketer 将 100 条记录等分为 4 个范围,则它将计算范围,以便每个范围有大约 25 个记录,具体取决于设置的舍入 因素。第 15 章:专题地图绘制和分析 开发人员指南 235 © 2006 MapInfo Corporation. 保留所有权利。 在使用等计数(或任意其他范围方法)时,需要注意可能影响到专题地图的任意特殊数值(这些值 在统计学中称为异常值)。例如,如果使用如下数据库根据等计数方法进行影线表示: Ben 和 Miguel 划分到同一范围(因为两者具有两个最小值)。这样做可能不会产生所需的结果,因 为 Ben 的值比其它值小很多。 DISTRIBUTION_TYPE_EQUAL_RANGES 将记录划分为大小相同的范围。例如,表中某一字段的数 值为从 1 至 100。此时需要使用 4 个等分范围来创建专题地图。Bucketer 生成的范围为 1-25、26-50、 51-75 和 76-100。 切记 Bucketer 可以在没有数据记录的情况下创建范围,具体取决于数据的分布。例如,如果使用以 下数据库根据等范围以影线表示: Bucketer 将创建 4 个范围(1-25、26-50、51-75 和 76-100)。注意,实际上只有两个范围(1-25 和 76-100)包含记录。 DISTRIBUTION_TYPE_STANDARD_DEVIATION 在均值的中间范围处中断,而中间范围之上/下的 范围将是一个位于该均值之上 / 下的标准偏差。 DISTRIBUTION_TYPE_NATURAL_BREAK 是根据数据的自然断点划分数据范围的方法。根据数据 在数据分布中相对于所有其它数据值的位置,将数据制定到相应范围。该分布类型使用迭代算法将 数据以最佳方式指定到相应的范围,每个范围内的差异已最小化,而范围之间的差异已最大化。 RoundOff RoundOff 对象用于创建范围的规则分点值。例如,假定正在使用从 101 至 397 的值以影线表示地 图,则如果范围为 100 至 400,那么会更加符合规则。RoundOff 可以舍入至范围内的较低值,也可 以舍入至范围外的较高值。 John 5000 Andrea 7000 Penny 6000 Kyle 5500 Miguel 4500 Angela 7500 Ben 100 Mark 7000 John 100 Andrea 90 Penny 6 Kyle 1 Miguel 4 Angela 92 Linda 95 Elroy 89 Ben 10 Mark 10RangedTheme 236 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 LinearRenditionSpreader 使用渐变值样式来表示数据是创建实用的专题地图的重要组成部分之一。RangedTheme 介绍中的示 例讨论以影线表示降雪量的方式。值的一端使用红色表示,接下来的一个范围使用较浅的红色表示, 依此类推。LinearRenditionSpreader 的 spread 方法将返回一个样式向量,从给定样式展开至另一个 样式,直至达到给定元素数量。元素数量应该与传递到 Bucketer 对象的范围数量相匹配。例如,如果 传递一个红色填充的样式,一个白色填充的样式,数量为 5,那么 LinearRenditionSpreader 将使用 红色填充作为起始,白色填充作为结束,创建一个具有 5 个样式的向量,中间为平均展开过渡的填 充类型。 创建 RangedTheme 以下示例展示了用于创建 RangedTheme 的代码,其中美国各州的表根据人口数量,使用从黄色至 红色的 5 个范围以影线表示。 Rendition yellow = new RenditionImpl(); Rendition red = new RenditionImpl(); FeatureLayer lyr = (FeatureLayer) myMap.getLayers().get("States.tab"); String colName = "Pop_1990"; ColumnStatistics colStats = lyr.fetchColumnStatistics(colName); // Set number of breaks for data int numBreaks=5; // Compute the distribution of data with 5 breaks and // Equal Ranges List breakList = (List) Bucketer.computeDistribution (numBreaks, colStats, Bucketer.DISTRIBUTION_TYPE_EQUAL_RANGES); // Set up a red and a yellow rendition and then // spread the colors yellow.setValue(Rendition.FILL, Color.yellow); yellow.setValue(Rendition.STROKE_WIDTH, 2); red.setValue(Rendition.FILL, Color.red); red.setValue(Rendition.STROKE_WIDTH, 4); List renditionList = (List) LinearRenditionSpreader.spread (numBreaks, yellow, red); // Create Theme object RangedTheme rTheme = new RangedTheme (colName, breakList, renditionList, "States by Pop_1990"); // Get ThemeList class object ThemeList themeList = lyr.getThemeList(); // Add theme to Layers themeList themeList.add(rTheme); 范围专题还可以通过 AddTheme 向导构建。此外还可以创建关联的专题图例。第 15 章:专题地图绘制和分析 开发人员指南 237 © 2006 MapInfo Corporation. 保留所有权利。 指定定制范围 通过指定定制的范围,还可创建 RangedTheme。为此需要执行以下操作: 1. 为每个范围颜色创建样式,然后添加至向量。 2. 创建表示范围上限(分点值)的属性列表。 注: 该属性必须采用数字 / 字母顺序。 3. 实例化 RangedTheme 对象,指定为参数:专题列、分点值列表、样式列表和说明性名称。 4. 将该专题添加到 ThemeList。 5. 渲染地图。 以下代码示例创建三个范围: Rendition redRendition = new RenditionImpl(); redRendition.setValue(Rendition.FILL, Color.RED); Rendition grayRendition = new RenditionImpl(); redRendition.setValue(Rendition.FILL, Color.GRAY); Rendition greenRendition = new RenditionImpl(); redRendition.setValue(Rendition.FILL, Color.GREEN); // Set up the ranges List breakList = new ArrayList(); breakList.add(new Attribute(1)); breakList.add(new Attribute(5)); breakList.add(new Attribute(7)); // Set up the renditions List renditionList = new ArrayList(); renditionList.add(redRendition); renditionList.add(grayRendition); renditionList.add(greenRendition); // Create a ranged theme object RangedTheme rTheme = new RangedTheme("POP_1994", breakList, renditionList, "States by Pop_1994"); // Assign theme to layers as element 1 myLayer.getThemeList().add(rTheme); // Draw the map // Create an ImageRequestComposer ImageRequestComposer imageRC = ImageRequestComposer.create (myMap, 256, Color.blue, "image/gif"); // Create a MapXtremeImageRenderer MapXtremeImageRenderer renderer = new MapXtremeImageRenderer ("http://localhost:8080/mapxtreme480/mapxtreme"); // Render the map renderer.render(imageRC);SelectionTheme 238 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 // Render the map to the file renderer.toFile("comp.gif"); SelectionTheme SelectionTheme 将样式应用于选择对象中引用的所有图元。此类专题通常用于存储在使用 add(FeatureSet fs) 方法的图层上使用搜索方法返回的图元。SelectionTheme 将取代过时的 IDSelectionTheme。 例如,给定 FeatureLayer 对象和 X 以及 Y 坐标,以下代码将展示在指定位置选择图层图元,以及创 建 SelectionTheme 以红色显示所选图元的过程。 List columnNames = new ArrayList(); // Select the features at the specified location FeatureSet fs = myLayer.searchAtPoint(columnNames, new DoublePoint(-72, 42), null); // Create a SelectionTheme SelectionTheme selTheme = new SelectionTheme("PointSelection"); // Create a Selection object, and add the selected features Selection sel = new Selection(); sel.add(fs); // Assign the Selection object to the SelectionTheme selTheme.setSelection(sel); // Assign the display style of the SelectionTheme Rendition rend = new RenditionImpl(); rend.setValue(Rendition.FILL, Color.red); selTheme.setRendition(rend); // Add the SelectionTheme to the layer's list of themes myLayer.getThemeList().add(selTheme); IndividualValueTheme 此类专题允许基于指定列的特定属性值,对图元进行专题影线表示。例如,基于 Territories 列中的 值,使用单值专题来修改 Coverage 表中的区域图元的样式。带有 SouthWest 的 Territories 可以表 示为红色,而带有 SouthEast 值则可以表示为蓝色。第 15 章:专题地图绘制和分析 开发人员指南 239 © 2006 MapInfo Corporation. 保留所有权利。 要创建 IndividualValueTheme,请遵循以下代码示例: DataProviderRef dataProviderRef = null; TableDescHelper tableDescHelper = null; // get a reference to the layer we will be applying theme to FeatureLayer lyr = (FeatureLayer) myMap.getLayers().addLayer(dataProviderRef, tableDescHelper, "Territories"); // create a new theme object IndividualValueTheme iValThm = new IndividualValueTheme("CoverageTerritory", "Sales Coverage Breakdown"); // create a rendition Rendition rend = new RenditionImpl(); // assign color to rendition add attribute to theme with previously set //rendition rend.setValue(Rendition.FILL, Color.red); iValThm.add(new Attribute("SouthWest"), rend); // assign color to rendition add attribute to theme with previously set //— þ¾ rend.setValue(Rendition.FILL, Color.blue); iValThm.add(new Attribute("SouthEast"), rend); // assign color to rendition add attribute to theme with previously set //rendition rend.setValue(Rendition.FILL, Color.green); iValThm.add(new Attribute("Central"), rend); // Add the theme to layers theme list lyr.getThemeList().add(iValThm); // Store column name and type in hashtable Hashtable ht = new Hashtable(); ht.put("geomtype", IndividualValueThemeLegend.REGION_GEOMETRY); ht.put("lableorder", IndividualValueThemeLegend.ORDER_ASCENDING); // Create new legend passing theme and hashtable. Then set Theme Title. IndividualValueThemeLegend iValThmLeg; iValThmLeg = new IndividualValueThemeLegend(iValThm, ht); iValThmLeg.setTitle("Coverge Territory legend"); // Generate gif image from legend iValThmLeg.toFile("c:\\temp\\terrLeg.gif", "image/gif"); IndividualValueTheme 也可通过 AddTheme 向导构建。此外还可以创建关联的专题图例。专题图例 240 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 专题图例 基于该数据可为范围或单值专题创建图例。对于图例的外观,可采用众多的控制选项。例如更改标 题、字体,插入新的信息以及更改说明文本和颜色等。 图例可以在客户机或服务器端使用,并导出为图像(如 GIF 或 JPEG)。专题图例是可以和 MapXtreme 的 JavaBeans 一起使用的 Swing 组件。 为启用专题图例,产品增强了 Theme 接口的功能,以支持专题的 Legend 对象。每个专题都具有关 联的 ThemeLegend 对象,相应对象起初均为空。只有 RangedThemes 和 IndividualValueThemes 包含的图例具有实际的信息。(其他专题类型 OverrideThemes 和 SelectionThemes 均返回空图 例。) 要设置与专题关联的图例,则必须调用 Theme 对象的 setLegend(ThemeLegend) 方法。 ThemeLegend 可通过创建一个简明方法或通过专题的 createDefaultLegend() 方法来获取。 以下示例展示了用于创建 RangedThemeLegend 的代码: Rendition redRendition = new RenditionImpl(); redRendition.setValue(Rendition.FILL, Color.RED); Rendition grayRendition = new RenditionImpl(); redRendition.setValue(Rendition.FILL, Color.GRAY); Rendition greenRendition = new RenditionImpl(); redRendition.setValue(Rendition.FILL, Color.GREEN); // Set up the ranges List breakList = new ArrayList(); breakList.add(new Attribute(1)); breakList.add(new Attribute(5)); breakList.add(new Attribute(7)); // Set up the renditions List renditionList = new ArrayList(); renditionList.add(redRendition); renditionList.add(grayRendition); renditionList.add(greenRendition); // Create Theme object RangedTheme rTheme = new RangedTheme("POP_1990", breakList, renditionList, "States by Pop_1990"); // Create a default legend RangedThemeLegend rThmLeg = (RangedThemeLegend) rTheme.createDefaultLegend(null); // OR, Create a theme legend instance using theme and setting hashtable // Add theme settings to hashtable Hashtable ht = new Hashtable(); ht.put("geomtype", RangedThemeLegend.REGION_GEOMETRY); ht.put("lableorder", RangedThemeLegend.ORDER_ASCENDING); rThmLeg = new RangedThemeLegend(rTheme, ht); // Set legend title第 15 章:专题地图绘制和分析 开发人员指南 241 © 2006 MapInfo Corporation. 保留所有权利。 rThmLeg.setTitle("Ranged Theme legend"); // send legend to image file rThmLeg.toFile("c:\\temp\\rangeLeg.gif", "image/gif"); LegendContainerBean 管理图例的布局和显示方式。可以放入到伴随的 VisualMapJ 对象中,然后显 示添加到 VisualMapJ 地图的任意图例。VisualMapJ 通知 LegendContainerBean 何时专题发生更 改,以便 LegendContainerBean 对其显示作出相应的更新。 LegendContainerBean 在作为示例 applet 的 SimpleMap 中展示。有关详细信息,请参阅第 87 页第 7 章的 MapXtreme JavaBeans。 制图图例 在专题图例为专题中的样式提供键的同时,制图图例还为任意 FeatureSet 的样式集提供了键。此时将使 用 com.mapinfo.legend.CartographicLegend 类来创建制图图例。既可以一次性植入 CartographicLegend 的整个 FeatureSet (addFeatureSet(FeatureSet fs, String descriptionCol) 方法),也可以每次(通过 addRow(Rendition rend, String description) 方法)植入一个 Feature (Rendition)。 在单个图例中显示地图,这些地图具有包含多个几何对象(例如,点或多边形)的 FeatureSets 或多 个不同几何类型的 FeatureSets。 以下代码展示如何创建用于包含多种几何类型的地图的制图图例,在这种情况下,有三种 FeatureSets: 地标、湖泊和街道。 FeatureLayer landmarks = (FeatureLayer) myMap.getLayers().get("landmarks"); FeatureLayer lakes = (FeatureLayer) myMap.getLayers().get("lakes"); FeatureLayer streets = (FeatureLayer) myMap.getLayers().get("streets"); // create the legend with title "State Landmarks" CartographicLegend legend = new CartographicLegend("State Landmarks", true); // Perform a searchAll() on the layer to get its entire FeatureSet - need // to make sure we fetch the column that we want to label with in the // legend ("Name") List columnNames = new ArrayList(); columnNames.add("Name"); FeatureSet fs = landmarks.searchAll(columnNames, null); // add the FeatureSet to the legend, and specify that we want to label // each feature's rendition with the valuein the "Name" column legend.addFeatureSet(fs, "Name"); // always dispose of the FeatureSet once you're done with it! fs.dispose(); // Perform a searchAll() on the layer to get its entire FeatureSet - need 使用分析图层 242 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 // to make sure we fetch the column that we want to label with in the // legend ("Name") fs = lakes.searchAll(columnNames, null); // add the FeatureSet to the legend, and specify that we want to label // each feature's rendition with the valuein the "Name" column legend.addFeatureSet(fs, "Name"); // always dispose of the FeatureSet once you're done with it! fs.dispose(); // Perform a searchAll() on the layer to get its entire FeatureSet - need // to make sure we fetch the column that we want to label with in the // legend ("Name") fs = streets.searchAll(columnNames, null); // add the FeatureSet to the legend, and specify that we want to label // each feature's rendition with the valuein the "Name" column legend.addFeatureSet(fs, "Name"); // always dispose of the FeatureSet once you're done with it! fs.dispose(); 使用分析图层 MapXtreme Java 提供了包括饼图、并行条形图和堆叠条形图的功能。并行条形图垂直显示,而堆叠条 形饼图则水平显示。这些图均通过 AnalysisLayer 类表示。有关详细信息,请参阅 HTML Javadoc。 可缓存分析图层对象。必须实现 com.mapinfo.util.CacheManager 才能在服务器或本地清除缓存。 直方图地图 与一个变量的值范围或渐变符号专题地图不同的是,在条形图地图中可一次查看一行中的多个变 量。用户可以为每个地图对象(图元)构建条形图,以便可以通过比较条块高度,分析特定图形中 的专题变量。此外还可以在地图中查看所有图形中的同一变量。 例如,假定有一个表示美国各州的表,其中包含男女人口数量。使用条形图,即可创建专题地图, 用两个条块显示每个州的人口:一个条块代表女性人口,另一个则表示男性人口。此外还可以比较 每个州的人口区别,或者可以查看几个州并比较某个州和其它州之间的异同。 饼图地图 使用饼图的地图绘制分析可以一次查看同一行上的多个变量。正如比较条形图中条块的高度一样, 在饼图中还可以比较单个切片的份额,或是检查特定切片在所有饼图上的份额。使用饼图,也可比 较一个整体的不同组成部分。第 15 章:专题地图绘制和分析 开发人员指南 243 © 2006 MapInfo Corporation. 保留所有权利。 饼图和直方图对于分析人口统计学数据尤为实用。例如,假定具有美国的人口统计信息的数据集。 该数据集显示了若干人口统计群组的人口。使用饼图,可以显示各人口统计群组的人口,然后查看 构成各个饼图的组成部分所占的比例大小。这样即可了解到各州或整个美国的人口统计群组的分 布。此外还可以查看单个人口统计群组,了解人口群组在不同的州的差异。 以下代码示例是供创建饼图地图参考的指南。 // add a pie chart analysis layer based on the world layer // get a reference to the previously added world layer FeatureLayer world = (FeatureLayer) myMap.getLayers().get("world"); // build a List of columns in world to analyze List columnNames = new ArrayList(3); columnNames.add("Pop_0_14"); columnNames.add("Pop_15_64"); columnNames.add("Pop_65Plus"); // create our AnalysisTableDescHelper - use world's TableDescHelper TableDescHelper tableDescHelper = new AnalysisTableDescHelper( world.getTableDescHelper(), columnNames, AnalysisLayerType.PIE_CHART); // insert the pie chart layer as the top-most layer in the map - use // world's DataProviderRef AnalysisLayer analysis = (AnalysisLayer) myMap.getLayers().insertLayer( world.getDataProviderRef(), tableDescHelper, 0, "World Population Analysis"); // modify some of the PieChartProperties PieChartProperties pcp = (PieChartProperties) analysis.getAnalysisProperties(); // define a list of custom fill styles for each wedge List wedgeStyles = new ArrayList(3); Rendition red = new RenditionImpl(); red.setValue(Rendition.FILL, Color.red); wedgeStyles.add(red); Rendition yellow = new RenditionImpl(); yellow.setValue(Rendition.FILL, Color.yellow); wedgeStyles.add(yellow); Rendition orange = new RenditionImpl(); orange.setValue(Rendition.FILL, Color.orange); wedgeStyles.add(orange); pcp.setSectionFillStyles(wedgeStyles); // use a 2-pixel wide line style for the pie chart // border and wedge dividers Rendition lineStyle = new RenditionImpl(); lineStyle.setValue(Rendition.STROKE_WIDTH, 2); pcp.setLineStyle(lineStyle);使用分析图层 244 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 // start drawing the first wedge at 0°„, and work // counter-clockwise from there pcp.setStartAngle(0); pcp.setDrawnClockwise(false);第 C 部分:高级主题 本《开发人员指南》的 C 部分为开发人员提供了 MapXtreme Java 中高级特性的有关信息。 主题:  第 16 章:XML 协议 本章介绍 Mapinfo Enterprise XML 协议、文档类型定义 (DTD)、MapImageRequests 和 MapVectorRequests。  第 17 章:定制 AddLayer 向导 本章提供使用“添加图层向导”添加新数据源的有关指导。  第 18 章:创建定制数据提供方 本章面向高级地图绘制应用程序开发,介绍如何创建定制数据提供方并令其在“添 加图层向导”中可用。  第 19 章:Web 地图服务 本章提供了使用 WMS 的有关指导。XML 协议 本章介绍 MapInfo Enterprise XML 协议。 本章内容:  MapInfo Enterprise XML 协议 . . . . . . . . . . . . . . . . . . . . . . . . . . . .248  MapImageRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .249  MapVectorRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .252MapInfo Enterprise XML 协议 248 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MapInfo Enterprise XML 协议 MapXtreme Java 内建支持 MapInfo Enterprise XML 协议,可协同各种企业应用程序工作。此协议基 于扩展标记语言 (XML),定义众多 MapInfo 企业产品如何处理对地图信息和数据的请求和响应,例 如 MapXtreme Java、MapMarker J Server 和 Routing J Server 等产品。 MapInfo Enterprise XML 协议提供两个支持的组件:MapImageRequests 和 MapVectorRequests。 MapImageRequest 是一个提交至 MapXtremeServlet 的 XML 文档,用于请求多图层地图渲染。此 外,MapImageRequest 也用于请求生成动画图像的基础地图以及点覆盖列表。有关详细信息,请参 阅第 249 页的 MapImageRequest。 借助于 MapVectorRequest 协议,使用 MapXtreme Java 类创建的所有客户机和非 MTXJ 客户机即 可作为图层搜索的一部分创建 MapVectorRequest,并以地理标记语言 (GML) 格式接收图层的原始 数据。有关 MapVectorRequests 的详细信息,请参阅第 252 页的 MapVectorRequest。 GML 是由开放式 GIS 协会 (OGC) 所开发的 XML 编码,用于说明地理图元的属性和几何特征。正如 XML 将 Web 内容与显示隔离开来一样,GML 在说明图元几何特征的同时,将其与图形解释和图元 的可视化元素隔离开来。 文档类型定义 (DTD) MapXtreme Java 中还包括了文档类型定义 (DTD),DTD 指定一组 XML 请求和响应文档的结构规则。 DTD 定义了每个有效元素的语法。在安装之后,DTD 位于 MapXtreme-4.8.0/lib 目录的 mxjdtds.jar 文 件之中。务必确保该 jar 文件位于 classpath 中。 定义 DTD 元素的 HTML 文档随 MapXtreme Java 提供,其位置为 /docs/xmlprot/index.htm。 注: 同时支持 4.0 版和 4.5 版的 DTD。 在 MapImageRequest 或 MapVectorRequest 中支持使用以下 DTD 的内容。 独立于产品的 DTD • MI_XML_Protocol_CommonElements_1_0.dtd: 定义时间、距离、角度和速度等度量单位。此外还定义国际化的元素。其对于线路规划、地 理编码和地图绘制的支持均独立于产品。 支持的 DTD 说明 MI_XML_Protocol_MapImageRequest_4_ 7.dtd 定义客户机和服务器之间用于地图图像的请求和 响应。 MI_XML_Protocol_MapVectorRequest_4_ 7.dtd 以地理标记语言 (GML) 格式定义客户机和服务 器之间用于向量数据的请求和响应。第 16 章:XML 协议 开发人员指南 249 © 2006 MapInfo Corporation. 保留所有权利。 MapXtreme Java DTD • MI_XML_Protocol_MapCommonElements_4_7.dtd: 定义所有 MapXtreme 请求和响应的公共地图元素。说明支持 MapVectorResponses 的新 GMLFeature 和 GMLFeatureSetElements。 • MI_XML_Protocol_MapFeatureStyle_4_7.dtd: 定义说明用于图元或专题样式的元素。 • MI_XML_Protocol_MapStyle_4_7.dtd: 定义样式元素,例如填充、单笔填充、字体和标记等。 • MI_XML_Protocol_MapTextLabels_4_7.dtd: 定义说明标准的元素,其中包括基础属性、样式、专题、位置和约束条件(如是否允许标准 重复或覆盖)。 OGC 特定的 DTD 开放式 GIS 协会 (OGC) 在规范中对这些 DTD 作出了概要介绍。DTD 中采用了完全相同的规范。 • MI_XML_Protocol_OGC_CRS_1_1.dtd: OGC 坐标参考系定义。 • MI_XML_Protocol_OGC_GML_1_0.dtd: 定义用于点、多边形、折线和集合的简单 GML(地理标记语言)几何元素,符合 OGC 定义 的规范。 • MI_XML_Protocol_OGC_Identification_1_0.dtd: 定义 OGC 标识元素。 • MI_XML_Protocol_OGC_Units_1_1.dtd: 定义时间、距离、角度、像素间距度量的 OGC 单位。 MapImageRequest MapImageRequest 是一个用于请求 MapXtreme Java 渲染多图层地图的 XML 文档。 MapImageRequest 包含服务器访问每个图层中的数据、要应用于每个图层几何对象的专题影线表示 定义、要为每个图层生成的标注定义,以及所要返回的图像属性的定义所需的全部信息。 DTD 文件 MI_XML_Protocol_MapImageRequest_4_7.dtd 定义了 MapXtreme 4.5 MapImageRequest、 MapImageResponse 和 MapImageFaultResponse 的语法。此文档使用了外部 !ENTITY 结构以包 含另外 9 个 DTD 文件,这 9 个文件元素定义在其他 XML 协议请求之间共享。所有的 DTD 文件均可 见于随 MapXtreme Java 4.7 版本发布的 midtds.jar 文件之中。 MapImageRequest 可通过采用任何语言编写的、在任意平台上运行的任意客户机应用程序发送到 MapXtreme Java 服务器,只要其遵循该协议即可。对于客户机而言,不必使用 MapXtreme Java 客 户机类实现客户机(MapJ 和关联类)。 创建和发送 MapImageRequests 对于编写其自己的客户机,并直接从/至 MapXtreme Java 服务器处 理请求 / 响应的应用程序尤为重要。MapImageRequest 250 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 创建 MapImageRequest 不使用任意 MapXtreme Java 客户机类(MapJ 和关联的类)的客户机应用程序必须通过其自己的途 径,并以符合本文所述控制 XML 文档内容的 DTD 语法和其他策略来创建 MapImageRequest。 要使用 MapXtreme Java 客户机类的客户机应用程序可以创建 MapJ 对象,并使用 ImageRequestComposer 类从 MapJ 对象创建 MapImageRequest。由 ImageRequestComposer 生 成的文档在发送到服务器之前无需更改。 将 MapImageRequest 发送到服务器 MapImageRequest 将使用 HTTP 1.1 POST 请求发送到服务器。 HTTP 1.1 Request-Line: POST Content-Language: en_us Content-Type: text/xml; charset=iso-8859-4 Accept-Language: en_us Accept-Charset: iso-8859-4 MI_XMLProtocolRequest: MapImageRequest MI_XMLProtocolVersion: MI_XML_Protocol_MapImageRequest_4_7 MI_XMLProtocolTransactionId: client_defined_id //request content 该协议包括 3 个定制的 HTTP 标头。其中两个为必需,第三个为可选。 • MI_XMLProtocolRequest — 必需。 确定协议请求类型。此例中为字符串 MapImageRequest。 • MI_XMLProtocolVersion — 必需。 确定请求的协议版本。尤为重要的是,这是定义请求语法的 DTD 版本。此版本字符串在 DTD 文件本身的标头注释中确定。例如,MI_XML_Protocol_MapImageRequest_4_7.dtd 文件包 含确定此版本的标头注释,如下所示。 • MI_XMLProtocolTransactionId — 可选。 由客户机应用程序定义。用于关联响应与请求。第 16 章:XML 协议 开发人员指南 251 © 2006 MapInfo Corporation. 保留所有权利。 从 MapImageRequest 接收响应。 源自 MapImageRequest 的响应如下:一个图像、一个包含在 XML MapImageResponse 中的 base64 编码图像或 XML MapImageFaultResponse。 返回图像的成功示例: HTTP 1.1 Content-Type: image/gif MI_XMLProtocolTransactionId: client_defined_id 在返回图像的成功示例中,HTTP 响应不是 XML 文档,只是图像。 标头 MI_XMLProtocolTransactionId 为可选,并且只有在原始请求中出现时包括。 成功返回 base64 编码图像的成功示例: HTTP 1.1 Content-Language: en_us Content-Type: text/xml; charset=iso-8859-4 MI_XMLProtocolResponse: MapImageResponse MI_XMLProtocolVersion: MI_XML_Protocol_MapImageRequest_4_7 MI_XMLProtocolTransactionId: client_defined_id . . . 在返回编码图像的成功示例中,HTTP 响应是一个包含表示为编码文本的图像的 XML 文档。标头 MI_XMLProtocolResponse 和 MI_XMLProtocolVersion 为必需,标头 MI_XMLProtocolTransactionId 为可选,并且只有在原始请求中出现时包括。MapVectorRequest 252 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 所有失败的示例: HTTP 1.1 Content-Language: en_us Content-Type: text/xml; charset=iso-8859-4 MI_XMLProtocolResponse: MapImageFaultResponse MI_XMLProtocolVersion: MI_XML_Protocol_MapImageRequest_4_7 MI_XMLProtocolTransactionId:client_defined_id //response content 所有失败的示例均返回 XML MapImageFaultResponse。标头 MI_XMLProtocolResponse 和 MI_XMLProtocolVersion 为必需,标头 MI_XMLProtocolTransactionId 为可选,并且只有在原始请求 中出现时包括。 MapVectorRequest MapVectorRequest 是一个 XML 文档,请求 MapXtreme Java 服务器对数据源执行搜索,并将结果 返回为图元集,包括属性、样式和几何数据。术语“向量”特指将几何数据表示为点集的事实。 MapVectorRequest 确定数据源、搜索条件和要返回的特定数据项。 DTD 文件 MI_XML_Protocol_MapVectorRequest_4_7.dtd 定义 MapXtreme 4.7 MapVectorRequest、 MapVectorResponse 和 MapVectorFaultResponse 的语法。此文档使用了外部 !ENTITY 结构以包含 另外 9 个 DTD 文件,这 9 个文件元素定义在其他 XML 协议请求之间共享。所有的 DTD 文件均可见 于随 MapXtreme Java 4.7 版本发布的 midtds.jar 文件之中。 MapVectorRequest 可通过采用任何语言编写的、在任意平台上运行的任意客户机应用程序发送到 MapXtreme Java 服务器,只要其遵循该协议即可。对于客户机而言,不必使用 MapXtreme Java 客 户机类实现客户机(MapJ 和关联类)。 创建和发送 MapVectorRequests 对于编写其自己的客户机,并需要直接从/至 MapXtreme Java 服务 器处理请求 / 响应的应用程序尤为重要。 创建 MapVectorRequest 不使用任意 MapXtreme Java 客户机类(MapJ 和关联的类)的客户机应用程序必须通过其自己的途 径,并以符合本文所述控制 XML 文档内容的 DTD 语法和其他策略来创建 MapVectorRequest。 要使用 MapXtreme Java 客户机类的客户机应用程序可以创建 MapJ 对象,并使用 LayerVectorRequestComposer 类从图层对象创建 MapVectorRequest。由 LayerVectorRequestComposer 生成的文档在发送到服务器之前无需更改。第 16 章:XML 协议 开发人员指南 253 © 2006 MapInfo Corporation. 保留所有权利。 将 MapVectorRequest 发送到服务器 MapVectorRequest 将使用 HTTP 1.1 POST 请求发送到服务器。 HTTP 1.1 Request-Line: POST Content-Language: en_us Content-Type: text/xml; charset=iso-8859-4 Accept-Language: en_us Accept-Charset: iso-8859-4 MI_XMLProtocolRequest: MapVectorRequest MI_XMLProtocolVersion: Mi_XML_Protocol_MapVectorRequest_4_7 MI_XMLProtocolTrasactionId: client_defined_id //request content 该协议包括 3 个定制的 HTTP 标头。其中两个为必需,第三个为可选。 • MI_XMLProtocolRequest — 必需。确定协议请求类型。此例中为字符串 MapVectorRequest。 • MI_XMLProtocolVersion — 必需。确定请求的协议版本。尤为重要的是,这是定义请求语法的 DTD 版本。此版本字符串在 DTD 文件本身的标头注释中确定。例如, MI_XML_Protocol_MapVectorRequest_4_7.dtd 文件包含确定此版本的标头注释,如下所示。 • MI_XMLProtocolTransactionId — 可选。由客户机应用程序定义。用于关联响应与请求。 从 MapVectorRequest 接收响应。 源自 MapVectorRequest 的响应如下:XML MapVectorResponse 或 XML MapVectorFaultResponse。 返回图像的成功示例: HTTP 1.1 Request-Line: POST Content-Language: en_us Content-Type: text/xml; charset=iso-8859-4 Accept-Language: en_us Accept-Charset: iso-8859-4MapVectorRequest 254 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 MI_XMLProtocolRequest: MapVectorResponse MI_XMLProtocolVersion: MI_XML_Protocol_MapVectorResponse_4_7 MI_XMLProtocolTrasactionId: client_defined_id . . . 在成功的示例中,HTTP 响应是一个包含 MIFeatureSet 的 XML 文档。标头 MI_XMLProtocolResponse 和 MI_XMLProtocolVersion 为必需,标头 MI_XMLProtocolTransactionId 为可选,并且只有在原始 请求中出现时包括。应该注意 XML 响应文档可能会非常大,具体大小取决于在数据源中出现的几何 对象的数量和类型。 失败的示例返回 XML MapVectorFaultResponse。标头 MI_XMLProtocolResponse 和 MI_XMLProtocolVersion 均为必需。标头 MI_XMLProtocolTransactionId 为可选,并且只有在原始请 求中出现时包括。 HTTP 1.1 Content-Language: en_us Content-Type: text/xml; charset=iso-8859-4 MI_XMLProtocolResponse: MapVectorFaultResponse MI_XMLProtocolVersion: MI_XML_Protocol_ MapVectorResponse_4_7 MI_XMLProtocolTransactionId: client_defined_id //response content 定制 AddLayer 向导 本章介绍如何定制 AddLayer 向导。 本章内容:  概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256  更改数据源列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256  指定命名数据库连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259  addlayerwizard.properties 的位置. . . . . . . . . . . . . . . . . . . . . . . . .260  指定默认值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260  保存口令. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261概览 256 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 概览 添加图层向导是一个帮助用户添加图层的向导工具。在“图层控制”对话框中单击“添加”按钮, 即可显示该向导。要获取“添加图层向导”行为的示例,可运行 MapXtreme Java Manager,然后单 击“图层控制”按钮。从“图层控制”对话框,单击“添加”按钮,以显示“添加图层向导”。 “添加图层向导”将根据存储在 addlayerwizard.properties 文件中的数据源的值自行初始化。该文 件为文本文件,由 MapXtreme Java 安装程序安装到 MapXtreme Java 安装目录下的 lib/client 目录 中。该文件中的大部分行都包括一个键和一个与之关联的值,其间由等号 (=) 间隔。此文件中的值可 以修改,以更改 AddLayer 向导的配置,其中包括: • 应该出现在数据源初始列表中的数据源列表。 • 在从初始列表选择“使用命名数据库连接”数据源(此数据源默认为不出现)之后将出现的“命 名连接”列表。 • 提供用于向导操作步骤的数据源信息的默认值和常用值。 • 用于向导的第一步(选择数据源)和最后一步(指定如何访问数据)的默认值和 / 或常用值。 • 口令是否保存到属性文件(默认为不保存)。 更改数据源列表 由 MapXtreme Java 安装的 addlayerwizard.properties 文件配置用于在向导的第一步提供以下数据源 列表: • MapInfo TAB 文件 • 有空间选项的 Oracle • 有 SpatialWare 的 SQL Server • 有 SpatialWare 的 IUS • 任意具有 X/Y 列的数据 • GeoTIFF 栅格文件 • ESRI Shape • 数据绑定 • 命名图层 • 分析图层 • 使用命名数据库连接(只有在手动添加命名连接之后可用) • ECW 栅格 • MrSID 栅格 • DB2 Spatial Extender 如果在惯用的文本文件查看器中打开 addlayerwizard.properties 文件,将会在该文件顶部看到以下行: DataSource1=MapInfo TAB file 其中的 1 表示将成为列表中第一个数据源的 MapInfo TAB 文件数据源。随后是其它各个数据源(按 照数字排序)。第 17 章:定制 AddLayer 向导 开发人员指南 257 © 2006 MapInfo Corporation. 保留所有权利。 DataSource1=MapInfo TAB file DataSource2=Oracle with Spatial Option DataSource3=SQL Server with SpatialWare DataSource4=IUS with SpatialWare DataSource5=Any with X/Y Column Data DataSource6=GeoTIFF Raster DataSource7=ESRI Shape DataSource8=Data Binding DataSource9=Named Layer DataSource10=Analysis Layer DataSource11=Use Named Database Connection DataSource12=ECW Raster DataSource13=MrSID Raster DataSource14=DB2 Spatial Extender 删除数据源 如果已知您(或是 applet/ 应用程序的用户)将不会从上述列表的任意数据源添加图层,则可以将其 从 addlayerwizard.properties 文件的列表中删除。但是,如果在列表的中部删除数据源,则必须调整 列表中该数据源之后所有数据源的编号。例如,由于不需要从 SQL 服务器数据源添加图层,因此可 以删除以下条目组。 DataSource3=SQL Server with SpatialWare DataSource3_DPHelper_Page=DataSource3_Page2 DataSource3_DPHelper_Class=com.mapinfo.dp.jdbc.sqlserversw. SQLServerSpwDataProviderHelper DataSource3_Page_Count=3 DataSource3_Page1=com.mapinfo.beans.addlayer.PageSQLSRVp1 DataSource3_Page1_Description=Specify SQL Server Data Source Information DataSource3_Page2=com.mapinfo.beans.addlayer.PageSQLSRVp2 DataSource3_Page2_Description=Specify SQL Server Table or Query Information DataSource3_Page3=com.mapinfo.beans.addlayer.PageSQLSRVp3 DataSource3_Page3_Description=Specify Other SQL Server Table or Query Information 随后,您必须在该属性文件中上移其后的所有数据源(编号)。因此,DataSource4 条目组将更改 为 DataSource3 条目,DataSource5 条目组将更改为 DataSource4 条目,依此类推。 我们建议不要从属性文件删除该组条目,而是对该组条目进行注释,即在该组条目的各行之前添加 # 字符。例如,对 SQL 服务器条目进行注释的示例如下所示。更改数据源列表 258 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 #DataSource3=SQL Server with SpatialWare #DataSource3_DPHelper_Page=DataSource3_Page2 #DataSource3_DPHelper_Class=com.mapinfo.dp.jdbc.sqlserversw. SQLServerSpwDataProviderHelper #DataSource3_Page_Count=3 #DataSource3_Page1=com.mapinfo.beans.addlayer.PageSQLSRVp1 #DataSource3_Page1_Description=Specify SQL Server Data Source Information #DataSource3_Page2=com.mapinfo.beans.addlayer.PageSQLSRVp2 #DataSource3_Page2_Description=Specify SQL Server Table or Query Information #DataSource3_Page3=com.mapinfo.beans.addlayer.PageSQLSRVp3 #DataSource3_Page3_Description=Specify Other SQL Server Table or Query Information 如果只是对这些行进行注释,那么删除 # 字符,即可将相应的数据源添加回到列表之中。 此外,如果删除到只剩一个数据源,那么 AddLayerWizard 的第一步将不会显示数据源列表,因为对 于一个数据源而言别无他选。 数据源重新排序 与每组数据源条目关联的编号决定了其在数据源列表中的位置,这些数据源将在添加数据源向导的 第一步中显示。 通常,我们将常用的数据源放在列表中靠前的位置上。例如,如果已知 applet/ 应用程序用户经常需要从 IUS 数据源向其地图添加图层,则可选择将该数据源置于列表首位。默认的 addlayerwizard.properties 文件表示 IUS 数据源将作为列表中的第四个数据源显示。要将其置于首位,可对条目组更改如下: DataSource1=IUS with SpatialWare DataSource1_DPHelper_Page=DataSource5_Page2 DataSource1_DPHelper_Class=com.mapinfo.dp.jdbc.iussw. IusSpwDataProviderHelper DataSource1_Page_Count=3 DataSource1_Page1=com.mapinfo.beans.addlayer.PageIUSp1 DataSource1_Page1_Description=Specify IUS Data Source Information DataSource1_Page2=com.mapinfo.beans.addlayer.PageIUSp2 DataSource1_Page2_Description=Specify IUS Table or Query Information DataSource1_Page3=com.mapinfo.beans.addlayer.PageIUSp3 DataSource1_Page3_Description=Specify Other IUS Table or Query Information 自然,这样做将会令属性文件中出现两个 DataSource1 条目。要解决此问题,可增加和该数据源关 联的编号,以便将其置于新的 1 号条目之后。第 17 章:定制 AddLayer 向导 开发人员指南 259 © 2006 MapInfo Corporation. 保留所有权利。 指定命名数据库连接 如果已经查看了由 MapXtreme Java 安装的 addlayerwizard.properties 文件的内容,则可能会注意到 其中包括了第 11 个数据源,即使用命名数据库连接。此外,还可能注意到这一数据源并未出现在向 导第一步中供选的数据源列表之内。其原因在于已经安装的 addlayerwizard.properties 文件没有任何 命名连接条目。 这些命名连接条目是和由连接管理器面板管理的命名连接相同的连接(请参阅第 12 章:访问远程数 据),并且存储在 miconnections.properties 文件中。命名连接为特定数据库连接(更为准确地 说,是一组数据库连接属性)提供了轻松的引用方式。 要使 applet/ 应用程序的用户可以基于这些命名连接之一来添加图层,而无需指定任何连接信息,则 需要向 addlayerwizard.properties 文件的命名连接列表添加相应的命名连接。 例如,如果此前已经定义名为 Enigma 的连接,该连接定义了到 Oracle Spatial 数据源的连接,则需 要向 addlayerwizard.properties 文件添加一对条目,令“添加条目向导”意识到命名连接 / 资源的存 在,参阅以下粗体文本: # Named Connections # Add any named Connections that appear in # miconnections.properties. # Each named resource entry should include the name of the # resource as well # as the data source which is appropriate for that named # resource. # Sample named resource: # NamedConnection1=snoopy # NamedConnection1_DataSource=DataSource2 # In this sample, DataSource2 represents the data source which # is appropriate for snoopy. NamedConnection1=Enigma NamedConnection1_DataSource=DataSource2 在文件中紧接着命名连接注释部分之后的位置添加条目,以便可以从一个位置管理所有的命名连 接。相应注释部分还说明了定义命名资源时所要使用的约定。唯一不明显的地方如下所示: NamedConnection1_DataSource=DataSource2 此行表示 DataSource2(默认为 Oracle Spatial 数据源)是相应于命名 Enigma 连接的数据源。 您可以根据需要添加任意数量的命名资源,前提是相应数据源和 miconnections.properties 文件中的 命名连接保持一致。在列表中至少有一个命名资源之后,相应的“命名资源”数据源将显示在向导 第一步的数据源列表之中。有关连接和命名资源的详细信息,请参阅第 12 章:访问远程数据。addlayerwizard.properties 的位置 260 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 addlayerwizard.properties 的位置 此处有两个 addlayerwizard.properties 副本。其一位于 lib/client 之中,在运行类似 MapXtreme Java Manager 应用程序的独立应用程序时使用。 addlayerwizard.properties 的另一个副本存储在 webapps/mapxtreme480/client 目录的 mjmappletsup.jar 文件之内,该副本在 MapXtreme Java Manager 作为 applet 运行时使用。当作为 applet 运行 MapXtreme Java Manager 时,将会使用略有不同的安全设置,因此需要自己的属性文件副本。 如果需要编辑 addlayerwizard.properties 文件,确保编辑的是计划运行的应用程序的适当文件副本。 指定默认值 可以置入各种“添加图层向导”控件的默认值,这些默认值显示为预选设置或出现相应设置时的指 定值。这一点非常实用,尤其是在 applet/ 应用程序的用户不知道远程数据源的连接信息的情况下, 因为此时您可以自动为其填充相应的数据。 要为控件指定默认值,可在 addlayerwizard.properties 中添加行,表示要设置的页面和控件(两者共 同构成“键”)以及默认值。例如,如果要设置在向导的初始 DataSourcePage 页面显示为预先选 定的数据源,可以添加如下行: DataSourcePage_default_datasource=Oracle with Spatial Option 注: 产品安装时已经安装了包含此行的 addlayerwizard.properties 文件,即指定 MapInfo TAB 文 件为默认数据源。 用于在 addlayerwizard.properties 中指定默认值的约定如下所示: _default_= 注: 在默认值前后请勿包括双引号。 设置用于首页和末页控件的默认值 在向导的首页(屏幕)中,可选择用于添加图层的数据源。而在末页中,则可指定访问数据的方式 和设置某些杂项值。 要为任意页面中的控件指定默认值,可按照上述指定默认值的约定,向属性文件添加相应的行。 页面 控件名称 控件说明 DataSourcePage datasource “可用的数据源”列表中预先选定的数据源(如 MapInfo TAB 文件) DataSourcePage useprevious 如为 True 则表示预先选择“使用先前的设置作为默认 值”选项;如为 False 则表示预先选择“使用默认属 性值”选项。第 17 章:定制 AddLayer 向导 开发人员指南 261 © 2006 MapInfo Corporation. 保留所有权利。 设置用于其它 DataSource 页面控件的默认值 “添加图层向导”中的每个数据源均具有一个或多个与其关联的“页面”,用于查询用户从该类数 据源添加特定图层所需的必要信息。如果查看 addlayerwizard.properties 的内容,将会注意到其中有 多种 DataSourceX_PageY 条目。您所指定的默认值将为向导某一页面所专用。 添加图层向导可以保持在会话之间最常使用 (MRU) 的值集。添加图层向导具有对 addlayerwizard.properties 文件的写访问权限,在您每次单击“完成”按钮之后,向导将写入各种 MRU 值行。如果选择了“使用先前的设置作为默认值”选项,则这些值将在向导的首页中作为预选 的值。这一特性有助于避免重复键入相同或类似的设置。 注: 如果在 applet 中部署,则添加图层向导不能写入此文件。 确认可以设置哪一默认值的最简单办法是在单击添加图层的“完成”按钮之后,查看所保存的 MRU 值。复制现有的 MRU 行来创建其另一(默认)版本,再使用 mru 替代 default。 保存口令 默认情况下,添加图层向导配置为不在属性文件中保存最常用的口令。在添加远程数据库中的图层 时,口令是连接信息的必要组成部分。为了安全起见,默认情况下,这些口令将不保存在属性文件 中。但是,如果希望将 MRU 口令保存在属性文件中,只需更改 addlayerwizard.properties 中的一行 信息即可。即将属性文件的第一行更改如下: Save_Passwords=true DataAccessPage servlet 如为 True 则表示预先选择“由远程 MapXtremeServlet 访问数据”;如为 False 则表示预先选择“访问本地 数据”选项。 DataAccessPage url URL — MapXtremeServlet 的 URL 页面 控件名称 控件说明保存口令 262 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 创建定制数据提供方 本章介绍如何实现定制的数据提供方。 本章内容:  简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264  主数据提供方接口和文件概览. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264  用于向量数据的 DataProvider 实现步骤 . . . . . . . . . . . . . . . . . . . . .266  用于栅格数据的 DataProvider 实现步骤 . . . . . . . . . . . . . . . . . . . . .267  向 AddLayerWizard 添加定制 DataProvider . . . . . . . . . . . . . . . . .268简介 264 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 简介 在 MapXtreme Java 4.0 之前,只能使用由 MapXtreme 支持的数据源集合提供的数据提供方来检索 数据。在 3.0 发布版中添加的 QueryBuilder 功能提供了定制 MapXtreme 数据提供方行为的机制,但 是仍然将访问权限限定为支持的数据源。在 4.x 发布版中,创建数据提供方所需的全部接口和类均完 全公开,用户借此即可采用任何方式来访问各种类型的数据。 实现数据提供方需要在开发和测试资源上完成大量工作,这不是一项轻松的任务。几乎所有用户都 发现 MapXtreme 数据提供方已经能够完全满足需要。只有那些在 MapXtreme 中无法找到所需特定 功能,并且具备实现 DataProvider 所需资源的用户,才有可能实现 DataProvider。 什么是 DataProvider? MapXtreme 应用程序基于由一个或多个图层对象构成的 MapJ 对象。每个图层中的数据均取自特定 的数据源(如 TAB 文件、RDBMS 或栅格文件)。图层本身并不识别植入数据的特定数据源、类型 和访问机制。使用提供给其构造器的对象,图层对象即可创建 DataProvider 接口的实例,以执行将 数据返回图层的必要操作。例如,如果数据源是 RDBMS 并且请求返回所有包含在边界矩形中的图 元,DataProvider 将需要执行以下操作: 1. 创建包含正确几何搜索约束条件并返回必要数据的 SQL 查询字符串。 2. 建立到 RDBMS 的连接。 3. 执行查询。 4. 取回结果集并将数据转换为 MapXtreme 所请求的格式返回。 总之,DataProvider 接口需要实现采用不同约束条件和两个元数据查询的 8 个数据查询。从 DataProvider 返回的数据应该是图元数据(向量几何和属性)或图像数据(栅格图像)。用于这两 种类型数据的 DataProvider 和相关接口的实现略有不同。下表确定了两种数据所需的接口。 主数据提供方接口和文件概览 接口 文件包 向量栅格 说明 DataProviderHelper com.mapinfo.dp 是是确定访问数据源所需的 元数据。 TableDescHelper com.mapinfo.dp 是是确定要在数据源处访问的 数据。 DataProvider com.mapinfo.dp 是 是 查询数据源,检索数据和元 数据。 UpdateableDataProvider com.mapinfo.dp 否* 否 扩展 DataProvider,以允许 编辑数据源中的数据。第 18 章:创建定制数据提供方 开发人员指南 265 © 2006 MapInfo Corporation. 保留所有权利。 FeatureSet com.mapinfo.dp 是是表示由 DataProvider 执行的 所有数据查询结果,即一个 实现为图元的记录集合。 图元 com.mapinfo.dp 是是FeatureSet 中的单一记录。 几何对象 com.mapinfo.dp 是 否 确定图元的常规几何信息。 PointGeometry com.mapinfo.dp 是 否 将 Geometry 扩展为点数据 特有的接口。 VectorGeometry com.mapinfo.dp 是 否 将 Geometry 扩展为线数据 或区域数据特有的接口。 PointList com.mapinfo.dp 是 否 提供对 VectorGeometry 坐 标数据的访问。 MIRaster com.mapinfo.dp 否 是将栅格数据绘制到 Java 图形 对象。 TableInfo com.mapinfo.dp 是 是 有关由 TableDescHelper (Layer 元数据)确定的数 据的元数据或从 DataProvider 查询(FeatureSet 元数据) 返回的数据的元数据。 ColumnStatistics com.mapinfo.dp 否 † 否 有关数据源中的单列数据的 统计信息。只和 RangedTheme 或 RangedLabelTheme 一起 使用。 LayerXMLHandler com.mapinfo. xmlprot.mxtj. layerxmlhandlers 是 是 提供数据提供方类从 / 至 MI_XML_Protocol_MapCom monElements_4_7.dtd 中定 义的 XML 元素的映射。 layerxmlhandlers.xml 未提供 是 是 系统配置文件,是提供在 LayerXMLHandler 和 DataProviderHelper 之间的 映射的外部配置文件。 * 如果数据源为只读则不需要 † 如果没有使用 RangedTheme 和 RangedLabelTheme 则不需要。 接口 文件包 向量栅格 说明用于向量数据的 DataProvider 实现步骤 266 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 用于向量数据的 DataProvider 实现步骤 1. 实现 TableDescHelper 实现接口方法,并在数据源中添加特定于数据的所有其它接口方法。DataProvider 实现不需 要的接口方法可以不采用任何操作。TableDescHelper 存储在图层之中,并传递到所有 DataProvider 接口方法以及 LayerXMLHandler.createQueryElement() 接口方法,因此其必须 包含这些方法所需的数据。 2. 实现 DataProviderHelper 此接口没有方法,因此必须为数据源添加所需的全部方法。DataProviderHelper 存储在图层 之内,并将传递到 theLayerXMLHandler.createConnectionElement() 接口方法,因此其必须 包含此方法所需的数据。 3. 实现 TableInfo 和 DataProvider.getTableInfo() 可连接到数据源并获取相应数据库所存储的数据类型的有关信息。DataProvider.getTableInfo() 和 FeatureSet.getTableInfo() 均需要实现 TableInfo。 4. 实现 DataProvider.queryInRect() 可对数据源中的数据进行有条件的几何搜索。MapXtreme 也需要使用这一方法来进行渲染。 5. 实现 FeatureSet、Feature、Geometry、VectorGeometry、PointGeometry 和 PointList 通过这些对象,MapXtreme 可以使用 queryInRect() 实现的结果。对于 DataProvider 的请求 表明了在 FeatureSet 中返回的几何数据所需的坐标系。因此,在返回到 MapXtreme 之前, 有必要转换从数据源取回的几何对象的坐标(请参阅 com.mapinfo.coordsys.CoordSys 和 com.mapinfo.coordsys.CoordTransform)。 6. 实现 LayerXMLHandler 此接口实现 Java 类和 XML 元素之间的映射(JDOM 元素对象)。XML 必须符合随 MapXtreme 提供的 DTD 中包含的文档定义(请参阅 midtds40.jar)。 *** 有关 元素下的 元素的要求 *** 元素中的字符串必须以数据提供方协议标记开始,该标记选择用于确认由“:”(冒号 字符)间隔的 DataProvider。例如,MapXtreme Oracle 和 Tab 数据提供方使用 oraso 和 tab 标记,示例 XML Url 元素如下所示: jdbc:oracle:thin:@your_server:1521:your_servicename tab:d:\Program Files\maps 如果实现的是 MyDataProvider,并且选择 mydp 作为协议标记,则 Url 将如下所示: mydp:any_url_string@blah.blah.blah:dotcom?hello 此外还可任选其它标记。配置文件 layerxmlhandlers.xml 中也确认了这一相同的标记(如下 所述)。MapXtreme 在 元素的开始部分查找此标记,并将其映射到适当的要实例化的 LayerXMLHandler,以读取由处理程序生成的 XML 文档的各个部分。Url 的其余部分可以采 用任意所需的格式。第 18 章:创建定制数据提供方 开发人员指南 267 © 2006 MapInfo Corporation. 保留所有权利。 7. 向 layerxmlhandlers.xml 添加条目 此文件为 MapXtreme 提供了数据提供方协议标记以及 DataProviderHelper 和 LayerXMLHandler 实现的类名之间的关联。此文件必须驻留在 MapXtreme 应用程序的类路径中。此文件的模板 随 MapXtreme 安装提供。 以下是 MyDataProvider 的示例条目。在此需要使用完全合格的类名。 元素是上述必须追加到连接 URL 的标记。 com.mycompany.myapp.MyDataProviderHelper com.mycompany.myapp.MyLayerXMLHandler mydp 8. 渲染使用 DataProvider 的图层 渲染完成之后,DataProvider 实现的主要障碍就不复存在了。 9. 实现其余的 DataProvider 接口方法 实现 ColumnStatistics。 10. 实现 UpdateableDataProvider(可选) 如果要允许编辑数据源,即与只读相反,可以更改数据提供方来实现 UpdateableDataProvider 接口并在该接口上实现附加方法。 用于栅格数据的 DataProvider 实现步骤 1. 与此前用于向量数据的步骤 1 相同。 2. 与用于向量数据的步骤 2 相同。 3. 与用于向量数据的步骤 3 相同。由于栅格数据的元数据很少,因此 DataProvider 实现无需采用的 TableInfo 接口方法可不采用任何操作。 4. 扩展 com.mapinfo.dp.util.AbstractRasterDataProvider。 5. 与用于向量数据的步骤 6 相同。 6. 与用于向量数据的步骤 7 相同。 7. (可选)覆盖 com.mapinfo.dp.util.AbstractRasterDataProvider.getValue(TableDescHelper, DoublePoint)。在实现读取网格栅格(如 MIG、GRD)的数据提供方时,只需覆盖此方法。 注: 扩展 AbstractRasterDataProvider 对象时,传递到方法中的 TableDescHelper 将为 RasterTableDescHelper 或其子类。此外,TableInfo 也应为 RasterTableInfo 或子类。向 AddLayerWizard 添加定制 DataProvider 268 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 向 AddLayerWizard 添加定制 DataProvider 对于任意 DataProvider 的支持均可轻松添加到 AddLayerWizard。该向导可以根据 addlayerwizard.properties 文件中的设置自行初始化。此文件定义: • 要添加的图层所源自的 DataProvider 列表。 • 对于每个 DataProvider,将会有一个或多个 GUI 页面的列表,提示用户添加 DataProvider 图层 所需的必要信息。 • GUI 页面中的某些或全部控件的默认值(可选)。 • GUI 页面中的某些或全部控件的常用值(可选)。 AddLayerPage 类 第一步是确定 GUI 页面集,要查询构建所需的 TableDescHelper 和 DataProviderHelper 必要信息, 则必须提供该页面集,TableDescHelper 和 DataProviderHelper 用来添加 DataProvider 的图层。这些 页面中的每个页面均将扩展 com.mapinfo.beans.addlayer.AddLayerPage 类。每个 AddLayerPage 本 质上均为 javax.swing.JPanel,包括用于该页的所有 GUI 控件。 页类应该调用默认(无参数)AddLayerPage 构造器,随后将进行向其布局添加 GUI 控件所需的必 要工作。 此外,对于需要额外实现的 AddLayerPage,也提供了一些可用的方法。如下所示: • boolean validatePage(AddLayerWizard wizard): 在向导中单击“下一步”或“完成”时调用此 方法。这也正是验证已经为该页提供所有必需信息的机会。如果一切正常将返回 ture,继续进行 后续步骤;如果有问题则返回 false。(此方法的默认实现如果没有覆盖,则会返回 true。) • void finishInitializing(AddLayerWizard wizard): 在此页变为可见之前(在向导中此页的前一页 单击“下一步”),将会立即调用此方法。这是执行最后的初始化的机会。(此方法的默认实现 如果没有覆盖,则不会作出任何操作。) • void setPageLinks(AddLayerWizard wizard): 此方法在该页得到成功验证(即 validatePage() 返回 true)之后将会调用。这为向导中的“下一页”或“上一页”提供了动态更改机制。(此方 法的默认实现如果没有覆盖,则不会作出任何操作。) 有关详细信息,请参阅 Javadocs 中的 com.mapinfo.beans.addlayer.AddLayerPage 类。 AddLayerWizard 类 com.mapinfo.beans.addlayer.AddLayerWizard 类具有某些方法,在页面中完成类似于设置当前 TableDescHelper 和 DataProviderHelper 的操作时将需要利用这些方法。 注: 以上讨论的三个 AddLayerPage 回调方法为您提供了 AddLayerWizard。 这些方法如下所示: • setDataProviderHelper(DataProviderHelper dpHelper):设置当前的 DataProviderHelper。 • setTableDescHelper(TableDescHelper tdHelper):设置当前的 TableDescHelper。 • setLayerNameRequired(boolean bNameRequired):设置在添加用于当前 DataProvider 的图 层时,是否需要图层名。如果使用值 ture 来调用此方法,则将强制用户在向导的最后一步指定图 层名称。第 18 章:创建定制数据提供方 开发人员指南 269 © 2006 MapInfo Corporation. 保留所有权利。 您最可能从 AddLayerPage(s) 的 validatePage(AddLayerWizard) 方法中调用这些方法, AddLayerPage(s) 用于获取构建 DataProviderHelper 和 / 或 TableDescHelper 的必要信息。 有关详细信息,请参阅 Javadocs 中的 com.mapinfo.beans.addlayer.AddLayerWizard 类。 addlayerwizard.properties 在实现用于 DataProvider 的必要页面之后,需要添加用于 DataProvider 的条目。为此,需要将新的 DataSourceI 条目添加到 addlayerwizard.properties 中的现有 DataSource 条目集中。有关示例,请 参阅 addlayerwizard.properties。 下表说明了支持的键值对: 此外,还可以通过 addlayerwizard.properties 指定 GUI 页面中某些或全部控件的默认值。在此,可 以通过 java.awt.Component 的 setName(String) 方法来命名页面中的控件。然后在键中使用相同的 名称来定义控件的默认值。 该向导还可以自动将最常用 (MRU) 的命名控件值用于 addlayerwizard.properties。此外,还可以命 名要存储 MRU 值的控件。 键值必需 DataSourceI 将在向导第一步中的数据源名称列表中出现的 数据源名称。 是 DataSourceI_TDHelper_Class 用于此数据源的 TableDescHelper 类的完全类 规范。 是 DataSourceI_Allowed_In_Applet True/False 说明是否允许从 applet 上下文中的 这一数据源添 加图层(如 未 指定则默认为 true)。 否 DataSourceI_Page_Count 此数据源所必需的页数。 是 DataSourceI_PageJ 表示此页的 Java 类。 是 DataSourceI_PageJ_Description 说明此页将要提示用户的具体内容。 是向 AddLayerWizard 添加定制 DataProvider 270 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 Web 地图服务 MapXtreme Java 提供 Web 地图服务 (WMS) 供用户使用。MapXtreme Java 中 的 WMS 兼容 1.1.1 OpenGIS® 的 Web 地图服务实现规范。本文档也可参阅 http://www.opengis.org/techno/implementation.htm。 本章内容:  WMS 服务器概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272  GetCapabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272  GetMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276  GetFeatureInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .277  WMS 栅格数据提供方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279  WMS 客户端. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .280WMS 服务器概览 272 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 WMS 服务器概览 MapXtreme Java 中的 WMS 符合 Open GIS 协会的 Web 地图服务实现规范,可用于实现以下操作: • GetCapabilities 返回服务级别的元数据。这一元数据是有关信息内容和服务的可接受请求参数的 说明。 • GetMap 返回已定义地理空间和尺寸参数的地图图像。 • GetFeatureInfo — 返回有关地图所示图元的信息。此操作为可选。 注: 所有这些请求类型均为区分大小写。 GetCapabilities GetCapabilities 返回服务级别的元数据。这一元数据是有关信息内容和服务的可接受请求参数的说明。 请求参数 下表列出了可能的请求参数。 示例请求 以下是 GetCapabilities 请求的示例: http://hostname:portnumber/wmsserver111/servlet/wms?SERVICE=WMS &REQUEST=GetCapabilities 示例响应 以下是 GetCapabilities 响应的示例: - - OGC:WMS MapInfo Corporation Map Server 请求参数 必需 说明 VERSION=version 否 请求版本。MapXtreme Java 只支持 1.1.1 版本。 SERVICE=WMS 是 服务类型。由于目前所有 MapXtreme Java 均 支持 WMS,因此 SERVICE 属性始终设置为 WMS。 REQUEST=GetCapabilities 是请求名称第 19 章:Web 地图服务 开发人员指南 273 © 2006 MapInfo Corporation. 保留所有权利。 - - - application/vnd.ogc.wms_xml - - - - - image/gif image/jpeg image/jpg image/png - - - - - text/xml - - - GetCapabilities 274 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 - - application/vnd.ogc.se_xml application/vnd.ogc.se_inimage application/vnd.ogc.se_blank - MapInfo Corporation Map Server EPSG:4201 EPSG:4205 [...] - [...] - Layers/World/Capitals World Capitals - Layers/World/Countries World Countries - Layers/World/Grid Grid 第 19 章:Web 地图服务 开发人员指南 275 © 2006 MapInfo Corporation. 保留所有权利。 - Layers/World/Ocean Ocean (Robinson) 存储服务元素信息 用户可以提供一个 service.xml 文件,该文件存储了符合 OGC 定义的服务元素信息。这一 service.xml 文件需要符合 OGC DTD,并且需要位于 WEB-INF 文件夹的 wmsserver111 上下文中。以下提供了 service.xml 文件的示例。XML 文件的根元素需要为 ,否则系统会将 XML 文件视为无效, 并且 getCapabilitiesRequest 将出现故障。 - OGC:WMS Custom Service title GetCapabilities 请求高速缓存 MapXtreme Java 在初始化时创建了一个 capabilities.xml 文件,用于在 MapXtreme Java 对 GetCapabilities 请求作出响应时进行高速缓存。 此文件可以修改,以便提供有关数据的更多自定义信息。此外,还有一个新的初始化参数用于控制 此文件的“生存期”。以下提供了与其相关的 web.xml 的示例: maxAgeOfCapabilitiesXML -1 要按小时和分钟设置频率,请使用小数值。例如,要将最长时间设置 15 分钟,则将参数设置为 0.25。 必须实现 com.mapinfo.util.CacheManager 才能在服务器或本地清除缓存。详细信息请参阅 Javadocs。GetMap 276 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 GetMap GetMap 返回已定义地理空间和尺寸参数的地图图像。在调用 GetMap 时,WMS 客户端将指定: • 图层 • 样式 • 边界框 • 参考坐标系 • 输出格式 • 输出大小 • 背景透明度和颜色 请求参数 下表列出了可能的请求参数。 请求参数 必需说明 VERSION=version 是 请求版本。MapXtreme Java 只支持 1.1.1 版本。 REQUEST=GetMap 是请求名称。 LAYERS=layer_list 是由逗号间隔的列表,其中列出了一个或多个地 图图层。 STYLES=style_list 是由逗号间隔的列表,其中列出了渲染样式每个 请求的图层。 SRS=namespace:identifier 是空间参考系统。 BBOX=minx,miny,maxx,maxy 是 采用 SRS 单位表示的边界框角(左下、右上)。 WIDTH=output_width 是 地图图片的像素宽度。 HEIGHT=output_height 是 地图图片的像素高度。 FORMAT=output_format 是 地图的输出格式。 TRANSPARENT = TRUE|FALSE 否 地图的背景透明度(默认为 FALSE)。 BGCOLOR=color_value 否背景色的十六进制红绿蓝颜色值(默认值为 0xFFFFFF)。 EXCEPTIONS = exception_format 否 WMS 的异常错误报告格式(默认为 SE_XML)。 WFS = web_feature_service_URL 否 Web 图元服务的 URL,该服务提供要使用样式 图层说明器符号化的图元。第 19 章:Web 地图服务 开发人员指南 277 © 2006 MapInfo Corporation. 保留所有权利。 示例请求 以下是 GetMap 请求的示例: http://hostname:portnumber/wmsserver111/servlet/wms?VERSION=1.1.1 &SRS=epsg:4267&REQUEST=GetMap&LAYERS=Layers/World/ Countries&STYLES=&BBOX=-180,-90,180,180 &WIDTH=800&HEIGHT=600&FORMAT=image/gif 示例响应 以下是 GetMap 响应的示例: GetFeatureInfo GetFeatureInfo 返回有关地图所示图元的信息。此操作为可选。如果采用了 GetFeatureInfo,则必须 在 GetMap 请求之后发出。 请求参数 下表列出了可能的请求参数。 请求参数 必需说明 VERSION=version 是 请求版本。MapXtreme Java 只支持 1.1.1 版本。 REQUEST=GetFeatureInfo 是请求名称。 是 地图请求参数的部分副本,生成所需信息的 地图。 QUERY_LAYERS=layer_list 是 逗号分隔的列表,其中列出了一个或多个要查 询的图层。GetFeatureInfo 278 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 示例请求 以下是 GetFeatureInfo 请求的示例: http://hostname:portnumber/wmsserver111/servlet/wms?VERSION=1.1.1 &REQUEST=GetFeatureInfo&SRS=epsg:4326&LAYERS=Layers/World/Countries &STYLES=&BBOX=-180,-180,180,180&WIDTH=800&HEIGHT=600&QUERY_LAYERS=Layers/ World/Countries&X=54&Y=54 示例响应 以下是 GetFeatureInfo 响应的示例: - - world - - - -1.6194966287191512E7 -8621185.324024437 - 1.6789976633244906E7 8326222.646170927 - - coordsys122 mapinfo - Country Capital Pop_1994 INFO_FORMAT =output_format 否 图元信息的返回格式(MIME 类型)。 FEATURE_COUNT=number 否 要返回有关其信息的图元数量(默认为 1)。 X=pixel_column 是以像素表示的图元 X 坐标(自左上角测量为 0) Y=pixel_row 是以像素表示的图元 Y 坐标(自左上角测量为 0) EXCEPTIONS = exception_format 否 WMS 的异常错误报告格式(默认为 application/vnd.ogc.se_xml)。 请求参数 必需说明第 19 章:Web 地图服务 开发人员指南 279 © 2006 MapInfo Corporation. 保留所有权利。 Pop_Grw_Rt Pop_Male Pop_Fem Pop_0_14 Pop_15_64 Pop_65Plus Male_0_14 Male_15_64 Male_65Plus Fem_0_14 Fem_15_64 Fem_65Plus Pop_Urban Pop_Rural Pop_Urb_Male Pop_Urb_Fem Pop_Rur_Male Pop_Rur_Fem Arable_Pct Literacy Inflat_Rate Unempl_Rate Indust_Growth Continent MapInfo_ID - MapInfo_ID WMS 栅格数据提供方 Mapxtreme Java 提供了 WMSRasterDataProviderHelper 和 WMSRasterTableDescHelper 类,可用 于使用任意 WMS v1.1.1 Web 服务,以编程方式向 MapXtreme Java 提供将要作为地图组成部分的 图层。WMS 栅格数据提供方只可用于渲染图层。和渲染无关的任意查询将会返回空的 FeatureSet 或者返回没有意义的结果。 注: 返回有效结果的唯一一种查询是需要渲染的查询。有效的结果将从 queryInRectangle 中返回。 WMSRasterDataProviderHelper 类说明了要使用的 WMS 1.1.1 服务器的位置。该类和 WMSRasterTableDescHelper 一起使用,可以向基于 WMS 1.1.1 服务器上的图层的 MapJ 对象添加 图层。MapXtreme Java 目前不允许远程访问栅格图层。由于此 WMS 栅格数据提供方提供了栅格信 息,因此不能通过使用 MapXtremeDataProviderRef 进行远程数据访问。 有关详细信息,请参阅 Javadocs 中有关相应的类的说明。有关栅格图像的详细信息,请参阅第 160 页第 10 章的栅格图像。WMS 客户端 280 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 另请参阅 ImageConnectSample.java 的示例应用程序,位于 /MapXtreme-4.8.0/examples/client/wms 文件夹。此示例说明如何访问图像连接服 务、添加 ImageConnect WMS 栅格图层、在矢量图层上覆盖此栅格图层以及使用 Swing 显示结果。 WMS 客户端 MapXtreme Java Edition提供了 JSP WMS 定制标记示例应用程序,用于显示 WMS 客户端的示例功能。 启动 MapXtreme 服务器,打开浏览器,键入指向示例的 URL 即可访问 JSP WMS 定制标记,该 URL 可如下所示: http://[hostmachine:portnumber]/samples480/wms.jsp第 19 章:Web 地图服务 开发人员指南 281 © 2006 MapInfo Corporation. 保留所有权利。 WMS 客户端界面说明 本节介绍 WMS 客户端的图形用户界面。 服务器列表 在该界面的服务器列表部分提供了以下项目。 Add — 向列表添加新服务器,并令其图层可用于添加图层控制。此时将忽略无效的 WMS URL。 Remove — 从服务器列表删除服务器,并从地图删除其所有图层。 地图工具 在该界面的地图工具部分提供了以下项目。 ZoomIn/ZoomOut/Recenter — 与地图一起使用的基本地图工具。 ZoomToAllLayers — 更改缩放以包含地图上的所有可见图层。 图层控制 在该界面的图层控制部分提供了以下项目。 Visibility(开 / 闭)— 更改地图图层的可视性。 Style Chooser — 用于从图层支持的样式的列表中选择样式。 Move Layer(上 / 下)— 更改地图图层的排序顺序。 Remove Layer — 添加或删除随任意可用服务器提供的图层。 Add Layer — 添加随任意可用服务器提供的图层。 Refresh Map Data — 根据对任意图层可见性的更改,重画图层。 使用 WMS 客户端 要使用 WMS 客户端,可执行以下操作: 1. 从界面的“Server List”部分,单击 Add。此时将显示“Add Server Dialog”框。 2. 输入所要使用的 WMS 1.1.1 服务器的 URL,然后单击 OK。WMS 客户端 282 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 3. 从界面的 WMS 图层控制部分,单击 Add。此时将显示“Add Layer”对话框。 4. 从相应的下拉框中选择服务器、图层和图像类型,然后单击 OK。 5. 使用第 281 页的 WMS 客户端界面说明中介绍的控件对地图进行所需的操作。第 D 部分:附录 本《开发人员指南》的 D 部分提供了众多参考资料,用于帮助您进一步充分利用 MapXtreme Java。 主题:  附录 A:MapXtreme Java Jar 文件 MapXtreme Java Edition 中所包括的 .jar 文件的列表和说明。  附录 B:坐标系的元素 有关受支持的投影和基准面参数的讨论  附录 C:定制 JSP 标记库 定义 MapXtreme Java 在定制库中附带的所有 JSP 标记  附录 D:理解 MapBasic 样式字符串 有关 MapBasic 样式画笔、画刷和符号的摘要  附录 E:图像符号 随 MapXtreme Java 附带的符号集的概略图  附录 F:MAPINFO.MAPINFO_MAPCATALOG 有关 MAPCATALOG 的摘要,这一注册表用于存储元数据的数据库,这些元数据与 数据库中的几何表有关  附录 G:系统属性 此附录介绍 MapXtreme Java 支持的系统属性。  附录 H:系统日志记录 有关在服务器和客户端上记录系统消息的信息。MapXtreme Java Jar 文件 下表列出了 MapXtreme Java Edition 附带的 .jar 文件。286 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 公共 jar 文件(用于多个 MapInfo 服务器产品) 特定于 MapXtreme Java 4.8 的 Jar 文件 公共 JAR 说明 附属 内容 mistyles XML 画笔 / 画刷 无所有画笔 / 画刷 XML 样式定义文件 miutil 实用程序类 无 整个 io 数据包 源自 com/mapinfo/util 的多个类 micsys 坐标系和单位 miutil 整个坐标系数据包 整个单位数据包 整个 xmlprot/csys 数据包 micsys.txt miappletsup 一般 applet 支持文件 无 所有 .xml 文件(例如, encoding-map.xml) 所有 .properties 文件(例如, rasterhandlerfactory.properties) MXJ JAR 说明 附属内容 mxj 核心 miutil, micsys MapJ LocalRenderer 和 Graphics MapXtremeImageRenderer 所有 DP 帮助程序 所有 XML 处理程序 mxjclient 瘦客户机 — 假定使用 所有远程数据和渲染 miutil, micsys MapJ MapXtremeImageRenderer 所有 DP 帮助程序 所有 XML 处理程序 mxjserver 所有 Servlet miutil, micsys, mxj MapXtremeServlet 和子 servlet MapXtreme Java Manager Servlet NamedResourceServlet mxjtabdp TAB 数据提供方 miutil, micsys, mxj TABDataProvider mxjoradp Oracle 数据提供方 miutil, micsys, mxj OraSoDataProvider附录 A:MapXtreme Java Jar 文件 开发人员指南 287 © 2006 MapInfo Corporation. 保留所有权利。 mxjdb2sedp IBM DB2 Spatial Extender miutil, micsys, mxj DB2SEDataProvider mxjdb2dp IBM DB2 with SpatialWare miutil, micsys, mxj Db2SpwDataProvider mxjiusdp IUS 数据提供方 miutil, micsys, mxj IUSDataProvider mxjsqlsvrdp SQL Server DP miutil, micsys, mxj SQLServerDataProvider mxjrasterdp 栅格数据提供方 miutil, micsys, mxj, mxjtabdp GeoTIFFDataProvider IIODataProvider JDKRasterDataProvider JimiDataProvider MIGridDataProvider NWGridDataProvider TIFFDataProvider Jimi 库 mxjotherdp 其它数据提供方 (DataBindingDP, XY, Shape) miutil, micsys, mxj, mxjtabdp DataBindingDataProvider XYDataProvider ShapeDataProvider mxjloc 本地化的资源包 无 本地化的资源包 mxjbeans Visual Beans miutil, micsys, mxj, mxjloc 整个 beans 数据包 所有图标图像 mxjapps 应用程序 miutil, micsys, mxj, mxjbeans, mxjloc MapDefManager ConnectionsManager .properties 文件 mxjmanager MapXtreme Java Manager 客户端(旧的 EM 客户端) miutil, micsys, mxj, mxjbeans, mxjloc MapXtreme Java Manager 客户端 .properties 文件 预览 GIF mjmappletsup MapXtreme Java Manager 特定属性文件 无 AddLayerWizard.properties (已翻译为每种支持的语言) mxjjsptags JSP 定制标记 miutil, micsys, mxj, mxjloc 标记实用程序 MapXtreme Java Edition 标记 MXJ JAR 说明 附属内容288 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 mxjdevsup 开发人员支持实用程序 miutil, micsys, mxj, mxjloc devsupport 数据包 mxjdtds DTD 文件 无 所有 MapXtreme Java Edition DTD mxjclientsamples 客户端示例 miutil, micsys, mxj, mxjdevsup examples/client/**/*.class mxjserversamples 服务器端示例 miutil, micsys, mxj, mxjdevsup examples/server/java/*servlet/**/ *.class mmjjsptags MapMarker Java JSP 定制标记 mxjjsptags MapMarkerJServer Client mxjloc 标记实用程序 MMJ 标记 rjsjsptags Routing J 服务器 JSP 定制标记 mmjjsptags mxjjsptags RoutingJServerClient mxjloc 标记实用程序 RJS 标记 MXJ JAR 说明 附属内容坐标系的元素 本附录内容:  投影及其参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .290  投影基准面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .293  有关投影的详细信息. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305投影及其参数 290 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 投影及其参数 下表表示了每种投影所适用的参数,这些参数按其在 micsys.txt 文件的相关坐标系行中出现的顺序列出。 基准面 单位 原点,经度 原点,纬度 标准平行线 1 标准平行线 2 方位角 比例因子 东位移加值 北位移加值 范围 Albers 等面积圆锥 XXXX XX XX 等距方位 XXXX X Cassini-Soldner XXXX XX 圆柱等面积 XXX X 球面双像 X X X X XXX Eckert IV XXX Eckert VI XXX 等距圆锥 XXXX XX XX Gall XXX Hotine Oblique Mercator X X X X XXXX Lambert 等面积方位 XXXX X Lambert 等角圆锥 XXXX XX XX 经度 - 纬度 X Mercator XXX Miller XXX Mollweide XXX 新西兰地图网格 XXXX XX 多圆锥 XXXX XX 区域 Mercator XXX XX Robinson XXX 正弦曲线 XXX 球面 X X X X XXX附录 B:坐标系的元素 开发人员指南 291 © 2006 MapInfo Corporation. 保留所有权利。 MapInfo 对所有原点纬度均支持“等距方位”和“Lambert 等面积方位”投影。此前仅支持只用于极 面的投影。 “区域 Mercator”投影支持标准平行线 1 和 2,从而可以更加精确地查看您所感兴趣的区域。请参 阅第 303 页的标准平行线(圆锥投影)。 投影 投影是坐标系使用的一个或一组等式。下表列出了 MapInfo 所使用的投影的名称以及用来在 micsys.txt 文件中标识投影的编号:该列表按受支持坐标的常用程度排序,以灰色突出显示。 Swiss Oblique Mercator XXXX XX 横轴 Mercator X X X X XXX 基准面 单位 原点,经度 原点,纬度 标准平行线 1 标准平行线 2 方位角 比例因子 东位移加值 北位移加值 范围 编号 投影 31 球面双像 30 Cassini-Soldner 29 Lambert 等面积方位(全部原点纬度) 28 等距方位(全部原点纬度) 27 多圆锥 26 区域 Mercator(标准平行线 1 和 2) 25 Swiss Oblique Mercator 24 横轴 Mercator(绘制 Finnish KKJ 时做了改良) 23 横轴 Mercator(绘制丹麦坐标系 34/45 博恩荷姆时做了改良) 22 横轴 Mercator(绘制丹麦坐标系 34 Jylland-Fyn 时做了改良) 21 横轴 Mercator(绘制丹麦坐标系 34 Jylland-Fyn 时做了改良) 20 球面 19 Lambert 等角圆锥(1972 年绘制比利时地图时做了改良) 18 新西兰地图网格投影及其参数 292 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 micsys.txt 中的投影编号可通过给上述投影表中列出的基本编号加上常数值来修改。有效值及其含义 列表如下: 17 Gall 16 正弦曲线 15 Eckert VI 14 Eckert IV 13 Mollweide 12 Robinson 11 Miller 圆柱 10 Mercator 9 Albers 等面积圆锥 8 横轴 Mercator(即 Gauss-Kruger) 7 Hotine Oblique Mercator 6 等距圆锥,即简单圆锥 5 等距方位(只用于极面) 4 Lambert 等面积方位(只用于极面) 3 Lambert 等角圆锥 2 圆柱等面积 1 经度 / 纬度 编号 投影 常数 含义参数 1000 系统具有仿射转换 仿射单位变量和系数在系统的正则参数之后 出现。 2000 系统具有显式边界 边界在系统的正则参数之后出现。 3000 具有仿射和边界的系统 仿射参数遵循系统参数;边界遵循仿射参数。附录 B:坐标系的元素 开发人员指南 293 © 2006 MapInfo Corporation. 保留所有权利。 示例: 假设您想要使用基于“横轴 Mercator”投影的单一系统以及 NAD 1983 基准面。您可能会在 micsys.txt 文件中发现下面一行文字: "UTM Zone 1 (NAD 83)", 8, 74, 7, -177, 0, 0.9996, 500000, 0 现在,假设系统基于这个投影,但具有使用以下参数指定的仿射转换:Units=meters; A=0.5; B=-0.866; C=0; D=0.866; E=0.5; and F=0。则 micsys.txt 文件中所需的一行文字为: "UTM Zone 1 (NAD 83) - rotated 60 degrees", 1008, 74, 7, -177, 0, 0.9996, 500000, 0, 7, 0.5, -0.866, 0, 0.866, 0.5, 0 此外,若要将系统的边界设置为 (x1, y1, x2, y2)=(-500000, 0, 500000, 1000000),所需的一行文字为: "UTM Zone 1 (NAD 83) - bounded", 2008, 74, 7, -177, 0, 0.9996, 500000, 0, -500000, 0, 500000, 1000000 使用这两种修改方法自定义系统,该行文字为: "UTM Zone 1 (NAD 83) - rotated and bounded", 3008, 74, 7, -177, 0, 0.9996, 500000, 0, 7, 0.5, -0.866, 0, 0.866, 0.5, 0, -500000, 0, 500000, 1000000 投影基准面 基准面是通过为地球上的特殊点键入基准椭圆来建立的。下表列出了每个基准面的相关细节: • 在 micsys.txt 文件中用于确定基准面的数字编号。 • 基准面的名称 • 基准面通常使用的地图 • 基准面的基准椭圆 编号 基准面面积地图 椭圆体 1 Adindan Ethiopia, Mali, Senegal, Sudan Clarke 1880 2 Afgooye Somalia Krassovsky 1007 AGD 66, 7 parameter Australia, A.C.T. Australian National 1008 AGD 66, 7 parameter Australia, Tasmania Australian National 1009 AGD 66, 7 parameter Australia, Victoria/ NSW Australian National 1006 AGD 84, 7 parameter Australia Australian National 3 Ain el Abd 1970 Bahrain Island 国际通用投影基准面 294 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 118 American Samoa American Samoa Islands Clarke 1866 4 Anna 1 Astro 1965 Cocos Islands Australian National 119 Antigua Island Astro 1943 Antigua, Leeward Islands Clarke 1880 5 Arc 1950 Botswana, Lesotho, Malawi, Swaziland, Zaire, Zambia, Zimbabwe Clarke 1880 6 Arc 1960 Kenya, Tanzania Clarke 1880 7 Ascension Island 1958 Ascension Island 国际通用 9 Astro B4 Sorol Atoll Tern Island 国际通用 8 Astro Beacon “E” Iwo Jima Island 国际通用 10 Astro DOS 71/4 St. Helena Island 国际通用 11 Astronomic Station 1952 Marcus Island 国际通用 151 ATS77 (Average Terrestrial System 1977) Canada ATS77 12 Australian Geodetic 1966 (AGD 66) Australia and Tasmania Island Australian National 13 Australian Geodetic 1984 (AGD 84) Australia and Tasmania Island Australian National 151 Average Terrestrial System 1977 (ATS77) 120 Ayabelle Lighthouse Djibouti Clarke 1880 110 Belgium Belgium 国际通用 14 Bellevue (IGN) Efate and Erromango Islands 国际通用 15 Bermuda 1957 Bermuda Islands Clarke 1866 16 Bogota Observatory Colombia 国际通用 121 Bukit Rimpah Bangka and Belitung Islands (Indonesia) Bessel 1841 编号 基准面面积地图 椭圆体附录 B:坐标系的元素 开发人员指南 295 © 2006 MapInfo Corporation. 保留所有权利。 17 Campo Inchauspe Argentina 国际通用 18 Canton Astro 1966 Phoenix Islands 国际通用 19 Cape South Africa Clarke 1880 20 Cape Canaveral Florida and Bahama Islands Clarke 1866 1005 Cape, 7 parameter South Africa WGS 84 21 Carthage Tunisia Clarke 1880 22 Chatham 1971 Chatham Island (New Zealand) 国际通用 23 Chua Astro Paraguay 国际通用 122 Co-Ordinate System 1937 of Estonia Estonia Bessel 1841 24 Corrego Alegre Brazil 国际通用 123 Dabola Guinea Clarke 1880 124 Deception Island Deception Island, Antarctica Clarke 1880 1000 Deutsches Hauptdreicksnetz (DHDN) Germany Bessel 25 Djakarta (Batavia) Sumatra Island (Indonesia) Bessel 1841 26 DOS 1968 Gizo Island (New Georgia Islands) 国际通用 27 Easter Island 1967 Easter Island 国际通用 115 EUREF 89 Europe GRS 80 28 European 1950 (ED 50) Austria, Belgium, Denmark, Finland, France, Germany, Gibraltar, Greece, Italy, Luxembourg, Netherlands, Norway, Portugal, Spain, Sweden, Switzerland 国际通用 编号 基准面面积地图 椭圆体投影基准面 296 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 29 European 1979 (ED 79) Austria, Finland, Netherlands, Norway, Spain, Sweden, Switzerland 国际通用 108 European 1987 (ED 87) Europe 国际通用 125 Fort Thomas 1955 Nevis, St. Kitts, Leeward Islands Clarke 1880 30 Gandajika Base Republic of Maldives 国际通用 116 GDA 94 Australia GRS 80 32 Geodetic Reference System 1967 (GRS 67) 全球 GRS 67 33 Geodetic Reference System 1980 (GRS 80) 全球 GRS 80 126 Graciosa Base SW 1948 Faial, Graciosa, Pico, Sao Jorge, and Terceira Islands (Azores) International 1924 34 Guam 1963 Guam Island Clarke 1866 35 GUX 1 Astro Guadalcanal Island 国际通用 150 Hartbeesthoek 94 South Africa WGS 84 127 Herat North Afghanistan International 1924 128 Hermannskogel Yugoslavia (Prior to 1990), Slovenia, Croatia, Bosnia and Herzegovina, Serbia Bessel 1841 36 Hito XVIII 1963 South Chile (near 53°S) 国际通用 37 Hjorsey 1955 Iceland 国际通用 38 Hong Kong 1963 Hong Kong 国际通用 1004 Hungarian Datum (HD 72) Hungary GRS 67 39 Hu-Tzu-Shan Taiwan 国际通用 40 Indian Thailand and Vietnam Everest (India 1830) 编号 基准面面积地图 椭圆体附录 B:坐标系的元素 开发人员指南 297 © 2006 MapInfo Corporation. 保留所有权利。 41 Indian Bangladesh, India, Nepal Everest (India 1830) 129 Indian Pakistan Everest (Pakistan) 130 Indian 1954 Thailand Everest (India 1830) 131 Indian 1960 Vietnam Everest (India 1830) 132 Indian 1975 Thailand Everest (India 1830) 133 Indonesian 1974 Indonesia Indonesian 1974 42 Ireland 1965 Ireland Modified Airy 134 ISTS 061 Astro 1968 South Georgia Island International 1924 43 ISTS 073 Astro 1969 Diego Garcia 国际通用 1015 Japanese Geodetic Datum 2000 (JGD2000) Japan Bessel 44 Johnston Island 1961 Johnston Island 国际通用 45 Kandawala Sri Lanka Everest (India 1830) 46 Kerguelen Island Kerguelen Island 国际通用 47 Kertau 1948 West Malaysia and Singapore Everest (W. Malaysia and Singapore 1948) 1016 KKJ Finnish Finland 国际通用 135 Kusaie Astro 1951 Caroline Islands, Federated States of Micronesia International 1924 48 L.C. 5 Astro Cayman Brac Island Clarke 1866 136 Leigon Ghana Clarke 1880 49 Liberia 1964 Liberia Clarke 1880 113 Lisboa (DLx) Portugal 国际通用 50 Luzon Philippines (excluding Mindanao Island) Clarke 1866 51 Luzon Mindanao Island Clarke 1866 52 Mahe 1971 Mahe Island Clarke 1880 编号 基准面面积地图 椭圆体投影基准面 298 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 53 Marco Astro Salvage Islands 国际通用 54 Massawa Eritrea (Ethiopia) Bessel 1841 114 Melrica 1973 (D73) Portugal 国际通用 55 Merchich Morocco Clarke 1880 56 Midway Astro 1961 Midway Island 国际通用 57 Minna Nigeria Clarke 1880 137 Montserrat Island Astro 1958 Montserrat, Leeward Islands Clarke 1880 138 M’Poraloko Gabon Clarke 1880 58 Nahrwan Masirah Island (Oman) Clarke 1880 59 Nahrwan United Arab Emirates Clarke 1880 60 Nahrwan Saudi Arabia Clarke 1880 61 Naparima, BWI Trinidad and Tobago 国际通用 109 Netherlands Netherlands Bessel 31 New Zealand Geodetic Datum 1949 (NZGD 49) New Zealand 国际通用 62 North American 1927 (NAD 27) Continental US Clarke 1866 63 North American 1927 (NAD 27) Alaska Clarke 1866 64 North American 1927 (NAD 27) Bahamas (excluding San Salvador Island) Clarke 1866 65 North American 1927 (NAD 27) San Salvador Island Clarke 1866 66 North American 1927 (NAD 27) Canada (including Newfoundland Island) Clarke 1866 67 North American 1927 (NAD 27) Canal Zone Clarke 1866 编号 基准面面积地图 椭圆体附录 B:坐标系的元素 开发人员指南 299 © 2006 MapInfo Corporation. 保留所有权利。 68 North American 1927 (NAD 27) Caribbean (Turks and Caicos Islands) Clarke 1866 69 North American 1927 (NAD 27) Central America (Belize, Costa Rica, El Salvador, Guatemala, Honduras, Nicaragua) Clarke 1866 70 North American 1927 (NAD 27) Cuba Clarke 1866 71 North American 1927 (NAD 27) Greenland (Hayes Peninsula) Clarke 1866 72 North American 1927 (NAD 27) Mexico Clarke 1866 73 North American 1927 (NAD 27) Michigan (used only for State Plane Coordinate System 1927) Modified Clarke 1866 74 North American 1983 (NAD 83) Alaska, Canada, Central America, Continental US, Mexico GRS 80 139 North Sahara 1959 Algeria Clarke 1880 107 Nouvelle Triangulation Francaise (NTF) Greenwich Prime Meridian France Modified Clarke 1880 1002 Nouvelle Triangulation Francaise (NTF) Paris Prime Meridian France Modified Clarke 1880 111 NWGL 10 全球 WGS 72 117 NZGD 2000 New Zealand GRS 80 1010 NZGD 49, 7 parameter New Zealand 国际通用 75 Observatorio 1966 Corvo and Flores Islands (Azores) 国际通用 编号 基准面面积地图 椭圆体投影基准面 300 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 140 Observatorio Meteorologico 1939 Corvo and Flores Islands (Azores) International 1924 76 Old Egyptian Egypt Helmert 1906 77 Old Hawaiian Hawaii Clarke 1866 78 Oman Oman Clarke 1880 79 Ordnance Survey of Great Britain 1936 England, Isle of Man, Scotland, Shetland Islands, Wales Airy 80 Pico de las Nieves Canary Islands 国际通用 81 Pitcairn Astro 1967 Pitcairn Island 国际通用 141 Point 58 Burkina Faso and Niger Clarke 1880 142 Pointe Noire 1948 Congo Clarke 1880 143 Porto Santo 1936 Porto Santo and Madeiras Islands International 1924 1000 Potsdam Germany Bessel 82 Provisional South American 1956 Bolivia, Chile, Colombia, Ecuador, Guyana, Peru, Venezuela 国际通用 36 Provisional South Chilean 1963 South Chile (near 53°S) 国际通用 83 Puerto Rico Puerto Rico and Virgin Islands Clarke 1866 1001 Pulkovo 1942 Germany Krassovsky 1012 PZ90 Russia PZ90 84 Qatar National Qatar 国际通用 85 Qornoq South Greenland 国际通用 1000 Rauenberg Germany Bessel 86 Reunion Mascarene Island 国际通用 编号 基准面面积地图 椭圆体附录 B:坐标系的元素 开发人员指南 301 © 2006 MapInfo Corporation. 保留所有权利。 112 Rikets Triangulering 1990 (RT 90) Sweden Bessel 1011 Rikets Triangulering 1990 (RT 90), 7 parameter Sweden Bessel 87 Rome 1940 Sardinia Island 国际通用 88 Santo (DOS) Espirito Santo Island 国际通用 89 São Braz São Miguel, Santa Maria Islands (Azores) 国际通用 90 Sapper Hill 1943 East Falkland Island 国际通用 91 Schwarzeck Namibia Modified Bessel 1841 144 Selvagem Grande 1938 Salvage Islands International 1924 145 Sierra Leone 1960 Sierra Leone Clarke 1880 146 S-JTSK Czech Republic Bessel 1841 1013 SK42 Russia PZ90 1024 SK95 Russia PZ90 92 South American 1969 Argentina, Bolivia, Brazil, Chile, Colombia, Ecuador, Guyana, Paraguay, Peru, Venezuela, Trinidad 和 Tobago South American 1969 93 South Asia Singapore Modified Fischer 1960 94 Southeast Base Porto Santo and Madeira Islands 国际通用 95 Southwest Base Faial, Graciosa, Pico, Sao Jorge, Terceira Islands (Azores) 国际通用 1003 Switzerland (CH 1903) Switzerland Bessel 147 Tananarive Observatory 1925 Madagascar International 1924 编号 基准面面积地图 椭圆体投影基准面 302 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 单位 下表列出了可用的坐标单位和用于标识 micsys.txt 文件中单位的编号: 96 Timbalai 1948 Brunei and East Malaysia (Sarawak and Sabah) Everest (India 1830) 97 Tokyo Japan, Korea, Okinawa Bessel 1841 1015 Tokyo97 Japan Bessel 1841 98 Tristan Astro 1968 Tristan da Cunha 国际通用 99 Viti Levu 1916 Viti Levu Island (Fiji Islands) Clarke 1880 148 Voirol 1874 Tunisia/Algeria Clarke 1880 149 Voirol 1960 Algeria Clarke 1880 100 Wake-Eniwetok 1960 Marshall Islands Hough 101 World Geodetic System 1960 (WGS 60) 全球 WGS 60 102 World Geodetic System 1966 (WGS 66) 全球 WGS 66 103 World Geodetic System 1972 (WGS 72) 全球 WGS 72 104 World Geodetic System 1984 (WGS 84) 全球 WGS 84 105 Yacare Uruguay 国际通用 106 Zanderij Surinam 国际通用 编号 基准面面积地图 椭圆体 编号 单位 6 厘米 31 测链 3 英尺(也称为国际通用英尺)* 2 英寸附录 B:坐标系的元素 开发人员指南 303 © 2006 MapInfo Corporation. 保留所有权利。 坐标系原点 原点是按经度和纬度指定的点,所有坐标都参考该点的坐标。选择该点来优化特殊坐标系的精确 性。当我们从原点向北移动时 Y 增加。向东移动时 X 增加。这些坐标值通常称为北位移和东位移。 对于横轴 Mercator 投影,原点的经度定义中央子午线。构建横轴 Mercator 投影时,圆柱和地球相 切。中央子午线即为切线。投影地图的刻度沿着中央子午线为正值。 创建 Hotine Oblique Mercator 投影时,需要指定一个既不是赤道也不是子午线的大圆。MapInfo 通 过指定椭圆体上的一点和从此点的方位角来完成该操作。该点即为坐标系的原点。 标准平行线(圆锥投影) 在圆锥投影中,圆锥贯穿地球并沿纬线的平行线与之相交。它们是标准平行线。一条指向投影区的 北部,另一条指向投影区的南部。使用同一标准平行线两次指定纬线。均以纬度来表示。 倾斜方位角 (Hotine Oblique Mercator) 指定一个大圆 (Hotine Oblique Mercator) 时可以使用点和方位角(圆弧),此方位角称为倾斜方位 角,用度来表示。 1 公里 30 令 7 米 0 英里 5 毫米 9 海里† 32 杆 8 美国测量尺(用于 1927 国家平面投影)‡ 4 码 * 一国际通用英尺精确等于 30.48 厘米。 † 一海里精确等于 1852 米。 ‡ 一美国测量尺精确等于 12/39.37 米,或约等于 30.48006 厘米。 编号 单位投影基准面 304 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 比例因子(横轴 Mercator) 将比例因子应用于圆柱坐标系以平均在减小沿东西边界的偏差时在地球中心区域的比例偏差。比例 因子可以使圆柱凹进地球,这样就会有两条相交线。沿这些相交线比例为正。 可以看到比例因子以比率表示,如 1:25000。这种情况下通常称为比例减少。比例因子和比例减少两 者之间的关系为: 比例因子 = 1 - 比例减少 这时比例因子即为 1-(1/25000) 或 0.99996。 北位移加值和东位移加值 不包含负数将会使坐标计算更容易些。为了在计算国家平面和通用横轴 Mercator 坐标时避免出现这 个问题,常用方法是为北位移和东位移增加测量偏移量。这些偏移量称为北位移加值和东位移加 值。均以纬度来表示。(坐标单位由单位参数指定。) 范围(正方位投影) 范围以度数来指定地球的可见部分。范围值可以在 1 和 180 之间。指定为 90 时会看到一个半球。指 定为 180 时您会看到整个地球,但是多数地方有很大扭曲。 多圆锥投影 以下描述摘自 John P. Snyder 所著的 USGS 1935 年专业文献 "Map Projections - A Working Manual"。 多圆锥投影(在欧洲通常称为美国多圆锥)之所以有这样的名称是因为地图上每条平行线的圆弧曲 率就如同沿着一个圆锥(以跟踪圆锥的平行线包裹切于纬线特殊平行线的地球)展开。因此,包括 了许多(“多重”)圆锥,而不是每个常规圆锥投影的单个圆锥。 多圆锥投影既不是等面积投影也不是等角投影。但是,沿着本初子午线,它不会扭曲并且会遵照实 际比例。每一条平行线均为实际比例,但是子午线被不同程度的拉长了,在平行线的正确位置穿过 每条平行线,因此从正形(或者等角)这方面来说,除了在本初子午线上以外没有标准的平行线。 在本初子午线附近,扭曲非常小。 该投影方法不适用于绘制大面积地图。所使用的转换算法在绘制经度范围比较大的地图时会有问 题。例如,MapInfo 公司地图绘制产品附带的样本数据 WORLD.TAB 如果使用多圆锥投影法可能会 显示畸形。附录 B:坐标系的元素 开发人员指南 305 © 2006 MapInfo Corporation. 保留所有权利。 有关投影的详细信息 下面列出的前三本出版物都是非常简短的小册子。后两本是内容翔实的书籍。我们还提供了美国测 量和地图绘制协会(小册子)以及美国地址调查局(书籍)的地址和电话号码。 美国地图制图学协会。Choosing a World Map — Attributes, Distortions, Classes, Aspects. Falls Church, VA: American Congress on Surveying and Mapping. Special Publication No. 2. 1988. 美国地图制图学协会。Matching the Map Projection the Need. Falls Church, VA: American Congress on Surveying and Mapping. Special Publication No. 3. 1991. 美国地图制图学协会。Which Map is Best? Projections for World Maps. Falls Church, VA: American Congress on Surveying and Mapping. Special Publication No. 1. 1986. John P. Snyder. Map Projections — Working Manual. Washington: U.S. Geological Survey Professional Paper 1395. 1987 John P. Snyder and Philip M. Voxland. An Album of Map Projections. Washington: U.S. Geological Survey Professional Paper 1453. 1989. 联系信息 位于 Boulder 的科罗拉多大学的地理学系创办了一个叫 "The Geographer's Craft" 的网站项目,致力于 提供地图投影、大地基准面和坐标系方面的说明。尤其是它的许多说明使用了 MapInfo Professional 进行表述。 这些资料可供学习、研究和教育所用。若您链接或引用下列资料,请注明下面关于作者的信息: Peter H. Dana, The Geographer's Craft Project, Department of Geography, The University of Colorado at Boulder. 有关大地基准面的信息和说明,请转到: http://www.colorado.edu/geography/gcraft/notes/datum/datum.html 有关坐标系和相关主题的信息,请转到: http://www.colorado.edu/geography/gcraft/notes/coordsys/coordsys.html 有关地图投影的信息,请转到: http://www.colorado.edu/geography/gcraft/notes/mapproj/mapproj.html有关投影的详细信息 306 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 定制 JSP 标记库 本附录提供了定制 JSP 标记的列表,并且说明了如何自行创建定制标记并将其 展示在 MapXtreme Java Manager 的 Web 应用程序构建器中。 本附录内容:  定制 JSP 标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308  创建定制 JSP 标记. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .317  创建添加 TAB 图层标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .319  向 Web 应用程序向导添加定制标记. . . . . . . . . . . . . . . . . . . . . . . . .321定制 JSP 标记 308 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 定制 JSP 标记 以下是可用于 MapXtreme Java 的定制 JSP 标记。 元素 说明 父级 JSP 语法 mapapp MapInfo 所有 JSP 定制标记 的根标记。定义所有生成的 图像的应用程序名称和 mime 类型。 web.xml 中 RequestHandler servlet 的名称应该和 mapinfo:mapapp 标记中指定的 appname 相同。 toolbar 工具栏工具的根标记。 mapapp tool 工具栏的一般工具。 toolbar cancel 显示用于关闭当前浏览器窗 口的 HTML 按钮。如果提供 了 src,该按钮将输出为 图像。 mapapp map 显示地图。 mapapp resizableMap 显示可以重新调整大小的地 图。要令地图大小可以调整, 此标记不能嵌入到表中。有关 详细信息,请参阅 Javadoc 中的 MapTag。 mapapp printPreviewMap 显示其大小由标记属性确定 的地图。此地图只能用于显 示。平移、缩放等功能将不 能和此标记一起正常工作。 有关示例请参阅 printpreview.jsp。 mapapp 附录 C:定制 JSP 标记库 开发人员指南 309 © 2006 MapInfo Corporation. 保留所有权利。 layercontrol 用于图层控制的根标记。定 义图层控制是否在和地图相 同的页面上。有关示例请参 阅 layercontroldialog.jsp。 mapapp layerlist 可见于各个图层和 MapJ 中 的 ThemeList。定义在图层 控制中要输出的主题。 layercontrol visible 输出 HTML 复选框,用于更 改当前图层的可见性。 layerlist label 输出 HTML 复选框,用于更 改当前图层的自动标注。 layerlist select 输出 HTML 复选框,用于更 改当前图层的可选性。 layerlist layerIndex 输出当前图层的索引,如果 当前图层是专题则不输出。 layerlist layername 输出图层名称或专题名称。 layerlist displayOptionsTool 输出一个工具,用于打开更改 当前图层显示选项的对话框。 如果包含值,则输出 HTML 按 钮,否则输出图像。 layerlist 元素 说明 父级 JSP 语法定制 JSP 标记 310 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 labelOptionsTool 输出一个工具,用于打开更改 当前图层标注选项的对话框。 如果包含值,则输出 HTML 按 钮,否则输出图像。 layerlist fontOptionsTool 输出一个工具,用于打开更改 当前图层字体选项的对话框。 如果包含值,则输出 HTML 按 钮,否则输出图像。 layerlist removeLayer 输出用于删除当前图层或专 题的按钮。 layerlist layercontroltool 输出用于打开图层控制对话 框的工具栏工具。 toolbar zoomin 输出用于放大地图的工具栏 工具。 toolbar zoomout 输出用于缩小地图的工具栏 工具。 toolbar recenter 输出用于重定地图中心的工 具栏工具。 toolbar infotool 输出一个工具栏,用于在某 点执行搜索并显示每个图层 在该点的有关信息。 toolbar info 可见于每个图层的标记,为 每个图层设置 FeatureSet。 有关示例请参阅 infodialog.jsp。 mapapp selectiontool 输出用于选择地图对象的工 具栏工具。 toolbar 元素 说明 父级 JSP 语法附录 C:定制 JSP 标记库 开发人员指南 311 © 2006 MapInfo Corporation. 保留所有权利。 unselecttool 输出用于取消选择所有地图 对象的工具栏工具。 toolbar selectioninfotool 输出一个工具栏工具,用于 打开显示所选图元属性数据 的对话框。 toolbar selectionInfo 可见于每个图层的标记,为 每个可选图层设置 FeatureSet。有关示例请参阅 selectioninfodialog.jsp。 mapapp opentool 输出用于打开对话框的工具 栏工具,在该对话框中可以 选择是要打开 MDF 还是 geoset。 toolbar open 输出 HTML 选择框,列出给 定目录中的 MDF 和 geoset。有关示例请参阅 opendialog.jsp。 mapapp savetool 输出一个工具栏工具,用于 打开保存 MDF 的对话框。 toolbar save 输出一个 HTML 文本框,用 于输入要保存的 MDF 的文件 名。有关示例请参阅 savedialog.jsp。 mapapp displayOptions 用于显示选项标记的根标记。 定 义 此标记是否 在对话 框 中。有关示例请参阅 displayoptionsdialog.jsp。 mapapp displayZoomRange 输出一个 HTML 复选框,用 于更改当前的图层是否显示 在缩放范围之内。 displayOptions displayMinZoom 输出一个 HTML 文本框,用 于更改当前图层的最小缩放 范围。 displayOptions 元素 说明 父级 JSP 语法定制 JSP 标记 312 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 displayMaxZoom 输出一个 HTML 文本框,用 于更改当前图层的最大缩放 范围。 displayOptions labelOptions 用于标注选项标记的根标记。 定义此标记是否在对话框中。 有关示例请参阅 labeloptionsdialog.jsp。 mapapp labelZoomRange 输出一个 HTML 复选框,用 于更改当前图层的标注是否 显示在缩放范围之内。 labelOptions labelMinZoom 输出一个 HTML 文本框,用 于更改标注的最小缩放范围。 labelOptions labelMaxZoom 输出一个 HTML 文本框,用 于更改标注的最大缩放范围。 lableOptions labelColumns 输出一个选择框,用于选择 将哪一列用于标注。 labelOptions labelDuplicates 输出一个复选框,用于更改 是否显示重复的标注。 labelOptions labelOverlapping 输出一个复选框,用于更改 是否输出重叠的标注。 labelOptions fontOptions 用于字体选项标记的根标记。 定义此标记是否在对话框中。 有关示例请参阅 fontoptionsdialog.jsp。 mapapp fontList 输出一个带有系统所有可用 字体的选择框。 fontOptions fontSize 输出一个 HTML 文本框,用 于更改标注的字体大小。 fontOptions fontColor 输出一个选择框,用于选择 标注的颜色。 fontOptions fontHaloColor 输出一个选择框,用于选择 晕环颜色。 fontOptions fontBold 输出一个复选框,用于更改 标注是否为粗体。 fontOptions 元素 说明 父级 JSP 语法附录 C:定制 JSP 标记库 开发人员指南 313 © 2006 MapInfo Corporation. 保留所有权利。 fontItalic 输出一个复选框,用于更改 标注是否为粗体。 fontOptions fontUnderline 输出一个复选框,用于更改 是否为标注加上下划线。 fontOptions thematic 用于专题向导的根标记。定 义此标记是否在对话框中。 如果提供图层,那么系统将 不提示用户选择图层。如果 提供了图层和列,则用户将 只能更改范围专题选项。有 关示例请参阅 thematicdialog.jsp。 mapapp themelayer 如果没有选择图层,将对此 标记的内容求值。 thematic themecolumn 如果没有选择列,将对此标 记的内容求值。 thematic themeoptions 如果已经选择图层和列,且 列为数字,那么将对此标记 的内容求值。 thematic themeStartColor 输出一个选择框,用于选择 起始颜色。 themeoptions themeEndColor 输出一个选择框,用于选择 结束颜色。 themeoptions themeDistribution Type 输出一个选择框,用于选择 范围专题的分布方法。 themeoptions themeBreaks 输出一个文本框,用于选择将 多少个分点值用于范围专题。 themeoptions themeLayerList 输出一个选择框,用于选择 执行专题所在的图层。 themelayer themeColumnList 输出一个选择框,用于选择 执行专题所在的列。 themecolumn themetool 输出一个用于打开专题对话 框的工具栏工具。 toolbar 元素 说明 父级 JSP 语法定制 JSP 标记 314 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 legendtool 输出一个用于打开图例对话 框的工具栏工具。 toolbar legendlist 可见于各个图层和专题, 并为输出图例的 legendelement 设置脚本 变量。有关示例请参阅 legenddialog.jsp。 mapapp legendelement 输出图例。 legendlist legend 输出给定图层和专题的图例。 可指定图层和专题的索引或 名称。 mapapp printpreviewtool 输出一个工具栏工具,用于 打开打印预览对话框。 toolbar tableinfo 可见于给定图层的所有记录。 如果未指定图层,则将在入局 请求中查找该图层。行数指定 每次显示的记录数量。 mapapp rowNum 输出当前行号。 tableinfo 元素 说明 父级 JSP 语法附录 C:定制 JSP 标记库 开发人员指南 315 © 2006 MapInfo Corporation. 保留所有权利。 tableColumns 可见于给定图层的列。如果 忽略图层,则将在 tableinfo 标记中查找该图层。 mapapp 或 tableinfo columnValue 输出当前记录和列的值。 tableColumns 和 tableinfo columnName 输出当前列的名称。 tableColumns nextTableInfo 输出按钮,用于转至下一组 记录。 mapapp zoomNumeric 地图显示标记的根标记。定 义此标记是否在对话框中。 有关示例请参阅 mapdisplaydialog.jsp。 mapapp zoomRange 输出地图的当前缩放范围。 如果 readOnly 设置为 false, 则将输出文本框。将四舍五 入设置为 10 的因数,确定如 何对值进行舍入。忽略表示 不对数字进行舍入。 zoomNumeric distanceUnits 输出用于当前地图距离的 单位。 zoomNumeric centerX 输出地图中心的 x 坐标。如 果 readOnly 设置为 false, 则将输出文本框。将四舍五 入设置为 10 的因数,确定如 何对值进行舍入。忽略表示 不对数字进行舍入。 zoomNumeric centerY 输出地图中心的 y 坐标。如 果 readOnly 设置为 false, 则将输出文本框。将四舍五 入设置为 10 的因数,确定如 何对值进行舍入。忽略表示 不对数字进行舍入。 zoomNumeric 元素 说明 父级 JSP 语法定制 JSP 标记 316 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 zoomnumerictool 输出一个工具栏工具,用于 打开缩放数值对话框。 toolbar viewEnirelayer 用于查看整个图层标记的根 标记。定义此标记是否在对 话框中。有关示例请参阅 viewentirelayerdialog.jsp。 mapapp viewEntireLayerList 输出一个选择框,用于选择 要缩放到的图层。 viewEntireLayer viewentirelayertool 输出一个工具栏工具,用于 打开查看整个图层对话框。 toolbar overviewmap 输出当前地图的概览。 mapapp projection 投影标记的根标记 定义此标 记是否在对话框中。有关示 例请参阅 projectiondialog.jsp。 mapapp projectionCategories 输出一个选择框,列出所有 投影种类。 projection projectionMembers 输出一个选择框,列出当前 种类的所有投影。 projection changeProjection 将某个投影更改为所选投影。 projection 元素 说明 父级 JSP 语法附录 C:定制 JSP 标记库 开发人员指南 317 © 2006 MapInfo Corporation. 保留所有权利。 创建定制 JSP 标记 MapXtreme Java 利用 Java 服务器页技术快速开发和部署 Web 应用程序。我们在此提供了定制 JSP 标记库,使用文本编辑器或 IDE 即可将其插入到 .JSP 文件中。 这些标记在 MapXtreme Java Manager 的 Web 应用程序构建器中显示为窗口部件,在该构建器中可 以选择所需元素,并将其添加到要另存为 .JSP 文件的布局框中。在运行时,.JSP 将与执行应用程序 业务逻辑的 servlet 通信。如果有必要更改应用程序的显示,可在 Web 应用程序构建器中轻松重排、 添加或删除窗口部件,创建新的 .JSP,而不会影响到 servlet 的内容生成操作。 这些定制标记设计可用于 MVC(模型/视图/控制器)JSP-servlet 体系架构。所生成的 .JSP(视图) 包含表单,相应表单将提交到一般 servlet(控制器)。控制器 servlet 重定向至执行创建专题、执行 半径搜索等必要业务逻辑的适当 Java Bean(模型),然后将相应请求转发回 .JSP 文件,由该文件 显示更新的地图。 projectiontool 输出一个工具栏工具,用于 打开投影对话框。 toolbar featureSet 可见于给定 FeatureSet 的所 有图元。 mapapp feature 可见于给定图元的所有属性。 featureSet 或 mapapp featureName 输出当前属性的名称。 feature featureValue 输出当前属性的值。 feature svgmap 渲染 SVG 文档。 (SVGMapBean 类必须位于 Requesthandler 列表中。) mapapp visible 如果已经加载图层但是图层 为关闭,则无需发出服务器 请求。 layername highlight 调用 onmouseover 事件,用 于更改颜色并向该项目添加 下落阴影。 layername 元素 说明 父级 JSP 语法创建定制 JSP 标记 318 MapXtreme Java v4.8 © 2006 MapInfo Corporation. 保留所有权利。 视图 取决于所需的标记功能,在此提供了若干基类。所有这些类的根类均为 MITag。这一抽象类实现 JSP 规范中定义的 javax.servlets.jsp.tagext.Tag 接口。此外还提供了实用程序方法,用于获取 ServerProperties 和 MappingSession 对象并执行某些公共任务。 模型 模型类基于用户从定制标记的输入来执行预期的业务逻辑。每个模型类的侧重都应该非常明确。例 如,MapXtreme 提供了一个 bean 类用于放大 (com.mapinfo.jsptags.mapxtreme.ZoomInToolBean), 提供了另一个类用于缩小 (com.mapinfo.jsptags.mapxtreme.ZoomOutToolBean)。尽管存在将两者合 并到一个缩放 bean 中的可能,但我们还是选择了分别提供,以便实现更加优良的模块化设计。 要创建模型类,只需实现 com.mapinfo.jsptags.TagBean 接口即可。实现方法有三种。第一, getParameterKey 应该只返回表示该类的唯一字符串。这将允许 RequestHandler servlet 正确确定用 于给定请求的 TagBean 类。第二是 setServerProperties。此方法允许用户获取有关给定应用程序的 各种服务器设置的引用。尽管此方法可以多次调用(如服务器设置在应用程序运行期间更改),但是 请务必确保在任何客户机请求之前进行调用。最后是实现进程。此方法应该执行必要的业务逻辑。提 供 MappingSession、HttpServletRequest 和 HttpServletResponse 作为调用参数。该方法的返回值将 表示在处理方法返回之后,如何处理 RequestHandler servlet。返回 true 将导致 RequestHandler servlet 执行任意清空和返回。返回值为 false 导致 RequestHandler servlet 将用户重定向到 JSP 或 HTML 页。 在完成之后,必须将 TagBean 类注册到 RequestHandler servlet。只需将完全合格的类名添加到 Beans 初始化参数即可。 控制器 作为自定义标记的作者,无需编写任何 servlet。RequestHandler servlet 将接受入局请求,创建适当 的 MappingSession 对象,将控制传递给 TagBean 类用于处理,且可选将客户机重定向到新视图。 为执行这些任务,RequestHandler servlet 将查找特定的 HTML 参数。这些参数通常以隐含表单字段 传递,并可被添加到 URL。下表对这些参数作出了说明: 名称 必需说明 appname 是 这是用于应用程序的唯一名称。可作为 mapapp 标记属性 覆盖。 注: 该名称存储为名为 APP_NAME_PARAMETER 的 MappingSession 类的常量。 mapinfobean 是应该处理入局请求的 TagBean 类的名称。该值应该匹配预 期类的 getParameterKey 方法返回的值。 注: 该名称存储为名为 PARAMETER_KEY_NAME 的 TagBean 类的常量。附录 C:定制 JSP 标记库 开发人员指南 319 © 2006 MapInfo Corporation. 保留所有权利。 此外,还提供了实用程序方法来帮助用户构建必要的语法,在视图和模型之间传递参数值。对于 TagBeans 的自助重定向控制(从进程返回 true),可使用 RequestHandler servlet 上的 getEncodedURL 方法之一。扩展 MITag 类之一的定制标记具有若干种获取必需参数的方法。对于 HTML 表单,可使用 getRequiredFieldsAsHTML 方法。此方法将返回包含隐含 HTML 表单字段的字符串,该字段包含了必要 的参数。对于要处理源自 URL(如 href 标记)的请求的情况,可使用 getRequiredFieldsAsQueryString 方法。 创建添加 TAB 图层标记 本节说明使用定制标记扩展 JSP 库的必要步骤。在示例中,将创建添加 TAB 图层标记。这将允许用 户向 MapJ 添加 TAB 图层。本示例的源代码随 MapXtreme Java 的安装提供。 对于此特性,我们希望为用户提供 tab 文件列表和新图层的位置,在该列表中可选择要添加到 MapJ 的文件。JSP 作者将确定相应的目录。这需要三个标记。 视图 首先,创建一个生成 HTML 组合框的标记。此类将扩展 MITag 并实现 doStartTag()。此方法将获取 给定目录中的文件列表,并为每个具有 .tab 文件扩展名的文件输出

pdf贡献者

cyechina

贡献于2015-11-18

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