收藏 分享(赏)

第五讲 MO图形的绘制.doc

上传人:scg750829 文档编号:8137808 上传时间:2019-06-10 格式:DOC 页数:17 大小:93.50KB
下载 相关 举报
第五讲 MO图形的绘制.doc_第1页
第1页 / 共17页
第五讲 MO图形的绘制.doc_第2页
第2页 / 共17页
第五讲 MO图形的绘制.doc_第3页
第3页 / 共17页
第五讲 MO图形的绘制.doc_第4页
第4页 / 共17页
第五讲 MO图形的绘制.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、第五讲 MO 图形的绘制MO 虽然不是绘图软件,但经常要用到在地图上画点标明位置,画矩形或多边形标明地图查询范围等操作,因此也需要用到一些基本的绘图功能。MO 的绘图就是在 MAP 上产生图形对象的过程,图形对象主要有:Point(点),Points(点集)、Line(线)、Rectangle(矩形)、Polygon(多边形)、Ellipse(椭圆)。绘图时,先要创建一个绘图对象,给他赋值(位置和尺寸),再在 Symbol 对象中定义显示方式,最后用 Drawshape 方法在地图上显示这个图形。定义 Symbol 对象,不仅可以设置线型、填充方式、尺寸、颜色和字体等,还可以画出多种预定义的符

2、号。Drawshape 方法绘图外,还可以用 AddEvent 方法在动态图层上画动态图形对象(GeoEvent)。另外还可以用 DrawText 方法在地图上写字。一、DrawShape 绘图方法1、DrawShape 定义DrawShape 方法的语法为:object.DrawShape shape, symbol其中,object:为绘图目的对象,一般为 Map 对象;shape:为绘图内容,是图形对象(Point, Points, Line, Rectangle, Polygon or Ellipse)或记录集(Recordset)对象;symbol:是一个 Symbol 对象,说明绘

3、图方式。注意:调用 DrawShape 必须在 LAYER 或 TrackingLayer 的 drawing 事件中,即AfterTrackingLayerDraw,BeforeLayerDraw,BeforeTrackingLayerDraw,AfterLayerDraw 事件过程中才有效。如果指定一个 Recordset 作为 DrawShape 的参数,该数据集必须是从 GeoDataset 获取,而不是从一个 Table 对象获取,同时 MO 从 shape 字段的第一个特征值开始,到最后一个结束,然后又指向第一个记录。2、画点(1)预定义画点:可以用 Point 对象画一个点,也可

4、以用 Points 对象画多个点。示例:Dim sym As New MapObjects2.SymbolDim p As PointDim pts As PointsPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)Set pts = New PointsSet p = Map1.ToMapPoint(1000, 1000)pts.Add p是 Points 对象中的一个函数,功能是增加一个 Point 成员到 Points 对象内。Set p = Map1.ToMapPoint(3000, 2000

5、)pts.Add psym.Color = moRedsym.SymbolType = moPointSymbolsym.Size = 3Map1.DrawShape pts, symEnd Sub(2)利用鼠标点击画点:通过鼠标点击屏幕获取点的坐标,进行画点操作。示例:Dim sym As New MapObjects2.SymbolDim p As PointDim pts As New PointsPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)If Not pts Is Nothing The

6、nsym.Color = moRedsym.SymbolType = moPointSymbolsym.Size = 3Map1.DrawShape pts, symMap1.DrawShape pts, symEnd IfEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Set p = Map1.ToMapPoint(X, Y)pts.Add pMap1.TrackingLayer.Refresh True TrackingLayer 对象是 MAP

7、控件中的一个图层,它描述位置可以动态改变的地理目标,Refresh 是 TrackingLayer 对象的成员函数,强制刷新TrackingLayer 对象。End Sub3、画线MO 中画线的基本原理是先设置两个点,将他们添加到一个 Points 对象中,再将 Points 对象放到一个 Line 对象中,使用 DrawShape 方法就可以画出一条线段来。如果在 Points 对象中有 N 个点,则可以产生一条 N-1 段的折线。(1)预定义点画线,示例:Dim g_line As MapObjects2.LineDim pts As PointsDim p As PointDim sym

