MapObejcts组件应用设计(地图绘图输出).doc

上传人:sk****8 文档编号:3520268 上传时间:2019-06-01 格式:DOC 页数:11 大小:134.50KB
下载 相关 举报
MapObejcts组件应用设计(地图绘图输出).doc_第1页
第1页 / 共11页
MapObejcts组件应用设计(地图绘图输出).doc_第2页
第2页 / 共11页
MapObejcts组件应用设计(地图绘图输出).doc_第3页
第3页 / 共11页
MapObejcts组件应用设计(地图绘图输出).doc_第4页
第4页 / 共11页
MapObejcts组件应用设计(地图绘图输出).doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、地图绘图输出使用 Map 控件提供的属性和方法,学习本节前请先熟悉 Map 控件,重点掌握它的绘图属性和方法。2.8.1 坐标系1 Map 控件窗口坐标系Map 控件窗口使用直角坐标系,以控件窗口的左上角为原点,向右是 X 轴,向下是 Y 轴。坐标系默认的度量单位是缇(twip),缇是固定长度单位, 1 缇等于1/1440 英寸(inch)。Map 控件的鼠标事件函数使用这一坐标系。 在 VB 中,Form.ScaleMode 属性设置窗体的坐标度量单位,在 VB 6.0 版中,可以设置 7 种度量单位。ScaleMode 默认值指定窗体的度量单位是缇。窗体上的所有控件在默认情下使用 Form

2、.ScaleMode 属性指定的度量单位,因此 Map控件窗口的默认度量单位是缇。本书样例程序中使用的坐标长度单位是缇,本节中特别指定的程序例外。Map 控件窗口使用 Form 的坐标度量单位,因此可以用 Form.ScaleMode 设置Map 控件窗口的坐标度量单位,然而设置的度量单位对 Map 控件本身的函数和方法不起作用,如果不使用 Windows API 函数,不应更改 Form.ScaeMode 的默认值,以免引起错误。Map 控件窗口坐标系由开发语言的编译器定义,同一种语言编译器若来自不同的厂家,窗口坐标系可能有差异。不同的语言定义的窗口坐标系也有差异。2 Map 控件窗口数据坐

3、标系Map.CoordinateSystem 属性指定的坐标系,坐标系的定义方法与图层数据坐标系相同。在程序中若没有用语句给 Map.CoordinateSystem 赋值,则它的值是Nothing。此时 Map 控件窗口数据坐标系使用图层数据坐标系 。3 图层数据坐标系文件中的地图数据使用笛卡儿直角坐标系。坐标系及其坐标单位在投影元文件中描述。地图数据是点、线、面等图形要数的(X,Y) 坐标值。(1) 矢量地图数据的坐标单位若地图已经投影,则地图数据坐标使用长度单位,我国最常用的长度单位是米,小比例尺地图常用用千米。若地图未经投影,则地图数据坐标单位使用十进制度,X 坐标表示经度,Y 坐标表

4、示纬度。坐标(123.5,43.2)表示经度是 123.5 度、纬度是 43.2 度的一点。地图不进行投影,用地理坐标记录地图数据是地理信息系统中数据最优表示方案。我国国家基本比例尺地形图数据库采用这一方案。(2) 栅格地图数据的坐标单位用栅格像元在地面对应矩形的长和宽表示坐标单位,像元所在的列号为 X 坐标,行号为 Y 坐标。栅格数据坐标系与设备坐标系一致。多数情况下栅格像元是正方形,也可以是矩形。4 设备坐标系输出设备具有自己的坐标系,用行、列表示坐标,用像素(pixel)作为坐标度量单位。像素是输出设备在介质上能描绘的最小图形,无论是图象、图形还是文字,任何输出都转换成像素在设备上输出。

5、在打印机或绘图仪的说明书上常使用 dot,就是指像素,用每英寸点数 (dot per inch 也称 dpi )表示分辨率。设备上的点以像素(dot) 尺寸为度量单位,以点所在的列为 X 坐标,以点所在的行为 Y坐标。如此定义的坐标系称为设备坐标系,设备坐标系的原点在左上角,向右是 X 轴方向,向下是 Y 轴方向。不难看出,如果坐标长度单位用 Pixel, Map 控件坐标就是设备坐标系。因此设备坐标系是控件坐标系的一种特例。多数设备的像素是正方形,也有是长方形的。有些设备绘图的最小像素尺寸可以通过软件或硬件设置。打印机、绘图仪、显示器是常见的输出设备,可以根据说明书设置分辨率。有些设备的分辨

