SuperMap Objects 初级开发教程

Similar documents
Visual Basic D 3D

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

INTRODUCTION TO COM.DOC

概述

基于ECO的UML模型驱动的数据库应用开发1.doc

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

用户大会 论文集2.2.doc

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

epub83-1

穨文件1

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

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

ActiveX Control

TwinCAT 1. TwinCAT TwinCAT PLC PLC IEC TwinCAT TwinCAT Masc

untitled

PowerPoint Presentation

手册 doc

TC35短信发送程序设计

VB控件教程大全

Microsoft PowerPoint - VB14.ppt

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

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

untitled

VB程序设计教程

Chapter 16 集合

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

RunPC2_.doc

untitled

untitled

ThreeDtunnel.doc

专注于做最好的嵌入式计算机系统供应商

Microsoft PowerPoint - OPVB1基本VB.ppt

untitled

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

培训提纲

SuperMap Objects 中级开发教程

RUN_PC連載_10_.doc

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

untitled

IsPostBack 2

概述

VC访问VB的ActiveX.dll.doc

mvc

FY.DOC

MVB-1001.DOC

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

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

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

untitled

多層次傳銷與獎金系統

Microsoft Word - 01.DOC

投影片 1

bingdian001.com

Microsoft Word - CIN-DLL.doc

游戏厅捕鱼技巧_天天酷跑游戏技巧 2048游戏技巧,游戏厅打鱼技巧_

Outline USB Application Requirements Variable Definition Communications Code for VB Code for Keil C Practice

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

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

Microsoft Word - ch04三校.doc

第一章 章标题-F2 上空24,下空24

untitled

untitled

Microsoft Word - 苹果脚本跟我学.doc


Guava学习之Resources

四川省普通高等学校

提问袁小兵:

投影片 1

新版 明解C++入門編

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

untitled

InstallShield InstallShield InstallShield Windows Installer ISWI ISWI InstallShield InstallShield InstallShield Windows Installer WI In

Oracle数据库实验指导书

全国计算机技术与软件专业技术资格(水平)考试

0SQL SQL SQL SQL SQL 3 SQL DBMS Oracle DBMS DBMS DBMS DBMS RDBMS R DBMS 2 DBMS RDBMS R SQL SQL SQL SQL SELECT au_fname,au_ lname FROM authors ORDER BY

untitled

2

2/14 Buffer I12, /* x=2, buffer = I 1 2 */ Buffer I243, /* x=34, buffer = I 2 43 */ x=56, buffer = I243 Buffer I243I265 code_int(int x, char *buffer)

(HMI) IO A

untitled

untitled

Microsoft Word - Learn Objective-C.doc

untitled

上海市教育考试院关于印发新修订的

PowerPoint 演示文稿

目录 WinForms 版 ComponentOne SSRSDocumentSource... Error! Bookmark not defined. Winform 版 ComponentOne 工具组件帮助... 1 SSRSDocumentSource 快速入门... 1 在代码中设定网络

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

epub 94-3

投稿類別:電子工程類

Microsoft Office SharePoint Server MOSS Web SharePoint Web SharePoint 22 Web SharePoint Web Web SharePoint Web Web f Lists.asmx Web Web CAML f

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

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

ebook129-9

ebook

ebook140-9

範本檔

CDWA Mapping. 22 Dublin Core Mapping

Microsoft Word Visual_Basic程序设计上机实践教程正文.doc

Transcription:

SuperMap Objects 5 开发教程 ( 初级篇 ) 北京超图地理信息技术有限公司 2006 年 4 月 北京

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

目 录 第 1 章 前 言...1 1.1 入门教程能帮助你学会什么?...1 1.2 适用对象...1 1.3 涉及对象 ( 含控件 ) 和接口 ( 属性 事件 方法 )...1 1.4 使用数据...2 1.5 本书内容...2 第 2 章 VISUAL BASIC 6.0 开发入门...3 2.1 第一步 : 创建一个新工程 :MyFirstSuperMap...3 2.2 第二步 : 加入 SuperMap Objects 控件...3 2.3 第三步 : 打开地图 添加图层...6 2.4 第四步 : 地图浏览功能...8 2.5 第五步 : 地图到属性查询...9 2.6 第六步 : 属性到地图查询...10 第 3 章 DELPHI 7 开发入门...13 3.1 第一步 : 创建一个新工程 :MyFirstSuperMap...13 3.2 第二步 : 加入 SuperMap Objects 控件...13 3.3 第三步 : 打开地图 添加图层...14 3.4 第四步 : 地图浏览功能...16 3.5 第五步 : 地图到属性查询...18 3.6 第六步 : 属性到地图查询...19 第 4 章 VISUAL C++ 6.0 开发入门...23 4.1 第一步 : 创建 Visual C++ 6.0 工程 :MyFirstSuperMap...23 4.2 第二步 : 加载 SuperMap Objects 控件...24 4.3 第三步 : 打开地图 添加图层...29 4.4 第四步 : 地图浏览功能...34 4.5 第五步 : 地图到属性查询...36 4.6 第六步 : 属性到地图查询...37 第 5 章 VISUAL BASIC.NET 2003 开发入门...39 5.1 第一步 : 创建一个新工程 :MyFirstSuperMap...39 I

SuperMap Objects 初级开发教程 5.2 第二步 : 加入 SuperMap Objects 控件...39 5.3 第三步 : 打开地图 添加图层...41 5.4 第四步 : 地图浏览功能...43 5.5 第五步 : 地图到属性查询...45 5.6 第六步 : 属性到地图查询...47 第 6 章 VISUAL C#.NET 2003 开发入门...49 6.1 第一步 : 创建一个新工程 :MyFirstSuperMap...49 6.2 第二步 : 加载 SuperMap Objects 控件...49 6.3 第三步 : 打开地图 添加图层...51 6.4 第四步 : 地图浏览功能...54 6.5 第五步 : 地图到属性查询...56 6.6 第六步 : 属性到地图查询...57 第 7 章 附录...59 7.1 如何注册 SuperMap Objects 运行许可?...59 7.2 如何随您的应用系统分发 SuperMap Objects?...59 II

第 1 章前言 1.1 入门教程能帮助你学会什么? 本教程通过实现一个简单程序, 帮助您了解如何使用 SuperMap Objects 控件开发应用程序 阅读完本教程, 您应该能够回答如下问题 : 1. 如何把 SuperMap Objects 控件添加到工程中? 2. 如何使用 SuperWorkspace 控件打开 SuperMap 数据源? 3. 如何把数据源中的一个数据集添加到地图窗口 (SuperMap 控件 ) 中显示? 4. 如何实现基本的地图浏览功能, 比如 : 放大 缩小 漫游等? 5. 如何实现地图到属性的查询功能? 6. 如何实现属性到地图的查询功能? 同时, 您还能理解 : 1. 工作空间和数据源之间的关系 2. 数据源和数据集之间的关系 3. 数据集和图层之间的关系 1.2 适用对象 本书介绍了如何使用 SuperMap Objects COM 组件结合 Visual Basic 6.0 Visual C++ 6.0 Delphi Visual Basic.NET 2003 Visual C#.NET2003 五种语言简单地实现 GIS 基本功能的开发, 因此本书适合于具备上述任一种语言基础和初次接触 SuperMap Objects COM 组件进行开发的用户 1.3 涉及对象 ( 含控件 ) 和接口 ( 属性 事件 方法 ) 1