8、 As SymbolPrivate Sub Command1_Click()Set g_line = New MapObjects2.LineSet pts = New PointsSet p = Map1.ToMapPoint(1000, 1000)pts.Add pSet p = Map1.ToMapPoint(2000, 3000)pts.Add pg_line.Parts.Add pts Parts 是 Line 对象的一个属性,此属性指向一个 Parts 集合对象,通过 Parts 属性可以检索组成线的片断(Parts),而 Parts 的每一个成员是一个点集(Points)。Set

9、 pts = g_line.Parts(0)Map1.RefreshEnd SubPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)If Not g_line Is Nothing ThenDim sym As New SymbolIf pts.Count 1 Then Count 属性表示当前 Points 对象内成员的数目,这是一个只读值。sym.Color = moRedsym.SymbolType = moLineSymbolsym.Size = 5Map1.DrawShape g_line,

10、symEnd IfEnd IfEnd Sub(2)鼠标点击获取点并画线,示例:Dim g_line As MapObjects2.LineDim pts As PointsDim p As PointDim sym As SymbolPrivate Sub Command1_Click()设置清空按钮Set g_line = NothingSet pts = NothingMap1.RefreshEnd SubPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)Dim sym As New SymbolI

11、f Not g_line Is Nothing Thensym.Color = moBlackMap1.DrawShape pts, symIf pts.Count 1 Thensym.Color = moRedsym.SymbolType = moLineSymbolsym.Size = 5Map1.DrawShape g_line, symEnd IfEnd IfEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)If Button = 1 ThenI

12、f g_line Is Nothing ThenSet g_line = New MapObjects2.LineEnd IfIf pts Is Nothing ThenSet pts = New PointsEnd IfSet p = Map1.ToMapPoint(X, Y)pts.Add pIf pts.Count = 1 Theng_line.Parts.Add ptsSet pts = g_line.Parts(0)End IfMap1.TrackingLayer.Refresh TrueElseMsgBox “right“End IfEnd Sub4、画矩形和椭圆(1)预定义画矩形

13、:画矩形是先定义一个矩形对象,给它的 top、left、bottom、right属性赋值,再使用 DrawShape 方法就可以画出一个矩形来。定义矩形范围时,可以先确定一个中心点,再确定一个半径(或 X 方向半径和 Y 方向半径),得到 top、left、bottom、right 的值。示例:Option ExplicitDim rect As MapObjects2.RectanglePrivate Sub Command1_Click()Dim dist As DoubleDim pt As New PointSet rect = New MapObjects2.Rectangledis

14、t = 0.2Set pt = Map1.ToMapPoint(2500, 1500)这里可以动态设置中心点的位置rect.Right = pt.X + distrect.Left = pt.X - distrect.Top = pt.Y + distrect.Bottom = pt.Y - distMap1.RefreshEnd SubPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)If Not rect Is Nothing ThenDim sym As New Symbolsym.SymbolT

15、ype = moFillSymbolsym.Style = moDiagonalCrossFillsym.Color = moBlueMap1.DrawShape rect, symEnd IfEnd Sub(2)定义一个矩形框对象后,进行画矩形。示例:Option ExplicitDim rect As MapObjects2.RectanglePrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)Dim sym As New MapObjects2.SymbolIf Not rect Is Nothin

16、g Thensym.SymbolType = moFillSymbolsym.Style = moDiagonalCrossFillsym.Color = moBlueMap1.DrawShape rect, symEnd IfEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Set rect = Map1.TrackRectangleMap1.TrackingLayer.Refresh TrueEnd Sub用同样的方法可以画出椭圆来。5、用 Trac

17、k 方法画图形在 MO 中还可以用一类方法在地图上半自动画图,如:TrackCircle 方法,点击产生圆心,拖动产生半径,放手成圆形;TrackRectangle 方法,点击产生一个角,拖动放大,放手形成矩形;TrackPolygon 方法,点击画几条直线,双击形成多边形图形。这一类方法都是以 Track 开头,所以称为 Track 画图方法,这和 TrackingLayer(动态图层)毫无关系。示例:Option ExplicitDim eli As MapObjects2.EllipseDim recs As MapObjects2.RectangleDim ply As MapObje