6、率是固定的,不能进行设置。设备坐标系在对设备直接编程控制时使用,在 Windows 操作系统下,可以调用设备驱动程序控制设备,设备驱动程序及 Windows API 函数使用设备坐标系。VB 的预定义对象实例 Printer 和 Screen 提供了 TwipsPerPixelX 与TwipsPerPixelY 属性,可用于像素与坐标单位之间的转换。5 绘图显示过程中的坐标变换Map1 窗口显示地图的坐标变换过程如下:If Map1.CoordinateSystem = Nothing将图层坐标数据变换成 Map1 窗口坐标系数据用 Map1 窗口坐标系数据绘图Else将图层坐标数据变换成 M

7、ap1 控件数据坐标系数据将 Map1 控件数据坐标系数据变换成 Map1 窗口坐标系数据用 Map1 窗口坐标系数据绘图End If用 Map1 窗口坐标系数据绘图经过两步完成:将窗口坐标系数据变换成设备坐标系数据用设备坐标系数据调用 Windows 的 API 函数绘图用打印机绘图的坐标变换过程也是如此。6 Map.Extent 属性及 Map 事件函数中使用的坐标系Map1.Extent 属性中的坐标数据使用地图数据坐标系。Map1.Extent 属性各分量名称注释Map1.Extent.Width Map1 窗口的宽度Map1.Extent.Height Map1 窗口的高度Map1.

8、Extent.Top Map1 窗口的顶部边线 Y 坐标Map1.Extent.Left Map1 窗口的左部边线 X 坐标Map1.Extent 属性的各分量Map1 事件函数中使用 Map 控件坐标系,如Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Map1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)等函数中的 X、Y 表示鼠标当前位置在 Map1 控件窗口坐标系下的坐标,坐标单位是

9、缇。参见 MapExtent 目录中的程序运行结果。例 1 计算 Map1 窗口中的一点在 4 种坐标系下的坐标(完整程序参见样例目录Coordinate)Map1.CoordinateSystem = Map1.Layers.Item(0).CoordinateSystem.GeoCoordSysPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim DevX, DevY As SingleLabel1.Caption = “Map 控件窗口坐标系 X = “ &

10、 X & “ Y = “ & Y计算 Map 控件设备坐标系坐标:DevX = Form1.ScaleX(X, Form1.ScaleMode, vbPixels)DevY = Form1.ScaleY(Y, Form1.ScaleMode, vbPixels)Label2.Caption = “Map 控件设备坐标系 X = “ & DevX & “ Y = “ & DevY计算 Map 控件数据坐标系坐标:Dim aPoint As New MapObjects2.PointDim TwipsX, TwipsY As LongIf Form1.ScaleMode vbTwips ThenT

11、wipsX = ScaleX(X, Form1.ScaleMode, vbTwips)TwipsY = ScaleY(Y, Form1.ScaleMode, vbTwips)ElseTwipsX = XTwipsY = YEnd IfSet aPoint = Map1.ToMapPoint(TwipsX, TwipsY)Label3.Caption = “Map 控件数据坐标系 X = “ & aPoint.X & “ Y = “ & aPoint.Y计算 Map1 图层坐标系坐标:Dim thePrj As MapObjects2.ProjCoordSysDim bPoint As MapO

12、bjects2.PointSet thePrj = Map1.Layers.Item(0).CoordinateSystemSet bPoint = thePrj.Transform(Map1.CoordinateSystem, aPoint)Label4.Caption = “Map 控件图层坐标系 X = “ & bPoint.X & “ Y = “ & bPoint.YEnd Sub习题1 运行例题 1 程序,观察 Map1 窗口中点的坐标值变化规律,总结出 4 种坐标系的定义。2 交互式改变 Map1.CoordinateSystem 及 Form1. ScaleMode 的值,设计程