SuperMap Objects 初级开发教程 对象属性方法事件 SuperMap 控件 Action 属性 Selection 属性 Layers 属性 ViewEntire 方法 Connect 方法 Refresh 方法 Disconnect 方法 GeometrySelected 事件 SuperWorkspace 控件 Object 属性 ( 或 Handle 属性 ) OpenDataSource 方法 sodatasource 对象 sodatasets 对象 Count 属性 Item 属性 sodatasetvector 对象 Query 方法 solayer 对象 AddDataset 方法 sorecordset 对象 FieldCount 属性 GetFieldInfo 方法 GetFieldValue 方 法 MoveFirst 方法 soselection 对象 ToRecordset 方法 FromRecordset 方法 1.4 使用数据 本程序演示用 SuperMap Objects 控件打开地图, 并对其进行基本操作和属性与地图之间的双向查询 所用的数据为世界地图 (World.sdb), 其中包括世界经纬网 (Grid) 各国首都 (Capital) 和世界地图 (World) 等多个地图图层, 打开时, 把所有图层加入到 SupeMap 中显示 世界地图 :World.sdb World.sdd 1.5 本书内容 本书是 SuperMap Objects 开发入门教程, 总共 7 章, 第 1 章前言介绍本书的内容和特点,2 到 6 章分别介绍使用不同的开发语言如何实现加载 SuperMap Objects 控件, 基于 SuperMap Objects 控件实现地图浏览 地图到属性查询和属性到地图查询等基本 GIS 功能的开发过程, 旨在指导开发人员快速掌握全组件式地理信息系统 SuperMap Objects 的开发方法 本书包含目前最流行的 5 种开发语言的入门教程内容, 开发人员可以选择阅读自己熟悉和喜欢的开发语言的入门教程 2

第 2 章 Visual Basic 6.0 开发入门 2.1 第一步 : 创建一个新工程 :MyFirstSuperMap 1. 创建一个工作目录 C:\MyProject 2. 从帮助文档 GettingStarted.chm 的首页中点击链接下载数据文件 World..zip( 包含 World.smw 工作空间文件和 World.sdb World.sdd 文件 ) 到工作目 C:\MyProject 3. 启动 VB 4. 在工作目录 C:\MyProject 下创建一个新工程 : MyFirstSuperMap 2.2 第二步 : 加入 SuperMap Objects 控件 1. 添加 SuperMap Objects 控件到 ToolBox( 工具箱 ) 用 Ctrl+T 快捷键或在 ToolBox( 工具箱 ) 上单击鼠标右键, 点击 "Components..." 出现如下对话框 : 3

SuperMap Objects 初级开发教程 图 2.1 VB6 加载控件窗口 选中 Supermap Objects Core Controls ( 前面的框内出现一个钩即为选中 ), 点击确定 ToolBox 中就会多出图中所示两个控件 4

第 2 章 Visual Basic 开发入门 图 2.2 加载控件后控件面板 2. 把这两个控件加入到窗体 Form1 中, 如图 5

SuperMap Objects 初级开发教程 图 2.3 添加 SuperMap 控件后窗口 2.3 第三步 : 打开地图 添加图层 在窗体中加入以下代码 : Private Sub Form_Load() ' 建立 SuperWorkspace 与 SuperMap 之间的联系 SuperMap1.Connect(SuperWorkspace1.Object) Dim stralias As String ' 数据源别名 Dim nenginetype As seenginetype ' 数据引擎类型 Dim strdatasourcename As String ' 数据源绝对路径名 Dim objdatasource As sodatasource ' 数据源对象, 指向打开的数据源 Dim breadonly As Boolean ' 数据源里的数据是否只读 Dim objlayer As solayer ' 图层对象变量, 指向将要打开的图层 Dim baddtohead As Boolean ' 是否加到最上面 Dim i As Integer ' 循环变量 stralias = "MyDataSource" ' 原则上别名可以任意给, 建议取成和数据源文件主名 nenginetype = scesdbplus 'SuperMap 支持多种类型, 此处为 SDB+ 类型 strdatasourcename = "c:\myproject\world.sdb" breadonly = False ' 不设为只读 ' 打开数据源 objdatasource = SuperWorkspace1.OpenDataSource(strDataSourceName, stralias, nenginetype, breadonly) If objdatasource Is Nothing Then 6

第 2 章 Visual Basic 开发入门 MsgBox(" 打开数据源失败!", vbinformation) Else For i = 1 To objdatasource.datasets.count ' 把数据源中的所有图层加入到 SuperMap 中 baddtohead = True objlayer = SuperMap1.Layers.AddDataset(objDataSource.Datasets.Item(i), baddtohead) Next End If ' 刷新地图窗口 SuperMap1.Refresh() ' 修改选中对象风格 SuperMap1.selection.Style.PenColor = RGB(231, 77, 0) SuperMap1.selection.Style.PenWidth = 1 SuperMap1.selection.Style.PenStyle = 1 SuperMap1.selection.Style.BrushStyle = 5 SuperMap1.selection.Style.BrushColor = RGB(115, 69, 140) SuperMap1.selection.Style.BrushBackColor = RGB(239, 150, 255) SuperMap1.selection.Style.BrushOpaqueRate = 50 ' 释放内存 objdatasource = Nothing objlayer = Nothing End Sub Private Sub Form_Unload(ByVal Cancel As Integer) SuperMap1.Disconnect() SuperWorkspace1.Close() End Sub 运行上述代码后会有如下的界面 : 7

SuperMap Objects 初级开发教程 图 2.4 打开地图运行结果窗口 2.4 第四步 : 地图浏览功能 利用 SuperMap Objects 控件, 可以很方便地进行地图的基本操作, 如放大 缩小 自由缩放 漫游 全幅显示 画点 画线等等 下面以放大 缩小 自由缩放 漫游 全幅显示功能为例予以说明 首先 : 在窗体中加入五个按钮, 设置如下的属性值 ( 其余属性取默认值即可 ): cmdpan cmdzoomin cmdzoomout cmdzoomfree cmdviewentire Name 漫游放大缩小自由缩放全幅显示 Caption 然后 : 在各个按钮的 Click 事件里加入以下代码, 即可实现以上功能 ; Private Sub cmdpan_click() ' 漫游 SuperMap1.Action = scapan End Sub Private Sub cmdviewentire_click() ' 全幅显示 SuperMap1.ViewEntire() End Sub Private Sub cmdzoomfree_click() ' 自由缩放 SuperMap1.Action = scazoomfree End Sub Private Sub cmdzoomin_click() ' 放大 SuperMap1.Action = scazoomin End Sub Private Sub cmdzoomout_click() ' 缩小 SuperMap1.Action = scazoomout End Sub 下图即为放大时的效果 8

第 2 章 Visual Basic 开发入门 2.5 第五步 : 地图到属性查询 图 2.5 地图浏览功能运行结果窗口 首先, 在窗体中加入一个按钮并设置它的属性值 : Name cmdselect Caption 图查属性 然后, 在其 Click 事件中加入以下程序代码 : Private Sub cmdselect_click() SuperMap1.Action = scaselect End Sub 最后, 在 Form1 窗体 SuperMap1 控件的 GeometrySelected 事件中加入如下代码 : Private Sub SuperMap1_GeometrySelected(ByVal nselectedgeometrycount As Long) Dim objrecordset As sorecordset ' 属性对象 Dim i As Integer ' 循环变量 Dim strname(40) As String ' 存储属性名 Dim strvalue(40) As String ' 存储属性值 Dim strmessage As String ' 显示所有信息 9

SuperMap Objects 初级开发教程 据 Set objrecordset = SuperMap1.Selection.ToRecordset(False) ' 提取所选对象的属性数 objrecordset.movefirst ' 移到第一条属性 For i = 1 To objrecordset.fieldcount strname(i - 1) = objrecordset.getfieldinfo(i).name ' 得到属性名 strvalue(i - 1) = objrecordset.getfieldvalue(i) ' 得到属性值 Next strmessage = "" For i = 1 To objrecordset.fieldcount strmessage = strmessage & strname(i) & ": " & strvalue(i) & Space(5) & vbcrlf Next MsgBox strmessage Set objrecordset = Nothing End Sub 下图是图查属性时的效果 : ' 释放内存 2.6 第六步 : 属性到地图查询 图 2.6 地图到属性查询运行结果窗口 1. 在窗体中加入一个按钮和一个编辑框 (TextBox), 并设置它们的属性值如下 : 10

