如何用map.readshapefile map绘制晶体的扭曲途径

第一章& 了解MapObjects&&& MapObjects是一套制图软件集,它使程序员能够把地图加到应用程序中去。&&& 通过MapObjects你可灵活地建立适合用户的地图接口。在小内存空间中,你能用多种工业标准程序环境之一去建立应用程序,你能够联合使用MapObjects与其它软件去实现地图与用户信息的联系。元素软件&&& 大部分商业软件在最近的版本中极度壮大,诸如字处理及报表等程序,其最初仅有几兆,目前却严重消耗磁盘空间。这就要看最新的计算机能否快速执行最新版本软件以至于不落后于旧机器使用老软件的效率。&&& 由于操作系统变得越来越复杂及用户对更多功能的要求也日趋强烈,程序也随之壮大了。然而典型用户也仅充分使用了这些大软件的10%-20%。那些没有用到的功能象一个大包袱,严重消耗了系统资源和磁盘空间。&&& 如何打破这种恶性循环?元素软件(Component software)是一技术上的重大突破。它提供了一种解决办法。&&& 元素软件的原理是把大的桌面应用软件的功能打碎成部件。开发人员可跟据需要恰当地将一些部件组合成工具箱,用它建立专用软件。这种部件叫目标(objects)。所用平台就是可视化程序语言。其结果就是精炼地程序快速经济地运行并且对特定的市场有很强的适应性。MapObjects的功能通过MapObjects你可完成以下甚至更多功能:显示一张多图层地图(道路,河流,边界)。放大,缩小,漫游。生成图形元素,如点,线,圆,多边形。说明注记识别地图上被选中的元素。通过线,方框,区域,多边形,圆来拾取物体。拾取距某参照物特定范围内的物体。通过SQL描述来选择物体。对选取物体进行基本统计。对所选地图元素的属性进行更新,查询。绘制专题图。标注地图元素。从航片或卫星图片上截取图像。动态显示实时或系列时间组数据。在图上标注地址或定位。&&& 本书开发了一系列通过VB,OLE,WinAPI扩展MapObjects的办法。&&& MapObjects可执行许多基础制图功能。但它不能执行某些高级功能。如,高质量地图输出,地图坐标系投影,表面模型或网络分析等高级空间分析。以及拓扑编辑。你可利用ESRI的其它产品如ARC/INFO,ArcView来实现高级功能。MapObjects简介&&& MapObjects包括一个OLE控件(OCX)叫做地图控件(Map control)和一组(三十多个)OLE目标(objects)。它适用于工业标准程序环境。如VB4.0,Delphi2.0,PowerBuilder,MS Access等。&&& MapObjects不适用于最终用户。它是为程序开发者设计的。程序开发者可利用MapObjects开发应用程序并把这些程序提供给下一级用户使用。&&& MapObjects运行于Win95或Win NT3.51或更高。&&& 最近,Mierosoft开始把OLE controls称作ActiveX controls。本书将元素称为控件(OLE controls 或 OCXs),但这些术语可与新术语ActiveX互换。MapObjects和OLE containers&&& OLE Automation object 是一种可编程目标,它可通过OLE Automation server来通讯。OLE custom control是一种软件元件,它可通过OLE container实现特定功能。OLE container和 OLE Automation Server就是VB,Delphi,Access,VFro。&&& OLE custom control有事件,属性和方法。&&& OLE Automation objects有属性和方法。&&& 在OLE Container中(如VB),你能联合使用Map Objects的目标和其它Custom controls,及利用别的程序中的OLE Automation objects(如 office)去建立应用程序。& 部件软件的优势 Map Objects(通常叫OCXs)可容易地用OCXs建立程序而免去C++ 冗长的代码,你可发挥专长于设计,工程,制图,而不是软件。你的Map Objects 应用软件不多占用内存空间。比其它 Win 支持的制图软件速度更快,MapObjects 直接建立在MFC 库上且优化执行。你有极大的灵活性去建立用户接口。你可在应用程序上建立几乎所有在Win95上见过的接口。&&& MapObjects的另一特点是,地图可以是程序中的主要元素也可是附属品。因此MapObjects尤其适合vertical应用软件。例如, 你的软件可能主要是商用数据库,当查询时可在表单上高亮度显示与查询内容相关的地图。使用MapObjects&& 把一张地图加到VB的表单上十分容易,如图**************************用 MapObjects编写程序的步骤:从CD-ROM装入MapObjects。启动VB在&工具&菜单下打开Custom controls对话框。如果安装成功你将看到ESRI MapObjects的全称。用鼠标点check box (选 MapObjects 可用)。你会看到MapObjects图标被加到VB工具栏内。选地图控件,把鼠标移到表单中,拖动十字丝把矩形框尺寸调到适当大小,释放鼠标,你的表单上就会有一个地图控件。通过地图控件属性框或通过对Data connection和图层目标的编程,你可向地图控件中增加地图数据。你还可以继续添加其它控件,如命令按钮和工具条,或编写代码来调用属性,事件和方法。编写,调试,编译。安装 MapObjects&&& 一旦从CD-ROM中成功装入,下一步就是向VB工程中增加MapObjects**************************&&& 当你打开一个VB的工程,工具档中包含了一部份你已购买的 VB控件。但并不是全部。你会发现制定缺省控件装入从而把MapObjects 包括进去是十分方便的。&&& 为达到上述目的,你可向C:\Program Files\Microsoft Visral Basic\Avto 32 ld.vbp中加入所需控件。一但你把MapObjects加入,在每次开始新工程时,地图控件将被自动装入。&&& 你可自己制定一次装入控件的数量。按需要决定控件的数量是一个好习惯。这样会使你的工程装入的快点且节省内存。加入一地图控件&&& 你可向任意VB表单中加入一个或多个地图控件。**********************************&&& &&& 当你向表单中加入一地图控件,最初它就象VB的图片框控件, 然而它的资源并不是位图而是矢量或栅格数据的图层。加入一图层&&& 你可通过地图控件的属性窗或通过写代码来加入图层。*******************************&&& &&& 你可通过地图控件属性窗口增加图层也可采用在图层属性窗口中对图层目标赋属性的办法加如图层。&&& 地图控件属性窗和图层属性窗是连接地图控件和图层目标的某些属性的通道。&&& 在实践中你可通过写代码来增加图层,因为你通常不能预言你的下级用户新需接的图层在哪里。下面是加入图层的例子:Dim dCON As New MapObjects.DataConnectionDim curLayer As New MapObjects.MapLayerdCON.Database = &c:\Data&curLayer.GeoDataset = dCON.FindGeoDataset(&Counties&)map1.Layers.Add curLayer&&& 这是一段通用程序,下一章我们将进一步讨论MapObjects的数据通道(data access)目标,将介绍更多的增加图层的程序。编写代码和增加属性&&& 以下是如何使用VB代码编辑器和设置属性:&***************************************************&&& 象其它所有控件一样,当在地图控件上打开VB代码窗时,你就会看到关于地图控件的所有事件的代码结构。&&& 在最后一部分,你会看到在地图控件属性表中可快捷设置地图控件的属性。&&& 注意,在标准属性窗口中,地图控件的一些属性是不可见的。这些属性是只读的。我们在后面会涉及。取得MapObjects的帮助&&& MapObjects具有在线帮助系统,它包括MapObjects每一目标的属性,方法和事件,以及常量的详细说明。&&& 大多数帮助的主题下都有一小段程序例子,它可在VB下执行。下面有三种办法可得到帮助:你可点工具栏中地图控件并按F1。可通过VB的目标浏览器与MapObjects的帮助建立联系。可把VB编辑窗口的文本游标移到MapObjects的某一目标,属性或事件上按F1。&&& 一种最好的学习MapObjects的方法就是学习例子。以下是使用例子的步骤:在帮助的主题下点例子。打开一新VB工程并加上一地图控件。当表单是活动状态时按F7打开代码编辑器。读例子的结构,并向表单中加入特定控件。从例子中粘贴代码到代码编辑器中。按F5或选择RUN。你的例子将被运行。运行工程&&& 你可编写一小段应用程序。加入地图控制并加入一个或多个图层。在编写时你不会看到任何图层显示出来。但当程序运行时,你就会看到图层将掌满显示区域,如果没制定符号属性(颜色、大小 、型),则缺省设置将自动启用。使用OLE Automation objects&&& 除了地图控件以外,MapObjects包括三十多个OLE Automation objects,这些目标是MapObjects区别于同类产品的制图软件部件,它们提供了灵活性和多功能。OLE Automation objects是编写交互的高效应用软件的关键。使用目标浏览器OLE Automation objects在打开VB之初并没有呈现出来。但可在目标浏览中看到它们,点View菜单中object Browser,在库/工程下拉框中选&Mapobjects-ESRI Mapobjects&你就会在类/组件列表框中看到MapObjects的constants和目标。点任意目标,在方法/属性列表框中就会有增加。点任意方法或属性,你就会在目标浏览器底部看到一小段描述。点question按钮,就会得到on line帮助。引用OLE Avtomation objects&&& 大多情况,用MapObjects就要用地图控件。地图控件是一种可视化元素,然而有一些用MapObjects编制的应用程序并不需要地图控件。你可以在VB的Reference窗口选中MapObjects OLE Automation objects而不用增加地图控件。在VB工具&&& 注意,如果你把MapObjects加到VB的工具栏中,也就自动地引用了OLE Automation objects。声明目标当你声明或建立一新目标时,最好写全名,例:Dim rSet As New Mapobjects.Recordset而不是Dim rSet As New Recordset&&& 这不仅可提高运行效率,也避免了潜在的命名矛盾。如 MapObjects的Recordset目标和VB的Recordset目标。使用常量&&& 本书涉及了所有MapObjects可用的常量,在设置变量或属性时可使用常量而不是数值。常量代表的具体数值请参阅参考手册和在线帮助。明确变量类型&&& 如果你还没有做准备,你就应该在VB的工程中声明变量和目标的类型。从Tools 单中选Options项,在Options对话框中点中 Require Variable Declaration,在任何一个新表或模块中都会具有这个设置。&&& 在声明段,你的微不足道的变量和目标声明工作将换来少测试和高效的表。MapObjects的数据源&&& 你可通过MapObjects使用形文件,图像文件,属性表或通过ESRI的专用数据库引擎连接的专用数据库。形文件是地图数据的矢量形式,图像文件是栅格图像或尤指航空或卫量的畸变图像的纠正照片,属性表是可用ODBC装入的任意格式。&& 专用数据库是网络上通过ESRI专用数据库引擎连接的UNIX服务器。&& &&& 形文件适用于中小型地图数据。而大型数据(省,国家道路网),你就需使用专用数据库。&& 用MapObjects编写的软件是可伸缩的。最初你可用形文件。当用户需要与大型数据库连接时,几乎所有代码都可被移到与专用数据库连接后的工作中,你仅需修改打开数据源的几行代码。形文件&&& 形文件是ESRI提供的存储地理数据的矢量格式。这就意味着地图元素以X,Y形式出现。其坐标系是笛卡尔坐标。注意,笛卡尔坐标与屏幕坐标有所不同。&&& 每一元素的几何形状以包括一组矢量坐标的形的形式存储。其属性存放在与形文件相连的dBASE的记录中。以下是得到形文件的不同方法。购卖商业地图数据。MapObjects提供的光盘。ARcView,ARC/INFO 等 ESRI 产品的数据。编写程序从其它格式中转换。&&& 一个形文件由三种文件组成,主文件(*.shp)包含几何形状。索引文件(*.shx)包含数据的索引。数据库文件(*.dbf)包含形的属性,你可以修改字段的定义。每一个形文件包含一种类型(点 弧 多边形)点有一个(X,Y)坐标和一个属性。弧段包含一条或一组(可连,可不连)的多义线。一条多义线是一组有序结点。每一弧段有一个属性记录。多边形包括一个或多个边界,一个边界是一个无交叉点的闭合环,一个边界可嵌于一多边形中而形成环形。边界的方向决定它是否代表区域内的面积。每一多边形有一属性记录。&&& 形文件通过ODBC读入,ODBC在装MapObjects的同时被装入并注册。&&& ARC/INFO用户应注意形文件中弧,多边形的定义不同于 ARC/INFO coverage中的定义。形文件无拓扑,因此,形文件允许你集合简单元素来合成元素。如,把几条polyoline会成arc。通过形文件,你可快速显示图形并具有一简单数据模型; 以简单数据模型换取快速显示,这使得对形文件进行拓扑编辑或高级分析变得十分困难。&&& 形文件是一种通用格式,如果你想编写程序直接读写形文件,你可以从ESRI网点 上下载ArcView V 2.0形文件描述。图像(Image)文件&&&& 你可通过MapObjects编写应用程序来显示多种图像文件。在地图中图像多来自航空照片和卫星图像。&&& 图像文件依靠带有灰度值或色标的一组像元来表示图片,这些像元无属性连接,其坐标系统与形文件不同。&&& 你可把图像文件精确重叠于大地坐标的形文件。MapObjects (或其它 ESRI 软件)用world files来配准图像。&&& 一个world文件是一个简单的文本文件,它包括数学参数来定义转换关系,其公式为:x' = Ax + By + Cy' = Dx + Ey + Fx'& 像元在地图上的计算坐标值X。y'& 像元在地图上的计算坐标值 Y。x& 像元列数。y& 像元行数。A&& X轴上像元的尺寸。B,D& 旋转关系项。E& 负的Y轴上像元的尺寸。C,F& 左上角像元中心的X Y地图坐标。&&& 注意 E 为&负&值,因为,形文件坐标与图像坐标Y方向正向反。&&& world文件是包含A,B,C,D,E,F值的连续行文本文件。&&& 注意 MapObjects不支持图像旋转。这样 B,D的值在 world 文件中是被忽略的。为果需要旋转,你可用 ESRI的ARC GRID。以下是MapObjects支持的图像文件格式。名称&&&& 描述&&&&&&&&&&&&&&&&&&& 扩展名&& World file扩展名BMP&&&& Windows bitmap&&&&&&&&&&&& *.bmp&&&&& *.bpwTIFF&&& Tag image file&&&&&&&&&&&& *.tif&&&&& *.tfwSUN&&&& Sun raster file&&&&&&&&&&& *.sun&&&&& *.snwERDAS&& ERDAS GIS or LAN&&&&&&&&&& *.gis&&&&& *.gswIMPELL& IMPELL bitmap&&&&&&&&&&&&& *.rls&&&&& *.rlwBIL&&&& Band interleaved by line&& *.bil&&&&& *.blwBIP&&&& Band interleaved by pixel& *.bip&&&&& *.bpwBSQ&&&& Band sequential&&&&&&&&&&& *.bsq&&&&& *.bqw属性表用MapObjects编写的应用程序,可通过一种关系与外部属性表相连。关系是连接元素表(元素表可是形文件的dBASE表,也可是从SDE层中得到的表)与属性表的表。为了这种连接,可安装 ODBC。这种关系留存于应用程序运行期间,它不会被写入文件中。&&&&&&&&&&&&&&&& &&& 要建立这种关系。你要确认一个元素表的某一字段,一个要与之建立关系的属性表和该属性表的一个字段。属性表的相关字段必须是primary key或允许在其上建立一独一无二的索引。有一例外,在少于100个记录的小型元素表上可建立无特殊字段的关系。&&& 一旦建立了关系,它就在元素表上建立了一种纽带,你可通过属性表的字段查询属性,但你不能在MapObjects中通过SQL表达式向里面增加数据。空间数据引擎&&& 如果你采用大规模地图数据组来组织工作,见意考虑使用空间数据引擎(SDE),一种高性能制图数据服务器。&&& 通过SDE,空间数据可存放于UNIX服务器上。用户的SDE应用程序可基于UNIX或WIN环境被编写,SDE提供软件开发和数据管理能力:管理大规模地理数据,提供地图无缝显示。通过某种商业关系数据库存储数据。通过一组高效的尖端空间数据操作来查询空间数据。&&& SDE包括一个C语言应用程序接口(API),它提供最大能力的执行效率和极大的灵活性。下一章,我们将详细解绍与SDE的连接。纵览MapObjects&&& MapObjects包含一组具有属性,事件和方法的目标。&&& 你已经看到你可通过地图控件快速建立一简单应用程序,但实际的应用中,需要使用OLE Automation objects。当你初次使用MapObjects你应了解这些目标、属性和方法。这些对于MapObjects的全部组织是非常有用的。MapObjects的目标分为四组:数据通道目标组地图显示目标组几何图形目标组地址匹配目标组数据通道目标组&&& 通过数据通道目标组,你能建立与地图数据的联系。增加属性值,从地图元素上反馈属性信息。数据通道目标组由以下部件组成:&&& 数据连接(Data Connection)目标是MapObjects通向地图数据的通道。它包括属性和方法来建立与地理数据集合(GeoDatasets)的联系。&&& 地理数据集合( GeoDataset)目标代表制图数据并可引用图层。它可引用形文件或SDE layer的数据。&&& 地理数据集合是对于一个数据连接的所有地理数据集合目标的总合。它是一特定文件夹中所有形文件或SDE数据库中所有SDE层。&&& 记录集合(Record set)目标代表一个图层的记录。如果你做了一个选择集,它就代表所选记录。它类似于数据库指针。&&& TableDesc目标给你关于与记录集相连的表的字段的信息。&&& 表(Table)目标是一个只读数据通道目标。它代表来自ODBC& 数据源的一个表单。你可增加一表作为与图层目标的关联或为了大批地址匹配。&&& 字段集合包括记录集目标的字段目标。&&& 统计目标代表关于一个记录集的简单统计信息。你首先应用一方法计算关于记录集的统计值,然后可在统计目标中检查结果。&&& 字串集合是一组标准字符串数据类型集合。你可通过它从其它目标中取值来自接口控件(如列表框)中增加数据。地图显示目标组&&& 通过地图显示目标组,你能用符号或专题描述画一张地图。你也可加入图像做为背景,在地图上显示动态数据。地图显示目标组由以下部件组成:&&& 地图控件使你能显示图层、图像层,和动态跟踪图层目标,你可编写代码来控制鼠标驱动绘图事件,设置显示参数,用方法可画元素,闪烁选择的元素,计算点与元素的距离,输入线,圆,三角。&&& 层(Layer)集合是服务于地图控件的图层目标和影像层目标的集合。&&& 图层目标代表带有一些显示属性的地理数据集合目标。它可让你处理专题地图,此目标有几个方法来查找和选择地理元素。&&& 图像层目标代表一作为地图控件上的背景的影像文件。&&& 动态跟踪图层(Tracking Layer)目标让你能动态拖拽元素而无需重显。这对实时数据获取是十分理想的(如GPS)。它也可用于显示基本几何形状(如三角、圆)和描述性文本。它们都不是地图数据的一部分。&&& Geo Event目标代表可加到Tracking Layer目标上的点元素。&&& 符号(symbol)目标是广泛使用的目标,它影响如何在地图上显示元素的许多方面。其属性包括:颜色、字形、大小、形状。&&& 文本(Textsymbol) 目标代表文本的某些属性(如准线、字型)&&& ClassBreaksRenderer目标使你能在图层目标中通过分类的办法依数值字段显示元素。&&& ValueMapRender目标使你在图层目标中通过特殊字段中单独的值,用符号来显示元素。&&& LableRenderer目标使你在图层目标中,依元素的某一字段的属性标注文本。几何图形目标组&&& 几何图形目标组提供几种功效:依从图层中选择的元素反馈几何信息;向图层添加几何目标;向地图中画几何目标而不更新图层。几何图形目标组由以下部件组成:&&& 矩形(Rectangle)目标经常用来设置和反馈地图范围,也用来画矩形。&&& 点集合存贮线和多边形目标的坐标。&&& 点目标代表具有X、Y坐标的点。&&& 线目标代表地图上的一条线。多边形目标代表多边形。它的头一个点和最后一个点在它的点集合上是相同的。&&& 椭圆目标代表椭圆和圆。地址匹配目标组&&& 地址匹配目标组让你进入一图层上的某个地址,该地址具有街道和地址范围并返回一个位置,你也可发现十字路口的位置和地名。地址匹配目标组由以下部件组成:&&& 地址匹配(Address Matcher)目标让你列出含有地址范围的道路中心线的地理数据集合,并具有为单个或一批地址匹配的方法。&&& 地址目标代表关于Address Matcher目标的方法中标准化地址。&&& 定位目标(Place Locator)让你列出带有地名的地理数据集并通过一个方法找出地名的位置。&&& 地址位置(Address Location)目标包含一段代码指示是否(或如何) 一个地址被解决如果已被解决指出与地址匹配的图型位置。&moView 应用程序&&& 我们提供一种叫作moView的应用程序来展示MapObjects许多功能的优点并提供模板,在这本书的许多章节将通过代码片段和来自于 moView 及其它例子的应用来揭示MapObjects。&&& 你可在MapObjects光盘的例子目录中找到moView,如要学习只需考贝moView文件夹到你的系统目录中。&&& moView是一种普通简单的制图应用程序。它的接口围绕着地图控件而调整,这种类型叫作地图中枢(map ceneric),也许在你的应用程序中地图很象是一个附件而不是核心。&&& 在应用程序中,没有硬编译代码(Hard coded)的数据源,你可使用任何MapObjects可接受的数据。moView展示了许多事件、属性和方法。并提供一个框架使你在开发程序时可踊跃前进。&&& 你可为某特定市场建立纵向应用程序。这时你可使用moView片段,它给你的应用程序做向导。并可扩展为特定应用程序所设计的接口。运行 moView &&&& 一但在VB内装入moView,你可按F5或点Run菜单中的& Start。&&&& 当你打开moView你就会看到一个主表和一个空地图显示区,你可点工具条中第二个按钮(地图目录)来引入图层,地图目录表很象VB中地图控件属性表单。moView 命令集moView的主要命令被装在主表的工具条中。打印,向缺省打印机输出地图控件上的当前显示。查找,可产生一元素查找表,通过它你可根据属性来定位元素。空间选择(Spatial select),将产生空间选择表,通过它可实行MapObjects的所有空间寻找方法。地址匹配(Adress matching),可产生地址匹配表,通过它可执行基础地址匹配。撑满(Full extent),在地图控件中撑满地图包括所有图层中的所有元素。放大( Zoom in ),开窗放大。缩小(Zoom out ),以鼠标点为中心降低地图比例二倍。漫游(Pan)标注(Edeneify),标注鼠标点或附近。图形(Graphics),激活图形工具条可画几何图形。框架开发&&& 用VB建立一地图应用程序的用户接口是一项特殊的要求。因为VB提供的控件最适合交互式文本和表,对于图形仅为边缘插图功能象地图的图式。moView的一个重要的中心任务是解决建立地图用户接口问题。&&& 我们不选用第三方控件,因为我们不能预言或假设你除了VB提供的控件以外使用什么控件。为建立地图应用程序的用户接口。 你可选择任何一个厂商提供的控件。&&& 对于moView 应用程序的源代码和表你都有通道与连接,无论你有无VB经验,moView 的代码对你都是有价值的。moView 的方针&&& 你会发现 moView 应用程序在VB下安装了一些程序标准,这些应用程序提高了应用程序的健壮性、可读性和可靠性。你的选择是由你和应用程序的大小和特性决定的。对于一成功的应用程序开发来说。程序标准是一个基本部份。&&& 在moView中使用的一些程序方法:用控件的标准前缀的命名约定。整个代码中大量的描述性注释。变量范围限制和全局变量限制。在开始阶段装入并隐藏表来优化执行。向标准模型中压缩数据和方法。第二章& 使用地图和图层使用MapObjects的起点就是向应用程序中加入地图并向地图中加入数据。向应用程序中加入地图十分简单,只需把工具箱中的地图控件加道VB的表单中,象其它控件一样,你可调整它的大小和位置,并可同过VB的属性窗口或地图控件属性窗口来改变属性。通过地图控件属性窗口加入形文件十分方便,当你在应用程序中使用MapObjects时,还会发现使用图层是十分必要的。最初,你会对向地图中加入图层感到不适应,你不得不研究大量的OLE Automatiion objects、SDE层和影像文件。但渐渐你会发现MapObjects的数据通道和地图显示目标具有极大的灵活性和多功能性。本章将涉及以下内容:如何在地图上表示层。层的次序。向地图中加入形文件。向地图中加入图像文件。建立地图用户接口。设置地图属性。数据连接。修改图层。动态跟踪层。本章将涉及以下目标:GeoDatasets集、DataConnection目标、GeoDataset目标、地图控件、图层集、图层目标、影像层目标、动态跟踪层目标、GeoEvent目标。使用MapObjects向地图中添加数据有三种方式:通过建立DataConnection、GeoDataset和图层目标及向地图目标的层集中添加数据的方法加入矢量地图数据。通过建立影像层目标及向地图目标的层集中影像层的方法显示影像地图数据以作背景。通过使用动态跟踪层目标和添加GeoEvent目标的方法实现动态跟踪。在地图上画层地图包含许多层。现在我们要讨论MapObjects的各种层目标和如何在地图控件中管理图层。用户眼中的图层地图的最上方是动态跟踪层,最下方为地图控件,中间为层集。层集中图层目标和影像层目标可以任意顺序排放,但通常影像层显示在最底层作为背景。以层方式工作十分有意,因为它十你很容易的选取同类地物。程序员眼中的层以下是影响显示地图数据的关键目标:地图控件是显示图层的平台,它有两个重要的属性:层集和动态跟踪层目标。层集包含图层目标和动态跟踪层目标。它们的顺序决定在地图控件中的相互覆盖关系。图层目标代表矢量数据。影响层目标代表栅格数据。动态跟踪层目标显示实时数据。地图控件的关键属性是层和跟踪层。当你向表单中假如一地图控件,你也同时建立了一个空层和空跟踪层。另一重要属性是Extent。它决定地图的显示范围。用Refresh方法在地图控件上画层。当你执行下列操作时Refresh方法将自动执行:向层集中加入图层或影像层。使用Pan和CenterAt方法。更新地图控件的Extent属性。使用Clear或Remove方法。注意,有些操作不会引发Refresh方法,在编写程序时应在这些操作后加上Refresh方法一使操作更新显示。标准控件的属性和方法如果你是VB的用户,你应了解一些标准属性和方法:Container、DragIcon、Index、Left、Height、Drag、Setfocus等,这里我们还将介绍一些Mapobjects的专门属性。层集层集是地图控件的重要属性,包含图层和影像层。使用Add方法可向层集中加入图层或影像层,无论增加了图层还是影像层,FullExtent属性都会使地图撑满。如果你想使全图重新显示,可设置Extent属性为FullExtent。Set map1.Extent = map1.FullExtentClear和Remove方法可删除层集中某层。例如:Map1.Layers.Remove (4)MoveTo、MoveToBottom和MoveToTop方法可改变层集中侧的顺序。层的表示可以有层名和索引两种方式。例如,下面的例子中索引号为2,层名名叫Hydrography:Map1.Layers.Item(2).Symbol.Color = vbBlueMap1.Layers(2).Symbol.Color = vbBlueMap1.Layers.Item(&Hydrography&).Symbol.Color = vbBlueMap1.Layers(&Hydrography&).Symbol.Color = vbBlue图层目标图层目标代表矢量数据。你可以下面的方式建立新层:Dim mLayer As New MapObjects。MapLayer当你通过DataConnection目标的FindGeoDataset方法把图层加到GeoDataset目标中时,以下操作将自动执行:Extent属性被更新为地图的最大范围。Records属性被分配了一Recordset目标。ShapeType属性将依据形文件类型被设成moPoint、moLine、moPolygon。Symbol设为缺省,并随即赋予颜色。如果FindGeoDataset方法成功,Valid属性将被设成True。Visible属性设成True。Renderer属性将设为Nothing,等待你设定其中的一个Rerderer目标:ClassBreaksRenderer、ValueMapRenderer、DotDensityRenderer或LableRenderer。Maplayer给你提供了一些强有力的方法以改变Maplayer的属性数据。这些将在第五章里讲述。影像层目标影像层目标表示你的层集中的一个图象文件。象图层目标一样,可以如此创立一个新影像层目标:Dim iLayer As New Mapobjects ImageLayer然后,你可在层集里用Add方法往你的地图画面里加入图象文件。你可能还要使用层集里的MoveToBottom方法,这样图象就不会挡住其它的层。当你将影像层附加图象文件时,Extent属性就会被更新,最大限度地反映地理范围。在同一地理坐标上,如果你想使用其它图层,图象文件应有一个相关的配准文件。反馈图层类型在层集里用Add方法加入图层或影像层,如方法成功,就会反回True。一旦层集里包括了一些层目标,你必须随时掌握各种层的类型。下面是在层集中返回层类型的例子:Dim Layer As objectsFor Each Layer In Map1.LayersIf Layer.LayerType = moMapLayer ThenMsgBook &layer& & Layer.Name & &is a map layer&ElseIf Layer.LayerType = moImageLayer ThenMsgBook &layer& & Layer.Name & &is a image layer&End IfNext Layer注意,我们必须将层声明为目标,这样Visual Basic可在运行时接受此定义。在上面例子中,还用到两个常量:moMaplayer和moImagelayer,这增加了程序的可读性。你可在MapObjects帮助屏上或在MapObjects程序员手册上查到所有常量的值。全面检查图层在上面例子的基础上,使用层集索引全面检查图层属性:Dim i As IntegerFor i = 0 To Map1.Layers.Count - 1If Map1.Layer(i).LayerType = moMapLayer ThenIf Map1.Layer(i).shapeType = moPoint ThenMsgBook &Layer number& & i & &is a map layer and contains points.&ElseIf Map1.Layer(i).shapeType = moLine ThenMsgBook &Layer number& & i & &is a map layer and contains lines.&ElseIf Map1.Layer(i).shapeType = moPolygon ThenMsgBook &Layer number& & i & &is a map layer and contains polygons.&End IfElseIf Map1.Layer(i).LayerType = moImageLayer ThenMsgBook &Layer number& & i & &is a image layer.&End IfNext i图层显示图层在地图控件中的显示顺序与其在层集中索引的顺序相反。新增图层的索引号总是0,以有图层的索引号按顺序递增。这与VB的一些集合有所不同。在地图控制单中,Layers 是按 Layers 集里索引值的例序排列来调用的.Drawing事件当你在地图上调出图层后,一系列事件就会起动。你可将程序放到这些事件后面,并可让用户取消调出的大的地图层。当你在地图控件中使用Refresh方法,就会出现如下情况:BeforeLayerDraw事件起动。层集按索引相反顺序调出。AfterLayerDraw事件起动。BeforeTrackingLayerDraw事件起动。如果任何GeoEvents加入到TrackingLayer中,他们就被画出。AfterTrackingLayerDrow事件启动。这些Drawing事件的一个使用方法是往地图上画一些几何图形,如线、圆和在地图上说明注记,另一使用方法是调出层集或TrackingLayer之前来检验状态。如果你的用户在地图上已启动了一种方法,而它又占用了太长的时间,你可按Escape键取消操作。你可赋予地图控件的CancelAction属性以下三种值。moCancelNone是说按Escape键将被忽略。moCancelMap将停止所有层的调出。moCancelLayer将停止当前层的调出。按Escape键启动DrawingCancelled事件。将程序放到事件后,以便应用程序可通过恰当的方法处理绘图过程的末端。在你的应用程序中控制地图的调出速度的方法是在地图控件中设置RefreshCount属性。Mapobjects在缓冲器里调出地图,当达到一定矢量数目时更新地图显示。缺省情况下,此属性为10,000。降低这种特性在较慢的计算机上可能会明显提高效率,增加这种特性将加快一些地图控件的调出。利用Win API扩充MapObjects应用程序MapObjects提供了一种方法来使用经常出现在Window应用程序接口程序中的两个变量 hDC和hWND。hDC是一句柄,一个唯一Windows分配给表面设备的ID号,如屏幕或打印机,通过它你的应用程序可产生可视操作。你可通过Windows API GetDC函数可以得到自己的hDC,但使用完,一定要用ReleaseDC功能退出。一旦你有了device context,你可用适合你的应用程序的Windows API图表来使用它。例如,在一个应用程序里,这个应用程序能够在地图点位上提供图符设制,你就可以象如下程序:Private Sub mapMain_BeforeLayerDraw(ByVal index As Integer, ByVal hdc As Long)If index = 0 ThenRenderIconicMarkers hdc, mapMain.Layers(index), picLogoEnd IfPrivate Sub RenderIconicMarkers(hdc As Long, layer As MapLayer, pic As PictureBox)Dim recs As MapObjects.RecordsetSet recs = layer.RecordsDim shpfield As MapObjects.FieldSet shpfield = recs.Fields(&Shape&)Do While Not recs.EOFDim pt As MapObjects.PointSet pt = shpfield.ValueDrawIconicMarker pt, pic, hdcrecs.MoveNextLoopEnd SubPrivate Sub DrawIconicMarker(pt As MapObjects.Point, pic As PictureBox, hdc As Long)Dim x As Single, y As SinglemapMain.FromMapPoint pt, x, yDim xPixels As Integer, yPixels As IntegerxPixels = Me.ScaleX(x, vbTwips, vbPixels)xPixels = Me.ScaleX(y, vbTwips, vbPixels)BitBlt hdc, xPixels - 16, yPixels - 16, 32, 32, pic, hdc, 0, 0, SRCCOPYEnd Sub另一方面,hWnd是Map的真正的句柄。它存在于较大的hDC中,尽管它设计成为地图的属性,实际上hwnd是windows变量,不能够改变,只有运用API子程序,才能通过它。在下面的例子中,当用户在地图上拖动鼠标,就会出现一个矩形,依据矩形的大小显示地图。程序得到了地图的hwnd属性,用来设置显示设备。Private Declare Function Rectangle Lib &gdi32& (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongPrivate Declare Function GetDC Lib &user32& (ByVal hwnd As Long) As LongPrivate Declare Function ReleaseDC Lib &user32& (ByVal hwnd As Long, ByVal hdc As Long) As LongPrivate Declare Function SetROP2 Lib &gdi32& (ByVal hdc As Long, ByVal nDrawMode As Long) As LongPrivate Const R2_NOTXORPEN = 10Private Const R2_NOT = 6Dim g_hdc As LongDim g_hwnd As LongDim dragging As BooleanDim xs As Integer, ys As IntegerEnd SubPrivate Sub Form_Load()dragging = FalseEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)dragging = Trueg_hwnd = Map1.hWndg_hdc = GetDC(g_hwnd)SetROP2 g_hdc, R2_NOTXORPENxs = Form1.Scale(X, vbTwips, vbPixels)ys = Form1.Scale(Y, vbTwips, vbPixels)Rectangle g_hdc, xs - 10, ys - 10, xs + 10, ys + 10End SubPrivate Sub Map1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)If dragging ThenRectangle g_hdc, xs - 10, ys - 10, xs + 10, ys + 10xs = Form1.Scale(X, vbTwips, vbPixels)ys = Form1.Scale(Y, vbTwips, vbPixels)Rectangle g_hdc, xs - 10, ys - 10, xs + 10, ys + 10End IfEnd SubPrivate Sub Map1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)Rectangle g_hdc, xs - 10, ys - 10, xs + 10, ys + 10ReleaseDC g_hwnd, g_hdcdragging = Falsed = Form1.Scale(10, vbTwips, vbPixels)Dim pt As New MapObjects.PointSet pt = map1.ToMapPoint(X, Y)dist = map1.ToMapDistance(d)Set rect = CreateObject(&MapObjects.Rectangle&)rect.Left = pt.X - distrect.Top = pt.Y + distrect.Right = pt.X + distrect.Bottom = pt.Y - distmap1.Extent = rectEnd Sub向层里加数据在往地图控件中的层集里加入图层和影像层之前,你需把层集与数据相连接。通过DataConnection和GeoDataset目标可从文件系统或SDE数据服务器中查找和连接数据。DataConrection目标DataConrection目标用来连接装有形文件的文件夹或SDE数据库。要连接形文件文件夹,需设置数据库特性为具有文件夹名的串,并应用Connect方法。连接SDE数据库,需设置数据库,密码,服务器和用户特性,并应用Connect方法和检查连接特性。如果连接错误,检查ConnectError特性,对比ConnectionErrorCode,寻找错误原因。当你进行连接时,GeoDatasets就会移到当前层或SDE层中的形文件集里。GeoDatasets并不是自动移到层集里,而是目的在于组织一个接口,用户可以选择形文件或SDE使用GeoDatasets集中的FindGeoDataset方法,来使形文件或SDE层连到GeoDatasets。你可使用AllGeoDataset方法生成一个新的形文件。当你用这样方法生成一个形文件,也就是生成了一个TableDesc来设置新的形文件的生成。请参照MapObject手册或MapObjects帮助功能中的程序例子。GeoDataset目标和GeoDatasets集GeoDataset表示从形文件或SDE层中得到的地图数据的一层。Geo Datasets集表示DataConnection里所有的GeoDatasets,即文件夹里所有的形文件或SDE数据库里所有的SDE层。注意,MapObjects中GeoDataset属性是只写的。一旦你将GeoDataset放置到MapLayer或其它目标上作为一种属性,那么它不能恢复或改写。MapObjects里有3种属性:MapLayer目标的GeoDatasetct属性;AddressMatcher目标的SrreetTable属性;PlaceLocator目标的PlaceNameTable属性。增加形文件使用MapObjects的一个最基本的任务是往你的地图里增加形文件。以下是增加形文件的步骤:调出一个新的DataConnection。设置数据库属性为包含形文件的文件夹。调出一个新的图层。在DataConnection上使用FileGeoDataset方法,用形文件名设置Map Layer的GeoDataset属性。向层集里加入图层。Dim dConn As New MapObjects.DataConnectionDim mLayer As New MapObjects.MapLayerdConn.Database = &c:\MapObjects Data\Namerica\Mexico&Set mLayer.GeoDataset = dConn.FindGeoDataset(&Roads&)Map1.Layers.Add mLayer加入SDE层如果你需要运行一大规模地图数据,可使用ESRI的Spatial Database Engine(空间数据引擎)。注意,必须向服务器中按装ESRI的Spatial Database Engine。加入SDE层的许多步骤同加入形文件是一样的,但还需提供服务器名称,用户名称,密码以及SDE数据库名称。Dim dCon As New MapObjects.DataConnectionWith dCon.Server = &SpeedyServer&.User = &SDE user&.Password = &Top secret&.Database = &MondoMaps&End WithdCon.ConnectDim SDElayer As New MapObjects.MapLayerSet SDElayer.GeoDataset = dCon.FindGeoDataset(&LayerIWant&)Map1.lapers.ADD SDElayer在SDE层中,GeoDataset集对决定哪些层出现在SDE数据库里也是有用的。当你连接上一个DataConnection目标,GeoDatasets集将置于一个指定的SDE数据库的SDE层里。在形文件里,通常不用GeoDatasets集,因为你将使用VB的通用对话方式寻找一个目录下的形文件。而VB普通控制不能在SDE层里运行,GeoDatasetsconection能用来建立一个VisualBasic控件例如ListBox,ComboBox或ListView。增加一个图象文件增加一个图象文件是很容易的。你需做的只是申请一个新的ImageLayer目标,赋一个名字并把它加到一个地图的层集上去。以下是一个增加图象文件的简单编码的例子:Dim iLayer As New MapObjects.ImageLayeriLayer.File = &c:\data\Washington.bmp&Map.layer.Add iLayer你必须记住,如果MapObjects能找到相关的配准文件,它将自动应用这个文件。TrackingLayer动态跟踪层操作你可以在地图上动态地显示一个随时运动的物体。例如,你可以在你的地图上显示救护车,飞机,货车。动态跟踪层最适合接收从GPS接收器中接收来的实际的时间空间数据并在地图上动态显示。TrackingLayer和GeoEvent目标使你能显示随时间运动的模型。TrackingLayer和GeoEvent目标TrackingLayer目标代表一个在你的地图控件中的一层,它显示与层集之后,并可相对层集独立重显。GeoEvent目标表达一些TrackingLayer里的离散目标,这些目标可以用编程的方法移动。TrackingLayer和GeoEvent目标的属性和方法当你向一个表单增加地图控件时,你就自动拥有一个TrackingLayer目标,它是地图的一个属性。Event组是空的,EventCount的值为零。使用TrackingLayer里的AddEvent方法可生成一个新的GeoEvent目标。Map1.TrackingLayer.AddEvent 2, 0一旦你加入GeoEvent,它就被加入TrackingLayer目标的Event数组中。你可通过分配TrackingLayer目标中的SymbolIndex给GeoEvent目标分配符号。你还可通过编程时时控制符号的位置和方向。Refresh方法可以不重显层集而单独重显TrackingLayer,这是TrackingLayer的一个重要的特性,因为你可以不用调用下面的地图层而快速地完成显示。当你调用Refresh时地图控件的两个事件将被引发,BeforeTrackingLayerDraw和AfterTrackingLayerDraw。为地图层建立一个用户界面在所举例子的代码中我们已讲过了增加形文件,SDE层和图像文件的方法。我们编程输入数据资源,而忽视了这些资源的有效性,并且在建立界面时没有用VB的其它任何控制。现在,我们将以moView为例,为地图层建立一个用户界面。介绍moView我们将从遍历MapContents form所有性能开始,接着我们将解释它代码的性能。如果你按一下工具栏里的Map按钮,MapContents框将显示。用Add File,和Add SDE Layer按钮给一个地图增加层。一旦你增加了一些层,moView的主表单将开始显示地图数据,MapContents框里的一个Visual Basic List View控制将层名以及状态的说明。MapContents控制里有八种设定的状态:点图层可见,线图层可见,多边形图层可见,图像层可见,点图层不可见,线图层不可见,多边形图层不可见,图像层不可见。在表单中查找一个文件要增加一个图形或图象文件时,击AddFile按钮。你将会看到常见的打开文件的对话框出现。注意,形文件(*.shp)为缺省文件类型,但你可以按类型BOX来选择两个常用的图象类型windows bitmap(*.bmp)和Tagged Image File Format(*.tif),或者其它任何图象文件类型。下面是Map Contents表单里用来建立常见的对话框和返回文件的编码。这个过程处理以&shp&为扩展名的形文件和其它的图象文件,这些文件增加层的过程中实现。往表单中加入一个形文件如果加入文件的过程中发现一个带有&shp&后缀的文件。那么这就是往地图层集中加入文件的过程,注意,由于地图是在不同于地图控件的表单上,层集被定义为.mapDisp.Layers,frmMain是起动表单,MapDisp是表单上的地图控件,Layers是地图的层集。**************P62往表格中加入图象文件如果加入文件的过程中发现不是形文件,那么这就是往地图层集中加入ImageLayer的过程。在moView上,往层集里加入图象文件时,总是加到了层集底部,以避免它覆盖其它层。*************P62往表格中加入SDE层在MapContents表单上,按AddSDELayer加入SDE层。表单会显示一个对话框。首先,输入服务器,用户和密码值,这些会设置为DataConnection的属性,按下Connect,联接到服务器上。联接好了以后,这个SDE层将在表格右边的显示框中显示出来,可以加入一个或许多SDE层。更改一个层集里的层的顺序你在MapContents表单中上下移动层的顺序。你将会在MapContents表单的底端发现分别带有向上和向下箭头的两个按钮,当你选择表中顶端的层时,你将会看到向上的箭头将会变模糊并且不能实现,同样,当你选择表中底端的层时,向下的箭头将变模糊并且不能实现。首先,选择好要选的层,按其中的一个按钮来提前或排后它在层集中的位置。向上和向下箭头的按钮在一个由Visnal Basic提供的Toolbar控制里实现。建立层集的一个Listview在moview应用中,我们选择了Visual Basic List View控制来管理层集。还有其它的可用的控制:ListBox或ComboBox。但我们认定,List View控制为最好的建立一个用来管理层的用户界面的方法。因为ListView控制有一个List Item对象,每一个对象可以用来编程以响应一个层。我们可以配合Map Objects层集中的方法来用Visual Basic List Item里的方法。我们想用控制的方法来描述一个层是否可见和层的类型。你可以在界面上看到两个标识,但是对于某一个List Item对象只有一个标识是可以实现的。下面是我们使用List View控制的技巧:我们有两个可见的状态和四种层的类型(点,线,多边形和图相)。所以我们为每种可能建立了八个bitmaps,把它们放到一个Imagelist中,并把Imagelist和Listview控制联系起来。每当层集的状态发生变化时,MapContents里将有一个重建Listview控制的调用。下面是重建ListView的过程:*******************P66触发 List View 里的可见状态.在Map Contents form List View控制里,你可以在checkbox里按键来触发层的可见状态。下面是ListView里触发的操作。当你按一个ListView控制里的键时,ListView的MouseDown事件将启动,当你在一个ListItem对象里按键时,ItemClick事件将启动。下面是Map Contents form激发可见状态的步骤:在MouseDown事件中截断X和Y坐标mouseX和mouseY是form的特有变量。**********************P67如果X的位置小于checkbox(250 tmips)的宽度就调用toggle Checkbox过程。*********************P67toggle Checkbox用Not运行的方式来弹出可见特性,ListView被重建,地图被重新画。******************P67为地图属性建立界面Map Contents form具有四种地图通用显示属性:背景色,边界类型,取消控制,滚动条。当你点General表时,便可设置这些属性。设置背景色Private Sub pctLightYellow_Click()frimMain.mapdisp.BackColor = pctLightYellow.BackColorEdn Sub设置边界类型边界类型决定是否在地图周围划一条线。0表示无边界,1表示设定一个简单的固定的线。Private Sub cboBorderStyle_Click()Dim status As Integerstatus = left (cboBorderStyle.Text, 1)frmMain.mapDisp.BorderStyle = StatueEnd Sub设置滚动条Private Sub chkscrollbars_Click()If chkscrollbars.Value = 0 ThenfrmMain.mapDisp.ScrollBars = FalseElse If chkscrollbars.Value = 1 ThenfrmMain.mapDisp.ScrollBars = TrueEnd IfEnd Sub设置绘图取消状态Cancel Action功能详细说明了当你按下 Escape 键时会出现的情况,我们已讨论过这一功能,数值为0,不取消绘图;数值为1,停止所有图层上的绘制;数值为2,则停止当前一层面上的绘图。Private Sub cboCancelAction_Click()Dim status As Integerstatus = left (cboBorderStyle.Text, 1)frmMain.mapDisp.CancelAction = StatueEnd Sub第三章& 坐标系和几何目标&&&&& 一但你在应用中引入一张地图,你可就要对其进行一系列的操作。地图控件和Map Objects中的一组目标提供了许多工具,可以实现移动,放大或缩小地图的比例,地图漫游或查询等功能。&&&&& 在这一章,我们将探讨一些技巧,来改变正在被观查的地图区域的范围, 计算地图的比例尺,从地图上得到地理坐标,将屏幕上的坐标转换为地图坐标,或是相反操作,选择或添加地物。我们将在moView的范例中涉及这些技巧。&&&& 贯穿MapObjects终始,我们将常提到几何目标,理解几何目标的关键在于要认识清楚它们是为许多目的服务的。例如:在地图控件中从鼠标交互操作中返回几何目标,返回&& 所选图形在地图控件中进行点与范围的交互操作。定义被显示的地理区域,创建新图形几何目标等等。以下是本章涉及的主要内容:控制坐标和表单坐标是如何在屏幕上定义的。使用地理坐标来设定某一地理元素。地理坐标和控制坐标的转换。设置地图范围和对地图比例尺的操作。从地图上得到某一位置。漫游和缩放。重置地图尺寸。从图形上标定几何目标。创建新几何目标。下面是这一章中我们将讨论的Map Objects目标:  Map Objects中的几何目标,特别是矩形目标是在地图上进行位置交互操作的关键。当我们谈及有关几何目标的课题时,我们也会向您介绍如何在地图上画上些基本的几何图形。例如:直线,矩形和圆。坐标系当你使用地图控件来显示一个地理区域时,了解Map Objects的地理坐标和Visual Basic的表单坐标之间的关系至关重要。控制坐标(control coordinate)&&& 在Visual Basic表单中左上角为原点,水平方向为X轴,竖直方向为Y轴。  Visual Basic以twips作为缺省的测量单位。你可以把表单的单位改成点,pixels ,字符长,英寸,毫米,厘米。或通过设置 Scale Mode属性来实现自定义单位设置。但在我们的讨论中我们应用twips,因为它是系统默认的缺省单位。在表单内的地图控件也有它自己的坐标系。其坐标单位与表单坐标相同。我们地图控件中的坐标称为&控制坐标&(control coordinate)地图坐标(Map coordinates)&&& 地图控件也可工作于地理坐标中。遵循笛卡尔坐标系原则。不同于Visual Basic表单的坐标系(左上角永远是0,0)地图控件内显示的地图坐标范围,时常在应用期间改变。 每次当你移动某一地图区时,地图控件内地图坐标范围就会变化。表单坐标与地图坐标间有一些关键的区别:地图控件的控制坐标的左上角的一位置为(0,0)。地图坐标通常都有一个在地图控件区域很远以外的原点( origin )。应当记住,你的地图控件只是地图表面的一个小窗口。控制坐标Y轴延向下递增,而地图坐标Y轴延向上递增。控制坐标以twips为单位,并且与你的计算机屏幕显示的实际尺寸有关。地图坐标则用米,英尺等单位表示,并且与地表特征的测量有关。  &&& 你可以把地图控件当作一个放大镜,在一块地域内可随意移动这个&放大镜&并增大或减小其放大倍数。  你地图数据中所用的坐标值通常很大,有的甚至是成百上千或数以百万计的。这些坐标值通常是以英尺或米为单位的。你地图资料的坐标,可以不同的坐标系为基础,如平面坐标系( SPCS:State Plane Coordinate System) 或麦卡脱坐标系( UTM:Universal Transverse Mercator)以及其它坐标系。如果你是从别人那里得到的资料,那么其提供者应已设置了适当的坐标系。  关于坐标系更细致的讨论超出本书的范围。但是值得注意的一点是应用Map Objects 时要确认图层上的资料用统一坐标系。如果不是,那些用了不同坐标系的图层是无法连接的。  如果你的地图资料应用了不同坐标系,并且你想同时在Map Objects中使用它们,那么你可以用一些其它软件,如&Arc-View&或&ARC/INFO& 来把你的地图资料转换成普通坐标系。该过程称为&map projection&(地图投影法)。地图与屏幕间的坐标转换地图控件有四种方法将位置和线性尺寸在&地图坐标&与&控制坐标&间转换。*****a: 用 Map Distance 方式,将以地图单位计算的距离长度转换成表格单位制下 &&&& 的距离长度。用 Map Point 方式地图上点的坐标。转换成 地图控件& 下标&&&& 准单位制的& X,Y 坐标。& b: To Map Distance 方式,将以表格单位下的距离长度转换成地图单位下的距离&&&& 长度。 To Map Doint 方式将 地图控件 下,以表格单位(X,Y) 为坐标的位&&&& 置转换成为地图单位的一个点。& c: 这些鼠标操作,将返回地图上表格单位下的位置, 您可用这些操作来得到屏幕&&&& 位置,并且坐标转换方式把它们转换成为地图坐标。&&&& 地图控件 下的四种转换方式:***********  要得到一点的地图坐标,可用ToMapPoint方法。你可使用鼠标事件(Mouse Down ,Mouse Move ,Mouse Up),从屏幕上选定一点,返回的 X,Y值就是其控制坐标。  要把地图坐标转换成控制坐标,用FromMapPoint方法,你将输入一个点目标并得到控制坐标的 X,Y 值,你可以其它方法应用这些X,Y值,来定义位置或选择地物。  若把控制单位下的长度转换成地图单位下的长度,要应用 ToMapDistarce方法。  把地图单位下的长度转换成控制单位的长度,要用FromMapDistance方发。在你的实际应用中,你可用地图控件下的TrackLine方法来画出一个轮廓,并得到其长度。************* &P77 (浏览器)&&& a: &moView 应用&使用 To Map Point 方式以当前地图坐标来记录统计栏内方&&&&&& 格控制板上的文本。&&&&&& 以当前光标可移滑块位置的地图坐标。来记录新近文本。&&& moView范例包括一个将控制坐标转换为地图坐标的举例:当你在地图图层中移动光标时你将看到当前地图坐标显示在表单底部状态条的第二栏中。在这个例子中。sbrstatus 是一个在 moView& 主栏中的状态条绦记录有地图坐标的文本信息在这状态条纹的第二个方框中被显示。*********位置和地图比例尺&&& 地图上最常用的一个操作是改变地图位置和比例。我们现在讨论一下用map extent来定位地图,用map scale来改变大小的技巧。&&& 在地图控件中地图范围以Extent属性代表,Extent属性是一个矩形目标,通过上,下,左,右边界尺寸属性来定位。这些尺寸是地图坐标数据。你可用许多方法设置地图的范围。如从某个图层上来取得地图范围或对另外一地图范围进行某些数学操作,你可将地图控件的Extent属性设置成你想要的新范围,在Map Objects中还有很多方法让你设置地图的范围。**************&&&& 下面是一些图框和功能你可能会用到。& a: Center At 方式可将图幅移至以(X,Y)为中心的位置。&&&& pan 方式通过拖拉操作。将图幅移动位置。&&&& Track Rectargle 方式。可用来从图上拖出一个矩形框来放大。& Interset 方式。可找到两矩形框的交叉位置。&&&& Union 方式。可找到两矩形框的接合处。&&&& Scale Rectangle 方式。增大或减小矩形的尺寸。& c: Extent 是当前图的范围。 Full Extent 是所有图层中最大范围。& d: Map layer 的范围是一个分隔和图形文件或 SDE 图层中所有特征的矩形。& e: Image Layer 的范围是个界定影像文件中所有间隔的矩形。& f: Top (顶) Left (左)。Bettem(底) Righl(右)定成了一个矩形区域。&P79& 地图控件 有一项功能叫做 Extent,这是一个矩形目标。&&&&& 为了考查 地图控件 中 Map1的地图范围。你可以考查这四项指标。&&&&& 就象这样:&&&&& 你可通过中间矩形目标(子窗口)来检查其范围。就象这样。&&&&& 下面是 Visual Basic 中一些设置地图范围的方法举例。&& 1 欲设置地图范围成一个分离坐标域(即分别赋值给中项指标)。&& 2 欲将 地图控件 设置为图层集合中第三层的范围。&& 3 欲将 地图控件 设置为所有图层的最大范围。&& 4 用一比例系数将 地图控件 设置成放大(200m in)的矩形。&& 5 将 地图控件 幅面设置为两图层跨越的区域。 加一更清楚但略繁琐的表达&&&& 方式为:&& 6 将 地图控件 的幅画设置成两图层交叉处的区域。&& 。 另一种清楚但繁琐的书写方式为:&& 7 欲在操作中得到整幅地图的全景。&&&& 当你启用 Pan 方式时,焦点箭头直接指向 地图控件,你的游标可随意设置&&&& 地图范围。移动地图内的游标(拖住游标)你会看到地图移动。当你松开手时,地&&&& 图的其它部分就会被重画。&P80 && 8 以(5)为中心重新绘制地图:***********  你还将在Map Objects下发现其它设置地图范围的方法。一个一般的技巧是让地图范围定义为矩形目标。使用矩形方法来改变矩形目标的尺寸。然后将修改过的矩形目标以地图控件范围大小放回。计算地图比例尺地图比例尺是地图单位下的实地尺寸和屏幕单位下的地图控件尺寸之间的比例。下面是一个使用moView例子来计算当前图面比例尺:************&&&&&& 计算地图比例尺的举例:*********当你做地图比例尺计算时,使用X轴或Y轴的值会得到同样的答案,如果你正在做手工运算。执行并比较一下不同尺寸下计算的结果。是一种好的检查方法。*********&P81&& 下面是一个在 地图控件 下计算当前地图比例尺的程序。&&&&&& 。。。。。。&&&&&& 在这个程序中,地图的比例尺将按水平坐标轴计算。它也能重过,纵坐标轴来计算。其结果将显示在&浏览器&(moView application)主栏底部的一个窗口内********重置地图尺寸许多Windows应用程序允许用户重置窗口尺寸。当使用者重置主窗口尺寸时,只需拖动窗口边框,工作区便会按比例放大或缩小到新的窗口的范围。你可以实践一下,重置包括地图控件在内的图框的尺寸。这是一幅关于重置浏览器窗口尺寸的示意图。********&&&& a:当你重置 moView application 主窗口尺寸时。。。。。&&&& b:不仅外框尺寸改变了。而且地图控制器(地图控件)的尺寸也随之改变了&&&&&& 伸展外框的同时,也伸展了地图。&P82& 这一对 地图控件 需于伸缩性的操作。其关键是对 地图控件& 所存在&&&&& 于的外框进行。尺寸重置操作。使用者任何时刻可使用鼠标拖动边框来设置 &&&&& 其尺寸。&&&&& 下面是在 moView application 中如何完成地图尺寸的设置。map Disp 是& 地图控件 在这一表格窗口下的名字。*************  这一程序考虑了主菜单下工具栏和状态栏的尺寸,更新Top,Left,Height和Width属性值,适时的填入表格的剩余空间。这一程序也确保在你将表格重置为小尺寸时。地图控件不会作为是不认可尺寸处理,这在Visual Basic中将会造成run time错误。  当你运行moView并设置图框尺寸时,你也会看到地图比例尺随之变化。这一现象发生在图层绘制操作过程中,之所以如此是因为重置地图控件的尺寸,系统会自动启动 Refcesh方法。Before Layer Draw这一指令下达到一个叫做Update scale 的程序中,这一程序可计算新图的比例尺,并将所得结果显示于状态栏中。注意到地图的范围在一程序操作中并未改变,所以所显示的地理区域保持不变,只是地图的比例尺规模发生了变化。如果你需要,你可加一些指令在程序中,来保持地图比例不变,并缩小或放大地图的范围。你可使用计算和设置合适的地图范围的方法。来保证比例不变。建立一个漫游和缩放操作的工具条工具条是一个下达命令的自然友好界面控制器,因为它使这些常用命令易于执行。*************-********  主控制板上的工具条有四个关于漫游和缩放的按键。Full Extent改变地图范围至图层集合中该图的全部范围,这一命令将地图控件的Extent属性设置到了Full Extent属性。Zoom in激活了地图控件中的Track Rectangle方法。当你在地图控件中移动光标时,你可拖住一个矩形框,而当你放开时,地图的新范围就会被设置在该矩形框中。Zoom out按照一个比例系数,以你在图上选定的点为中心计算新图的范围Pan激活了地图控件的Pan方法。在地图控件中拖住光标来移动地图使其以新的一点为中心。  Zoom in,Zoom out和Pan。属一个按键组,在这一按键组中,也包含了Identity 和 Graphics按键。这五个按键的共同之处是他们都是在地图控件中鼠标操作状态下的。例如:当按下Zoom in时,其它按键则被关闭,当你在图内移动光标Mouse Down会为Zoom in操作执行Track Rectangle方法,而不是为别的按钮服务。Full extent命令则不是该按键组的一部分。因为它不需鼠标操作而立即执行。  这些是应用工具条中命令使用的大体步骤。我们将举例来应用这些浏览器中控制器和指令。************&&&& 1。 为了你实践需要,建立小块地图。标准为 16*16 Paint 或 rester (光栅) &&&&&&& 编辑程序来建立地图。& P84 在 Paint 中编辑一个放大的 16*16 pixel 的地图块。&&&& 2。 将 Image List 控制器加到你的控制极上,如果你地图的颜色不合适,到了&&&&&&& Image List 功能的色彩表中将 Mask Coloz& 功能设置到未曾使用在该地&&&&&&& 图上的颜色。&&&&&&&& 在浏览器中检查一个 Image List 的控制器。&&&& 3。 将一个工具栏( Tool bar ) 控制器加到主控板上并将&查照&加到& Image&&&&&&& List 控制器上。接下来借助于在 Image List 控制器内的检索来增加关于&&&&&&& 图象的按键。工具栏功能菜单使得作为按键组和工具 tip 更易于提供图特&&&&&&& 征图例。除非你想要一幅大图象并在下面标注。&&&&&&& 插图说明(或字幕),否则应避免设置 Caption 功能。&&&&&&& 通过 Visual Basic4,改进 Tool Bar 和相关的 Image List& 是很麻烦的&&& 事。为了使 Image List 控制器和新图保持同步。你必须首先从 Tool bar 控制&&& 中分离出 Image List。&P85 ( 然后 Tool Bar 中的所有按键将变为横线),接下来, Mpolate 你的& Image&&&& List 并将其一重新分配到你的 Tool Bar 控制器中,然后,浏览所有按键, 并&&&& 重新输入图象检索值。遗憾的是,这是应用在 Visual Basic 中使 Tool Bar& &&&& 和 Image List 控制器成为适时状态的程序。&&&& 4。 将指令加入到 Mouse Down 操作中使系统执行&全景&操作和&远近&操作命&&&&&&& 令。下面是一些在浏览器中 地图控件 上进行 Mouse Down 操作的指令&&&&&&& map Disp 是这个 Map conrtol 的名字。bar Disp lay 是含有 pan, zoom&&&&&&& 命令的一个( Tool bar control )工具栏控制器的名字。&&&&&&& 与识别命令和几何图形绘制相关;更多指令,在这一操作程序中紧随其后。*************几何目标到现在为止,我们还未明确讨论过几何图形。但我们已经用过它来进行地图范&&&&& 围的变换操作和用鼠标事件从地图控件中返回点。下面是Map Objects中由六种几何目标形成的图形。****************&&& 所有为几何目标定义的坐标信息都是地图单位制,用地图控件中的FromMapPoint和 ToMapPoint方法把控制坐标转换成地图坐标。&&& Map Objects中的几何目标具特色。你可用它们来返回在地图控件上的位置和图形。从图层中获得所选取的图形,控制地图控件中地图的范围。或者检验某一特定目标是否存在于其它的目标之中。&&& 地图控件返回几何目标的四种方法是:Track Line,Track Rectargle,Track Cirtle, 和Track Polygon这些事件可用作选择,测量,生成图形和其它目的。图形与几何目标  六种几何目标中,点,直线和多边形有相同的几何定义。与形文件中和SDE图层中相应的特征形一样。形文件和SDE图层不能直接贮存椭圆和矩形。但它们可将其近似为多边形。下面是如何通过存在于形文件和SDE图层中的特征图例来绘制几何目标。***********& P87 ?a。 从一个名为 &shape& 的 Recordset 中返回 Field 目标中的 Value&& &&&&&&&&& 功能。通过这一操作。你可以图形文件或 SDE 图层的图例中建点,线或多&&&&&&&&& 边形目标。&&&&& b。 从图形文件中或 SDE 图层上返回的&直线&和&多边形&目标有阴影部分。&&&&&&&& 凭借 Recordset。你可以从图形文件或 SDE& 图层的图形中创立几何图形&&&&&&&& 。下面是一些通过 Recordset 重重显示每个图形的简单指令。&&&&&&&& 假定你有一个叫做 Map1 的 地图控件 和一个含有多边形叫做。&&&&&&&& Poly Layer 的 Map Layer (图层)。&&&&&&&&& (相关于)&&&&&& &&&&&&& 注意:有可能将图形写到图形文件中这并不符合关于图形。文件的详释。 一&&& 个例子是。修改一个多边形的点集( Points colletoom)以使首尾两点不同。&&&&&&& 在几何图形上可进行的关于 Map Objects 的操作,对图形文件中的图例来&&& 讲可能是不合法的。 Map Objects 不在你写到图形文件中的图形上。 执行任何&&& 合法操作。当读到你用 Map Objects 错误的建立或编辑的图形文件时, 你可能&&& 会碰到一些反常的现象。或软件运行失败。& P88& 直线与多边形允许多部复合。&&&&&& 与图形文件和 SDE 图层信息中的相应特征类似。 直线与多边形图形都能支&&& 持组合图形。意即直线( Line objects)& 能构成不连续的折线而这些不连续的&&& 折线构成拱形( Polygon obj)多边形。能构成许多环节,这些环节形成了一个多&&& 边形文件。&&&&&&& 直线与多边形图形能代表与图形文件和 SDE 图层兼容的组合图形,但它们&&& 的方式与性能并非为控制处理组合图形而设计。在 Map Objects 中建立组合直&&& 线与组合多边形的唯一途径是从(内存) Recordset& 中调用一图形来设置一条&&& 直线或一个多边形。同样也无法 programmatically 发现。某一给定图形是否由&&& 单体或多部分多合而成。你能在 Map Objects 中对简单图形进行简单编辑, 但&&& 修改编辑却是其它软件诸如 Arc View 或 ARC/INFO 之类的事。 Map& Objects&&& 不支持组合点图形文件。*************点目标点目标代表一种在地图坐标中具有X,Y值的几何图形。点的一般用途是:代表点形文件或SDE图层中的点。返回与相关位置相匹配的地址。代表地图控件上由使用者敲击鼠标的点。在直线和多边形目标中返回和设定坐标。返回几何图形交叉处的坐标。/*******************  & P89 A。 X,Y 是地图坐标系统中的迪卡尔坐标。&&&&& B。Distance To 方式计算两点间距。&&&&& C。Distance To Segment 方式计算点与由两点连成的直线之间的距离。&&&&& Peint Object 的性能与用法。*********以下是返回Point目标的属性与方法:矩形与椭圆目标的中心属性。多边形几何重心属性。点集的Item方法。Address location目标的定位(Loction)属性。地址匹配 (Address Matcher)目标的Match Intersection(交叉点匹配)方法。地图控件上的To Map Point方法。字段(Field)目标的值(Value)属性。以下是设置及通过Point目标的属性与方法:点集的增加(Add)方法。点,线,多边形与矩形目标的距离到(Distance To)方法。点目标的Distance To segment方法。地图控件的Draw shape方法。地图控件的Draw Text方法。地图控件的Flash shape方法。地图控件的From Map Point方法。点,线,多边形,和矩形的猎取交叉点方法( Get crossings)。点集的插入方法。多边形,矩形,和椭圆形内 Is Point In (点是否存在)方法。Map Layer目标的Search By Distance 方法。Map Layer目标的Search shape方法。点集合的set方法。Field目标的Value的属性。点集。 &&& 点集( points collection )由一组点目标组成,其目的是代表线和多边形目标的几何形状。下面是一部分点集的常用操作:编辑线和多边形目标的几何形状。返回重叠几何目标的交叉点。改变线和多边形的方向。*************************  点集是不可生成的目标。可把点集作为线或多边形等目标的一个确属性进行编程,或可利用某种方法。下面是更新线目标点集的例子。*****************以下是返回点集的属性( property ) 和方法( methods )。Get Crossings方法(点,线,多边形,矩形目标)。Place Locator目标的locate方法。线和多边形目标的点属性。&&& Add,Insert,Remove,Reverse,Set(增加,插入,转移,反转,设定)是修饰点集的点集方法。&&& 矩形目标&&& 矩形目标在Map objects中有广泛的应用,并对地图范围管理有重要作用。下列是矩形目标的常见用法:返回,修改地图范围。代表其他几何目标的范围。返回地图控件上鼠标拖拽的区域。代表图层中形的坐标区域或影像层的单元坐标区域。在矩形区域内选择其他目标。在地图控件上绘出几何形状。  矩形( Rectaingle ) 是可生成的目标。下面是生成新矩形目标的例子。************&&&&& P92&&&&&& 图形见原材料-**-*******以下为返回矩形目标的属性和方法:Map Layer目标的Area Of Interest属性。地图控件,图层,影像,椭圆和多边形目标的范围属性。地图控件的全范围属性。地图控件的Tack Rectangle方法。字段目标的值属性。下面是设置或通过矩形目标的性质和方法:Distance To方法(点,线,多边形和矩形目标)。地图控件的Draw shape方法。地图控件的Draw Text方法。点,线,多边形和矩形目标的Get Crossings方法。矩形目标的Intersect方法。矩形目标的Intersects方法。矩形目标的Union方法。Map Layer目标的Search By Distance方法。Map Layer目标的Search shape方法。Field 目标的值属性。Inset,Intersect,Offset,Scale Rectangle,Union是修改矩形目标的方法。线目标 &&& 线目标是具有线性几何特征,其几何形状由点集描述,点集中至少有两个点,下面是线目标常用法。代表线形文件(Line shapefile )或SDE层次的形状特性。返回用户用鼠标定义的条线。在地图控件上画出几何形状。选出与线交叉的其他目标。在前面讨论过,线目标可以有很多部分这种情况用来代表弧段。***********&&&&&&&&& 图表见材料&&& 线是可生成目标。下面是应用 Track Line 方法生成一条新线的简易代码。&&&&&&&&& 程序****************下面是返回线目标的属性和方法:地图控件上的Track Line方法。Field目标的值属性。下面是设定或通过线目标的属性和方法:点,线,多边形和矩形目标的Distance To方法。点,线,多边形和矩形目标的Get crossings方法。地图控件的Draw shape方法。地图控件的Draw Text方法。Map Layer目标的Search By Distance方法。地图控件的Flash Shape方法。Map Layer目标的Search Shape方法。Field目标的值属性。&& 多边形目标&&& 多边形目标具有线性几何特性,可构成一封闭图形。它的几何形状由点集描述,点集中至少要有三个点。下面是多边形目标的常见用法。在形文件或SDE层中代表地物。返回用户用鼠标定义的多边形。在地图控件上绘出几何形状。选择与多边形交叉的其他目标。***********&&& 多边形是可生成目标。下面是根据指定的坐标生成一新多边形的程序&&&& 注意在上面的例子中多边形的起点和终点坐标一致。在一多边形目标的点集中&&&& 加入点目标时, Map Objects 不可能。& P95& 辨别哪个点是最后一个,因此不能证实多边形是否闭合。&&&&&& 因此用户就要写下代码确保多边形目标的关闭。层管多边形不闭合时不会出&&&&&& 现运行时错误,但是区域和图形不会按预期的样子给出。&&&&&& 下面是另一段代码片段,可以根据用户的反应去 Map& 控制上返回一新多边&&&&&& 形。&&&&&& 使用上述代码可以保证多边形是闭合的。此类代码会被很典型地放置在 &&&&&& Map 控制的 Monse Dewn 事件中。&&&&&&&&&&&&& 图表见材料***************下面是能够返回多边形目标的属性和方法:地图控件的Track Polygon方法。Field目标的值属性。下面是设定或通过多边形目标的属性和方法。点,线,多边形和矩形目标的Distance To方法。点,线,多边形和矩形目标的Get crossings方法。地图控件的Draw shape方法。Map Layer目标的Search By Distance方法。地图控件的Flash Shape方法。Map Layer目标的Search Shape方法。Field目标的值属性。&&& 一种修改多边形目标的方法是Offset 。椭圆目标&&& 椭圆目标是一个表示椭圆和圆的几何体。它不常在Map objects中用到。以下是椭圆目标的一些用法:在地图控件上画圆或椭圆。在地图控件上得到用户定义的圆。****************&&& Inset 法:缩小椭圆。&&&&&&&&&&&&&&&&&&&&& Top,Boffom,Left,Right:&&& Is Point In 法:测试一点是否在椭圆内。&&& 设置椭圆大小。&&& Offset 法:移动椭圆。&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&& Ellipse&&&&&&&&&&&&&&&&&&&&&&&& object&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Center: 椭圆中心点。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Extent: 椭圆的矩形外界线。&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Height,Width: 椭圆短,长轴长度。&&&&&&&& 图3&&&& 椭圆对象&&&& 以下程序代码完成的工作是:在 地图控件 上得到一椭圆对象。&&&& Dim cur Ell as New Map Objects。 Ellipst。&&&& Set cur Ell = Map1。Track Circle。&&&& 圆可看作是椭圆的一个特例,创建一个圆对象时,长轴和短轴应设置为相同。此& 代码将会在 地图控件 的单击事件中执行。*********返回一个椭圆目标的方法是:地图控件上的Track Circle方法。通过一个椭圆目标的方法是:地图控件上的Draw Shape方法。&&& 两种修改椭圆实体的方法:Insert方法,Offset方法。第四章& 图属性的符号化本章,我们将探讨符号化图层和用带属性值符号描述地物两种操作的技巧。如果你愿意使你的图如同一幅艺术画,那么精通Symbol和Renderer是非常是有必要的。本章包括以下几个部分:用符号表示地物。确定 Visual Basic 和 Map Objects 颜色属性。使用 Map Objects 中颜色,标记,线型,填充类型常量。用特殊的属性值符号化地物。用True Type字体注记。分类画地物。用点密度描述多边形中的属性。按照属性标注文本。用符号画用户定义的图形。在一点或直线所确定的位置上写用户定义的文本。打印图形。为了帮助你开始使用Symbol,Text Symbol及Renderer object,我们来看这几个选自应用实例的范例,并通过这几个例子来说明Symbol,Text Symbol及Renderer object的使用。Symbol目标制定颜色,厚度和类型属性,Text Symbol目标制定字型及其他文本属性。DotDensityRenderer,ClassBreaksRenderer,ValueMapRenderer和LabelRenderer目标提供依照属性值画地物的方法。地图元素的符号化当你往图形上增加图层时,你会很快注意到系统已预先给各层着以不同的颜色。这是为了便于区分各层,但通常,你要控制为各层定义的符号。Symbol目标MapLayer object的Symbol属性决定一个图层或几何对象中以何种样式画出。你可以读写Symbol object中所有属性。然而有一些属性是否可用取决于Symbol Type (符号类型) property 是否被设置为moPiontSymbol,moLineSymbol,moFillSymbol中的一个常量。当你创建一个新的 MapLayer object 时,它会自动先给 Symbol Type 设置一缺省值:Geo Datasets中的点状地物置为moPiontSymbol,GeoDatasets中的线状地物置为moLineSymbol,GeoDatasets中的多边形地物置为moFillSymbol。你可直接配置 SymbolType 属性而不必考虑符号的实现。例如,在图层中,不必将SymbolType置为 moPiontSymbol 而直接符号化多边形中心。以下五个目标均与Symbol目标有关:图层目标有Symbol属性,用统一的符号来画一图层上所有属性,这是Symbol object的最一般用法。地图控件的DrawShape方法是使用Symbol object来画几何目标。ClassBreaksRenderer object用一组Symbol objects来画各类地物。ValueMapRenderer object是把一组Symbol objects赋给几个具有特定属性值的地物。TrackingLayer object是用一组Symbol objects来画Geo Event目标。颜色属性MapObjects中有关颜色的属性沿用VisualBasic中各种颜色的定义,也就是一种颜色是一长整型整数,其各字节表示红,绿,蓝的组成。你有许多确定颜色的方法:长整型整数; Visual Basic 中的颜色常数如 && vb B Visual Basic 中 RGB 或 QBColor 函数;或 Map Objects& 的颜色常&& 数如 moRed.&&&&& Map Objects 为方便使用而提供了23个颜色常数,这样便易于提供 Visual& && Basic 中没有定义的颜色.详情请查阅 Map Objects Programmer's& Reference&& 中各种颜色的长整形整数值以及与颜色确定有关的细节.&&&&&&&&&& mo Black&&&&&&& 黑&&&&&&&&&&&&&& mo Yellow&&&&&& 黄&&&&&&&&&& mo Red&&&&&&&&& 红&&&&&&&&&&&&&& mo Lime Green&& 灰绿&&&&&&&&&& mo Green&&&&&&& 绿&&&&&&&&&&&&&& mo Teal&&&&&&&&&&&& &&&&&&&&&& mo Blue&&&&&&&& 蓝&&&&&&&&&&&&&& mo Dark Green&& 墨绿&&&&&&&&&& mo Magenta&&&&& 紫红&&&&&&&&&&&& mo Maroon&&&&&& 紫酱&&&&&&&&&& mo Cyan&&&&&&&& 氰蓝&&&&&&&&&&&& mo Pur Ple&&&&& 紫&&&&&&&&&& mo White&&&&&&& 白&&&&&&&&&&&&&& mo Orange&&&&&& 橙&&&&&&&&&& mo Light Gray&& 浅灰&&&&&&&&&&&& mo Khaki&&&&&&& 土黄&&&&&&&&&& mo Dark Gray&&& 深灰&&&&&&&&&&&& mo Olive&&&&&&& 橄榄绿&&&&&&&&&& mo Gray&&&&&&&& 灰&&&&&&&&&&&&&& mo Broun&&&&&&& 褐&&&&&&&&&& mo Pale Yellow& 暗黄&&&&&&&&&&&& mo Navy&&&&&&&& 天蓝&&&&&&&&&& mo Light Yellow 浅黄&&&&&&&&&& 标记,线和填充方式把 Symbol Type 属性设定为 mo point Symbol mo Line Symbol 或 &&& mo Fill Symbol 三个常值之中一个,也就是, 取一组常值集合中一个常值给&&& Symbol object.&&&& mo Point Symbol 点&&&&&&&& 符号类型 有3个常数.每个符号类型都&&&& mo Line Symbol& 线&&&&&&&& 对应有一组用于符号对象的符号式样常值&&&& mo Fill Symbol& 填充&&&&&&& && mo Circle Marker&&& 圆形点&&&&&&&& mo Solid Line&&&&&&& 实线&& mo Square Marker&&& 方形点&&&&&&&& mo Dash Line&&&&&&&& 虚线&& mo Triangle Marker& 三角形点&&&&&& mo Dot Line&&&&&&&&& 点虚线&& mo Cross Marker&&&& 十字形点&&&&&& mo Dash Dot Line&&&& 点划线&& mo True Type Marker True Type 点&& mo Dash Dot Dot Line 双点划线&&点的式样常值&&&&&&&&&&&&& 线的式样常值&&&&&&&& 填充的式样常值&&&&&&& &&& mo folid Fill&&&&&&&&&&&& 实填充&&&&&& && mo Transparent Fill&&&&&& 空填充&&&&&& && mo Horizontal Fill&&&&&&& 水平线填充&& && mo Vertical Fill&&&&&&&&& 垂直线填充&& && mo Vpwarkd Diagonal Fill& 左上斜线填充 && mo Dounward diagonal Fill 右上斜线填充&& mo Cross Fill&&&&&&&&&&&& 网状填充& && mo Diagoral Cross Fill&&& 斜网状填充&& mo Light Gray Fill&&&&&&& 浅灰填充&& mo Gray Fill&&&&&&&&&&&&& 灰填充&& mo Dark Gray Fill&&&&&&&& 深灰填充&&&&&&&&&&& 如果将 Symbol Style 常值设为 mo True Type ,Symbol object 会用Font 和 Character Index 属性以及 True Type 字体来写字符.若需要定制标志符,可创建一新的 True Type 字体来得到新符号.Map Objects CD-ROW 包括:几种 True Type 字体和很多可供使用的标志符.这些制图字体需在安装MapObjects 时选择安装 。 mo View 应用程序中符号化图层现在,我们将要探讨在 mo View 应用程序中符号属性是怎样通过表单和代码以对话的方式应用于一终端用户的.在 mo View Visual Basic 项目中,有与所见表单相关的表单文件Main.frm,Map Contents.frm,Layer Prop.frm 和 Symbol Prop.frm.其中Symbol Prop.frm 与 draw Symbol. cls 类模块相关联. draw Symbol.cls 类模块完成的工作是:将当前 Symbol object 显示在 Map Control 上.Moview中的符号属性表mo View 中的符号属性表的功能是:更改Symbol object 的所有属性.Symbol Prop.frm 中的 Mpdata Form By Symbol 过程反映了 SymbolProperty form 如何随着符号类型的不同而不同的.符号属性表单左上角绘有一符号.这个符号的象素信息由 draw Symbol 类模块写入 Map 控件 中. Symbol Prop.frm 中的一个过程调用了 draw Symbol,这个 draw Symbol 类用到 Map 控件首先,计算出 Map 控件的中心;其次,画出一个符合当前属性的符号;最后,这个符号以一窗口文件的形式返回.图元文件的作用是,该过程把该图形化符号划分为一个个信元放于-Grid 控件中以达到创建一个交互式图例的目的. Symbol Property form 不用Grid控件而Layer Property form要用到Grid控件.实际应用中,这也是一种建立生动符号图例的技术.用 Draw Shape 和 Draw Text 两种方法在 Map 控件上画图例, 比如填充柜形状,描述性文本以及各种符号.Symbol Property form 中式样的列表随着当前 Symbol Type 不同而升级.Layer Prop.frm 中的 load Style Combo 过程反映了 Combo box& 更新情况.在单击符号颜色上(标签 color: 的旁边)的Picture Box 控件之后被激活的过程将调用普通对话框控件进行颜色的选择. tempSymbol 是保存当前符号对象的全局对象,以供 Layer Prop.frm 使用.draw Symbol 是一过程,它调用 draw Symbol 类在图象控件上画一指定的符号.Renderer object 尽管控制层显示属性最简单的方法就是给一图层设置符号属性, 但是其局限之处就是:在一个图层上所有属性都用同一符号描绘.在这一点上, Renderrt Objects提供了更大的灵活性,可用带参数的数据描绘属性.Map Objects 中有四个 Renderer objects:Value Map Renderer object :把一组符号赋给几个唯一值来画元素.Class Breaks Renderer object把一组符号赋给一定值域的几个值来画元素.Dot Density Renderer object以不同密度的点状图块对应不同的值的方式画多边形.Label Rendrer object从属性值下一个元素中提取文本.在以下几个部分,我们将探讨Renderer objects的一些实际应用.下面是适用于Renderer objects Symbol objects, Text Symbol objects的几条基本规则:用唯一的属性值符号化地形要素你经常会用唯一属性值符号化地图.假设当前你有一个图层,由几块陆地组成:一些是住宅区,一些是公园,一些是工业区等等.现在要干的工作是,从Recordset 字段中提取属性按土地使用类别给土地使用图着色.Value Map Renderer object 就是用来生成这类图的.Value Map Renderer object 在 Value Map Renderer object 的应用中, 若事先并不知道唯一的属性值是什么,通常在 Map Objects 中收集唯一的属性值的方法是: 迭代设置记录和使用字符串数组.如果一开始便设置字符串 Vnique property (唯一属性)为真,那么仅仅当一字符串原先不在字符串数组中时,这个字符串才能用增加法(Addmethod)来增加入该字符串数组.Count properyt(计数属性)表示字符串收集中唯一的属性值即不重复属性值的个数.值数组中没必要包括翻译区域中每个唯一的属性值.例如:共有20种土地使用类型,为了只给其中五种主要的土地使用类型着色而只用一种符号描述剩下15 种土地使用类型,所要做的工作是:给值数组和符号数组设置5组值;设置 vse Default 属性为真;设置该图层的符号属性就是剩下15 种土地使用类型的描述符号.mo View 中 Value Map Renderer 的使用mo View 应用程序的 Layer Property form 为 Value Map Renderer 提供了一个对话框.以下是在 mo View 应用程序中创建一个值图的步骤:1. 主菜单中单击 Map Contents 图标.2. 在 Map Contents form 中增加一个图层.3. 单击 Map Contents form 中的 properties.,出现 Layer property form后,单击Value Map.4.选择所感兴趣的区域.应用程序或许花费几秒钟的时间来计算(得到)唯一属性值的列表.如果计算出唯一属性值超过50条, 就会出现一消息框询问是否要查找更多的唯一值.此时,最好单击消息框中的 NO ,然后选择下一个具有较少唯一属性值的区域.5. 由你决定是否给未收集到的唯一属性值设置缺省值.如果&是&, 单击缺省符号(Default symbol)图形框后,便可给图层对象更改符号.6. 单击 Apply 按钮后,便完成这个 Value Map Renderer 的设置,当前图层属性已由前五步完成设置.下面程序代码在 mo View 应用程序中,完成的工作是:从对话框中提取所有的设置并由此得到一个新的 Value Map Renderer.这段代码是 Layer Prop.frm 中的一个过程(pro cedure),有几个关键元素:grd Value Map 栅格控制器存放值图翻译器用的唯一值, Record set (记录设置)针对的对象是frm Main 表单中 Map Disp 图形控制器所指定的当前层. unique List 字符收集器收集由记录设置所确定区域中的所有唯一值.用类别描述属性若 Recordset 的 Field 有一连续数值就不一定能创建值图.典型地,唯一属性值的数目会非常接近甚至等于记录数目.在一个类图(classifecation map)中,它将数值集合成一个个离散城,并且为每个城指定一个符号.下面是一个描述某地人口数量的例子. 假设要做一张地图,并且想用五种不同符号描述人口数的五个值城:0-9999人用黄色画;人的用浅橙色画;人的用橙色画;& 100000人以上的用红色画.在这个实例中,用3个值和100000 划分为四城三类.用 Class Breaks Renderer object 便可创建这类图分类翻译对象( Class Breaks Renderer object )以下程序代码完成的工作是:给 Counties 图层创建并配置一个 Class Breaks Renderer object:为生成并将ClassBreaksrendere object赋与名为Counties的图层,可用以下代码。接下来便可使用 Class Breaks Renderer object 的其他属性.一般说来,做一张类图是还要求给跨颜色的城着上颜色.使用 Ramp Colors方法之前必

我要回帖

更多关于 shape of you 歌词 的文章

 

随机推荐