13、序实现例题 1 的功能。2.8.2 Map 控件的绘图属性和方法1 hWnd 属性hWnd As OLE_HANDLE OLE_HANDLE 是 long 数据类型的别名 , 因此 hWnd 的数据类型是 long 型。Windows 操作系统在屏幕上绘图时,并不需要使用屏幕整个显示区域,而只向屏幕的一个矩形区域发送数据,这种区域称为窗口。桌面上运行的每一个应用程序都有一个窗口,Windows 操作系统为了管理窗口,给每个窗口赋予一个唯一编号,称为窗口句柄(Handle)。对窗口进行操作时使用窗口句柄。在Windows 许多 API(Application Programming Interf

14、ace,应用程序编程接口)函数中,经常使用窗口句柄,且用专用的名称 hWnd 表示,在其它场合,也常用 hWnd 表示窗口句柄, hWnd 已经成了窗口句柄的专用名称。 API 提供了丰富的窗口操作函数,利用 Map.hWnd 属性可以增加地图窗口的显示内容,扩充Map 控件的功能。在 Visaul Basic 的 Objects Browser(对象浏览器)中,定位到 Map.hWd 按 F1 键可以看到样例程序。2 输出图像或图形文件在 Map 控件中绘制的地图可以形成栅格结构图像或矢量结构图形保存到文件中,也可保存到剪贴板中,供其它软件使用。有四个方法实现这项功能。ExportMap、E

15、xportMap1、ExportMap2 三个方法作用相同。(1) Sub ExportMap(exportType As ExportMapConstants, outputFile As String, scaleFactor As Double)将 Map1 窗口中可见范围的地图输出到 BMP 或 EMF 格式的文件中,也可保存在剪贴板中。输出数据格式和数据存放位置由 exportType 参数指定,含义如下表。exportType 值 数据格式 存放位置moExportEMF 0 EMF 文件中moExportBMP 1 BMP 文件中moExportClipboardEMF 2 EM

16、F 剪贴板moExportClipboardBMP 3 BMP 剪贴板exportType 参数值表outputFile 参数指定输出文件名称。scaleFactor 参数指定像元个数放大系数,X,Y 两个方向使用同一系数。例如,Map1 窗口中每行有 110 个像元,scaleFactor 的值是 3,则输出的图像每行有330 个像元。(2) Sub ExportMap2(exportType As ExportMapConstants, outputFile As String, scaleFactor As Double, useSourceDepth)在 ExprotMap 的接口参数

17、中增加 useSourceDepth 参数形成 ExportMap2。当Map 控件窗口中含有影像图层时使用 ExportMap2 方法。useSourceDepth 参数是 Boolean 型,缺省值是 False,。指定在输出的图像中是否采用影像图层的调色板(Pallete) 。若 useSourceDepth 取值为 True,则输出影像采用原图像层的调色板,即目标影像与原影像的位层面数相同,影像色彩保真。(3) Sub ExportMap3(formatType As ExportMapConstants, formatData, scaleFactor As Double = 1,

18、scaleSymbology As ExportSymbologyScaleConstants = moLineSymbolsNotScaled, exportDepth As ExportDepthConstants = moExport8BitDepth, palette As ExportPaletteConstants = moDefaultPalette)这个方法在 ExportMap 的接口参数中增加三个参数,可为输出影像进行更多参数设置,含义如下:1) ExportSymbology 指定输出影像中的符号是否按 scaleFactor 因子进行比例拉伸,取值的含义如下表。Expo

19、rtSymbology 参数值 含义moNoSymbologyScaled 0 符号尺寸不变moLineSymbolsNotScaled 1线的宽度不变,符号的其它尺寸乘以scaleFactormoAllSymbologyScaled 2 符号尺寸乘以 scaleFactorExportSymbologyScaleConstants 枚举常量值表2) exportDepth 参数指定输出影像的位平面数,取值的含义如下表。exportDepth 参数值 输出影像的位平面数moExport8BitDepth 0 8 bit , palette 参数有效moExportSourceDepth 1 2

20、4 bit ,若 Map1 中有 24 bit 图像。否则 8 bitmoExport24BitDepth 2 24 bit ExportDepthConstants 枚举常量值表3) palette 当输出 8bit 位图时,指定输出位图的调色板,取值含义如下表所示。palette 参数值 输出位图采用的调色板moDefaultPalette 0 Windows 操作系统的缺省调色板moHalfTonePalette 1 与 Map1 最接近的半色调调色板moWebSafePalette 2 与 Map1 最接近的网络上用的调色板moGraysWithSystemColorsPalette

21、3 8 bit 颜色映射成灰度值调色板,ExportPaletteConstant 枚举常量值表(4) Sub ExportMapToJpeg(outputFile As String, percentQuality As Long = 85, isProgressive As Boolean = False, scaleFactor As Double = 1, scaleSymbology As ExportSymbologyScaleConstants = moLineSymbolsNotScaled)这个方法输出 JPEG 格式图像,有两个参数前文未加说明:1) percentQual