第 2 章 Visual Basic 开发入门 Control Name Caption 按钮 cmdquerymap 属性查图 编辑框 txtexpression --- 2. 在按钮的 Click 事件中加入以下程序代码 : Private Sub cmdquerymap_click() Dim objdtvector As sodatasetvector ' 矢量数据集变量 Dim objrecordset As sorecordset ' 属性数据集变量 Dim objselection As soselection ' 选择集变量 ' 取矢量数据集 : 取其中面数据集 "World" 进行查询 Set objdtvector = SuperWorkspace1.Datasources.Item("MyDataSource").Datasets ("World") If objdtvector Is Nothing Then MsgBox " 打开数据集错误 ", vbinformation Exit Sub End If ' 从数据集中查询出属性数据 (Query 方法只能用于 sodatasetvector 类对象 ) Set objrecordset = objdtvector.query(txtexpression.text, True) If objrecordset Is Nothing Then Exit Sub Else ' 把查到的数据加入到选择集中 ( 使其呈被选中状态 ) Set objselection = SuperMap1.Selection objselection.fromrecordset objrecordset ' 刷新地图窗口 SuperMap1.Refresh End If Set objdtvector = Nothing Set objrecordset = Nothing Set objselection = Nothing End Sub 3. 在编辑框中输入查询条件 :smid>50, 单击 属性查图 按钮, 得到如下结果 : 11

SuperMap Objects 初级开发教程 图 2.7 属性到地图查询运行结果窗口 12

第 3 章 Delphi 7 开发入门 3.1 第一步 : 创建一个新工程 :MyFirstSuperMap 1. 创建一个工作目录 C:\MyProject 2. 从帮助文档 GettingStarted.chm 的首页中点击链接下载数据文件 World..zip( 包含 World.smw 工作空间文件和 World.sdb World.sdd 文件 ) 到工作目 C:\MyProject 3. 启动 Delphi 4. 在工作目录 C:\MyProject 下创建一个新工程 : MyFirstSuperMap 5. 将窗体命名为 Tfrmmap 3.2 第二步 : 加入 SuperMap Objects 控件 1. 添加 ActiveX 控件到 Component Palette 的 ActiveX 栏上 找到 SuperMap 带的 SuperMap5.dpk 文件, 此文件通常在 SuperMap 安装目录的 Bin\InterfaceClass\ 目录下面, 在 delphi 中打开该文件, 将出现如下的对话框 图 3.1 打开 SuperMap5.dpk 文件窗口 如果您之前已经在 delphi 中加载过 SuperMap 的部分控件, 可以先移出以前加载的控件, 然后点击 Install 按钮 13

SuperMap Objects 初级开发教程 安装提示成功后,SuperMap Objects 全组件式系统在 Delphi 上的安装就完成了 安装成功在控件板上的 ActiveX 页上将出现如下图标 : 图 3.2 加载 SuperMap 控件后控件面板 第一次使用 SuperMap Objects 组件在 Delphi 中进行开发时, 需在菜单 Project/Options 中设置类型库文件搜索路径, 具体在 Options 的 Directories/conditionals 选项卡上 Search Path 中定位至 SuperMap Objects 的安装路径 :/Bin/InterfaceClass 下, 至此 SuperMap Objects 全组件式系统在 Delphi 上的安装就完成了 2. 将 SuperWorkspace 控件和 SuperMap 控件加到窗体上 3.3 第三步 : 打开地图 添加图层 在单元中加入如下代码 : procedure Tfrmmap.FormCreate(Sender: TObject); var stralias:string ; // 数据源别名 nenginetype:seenginetype; // 数据引擎类型 strdatasourcename:string; // 数据源绝对路径名 objdatasource:sodatasource; // 数据源对象, 指向打开的数据源 breadonly:boolean; // 数据源里的数据是否只读 objlayer:solayer; // 图层对象变量, 指向将要打开的图层 baddtohead:boolean; // 是否加到最上面 i:integer; // 循环变量 begin // 首先建立 supermap 与 SuperWorkspace 的联系 supermap1.connect(superworkspace1.handle); stralias:='mydatasource'; // 数据源别名可以任意给 // 建议取成数据源文件主名 nenginetype:=scesdbplus; //SuperMap 支持多种类型, 此处为 SDBPlus 类型 strdatasourcename:='c:\myproject\world.sdb'; breadonly:=false; // 不设为只读 // 打开数据源 objdatasource:=superworkspace1.opendatasource(strdatasourcename,stralias,nenginetype,breadonly); if objdatasource=nil then begin MessageBox(frmmap.handle, ' 打开数据源失败!', 'SuperMap Objects 5.2 开发入门教程 ', MB_OK); MessageBox(frmmap.handle,' 如果没有下载数据源, 请先下载示范数据 (world.sdb,world.sdd) 到当前程序目录下, 谢谢!', 'SuperMap Objects 5.2 开发入门教程 ', MB_OK); end 14

第 3 章 Delphi 开发入门 else begin // 将数据源中所有图层加到 Supermap 中 for i:=1 to objdatasource.datasets.count do begin baddtohead:=true; // 加到地图的最上层 objlayer:=supermap1.layers.adddataset(objdatasource.datasets.item[i], baddtohead); end; // 刷新地图 Supermap1.Refresh; // 修改选中对象风格 supermap1.selection.style.pencolor := RGB(231, 77, 0); supermap1.selection.style.penwidth := 1; supermap1.selection.style.penstyle := 1; supermap1.selection.style.brushstyle := 5; supermap1.selection.style.brushcolor := RGB(115, 69, 140); supermap1.selection.style.brushbackcolor := RGB(239, 150, 255); supermap1.selection.style.brushopaquerate := 50; end end; procedure Tfrmmap.FormClose(Sender: TObject; var Action: TCloseAction); begin // 关闭工作空间 SuperMap1.Disconnect; SuperMap1.Close; SuperWorkspace1.Close; SuperMap1.Free; SuperWorkspace1.Free; end; 运行以上代码后将出现如下界面 : 15

SuperMap Objects 初级开发教程 图 3.6 打开地图运行结果窗口 3.4 第四步 : 地图浏览功能 利用 SuperMap 控件, 可以很方便地进行地图的基本操作, 如放大 缩小 自由缩放 漫游 全幅显示 画点 画线等等 下面以放大 缩小 自由缩放 漫游 全幅显示功能为例予以说明 首先 : 在窗体中加入五个按钮, 设置如下的属性值 ( 其余属性取默认值即可 ): Name btpan btzoomin btzoomout btzoomfree btviewentire 16 Caption 漫游 放大 缩小 自由缩放 全幅显示 然后 : 在各个按钮的 Click 事件里加入以下代码, 即可实现以上功能 ;

第 3 章 Delphi 开发入门 procedure Tfrmmap.btViewEntireClick(Sender: TObject); begin // 查看全图 supermap1.viewentire; end; procedure Tfrmmap.btZoomInClick(Sender: TObject); begin // 放大 Supermap1.Action:=scaZoomIn; end; procedure Tfrmmap.btZoomOutClick(Sender: TObject); begin // 缩小 Supermap1.Action:=scaZoomOut; end; procedure Tfrmmap.btZoomFreeClick(Sender: TObject); begin // 自由缩放 Supermap1.Action:=scaZoomFree; end; procedure Tfrmmap.btPanClick(Sender: TObject); begin // 漫游 Supermap1.Action:=scaPan; end; 下图即为一放大时的效果 : 17

SuperMap Objects 初级开发教程 3.5 第五步 : 地图到属性查询 图 3.7 地图浏览功能运行结果窗口 首先, 在窗体中加入一个按钮并设置它的属性值 : Name btproperty 然后, 在其 Click 事件中加入以下程序代码 : Caption 图查属性 procedure Tfrmmap.btPropertyClick(Sender: TObject); begin // 查询地图属性 Supermap1.action:=scaSelect; end; 最后, 在 FrmMap 窗体 SuperMap1 控件的 GeometrySelected 事件中加入如下代码 : procedure Tfrmmap.SuperMap1GeometrySelected(Sender: TObject;nSelectedGeometryCount:Integer); var objrecordset:sorecordset; // 属性对象 i,j:integer; // 循环变量 strname:array[1..4] of string; // 存储属性名 strvalue:array[1..4] of String; // 存储属性值 strmessage:string; // 显示所有信息 begin // 先将选中对象转换为记录集对象 objrecordset:=supermap1.selection.torecordset(false); objrecordset.movefirst; // 读取字段数 j:=objrecordset.fieldcount; // 如果记录集多于 4 个字段, 则只读前四个字段 if j>4 then j:=4; // 只显示前四个字段 for i:=1 to j do begin strname[i]:=objrecordset.getfieldinfo(i).name; strvalue[i]:=objrecordset.getfieldvalue(i); end; strmessage:=''; for i:=1 to j do begin strmessage:=strmessage+strname[i]+ ':'+strvalue[i]+' '+ chr(vk_return); showmessage(strmessage); end; end; 下图是查询美国时的效果 : 18