18、cts2.PolygonPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)Dim sym As New MapObjects2.Symbolsym.SymbolType = moFillSymbolsym.Style = moDiagonalCrossFillIf Not recs Is Nothing Thensym.Color = moBlueMap1.DrawShape recs, symEnd IfIf Not eli Is Nothing Thensym.Color = moRedMap1.D

19、rawShape eli, symEnd IfIf Not ply Is Nothing Thensym.Color = moGreenMap1.DrawShape ply, symEnd IfEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)If Option1 ThenSet recs = Map1.TrackRectangleElseIf Option2 ThenSet eli = Map1.TrackCircleElseSet ply = Map

20、1.TrackPolygonEnd IfMap1.TrackingLayer.Refresh TrueEnd Sub二、写文字MO 一般采用 DrawText 方法在地图上写文字,也可以用画点时的 motruetypemarker 方式,在地图上写各种地图上常用的符号。1、DrawText 方法用 DrawText 方法可以在地图上写文字,语法结构为:object.DrawText text, shape, symbol其中,object:对象,text:字符串,shape:参照图形,可以是点、点集、线和矩形;symbol:为一个 Textsymbol 显示对象。如果参照图形为点,则文字中心在

21、点上;如果为点集,则中心在点集的范围中心上;为直线,中心在线段的中心上,方向同线段的方向;为折线,则文字的中心和方向按照点集的样条插值计算;如果为矩形,则文字国矩形中心的水平线排列。(1)在点击出写文字示例:Option ExplicitDim p As MapObjects2.PointDim tSym As New TextSymbolPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)If Not p Is Nothing ThenDim sym As New SymboltSym.Color =

22、moRedMap1.DrawText Text1.Text, p, tSymEnd IfEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)Set p = Map1.ToMapPoint(x, y)Map1.TrackingLayer.Refresh TrueEnd Sub(2)在线段上添加文字示例:Option ExplicitDim g_line As MapObjects2.LineDim pts As MapObjects2.PointsPriva

23、te Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE) make sure theres a lineIf Not g_line Is Nothing Then make sure theres at least two points in the lineIf pts.Count 1 ThenDim tSym As New TextSymbol use the font of the textbox controlSet tSym.Font = Text1.FontDim sym As New Symbolsym.

24、Color = moRedMap1.DrawShape g_line, symMap1.DrawText Text1.Text, g_line, tSymEnd IfEnd IfEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)If Button = 1 Then create the line if it does not existIf g_line Is Nothing ThenSet g_line = New MapObjects2.LineEn

25、d IfIf pts Is Nothing ThenSet pts = New MapObjects2.PointsEnd If create a point and add it to the lineDim p As PointSet p = Map1.ToMapPoint(x, y)pts.Add pIf pts.Count = 1 Theng_line.Parts.Add ptsSet pts = g_line.Parts(0)End If refresh the trackingLayerMap1.TrackingLayer.Refresh TrueElseDim r As MapO

26、bjects2.RectangleSet r = Map1.TrackRectangleIf Not r Is Nothing Then Map1.Extent = rEnd IfEnd Sub三、SymbolSymbol 是控制地图上的特征或图形的显示方式的对象或属性,图上的特征都是通过设置图层的 Symbol 属性来实现的,如:layer.Symbol.Color = moRed,如果没有设置图层的 Symbol属性,MO 就会使用缺省的线型、填充方式、尺寸、字体和随机的颜色。在设置图形的显示方式时,要定义一个 Symbol 对象:Dim sym As New Symbol再设置 Symb

27、olType 属性,这说明显示对象是点、线还是面,使用的常量如下:Constant Value DescriptionmoPointSymbol 0 symbol for a Point or Points objectmoLineSymbol1 symbol for a Line objectmoFillSymbol2 symbols for a Polygon, Rectangle or Ellipse object例如:sym.SymbolType = moFillSymbol然后就可以设置 Symbol 的 style 属性,对于点来设置点的形状和预定义的符号,对于线对象来设置线型,对