22、ity 取值 0 到 100 之间,指定输出图像的质量。值越大,质量越高,但图像文件也越大。2) isProgressive 指定输出的图像是否使用改进的 JPEG 格式。3 PrintMap 方法Sub PrintMap(docName As String, outputFile As String, landscapeOrientation As Boolean)将 Map1 窗口中的地图输出到打印机,也可存为一个打印文件。打印时自动将地图尺寸调整到打印纸的大小。1) docName 打印文档名称,可以任意命名,打印时在打印机的打印任务队列中可以看到您给的名字。2) outputFile

23、若将打印结果保存到文件中,可在此指定文件名, 否则用空字符串。3) landscape 指定地图在纸张上的打印方向。值为 True 表示纵向打印,否则横向打印。4 将地图复印到 hDC 标识的设备上。(1) Sub OutputMap(hDC As OLE_HANDLE)将地图窗口中显示的全部内容复印到 hDC 标识的设备上。hDC long 型参数(OLE_HANDLE 是 long 型的别称),用于指定输出设备。hDC是 Windows 操作系统 API 函数参数的专用名词之一,称为设备描述表句柄(Handle of device context),本质上是标识设备参数表及其驱动程序的编号

24、,Windows 操作系统中设备输入输出 API 函数用 hDC 作为参数。在 Visual Basic 中, Form 窗体、Picture 图片框,Printer 实例等有 hDC 属性。例 1 复制地图到控件 。将 Map1 窗口中的全部显示内容复印到图片控件Picture1 的窗口中 (参见 OutMap 目录中的 OutMap 程序窗口上的按钮 复制地图到控件 对应的代码)。Private Sub Command1_Click() 将 Map1 中的地图复印到 Picture1 控件窗口中Map1.OutputMap Picture1.hDCEnd SubOutputMap 方法也可

25、以将地图窗口中的内容硬拷贝输出到打印机。例 2 打印地图。 将 Map1 窗口中的地图输出到打印机。Private Sub Command4_Click() 打印地图Printer.Print 初始化打印机Map1.OutputMap Printer.hDC 打印地图Printer.EndDoc 结束打印End Sub (2) Sub OutputMap2(hDC As OLE_HANDLE, X As Long, Y As Long, Width As Long, Height As Long, DrawFlags)将地图窗口中显示的全部内容复印到 hDC 标识的设备上。X 设备坐标系下目标

26、设备绘图矩形区左上角的 X 坐标Y 设备坐标系下目标设备绘图矩形区左上角的 Y 坐标width 设备坐标系下目标设备绘图矩形区的宽度height 设备坐标系下目标设备绘图矩形区的高度drawFlags 一个数值型常数,指定如何绘图,含义如下表:drawFlags 的值 说明moNoBackground 1 不复印背景矩形边框moClipToExtent 2 只复印 Map1.Extent 以内的内容drawFlags 参数取值例 3 打印组合地图 。将 Map1 中的地图复印到打印纸右上四分之一区域及右下四分之一区域,组合成一张地图。Private Sub Command5_Click() 打

27、印组合地图Dim pixHeight As LongDim PixWidth As LongPrinter.Print 初始化打印页 将页面尺寸转换成像元数.pixHeight = Printer.ScaleHeight / Printer.TwipsPerPixelYPixWidth = Printer.ScaleWidth / Printer.TwipsPerPixelX 打印地图Map1.OutputMap2 Printer.hDC, PixWidth / 2, 0, PixWidth / 2, pixHeight / 2Map1.OutputMap2 Printer.hDC, PixW

28、idth / 2, pixHeight / 2, PixWidth / 2, pixHeight / 2Printer.EndDoc 打印文档结束,输出当前打印页,结束打印End SubOutputMap 与 OutputMap2 必需参数 hDC,如果不知道 hDC,但知道窗口的hWnd,可以用 API 函数获取 hDC。下段程序获得当前 FORM 窗体的 hDC:Private Declare Function GetDC Lib “user32“ (ByVal hWnd As Long) As Long API 函数Private Sub Command1_Click()Dim Geth