第 3 章 Delphi 开发入门 图 3.8 地图到属性查询运行结果窗口 3.6 第六步 : 属性到地图查询 1. 在窗体中加入一个按钮和一个编辑框 (TextBox), 并设置它们的属性值如下 : Control Name Caption 按钮 btquerymap 属性查图 编辑框 editexpression --- 2. 在按钮的 Click 事件中加入以下程序代码 : procedure Tfrmmap.btQueryMapClick(Sender: TObject); var objdatasource:sodatasource; // 数据源 objdtvector:sodatasetvector; // 矢量数据集变量 objrecordset:sorecordset; // 属性数据集变量 objselection:soselection; // 选择集变量 stroptions:widestring; objerrors:soerror; objgeo:sogeometry; begin 19

SuperMap Objects 初级开发教程 // 将 Supmap 控件的 Action 设为空 Supermap1.Action:=scaNull; if SuperWorkspace1.Datasources.count=0 then exit; // 取矢量数据集 objdatasource:=superworkspace1.datasources.item[1]; if objdatasource= nil then begin showmessage(' 数据源错误 '+objerrors.lasterrormsg ); Exit; end; objdtvector:=objdatasource.datasets.item[2] as sodatasetvector; if objdtvector=nil then begin showmessage(' 打开数据集错误 '+objerrors.lasterrormsg ); Exit end; try // 从数据集中查询出属性数据 objrecordset:=objdtvector.query(editexpression.text, true, nil, '') as sorecordset; if objrecordset=nil then exit else begin // 把查到的数据加入到选择集中 ( 使其呈被选中状态 ) objselection:=supermap1.selection; objselection.fromrecordset(objrecordset); // 刷新地图窗口 SuperMap1.Refresh ; exit; end; except MessageBox(frmmap.Handle,' 查询失败!',' 错误 ',MB_RETRYCANCEL+MB_ICONERROR) end; end; 3. 在编辑框中输入查询条件 :smid>50, 单击 " 属性查图 " 按钮, 得到如下结果 : 20

第 3 章 Delphi 开发入门 图 3.9 属性到地图查询运行结果窗口 21

第 4 章 Visual C++ 6.0 开发入门 4.1 第一步 : 创建 Visual C++ 6.0 工程 :MyFirstSuperMap 1. 创建一个工作目录 C:\Myproject; 2. 从帮助文档 GettingStarted.chm 的首页中点击链接下载数据文件 World..zip( 包含 World.smw 工作空间文件和 World.sdb World.sdd 文件 ) 到工作目 C:\MyProject; 3. 启动 Visual C++ 6.0 新建工程 执行 File -> New 菜单弹出下图窗口, 切换到 Projects 页面选项, 选择 MFC AppWizard(exe) Project 类型,Location 项使用路径定位功能定位到 C:\Myproject,Project name 项写入 MySuperMap, 点击 OK 按钮进入下一步 23

SuperMap Objects 初级开发教程 图 4.1 Visual C++ 新建工程窗口 4. 选择应用类型 新建工程的第二步是选择应用类型, 如下图所示选择第三项 Dialog based 然后点击 Finish 按钮完成新建 Project 图 4.2 选择工程类型窗口 4.2 第二步 : 加载 SuperMap Objects 控件 加载 SuperMap Objects 控件到工程中 (Project): 1. 用鼠标单击 Project 菜单下的 Add To Project 命令下的 Components and Controls Gallery 24

第 4 章 Visual C++ 开发入门 图 4.3 加载组件执行菜单 2. 用鼠标双击 Registered ActiveX Controls 目录, 选择 SuperMap 控件 如下图对话框 : 图 4.4 加载 SuperMap 组件窗口 25

SuperMap Objects 初级开发教程 3. 点击 Insert 按钮, 系统弹出消息框询问是否插入这个组件, 点击确定, 然后出现如下对话框, 单击 OK, 如下图 : 图 4.5 Inser 类这样 SuperMap Control 就被添加进工程里了, 同样的方法添加 SuperWorkspace Control 关闭选择控件的对话框, 这时 ToolBox 中就会多出图中所示两个控件 : 26

第 4 章 Visual C++ 开发入门 图 4.6 加载 SuperMap SuperWorkSpace 控件后 Control 面板 4. 通过上述步骤, 有些类仍然添加不进来, 需要通过以下步骤添加, 点击执行菜单 View -> ClassWizard..., 弹出菜单如下 : 图 4.7 添加类菜单点击菜单后, 出现如下对话框, 然后单击 Add Class 按钮 -> From a Type Library 27

SuperMap Objects 初级开发教程 图 4.8 添加类菜单然后选择安装目录下的 Bin\TypeLibrary\SuperMap.tlb 28

第 4 章 Visual C++ 开发入门 图 4.9 选择 SuperMap 类库现以下界面以后, 选中所有的类, 单击 OK 即可, 然后点击确定关闭 MFC ClassWizard 对话框 图 4.10 选择类窗口 4.3 第三步 : 打开地图 添加图层 1. 在当前对话框上 ( 如果当前对话框没有打开, 则可以从 VC 的工作空间管理器的 ResourceView 页中找到 ID 为 IDD_MYSUPERMAP_DIALOG 的对话框, 打开它 ) 添加 SuperWorkSpace 控件,ID 取名 IDC_SuperWorkspace, 添加 SuperMap 控件,ID 取名为 IDC_SuperMap 29

SuperMap Objects 初级开发教程 2. 在对话框上选中 SuperMap 控件, 单击右键, 选择 ClassWizard... ( 如下图 ) 图 4.11 ClassWizard 菜单在弹出的 MFC ClassWizard 对话框上选择 Member Variables 页, 双击 Control IDs: 列表框中的 IDC_SuperMap, 或者点击选中 IDC_SuperMap 后点击 Add Variable... 按钮, 进行变量关联, 如下图 : 30

第 4 章 Visual C++ 开发入门 图 4.12 添加 SuperMap 类点击 OK 按钮, 如下图可以在 MFC ClassWizard 对话框中看到增加的变量, 同样的方法, 为 IDC_SuperWorkspace 关联变量 m_superworkspace, 最后点击 OK, 关闭 MFC ClassWizard 31

SuperMap Objects 初级开发教程 图 4.13 WFC ClassWizard 3. 在 MySuperMapDlg.cpp 头部添加下列头文件 #include "sodatasource.h" #include "sodatasources.h" #include "sorecordset.h" #include "sofieldinfo.h" #include "sodatasets.h" #include "sodataset.h" #include "solayers.h" #include "solayer.h" #include "soselection.h" #include "sodatasetvector.h" #include "sostyle.h" 4. 在 CMySuperMapDlg 类的 OnInitDialog() 函数的 return TRUE; 前添加如下代码 : // 打开地图并显示 CsoDataSource objdatasource; CsoDatasets objdatasets; long Index; // 建立工作空间及数据源的联系 LPDISPATCH handle = m_superworkspace.gethandle (); m_supermap.connect(handle); handle->release(); 32

第 4 章 Visual C++ 开发入门 // 打开数据源,14 表示 SDB+ 引擎据 objdatasource=m_superworkspace.opendatasource("c:\\myproject\\world.sd b","world",14,false); if (! objdatasource) { MessageBox(" 打开数据源出错!"); exit(0); } objdatasets=objdatasource.getdatasets(); // 添加图层 for(index=1;index<=objdatasets.getcount();index++) { m_supermap.getlayers().adddataset(objdatasets.getitem(colevariant(inde x)),false); } // 刷新, 显示 m_supermap.refresh(); // 修改选中对象风格 CsoStyle objstyle = m_supermap.getselection().getstyle(); objstyle.setpencolor(rgb(231,77,0)); objstyle.setpenstyle(1); objstyle.setpenwidth(1); objstyle.setbrushstyle(5); objstyle.setbrushcolor(rgb(115,69,140)); objstyle.setbrushbackcolor(rgb(239,150,255)); objstyle.setbrushopaquerate(50); m_supermap.getselection().setstyle(objstyle); 运行代码后弹出如下界面 : 33