28、于面对象来设置填充方式。最后来设置 size、color、font 等。使用预定义符号:在画点时,设置 Symbol 的 style 属性为 moTrueTypeMarker 方式,可以在地图上写各种地图上常用的符号,先设置:sym.Style = moTrueTypeMarker,然后再设置sym.CharacterIndex = 35。CharacterIndex 的序号是从 33 开始的。下面就是一个使用预定义字符的例子:Option ExplicitDim Pt(400) As MapObjects2.PointDim Pt1(400) As MapObjects2.PointDim

29、Sym(400) As New MapObjects2.SymbolDim tSym As New MapObjects2.TextSymbolPrivate Sub Form_Load()Dim i As IntegerDim Swidth As IntegerDim Sheight As Integer Swidth = Screen.Width Sheight = Screen.HeightSwidth = 800 * 15Sheight = 600 * 15Me.Height = Sheight - 100Me.Width = Swidth - 300Map1.Height = Me.

30、Height - 200Map1.Width = Me.Width - 200Map1.Top = 100Map1.Left = 100For i = 0 To 399With Sym(i).Style = moTrueTypeMarker.SymbolType = moPointSymbol.Font = “ESRI Transportation & Municipal“.Size = 20.Style = moTrueTypeMarker.Color = moBlackEnd WithNext itSym.Color = moBlacktSym.Font.Size = 10End SubP

31、rivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)Dim i As IntegerFor i = 0 To 399If Not Pt(i) Is Nothing ThenMap1.DrawShape Pt(i), Sym(i)Map1.DrawText 33 + i, Pt1(i), tSymEnd IfNext iEnd SubPrivate Sub Map1_Click()Dim i As Integer, j As Integer, k As IntegerConst Mx0 = 400Const

32、My0 = 300Const Mxc = 520Const Myc = 800k = 0j = 0For i = 0 To 199For i = 200 To 399Set Pt(i) = Map1.ToMapPoint(j * Mxc + Mx0, My0 + k * Myc)Set Pt1(i) = Map1.ToMapPoint(j * Mxc + Mx0, My0 + 400 + k * Myc)Sym(i).CharacterIndex = 33 + ij = j + 1If j = 20 Thenj = 0k = k + 1End IfNext iMap1.TrackingLaye

33、r.Refresh TrueEnd Sub画出交通和市政的预定义符号,符号代码如下:Option ExplicitDim Pt(400) As MapObjects2.PointDim Pt1(400) As MapObjects2.PointDim Sym(400) As New MapObjects2.SymbolDim tSym As New MapObjects2.TextSymbolPrivate Sub Form_Load()Dim i As IntegerDim Swidth As IntegerDim Sheight As IntegerDim fnt As New StdFo

34、ntfnt.Name = “Wingdings“ Swidth = Screen.Width Sheight = Screen.HeightSwidth = 800 * 15Sheight = 600 * 15Me.Height = Sheight - 100Me.Width = Swidth - 300Map1.Height = Me.Height - 200Map1.Width = Me.Width - 200Map1.Top = 100Map1.Left = 100For i = 0 To 399With Sym(i).Style = moTrueTypeMarker.SymbolTyp

35、e = moPointSymbol.Font = “ESRI Transportation & Municipal“.Font = fnt.Size = 20.Style = moTrueTypeMarker.Color = moBlackEnd WithNext itSym.Color = moBlacktSym.Font.Size = 10End SubPrivate Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)Dim i As IntegerFor i = 0 To 399If Not Pt(i) Is N

36、othing ThenMap1.DrawShape Pt(i), Sym(i)Map1.DrawText 33 + i, Pt1(i), tSymEnd IfNext iEnd SubPrivate Sub Map1_Click()Dim i As Integer, j As Integer, k As IntegerConst Mx0 = 400Const My0 = 300Const Mxc = 520Const Myc = 800k = 0j = 0For i = 0 To 199For i = 200 To 399Set Pt(i) = Map1.ToMapPoint(j * Mxc + Mx0, My0 + k * Myc)Set Pt1(i) = Map1.ToMapPoint(j * Mxc + Mx0, My0 + 400 + k * Myc)Sym(i).CharacterIndex = 33 + ij = j + 1If j = 20 Thenj = 0k = k + 1End IfNext iMap1.TrackingLayer.Refresh TrueEnd Sub

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报