29、DC As LongGethDC = GetDC(Me.hWnd) 用 API 函数获取窗口的 hDCEnd Sub5 CopyMap 方法Sub CopyMap(scaleFactor As Double)将 Map1 窗口中地图复制到剪贴板上,用 EMF( enhanced metafile format,Windows 增强元文件格式)和 WMF(standard metafile format,Windows 标准元文件格式)格式表示。scaleFactor 地图输出缩放因子。样例参见 OutMap 目录中程序的 复制地图到剪贴板 命令按钮对应的代码。习题1 编写程序实现例 1、例 2

30、、例 3 的功能2 用 Map1.CopyMap 方法将地图复制到剪贴板,用你熟悉的图象处理软件提取剪贴板中的地图。2.8.3 地图绘图输出1 窗体和控件上的绘图输出Map 控件中的地图可以输出到窗体,也可以输出到控件。窗体和控件都是Windows 操作系统的窗口,Map 控件底层的函数绘图是在窗口上实现的,因此两者绘输出编程原理相同。Map.OutputMap 或 Map.OutputMap2 方法可以实现这两项功能。例 1 复制地图到另一个窗体。将 Form1 窗体上 Map1 中的地图复制到窗体ShowMap 上( 参见 OutMap2 目录中的程序)。1) 在命令按钮 复制地图到另一个

31、窗体 中显示 ShowMap 窗体Private Sub Command2_Click()ShowMap.ShowEnd Sub2) 在 ShowMap 窗体的 Paint 事件中复制地图Private Sub Form_Paint()Form1.Map1.OutputMap Me.hDCEnd Sub例 2 地图组合 。将 Map1 中的地图分别复制到 Picture1 图片框上的右半部上下两个区域( 见 OutMap2 目录中程序的 地图组合 命令按钮对应的代码)。Private Sub Command3_Click()With Me.Picture1Map1.OutputMap2 .hD

32、C, .ScaleWidth / 2, 0, .ScaleWidth / 2, .ScaleHeight / 2Map1.OutputMap2 .hDC, .ScaleWidth /2, .ScaleHeight /2, .ScaleWidth/2, .ScaleHeight /2End WithEnd SubMap1.OutputMap2 方法中的坐标参数使用设备坐标系,应将Me.Picture1.ScaleMode 属性值设置成 Pixel,这样,Picture1 的控件坐标系与设备坐标系一致。2 打印机绘图输出Map.PrintMap 或 Map.OutputMap 方法可将 Map 窗

33、口中的地图复印到打印机,输出图范围是整个地图窗口,并调整地图的输出比例尺,尽可能获得较大的输出地图。Map.PrintMap 方法一个语句就可以打印一页地图,不必使用打印机初始化及打印文档结束语句。Map.OutputMap2 方法可以指定输出地图的尺寸及其在纸张上的位置,可以输出组合地图。3 比例尺计算(1)比例尺的定义 若两地物在地面上的实际距离是 L,图面上的距离是 M,比值 BB = L/M则注记1:B称为地图的比例尺。(2) 计算 B 值在 MapObjects2 中,地图输出函数 Map1.OutputMap Map1.OutPutMap2 Map1.PrintMap Map1.C

34、opyMap 输出地图的范围是 Map1 窗口中显示的地图矩形区域,可用矩形区在地面上的尺寸和打印尺寸计算 B 值。1) 确定 L 的值 MappObjects2 中,若投影元数据完整, Map1.Extent 中的数据记录的是地图窗口矩形在地面上的实际尺寸,据此可以获得 L 值,若地图数据是经过投影的,从 Map1,CoordinateSystem.Unit.Type 可以确定确定 L 值的长度单位,若地图数据未经投影,则 L 值的长度单位是经纬度,这时需经投影计算获得地面矩形的实际尺寸。2) 确定 M 的值 Printer.ScaleWidth Printer.ScaleHeight 分别

35、是打印纸着墨区的宽度和高度,以缇(twips)为度量单位。Map1.OutputMap Map1.PrintMap Map1.CopyMap 三个函数以尽可能大的尺寸打印地图窗口矩形区中的地图,根据地图窗口的长宽比与打印纸张着墨区长宽比的大小可以确定 M 的值。Map1.OutputMap2 打印地图时,可以根据它的接口参数 Width 或 Height 确定M 的值。例 3 计算打印比例尺 。Map1 窗口中地图是经过投影了的,计算Map1.OutputMap Map1.PrintMap Map1.CopyMap 三个方法打印地图的比例尺(见 OutMap2 目录中程序的 计算地图比例尺 命令按钮对应的代码 )。Private Sub Command7_Click() 计算比例尺

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。