SuperMap Objects 初级开发教程 4.4 第四步 : 地图浏览功能 图 4.14 打开地图运行结果窗口 利用 SuperMap 控件, 可以很方便地进行地图的基本操作, 如放大 缩小 自由缩放 漫游 全幅显示 画点 画线等等 下面以放大 缩小 自由缩放 漫游 全幅显示功能为例予以说明 1. 在窗体中加入五个按钮, 设置如下的属性值 ( 其余属性取默认值即可 ): IDC_ButtonPan IDC_ButtonZoomIn ID 漫游 放大 Caption IDC_ButtonZoomOut IDC_ButtonZoomFree IDC_ButtonViewEntire 缩小 自由缩放 全幅显示 2. 在对话框中为这五个按钮添加响应处理函数, 并把下列代码分别添加到对应的各个处理函数中 : 34

第 4 章 Visual C++ 开发入门 void CMySuperMapDlg::OnButtonPan() { // 漫游 m_supermap.setaction(1); } void CMySuperMapDlg::OnButtonZoomIn() { // 放大 m_supermap.setaction (2); } void CMySuperMapDlg::OnButtonZoomOut() { // 缩小 m_supermap.setaction (3); } void CMySuperMapDlg::OnButtonZoomFree() { // 自由缩放 m_supermap.setaction(4); } void CMySuperMapDlg::OnButtonViewEntire() { // 全幅显示 m_supermap.viewentire(); } 下图为地图放大时的效果 : 35

SuperMap Objects 初级开发教程 4.5 第五步 : 地图到属性查询 图 4.15 地图浏览功能运行结果窗口 1. 在窗体中加入一个按钮并设置它的属性值 : ID IDC_ButtonQueryProperties 图查属性 Caption 2. 在对话框中添加该按钮的响应处理函数, 将下列代码添加到函数 : // 图查属性 m_supermap.setaction(5); 3. 通过 MFC ClassWizard 在对话框中添加 SuperMap 控件 GeometrySelected 消息的处理函数 OnGeometrySelectedSuperMap(long nselectedgeometrycount), 在函数中加入如下代码 : CsoRecordset Record; CsoFieldInfo Info; long Index; COleVariant var; CString strname; CString strvalue; CString strmsg; // 转化为属性集 Record=m_SuperMap.GetSelection().ToRecordset(false); strmsg=""; // 获得属性名与属性值 for(index=1;index<=record.getfieldcount();index++) { Info=Record.GetFieldInfo(COleVariant(Index)); strname=info.getname(); var=record.getfieldvalue(colevariant(index)); var.changetype(vt_bstr); strvalue=var.bstrval; strmsg =strmsg + strname + ":" + strvalue + "\n"; } // 显示属性 MessageBox(strMsg); 下图是图查属性时的效果 : 36

第 4 章 Visual C++ 开发入门 4.6 第六步 : 属性到地图查询 图 4.16 地图到属性查询运行结果窗口 1. 在窗体中加入一个按钮并设置它的属性值 : Controls ID Caption Button IDC_ButtonQueryMaps 属性查图 EditBox IDC_Edit --- 2. 在对话框中添加 ' IDC_ButtonQueryMaps 的响应处理函数, 把下列代码添加到处理函数中, 再使用 MFC ClassWizard 将 IDC_Edit 关联为字符串类型变量 m_querycondition : // 属性查图 UpdateData(true); CsoDatasetVector objdtvector; // 矢量数据集变量 CsoDataset objdt; CsoRecordset objrecordset; // 属性数据集变量 CsoDatasets objdtsets; CsoDataSource objdatasource; IDispatch *ar = NULL; char *dd = NULL; 37

SuperMap Objects 初级开发教程 // 取矢量数据集 objdatasource = m_superworkspace.getdatasources().getitem(colevariant(1l)); objdtsets = objdatasource.getdatasets(); objdt = objdtsets.getitem(colevariant(2l)); // 第二个参数为 false, 防止 objdt 被释放掉 objdtvector.attachdispatch(objdt,false); // 从数据集中查询出属性数据 objrecordset = objdtvector.query(m_querycondition,true,ar,dd); // 把查到的数据加入到选择集中 ( 使其呈被选中状态 ) m_supermap.getselection ().FromRecordset(objRecordset); // 刷新地图窗口并关闭 Recordset objrecordset.close(); m_supermap.refresh(); 3. 运行程序后, 在编辑框中输入查询条件 :SmID>50, 单击 属性查图 按钮, 效果如下 : 图 4.17 属性到地图查询运行结果窗口 38

第 5 章 Visual Basic.NET 2003 开发入门 5.1 第一步 : 创建一个新工程 :MyFirstSuperMap 1. 创建一个工作目录 C:\MyProject 2. 从帮助文档 GettingStarted.chm 的首页中点击链接下载数据文件 World..zip( 包含 World.smw 工作空间文件和 World.sdb World.sdd 文件 ) 到工作目 C:\MyProject 3. 启动 Visual Visual Studio.NET 4. 在工作目录 C:\MyProject 下创建一个新的 Visual Basic 工程 : MySuperMap 5.2 第二步 : 加入 SuperMap Objects 控件 1. 添加 SuperMap Objects 控件到 ToolBox( 工具箱 ): 在 ToolBox( 工具箱 ) 上单击鼠标右键, 点击 "Add Tab", 命名为 SuperMap 在 ToolBox( 工具箱 ) 上单击鼠标右键, 点击 "Add/Remove Items...", 出现如下对话框 : 39

SuperMap Objects 初级开发教程 图 5.1 Visual Studio.NET 加载控件窗口 在 COM Components 选项卡上选中 SuperMap Control 和 SuperWorkspace Control ( 前面的框内出现一个勾即为选中 ), 点击确定 工具箱上就会多出如下图所示的两个控件 : 40

第 5 章 Visual Basic.Net 开发入门 图 5.2 加载 SuperMap 控件后控件面板 2. 在 COM Components 选项卡上选中 SuperMap Control 和 SuperWorkspace Control ( 前面的框内出现一个勾即为选中 ), 点击确定 工具箱上就会多出如下图所示的两个控件 : 5.3 第三步 : 打开地图 添加图层 在窗体中加入以下代码 : Private Sub frmmap_load(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Handles MyBase.Load ' 建立 SuperWorkspace 与 SuperMap 之间的联系 ' 在 Visual Basic.NET 中,Handle 是系统属性名, 因此 SuperWorkspace 原有的 Handle 属性被更名为 CtlHandle AxSuperMap1.Connect(AxSuperWorkspace1.CtlHandle) Dim stralias As String ' 数据源别名 Dim nenginetype As SuperMapLib.seEngineType ' 数据引擎类型 Dim strdatasourcename As String ' 数据源绝对路径名 Dim objdatasource As SuperMapLib.soDataSource ' 数据源对象, 指向打开的数据源 Dim breadonly As Boolean ' 数据源里的数据是否只读 Dim objlayer As SuperMapLib.soLayer ' 图层对象变量, 指向将要打开的图层 Dim baddtohead As Boolean ' 是否加到最上面 Dim i As Short ' 循环变量 stralias = "MyDataSource" ' 上别名可以任意给, 建议取成和数据源文件主名 41

SuperMap Objects 初级开发教程 nenginetype = SuperMapLib.seEngineType.sceSDBPlus 'SuperMap 支持多种类型, 此处为 SDBPlus 类型 strdatasourcename = "c:\myproject\world.sdb" breadonly = False ' 不设为只读 ' 打开数据源 objdatasource = AxSuperWorkspace1.OpenDataSource(strDataSourceName, stralias, nenginetype, breadonly) If objdatasource Is Nothing Then MsgBox(" 打开数据源失败!", MsgBoxStyle.Information) MsgBox(" 请将数据源文件 (world.sdb,world.sdd) 下载到 c:\myproject 目录下, 再运行程序, 谢谢 ") Else For i = 1 To objdatasource.datasets.count ' 把数据源中的所有图层加入到 SuperMap 中 baddtohead = True objlayer = AxSuperMap1.Layers.AddDataset(objDataSource.Datasets.Item(i), baddtohead) Next End If ' 刷新地图窗口 ' 在 Visual Basic.NET 中,Handle 是系统属性名, 因此 SuperWorkspace 原有的 Handle 属性被更名为 CtlHandle AxSuperMap1.CtlRefresh() ' 修改选中对象风格 AxSuperMap1.selection.Style.PenColor = System.Convert.ToUInt32(RGB(231, 77, 0)) AxSuperMap1.selection.Style.PenWidth = 1 AxSuperMap1.selection.Style.PenStyle = 1 AxSuperMap1.selection.Style.BrushStyle = 5 AxSuperMap1.selection.Style.BrushColor = System.Convert.ToUInt32(RGB(115, 69, 140)) AxSuperMap1.selection.Style.BrushBackColor = System.Convert.ToUInt32(RGB(239, 150, 255)) AxSuperMap1.selection.Style.BrushOpaqueRate = 50 ' 释放内存 objdatasource = Nothing objlayer = Nothing End Sub Private Sub frmmap_closed(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Handles MyBase.Closed AxSuperMap1.Disconnect() AxSuperWorkspace1.Close() End Sub 运行上述代码后会有如下的界面 : 42

第 5 章 Visual Basic.Net 开发入门 图 5.3 打开地图运行结果窗口 5.4 第四步 : 地图浏览功能 利用 SuperMap 控件, 可以很方便地进行地图的基本操作, 如放大 缩小 自由缩放 漫游 全幅显示 画点 画线等等 下面以放大 缩小 自由缩放 漫游 全幅显示功能为例予以说明 首先 : 在窗体中加入五个按钮, 设置如下的属性值 ( 其余属性取默认值即可 ): cmdpan cmdzoomin cmdzoomout cmdzoomfree cmdviewentire Name 漫游放大缩小自由缩放全幅显示 Caption 43

SuperMap Objects 初级开发教程 然后 : 在各个按钮的 Click 事件里加入以下代码, 即可实现以上功能 ; Private Sub cmdviewentire_click(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Handles cmdviewentire.click SuperMap1.ViewEntire() ' 全幅显示 End Sub Private Sub cmdzoomfree_click(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Handles cmdzoomfree.click SuperMap1.Action = SuperMapLib.seAction.scaZoomFree ' 自由缩放 End Sub Private Sub cmdzoomin_click(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Handles cmdzoomin.click SuperMap1.Action = SuperMapLib.seAction.scaZoomIn ' 放大 End Sub Private Sub cmdzoomout_click(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Handles cmdzoomout.click SuperMap1.Action = SuperMapLib.seAction.scaZoomOut ' 缩小 End Sub Private Sub cmdpan_click(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Handles cmdpan.click SuperMap1.Action = SuperMapLib.seAction.scaPan ' 漫游 End Sub 下图即为一放大时的效果 44

第 5 章 Visual Basic.Net 开发入门 5.5 第五步 : 地图到属性查询 图 5.4 地图浏览功能运行结果窗口 1. 在窗体中加入一个按钮并设置它的属性值 : cmdselect Name 2. 在其 Click 事件中加入以下程序代码 : 图查属性 Text Private Sub cmdselect_click(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) SuperMap1.Action = SuperMapLib.seAction.scaSelect ' 选择 End Sub 3. 最后, 在 frmmap 窗体 SuperMap1 控件的 GeometrySelected 事件中加入如下代码 : Private Sub SuperMap1_GeometrySelected(ByVal eventsender As System.Object, ByVal eventargs As AxSuperMapLib._DSuperMapEvents_GeometrySelectedEvent) Handles SuperMap1.GeometrySelected Dim objrecordset As SuperMapLib.soRecordset ' 属性对象 45

SuperMap Objects 初级开发教程 Dim i As Short ' 循环变量 Dim strname(4) As String ' 存储属性名 Dim strvalue(4) As String ' 存储属性值 Dim strmessage As String ' 显示所有信息 objrecordset = AxSuperMap1.selection.ToRecordset(False) ' 提取所选对象的属性数据 objrecordset.movefirst() ' 移到第一条属性 For i = 1 To objrecordset.fieldcount strname(i - 1) = objrecordset.getfieldinfo(i).name ' 得到属性名 strvalue(i - 1) = objrecordset.getfieldvalue(i) ' 得到属性值 Next strmessage = "" For i = 0 To objrecordset.fieldcount - 1 strmessage = strmessage & strname(i) & ": " & strvalue(i) & Space(5) & vbcrlf Next MsgBox(strMessage) objrecordset = Nothing ' 释放内存 End Sub 下图是图查属性时的效果 : 图 5.5 地图到属性查询运行结果窗口 46

5.6 第六步 : 属性到地图查询 第 5 章 Visual Basic.Net 开发入门 1. 在窗体中加入一个按钮和一个编辑框 (TextBox), 并设置它们的属性值如下 : 控件 Name Caption 按钮 cmdquerymap 属性查图 编辑框 txtexpression --- 2. 在按钮的 Click 事件中加入以下程序代码 : Private Sub cmdquerymap_click(byval eventsender As System.Object, ByVal eventargs As System.EventArgs) Dim objdtvector As SuperMapLib.soDatasetVector ' 矢量数据集变量 Dim objrecordset As SuperMapLib.soRecordset ' 属性数据集变量 Dim objselection As SuperMapLib.soSelection ' 选择集变量 ' 取矢量数据集 : 取其中面数据集 "World" 进行查询 If AxSuperWorkspace1.Datasources.Count = 0 Then Exit Sub End If objdtvector = AxSuperWorkspace1.Datasources.Item("MyDataSource").Datasets("World") If objdtvector Is Nothing Then MsgBox(" 打开数据集错误 ", MsgBoxStyle.Information) Exit Sub End If ' 从数据集中查询出属性数据 (Query 方法只能用于 sodatasetvector 类对象 ) objrecordset = objdtvector.query(txtexpression.text, True) If objrecordset Is Nothing Then Exit Sub Else ' 把查到的数据加入到选择集中 ( 使其呈被选中状态 ) objselection = AxSuperMap1.selection objselection.fromrecordset(objrecordset) ' 刷新地图窗口 AxSuperMap1.CtlRefresh() End If objdtvector = Nothing objrecordset = Nothing objselection = Nothing End Sub 3. 在编辑框中输入查询条件 :smid>50, 单击 " 属性查图 " 按钮, 得到如下结果 : 47

SuperMap Objects 初级开发教程 图 5.6 属性到地图查询运行结果窗口 48

第 6 章 Visual C#.NET 2003 开发入门 6.1 第一步 : 创建一个新工程 :MyFirstSuperMap 1. 创建一个工作目录 C:\Myproject 2. 从帮助文档 GettingStarted.chm 的首页中点击链接下载数据文件 World..zip( 包含 World.smw 工作空间文件和 World.sdb World.sdd 文件 ) 到工作目 C:\MyProject 3. 启动 Visual Studio.NET 4. 在工作目录 C:\Myproject 下创建一个新应用 : MyFirstSuperMap 图 6.1 创建 Visual C#.NET 工程窗口 6.2 第二步 : 加载 SuperMap Objects 控件 添加 SuperMap Objects 控件到 ToolBox( 工具箱 ): 在 ToolBox( 工具箱 ) 上单击鼠标右键, 点击 "Add Tab", 键入 SuperMap 作为名字 49

SuperMap Objects 初级开发教程 在 ToolBox( 工具箱 ) 上单击鼠标右键, 点击 " Add/Remove Items... ", 出现如下对话框 : 图 6.2 Visual Studio.NET 加载控件窗口 选中 SuperMap Control 和 SuperWorkspace Control ( 前面的框内出现一个钩即为选中 ), 点击确定 ToolBox 中就会多出图中所示两个控件 : 50

第 7 章 Visual C#.Net 开发入门 图 6.3 加载 SuperMap 控件后控件面板 6.3 第三步 : 打开地图 添加图层 1. 把窗体命名为 frmmain, 把这 SuperWorkSpace Control 添加到窗体中命名为 SuperWorkspace1, 把这 SuperMap Control 添加到窗体中命名为 SuperMap1, 如下图所示 51

SuperMap Objects 初级开发教程 图 6.4 添加 SuperMap 控件到 Form 2. 在 frmmain 下的 frmmain_load 插入如下代码 : private void frmmain_load(object sender, System.EventArgs e) { SuperMap1.Connect(SuperWorkspace1.CtlHandle); // 建立 SuperWorkspace 与 SuperMap 之间的联系 String stralias; // 数据源别名 SuperMapLib.seEngineType nenginetype; // 数据引擎类型 String strdatasourcename; // 数据源绝对路径名 SuperMapLib.soDataSource objdatasource; // 数据源对象, 指向打开的数据源 bool breadonly; // 数据源里的数据是否只读 bool baddtohead; // 是否加到最上面 int i; // 循环变量 stralias = "MyDataSource"; // 别名可以任意给, 建议取成和数据源文件主名 nenginetype = SuperMapLib.seEngineType.sceSDBPlus; //SuperMap 支持多种类型, 此处为 SDBPlus 类型 strdatasourcename = "C:\\MyProject\\World.sdb"; breadonly = false ; // 不设为只读 // 打开数据源 52

第 7 章 Visual C#.Net 开发入门 objdatasource = SuperWorkspace1.OpenDataSource(strDataSourceName, stralias, nenginetype, breadonly); if (objdatasource == null) { MessageBox.Show( " 请将数据源文件 (world.sdb,world.sdd) 下载到 C:\\MyProject\\World.sdb 目录, 再运行程序, 谢谢 "," 打开数据源失败 "); return ; } else { // 把数据源中的所有图层加入到 SuperMap 中 for(i=1;i<=objdatasource.datasets.count;i++) { baddtohead = true; SuperMap1.Layers.AddDataset(objDataSource.Datasets[i], baddtohead); } } SuperMap1.CtlRefresh(); // 刷新地图窗口 // 修改选中对象风格 SuperMap1.selection.Style.PenColor = System.Convert.ToUInt32(System.Drawing.ColorTranslator.ToOle(Color.Fro margb(231, 77, 0))); SuperMap1.selection.Style.PenWidth = 1; SuperMap1.selection.Style.PenStyle = 1; SuperMap1.selection.Style.BrushStyle = 5; SuperMap1.selection.Style.BrushColor = System.Convert.ToUInt32(System.Drawing.ColorTranslator.ToOle(Color.Fro margb(115, 69, 140))); SuperMap1.selection.Style.BrushBackColor = System.Convert.ToUInt32(System.Drawing.ColorTranslator.ToOle(Color.Fro margb(239, 150, 255))); SuperMap1.selection.Style.BrushOpaqueRate = 50; objdatasource = null; } 在 frmmain 下的 frmmain_closing 插入如下代码 : private void frmmain_closing(object sender, System.ComponentModel.CancelEventArgs e) { // 关闭窗口及工作空间, 注意别乱了顺序 SuperMap1.Close(); SuperMap1.Disconnect(); SuperWorkspace1.Close(); } 运行代码后弹出如下界面 : 53

SuperMap Objects 初级开发教程 图 6.5 打开地图运行结果窗口 6.4 第四步 : 地图浏览功能 利用 SuperMap 控件, 可以很方便地进行地图的基本操作, 如放大 缩小 自由缩放 漫游 全幅显示 画点 画线等等 下面以放大 缩小 自由缩放 漫游 全幅显示功能为例予以说明 首先 : 在窗体中加入五个按钮, 设置如下的属性值 ( 其余属性取默认值即可 ): cmdpan cmdzoomin cmdzoomout cmdzoomfree cmdviewentire Name 漫游放大缩小自由缩放全幅显示 Caption 然后 : 在各个按钮的 Click 事件里加入以下代码, 即可实现以上功能 ; 54

第 7 章 Visual C#.Net 开发入门 private void cmdzoomin_click(object sender, System.EventArgs e) { this.supermap1.action=supermaplib.seaction.scazoomin; // 放大 } private void cmdzoomout_click(object sender, System.EventArgs e) { this.supermap1.action = SuperMapLib.seAction.scaZoomOut; // 缩小 } private void cmdviewentire_click(object sender, System.EventArgs e) { this.supermap1.viewentire(); // 全幅显示 } private void cmdpan_click(object sender, System.EventArgs e) { this.supermap1.action = SuperMapLib.seAction.scaPan; // 漫游 } private void cmdpan_click(object sender, System.EventArgs e) { this.supermap1.action = SuperMapLib.seAction.scaZoomFree; // 自由缩放 } 下图为地图放大时的效果 : 55

SuperMap Objects 初级开发教程 图 6.6 地图浏览功能运行结果窗口 6.5 第五步 : 地图到属性查询 1. 在窗体中加入一个按钮并设置它的属性值 : cmdqueryproperties ID 图查属性 2. 把按钮中要响应的代码加入到 cmdqueryproperties_click(object sender, System.EventArgs e) 中, 即可实现以上功能 ; private void cmdqueryproperties_click(object sender, System.EventArgs e) { this.axsupermap1.action=supermaplib.seaction.scaselect; // 图查属性 } 在 SuperMap 控件的 GeometrySelected(object sender, AxSuperMapLib._DSuperMapEvents_GeometrySelectedEvent e) 加入如下代码 : private void axsupermap1_geometryselected(object sender, AxSuperMapLib._DSuperMapEvents_GeometrySelectedEvent e) { SuperMapLib.soSelection objselection; SuperMapLib.soRecordset objrd; objselection=this.axsupermap1.selection; objrd=objselection.torecordset(false); // 提取所选对象的属性数据 string str=""; for (int i=1 ;i<=objrd.fieldcount;i++) { str+=objrd.getfieldinfo(i).name ; // 得到属性名 str+=":"+objrd.getfieldvalue(i).tostring()+"\n"; // 得到属性值 } MessageBox.Show(str," 查找的纪录为 :"); objselection=null; objrd=null; } 下图是图查属性时的效果 : Text 56

第 7 章 Visual C#.Net 开发入门 6.6 第六步 : 属性到地图查询 图 6.7 地图到属性查询运行结果窗口 1. 在窗体中加入一个按钮并设置它的属性值 : 控件 ID Caption 按钮 cmdquerymaps 属性查图 编辑框 textbox1 --- 2. 把按钮响应的代码加入到 cmdquerymaps_click(object sender, System.EventArgs e), 即可实现以上功能 ; { private void cmdquerymaps_click(object sender, System.EventArgs e) if (this.textbox1.text=="") { MessageBox.Show(" 查找信息不能为空 "); return; } SuperMapLib.soDatasetVector objdtv; // 矢量数据集变量 SuperMapLib.soDataset objdt; SuperMapLib.soSelection objselection; // 选择集变量 57

SuperMap Objects 初级开发教程 SuperMapLib.soRecordset objrd; // 属性数据集变量 // 取矢量数据集 : 取其中面数据集 "World" 进行查询 objdt= this.supermap1.layers["world@world"].dataset; objdtv=(supermaplib.sodatasetvector)objdt; // 从数据集中查询出属性数据 (Query 方法只能用于 sodatasetvector 类对象 ) objrd=objdtv.query(this.textbox1.text,true,null,""); // 把查到的数据加入到选择集中 ( 使其呈被选中状态 ) objselection= this.supermap1.selection; objselection.fromrecordset(objrd); // 刷新地图窗口 this.supermap1.ctlrefresh(); } objrd= null; objdt= null; objdtv= null; objselection= null; 3. 在编辑框中输入查询条件 :SmID>50, 单击 属性查图 按钮, 得到如下结果 : 图 6.8 属性到地图查询运行结果窗口 58

第 7 章 附录 7.1 如何注册 SuperMap Objects 运行许可? 如果您购买了 SuperMap Objects 的运行许可, 您将得到一组运行许可序列号 SuperWorkspace SuperAnalyst Super3D SuperLayout 和 SuperTopo 控件以及 SDX+ 需要运行许可序列号,SuperMap SuperLegend SuperGridView SuperWkspManager 和 SmxLockInfo 不需要 在您开发的系统中, 需要使用这些序列号注册运行许可 注册的方式是分别调用相应控件的 RegisterForRuntime 方法 以 SuperWorkspace 控件为例, 在第一次打开数据之前, 使用控件的 RegisterForRuntime 方法 (Method) 按如下方式注册, 否则, 运行时将会弹出 About 对话框, 并将在地图窗口中显示提示注册信息 : RegisterForRuntime ( 用户名 单位名 产品序列号 ) 例如在 VB 工程中可以在 Form_Load 事件中注册, 以入门教程为例 : Private Sub Form_Load() If Not SuperWorkspace1.RegisterForRuntime("", "", "") Then End If MsgBox "SuperMap Objects 注册失败, 请确认序列号是否正确!" SuperMap1.Connect SuperWorkspace1.Handle SuperWorkspace1.OpenDataSource App.Path & "\..\data\world\world.sdb", "world", scesdb, True SuperMap1.Layers.AddDataset SuperWorkspace1.Datasources(1).Datasets ("World"), True SuperMap1.ViewEntire End Sub 其它控件也应在第一次使用该控件之前调用 RegisterForRuntime 方法进行注册 7.2 如何随您的应用系统分发 SuperMap Objects? 7.2.1 发布模式 SuperMap Objects 是一个面向二次开发的 GIS 平台, 您可以基于 SuperMap Objects 开发出适用于不同领域 功能强大的应用系统 通常情况下需要将应用系统以及附属文件制作成一个安装包, 便于最终用户的使用 那么如何发布基于 SuperMap objects 开发的软件呢? 通常有两种模式, 一种为简便模式, 另一种为高级模式 下面将向您介绍这两种模式 59

SuperMap Objects 初级开发教程 1 简单模式 简便模式即只将应用系统单独打包, 不包括 SuperMap Objects 运行库文件 用户安装时先安装 SuperMap Objects 运行版, 然后再安装应用系统 发布应用系统只能提供给用户运行版安装程序, 不能提供开发版安装程序 2 高级模式 高级模式即把 SuperMap Objects 的运行支持文件与应用系统一起打包成安装程序, 用户只需要安装一次, 如果您的系统是一个可以单独销售的产品, 建议采用这种方式 采用高级模式发布基于 SuperMap Objects 开发的软件时, 必须注意 : 有些文件属于 SuperMap Objects 开发版专有, 不能发布给您的用户使用, 下面提供了可以发布的文件清单和不可以发布的文件清单 7.2.2 可发布文件清单 SuperMap Objects 运行库包括三种类型文件 : MFC 运行库 DLL 文件 SuperMap Objects 支持库 DLL 文件和 SuperMap Objects OCX 控件文件 通常把第一组文件安装到 Winodws 系统目录下, 后面两组文件需要在安装到同一个目录下, 为避免版本冲突, 最好不要将后面两组文件安装到 Windows 系统目录 1 MFC 支持库 DLL 文件 : SuperMap Objects 基于 MicroSoft 的 MFC 开发, 运行时需要 MFC 的运行库文件, 这些文件必须安装到 Windows 的系统目录 在 Windows NT 4.0 及 Windows 2000 以上系统中安装到 System32 目录 MFC 的运行库文件包括 : msvcrt.dll msvcp60.dll mfc42.dll 2 SuperMap Objects 支持库 DLL 文件 : SuperMap Objects 的支持库文件包括 30 多个动态连接库 为了避免版本冲突, 这些文件最好不要安装到 Windows 的系统目录下 DiskSerial.dll iconv.dll libexpat.dll lt_appsupport.dll lt_common.dll lt_messagetext.dll lt_meta.dll lt_trans.dll 60

第 8 章附录 lt_utils.dll lt_xtrans.dll mrsid32.dll mrsidd.dll NCScnet.dll NCSEcw.dll NCSEcwC.dll NCSUtil.dll sx32w.dll SmAlib50.dll SmCSF50.dll SmCtl50.dll SmDTM50.DLL SmeDgn50.dll SmEdit50.dll SmeImg50.dll SmeMemory.dll SmElem50.dll SmEng50.dll SmeSDB50.dll SmeSDBPlus50.dll SmFPS50.dll SmFSL50.DLL SmGrid50.dll SmImg50.dll SmLogRes.dll SmLsl50.dll Smlyt50.dll SmOCI.dll SmOdbc50.dll SmPmp50.dll SmPrj50.dll SmScn50.dll SmSym50.dll SmTopo50.dll SmWks50.dll 3 OCX 文件 SuperMap Objects 包括如下几个 OCX 文件 同样, 我们建议您不必安装到系统目录 这些文件安装之后需要进行注册, 您可以使用安装工具 ( 如 InstallShield) 提供的 OCX 控件注册功能, 也可以手工注册 ( 如使用 Windows 的 RegSvr32.exe) SuperMap Objects 安装包中还提供了一个专门的注册工具 Register.exe, 直接执行这个文件, 就可以自动注册同一目录下的所有 SuperMap Objects 控件 后面将详细介绍注册 OCX 文件的技巧和注意事项 61

SuperMap Objects 初级开发教程 SuperMap.ocx SuperLayout.ocx SuperLegend.ocx SuperAnalyst.ocx Super3D.ocx SuperTopo.ocx SuperGridView.ocx SuperWkspManager.ocx SuperLockInfo.ocx 如果使用了 SuperMap Objects 组件的数据库引擎, 则应该增加相应的数据引擎文件, 所有的数据引擎文件如下 : SmeAcad50.sdx SmeDB2Plus50.sdx SmeKingBase50.sdx SmeODm50.sdx SmeOrcPlus50.sdx SmeOSbs50.sdx SmeOSP50.sdx SmeOSqlPlus.sdx SmeSQL50.sdx 7.2.3 不可发布的文件清单 发布应用系统时, 有些文件属于 SuperMap Objects 开发版专有, 不能发布给您的用户使用, 如果您的用户需要使用 SuperMap Objects 进行开发, 可以向 SuperMap Objects 在当地的代理商联系 不能发布给最终用户的 SuperMap Objects 文件包括 ( 但不限于 ): 1 开发许可文件 (*.lic) SuperLayout.lic Super3D.lic SuperLegend.lic SuperAnalyst.lic SuperMap.lic SuperTopo.lic SuperGridView.lic SuperWkspManager.lic 以及 SuperMap Objects 安装包携带的扩展名为.lic 的其他文件 2 类型库文件 (VC 开发使用, 扩展名 :*.tlb) SuperLayout.tlb Super3D.tlb SuperLegend.tlb SuperAnalyst.tlb 62

第 8 章附录 SuperMap.tlb SuperTopo.tlb SuperGridView.tlb SuperWkspManager.tlb 以及 SuperMapObjects 安装包携带的扩展名为.tlb 的其他文件 3 帮助文档 SmProRef.chm SmStart.chm SmoTech.chm smsamlib.chm 以及 SuperMap Objects 安装包携带的扩展名为.chm 的其他文件 7.2.4 注册 SuperMap Objects 组件 首先, 把 SuperMap Objects 提供的 RegisterSuperMap.exe 文件打包到 Install Shield 中, 并且与 SuperMap Objects 的一系列 OCX 文件安装在同一个目录下 设置 OCX 文件所在的文件组的 self-registered 属性为 FALSE, 因为您准备自行解决注册问题 当然, 别忘记把 MFC 的运行库文件打包了, 并且把这三个文件所在文件组的 Potentially Locked 属性设置为 TRUE, 否则不能正常安装 接着, 在 Install Shield (6.22 以上 ) Script 中定义并实现如下函数 : (1) 定义 ExecuteAfterRebootOrAtEnd() 函数, 定义之后需在头文件中声明 ;( 注意区分大小写 ) function ExecuteAfterRebootOrAtEnd() STRING strtempfile; begin strtempfile = TARGETDIR ^ "\\Bin\\RegisterSuperMap.exe"; // 指定自动注册程序的目标路径, 请根据实际安装目录进行相应的修改 LongPathToQuote ( strtempfile, TRUE ); LaunchAppAndWait ( strtempfile, "", WAIT ); end; (2) 响应 OnEnd(), 并添加如下代码 : function OnEnd() begin if (BATCH_INSTALL) then //do nbothing else ExecuteAfterRebootOrAtEnd(); endif; end; (3) 响应 OnRebooted() 函数并添加如下代码 : 63

SuperMap Objects 初级开发教程 function OnRebooted() begin ExecuteAfterRebootOrAtEnd(); end; ( 完 ) 64