第五章MO图形的绘制.docx
- 文档编号:9583191
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:19
- 大小:18.68KB
第五章MO图形的绘制.docx
《第五章MO图形的绘制.docx》由会员分享,可在线阅读,更多相关《第五章MO图形的绘制.docx(19页珍藏版)》请在冰点文库上搜索。
第五章MO图形的绘制
第五讲MO图形的绘制
MO尽管不是画图软件,但常常要用到在地图上画点标明位置,画矩形或多边形标明地图查询范围等操作,因此也需要用到一些大体的画图功能。
MO的画图确实是在MAP上产生图形对象的进程,图形对象要紧有:
Point(点),Points(点集)、Line(线)、Rectangle(矩形)、Polygon(多边形)、Ellipse(椭圆)。
画图时,先要创建一个画图对象,给他赋值(位置和尺寸),再在Symbol对象中概念显示方式,最后用Drawshape方式在地图上显示那个图形。
概念Symbol对象,不仅能够设置线型、填充方式、尺寸、颜色和字体等,还能够画出多种预概念的符号。
Drawshape方式画图外,还能够用AddEvent方式在动态图层上画动态图形对象(GeoEvent)。
另外还能够用DrawText方式在地图上写字。
一、DrawShape画图方式
1、DrawShape概念
DrawShape方式的语法为:
shape,symbol
其中,object:
为画图目的对象,一样为Map对象;
shape:
为画图内容,是图形对象(Point,Points,Line,Rectangle,PolygonorEllipse)或记录集(Recordset)对象;
symbol:
是一个Symbol对象,说明画图方式。
注意:
挪用DrawShape必需在LAYER或TrackingLayer的drawing事件中,即AfterTrackingLayerDraw,BeforeLayerDraw,BeforeTrackingLayerDraw,AfterLayerDraw事件进程中才有效。
若是指定一个Recordset作为DrawShape的参数,该数据集必需是从GeoDataset获取,而不是从一个Table对象获取,同时MO从shape字段的第一个特点值开始,到最后一个终止,然后又指向第一个记录。
2、画点
(1)预概念画点:
能够用Point对象画一个点,也能够用Points对象画多个点。
例如:
DimsymAsNew
DimpAsPoint
DimptsAsPoints
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
Setpts=NewPoints
Setp=(1000,1000)
p'是Points对象中的一个函数,功能是增加一个Point成员到Points对象内。
Setp=(3000,2000)
p
=moRed
=moPointSymbol
=3
pts,sym
EndSub
(2)利用鼠标点击画点:
通过鼠标点击屏幕获取点的坐标,进行画点操作。
例如:
DimsymAsNew
DimpAsPoint
DimptsAsNewPoints
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
IfNotptsIsNothingThen
=moRed
=moPointSymbol
=3
pts,sym
pts,sym
EndIf
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
Setp=(X,Y)
p
True’TrackingLayer对象是MAP控件中的一个图层,它描述位置能够动态改变的地理目标,Refresh是TrackingLayer对象的成员函数,强制刷新TrackingLayer对象。
EndSub
3、画线
MO中画线的大体原理是先设置两个点,将他们添加到一个Points对象中,再将Points对象放到一个Line对象中,利用DrawShape方式就能够够画出一条线段来。
若是在Points对象中有N个点,那么能够产生一条N-1段的折线。
(1)预概念点画线,例如:
Dimg_lineAs
DimptsAsPoints
DimpAsPoint
DimsymAsSymbol
PrivateSubCommand1_Click()
Setg_line=New
Setpts=NewPoints
Setp=(1000,1000)
p
Setp=(2000,3000)
p
pts'Parts是Line对象的一个属性,此属性指向一个Parts集合对象,通过Parts属性能够检索组成线的片断(Parts),而Parts的每一个成员是一个点集(Points)。
Setpts=(0)
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
IfNotg_lineIsNothingThen
DimsymAsNewSymbol
If>1Then’Count属性表示当前Points对象内成员的数量,这是一个只读值。
=moRed
=moLineSymbol
=5
g_line,sym
EndIf
EndIf
EndSub
(2)鼠标点击获取点并画线,例如:
Dimg_lineAs
DimptsAsPoints
DimpAsPoint
DimsymAsSymbol
PrivateSubCommand1_Click()’设置清空按钮
Setg_line=Nothing
Setpts=Nothing
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
DimsymAsNewSymbol
IfNotg_lineIsNothingThen
=moBlack
pts,sym
If>1Then
=moRed
=moLineSymbol
=5
g_line,sym
EndIf
EndIf
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfButton=1Then
Ifg_lineIsNothingThen
Setg_line=New
EndIf
IfptsIsNothingThen
Setpts=NewPoints
EndIf
Setp=(X,Y)
p
If=1Then
pts
Setpts=(0)
EndIf
True
Else
MsgBox"right"
EndIf
EndSub
4、画矩形和椭圆
(1)预概念画矩形:
画矩形是先概念一个矩形对象,给它的top、left、bottom、right属性赋值,再利用DrawShape方式就能够够画出一个矩形来。
概念矩形范围时,能够先确信一个中心点,再确信一个半径(或X方向半径和Y方向半径),取得top、left、bottom、right的值。
例如:
OptionExplicit
DimrectAs
PrivateSubCommand1_Click()
DimdistAsDouble
DimptAsNewPoint
Setrect=New
dist=
Setpt=(2500,1500)’那个地址能够动态设置中心点的位置
=+dist
=-dist
=+dist
=-dist
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
IfNotrectIsNothingThen
DimsymAsNewSymbol
=moFillSymbol
=moDiagonalCrossFill
=moBlue
rect,sym
EndIf
EndSub
(2)概念一个矩形框对象后,进行画矩形。
例如:
OptionExplicit
DimrectAs
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
DimsymAsNew
IfNotrectIsNothingThen
=moFillSymbol
=moDiagonalCrossFill
=moBlue
rect,sym
EndIf
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
Setrect=
True
EndSub
用一样的方式能够画出椭圆来。
5、用Track方式画图形
在MO中还能够用一类方式在地图上半自动画图,如:
TrackCircle方式,点击产生圆心,拖动产生半径,放手成圆形;TrackRectangle方式,点击产生一个角,拖动放大,放手形成矩形;TrackPolygon方式,点击画几条直线,双击形成多边形图形。
这一类方式都是以Track开头,因此称为Track画图方式,这和TrackingLayer(动态图层)毫无关系。
例如:
OptionExplicit
DimeliAs
DimrecsAs
DimplyAs
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
DimsymAsNew
=moFillSymbol
=moDiagonalCrossFill
IfNotrecsIsNothingThen
=moBlue
recs,sym
EndIf
IfNoteliIsNothingThen
=moRed
eli,sym
EndIf
IfNotplyIsNothingThen
=moGreen
ply,sym
EndIf
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfOption1Then
Setrecs=
ElseIfOption2Then
Seteli=
Else
Setply=
EndIf
True
EndSub
二、写文字
MO一样采纳DrawText方式在地图上写文字,也能够用画点时的motruetypemarker方式,在地图上写各类地图上经常使用的符号。
1、DrawText方式
用DrawText方式能够在地图上写文字,语法结构为:
text,shape,symbol
其中,object:
对象,text:
字符串,shape:
参照图形,能够是点、点集、线和矩形;symbol:
为一个Textsymbol显示对象。
若是参照图形为点,那么文字中心在点上;若是为点集,那么中心在点集的范围中心上;为直线,中心在线段的中心上,方向同线段的方向;为折线,那么文字的中心和方向依照点集的样条插值计算;若是为矩形,那么文字国矩形中心的水平线排列。
(1)在点击出写文字
例如:
OptionExplicit
DimpAs
DimtSymAsNewTextSymbol
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
IfNotpIsNothingThen
DimsymAsNewSymbol
=moRed
p,tSym
EndIf
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
Setp=(x,y)
True
EndSub
(2)在线段上添加文字
例如:
OptionExplicit
Dimg_lineAs
DimptsAs
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
'makesurethere'saline
IfNotg_lineIsNothingThen
'makesurethere'satleasttwopointsintheline
If>1Then
DimtSymAsNewTextSymbol
'usethefontofthetextboxcontrol
Set=
DimsymAsNewSymbol
=moRed
g_line,sym
g_line,tSym
EndIf
EndIf
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfButton=1Then
'createthelineifitdoesnotexist
Ifg_lineIsNothingThen
Setg_line=New
EndIf
IfptsIsNothingThen
Setpts=New
EndIf
'createapointandaddittotheline
DimpAsPoint
Setp=(x,y)
p
If=1Then
pts
Setpts=(0)
EndIf
'refreshthetrackingLayer
True
Else
DimrAs
Setr=
IfNotrIsNothingThen=r
EndIf
EndSub
三、Symbol
Symbol是操纵地图上的特点或图形的显示方式的对象或属性,图上的特点都是通过设置图层的Symbol属性来实现的,如:
=moRed,若是没有设置图层的Symbol属性,MO就会利用缺省的线型、填充方式、尺寸、字体和随机的颜色。
在设置图形的显示方式时,要概念一个Symbol对象:
DimsymAsNewSymbol
再设置SymbolType属性,这说明显示对象是点、线仍是面,利用的常量如下:
ConstantValueDescription
moPointSymbol0symbolforaPointorPointsobject
moLineSymbol1symbolforaLineobject
moFillSymbol2symbolsforaPolygon,RectangleorEllipseobject
例如:
=moFillSymbol
然后就能够够设置Symbol的style属性,关于点来设置点的形状和预概念的符号,关于线对象来设置线型,关于面对象来设置填充方式。
最后来设置size、color、font等。
利用预概念符号:
在画点时,设置Symbol的style属性为moTrueTypeMarker方式,能够在地图上写各类地图上经常使用的符号,先设置:
=moTrueTypeMarker,然后再设置=35。
CharacterIndex的序号是从33开始的。
下面确实是一个利用预概念字符的例子:
OptionExplicit
DimPt(400)As
DimPt1(400)As
DimSym(400)AsNew
DimtSymAsNew
PrivateSubForm_Load()
DimiAsInteger
DimSwidthAsInteger
DimSheightAsInteger
'Swidth=
'Sheight=
Swidth=800*15
Sheight=600*15
=Sheight-100
=Swidth-300
=-200
=-200
=100
=100
Fori=0To399
WithSym(i)
.Style=moTrueTypeMarker
.SymbolType=moPointSymbol
'.Font="ESRITransportation&Municipal"
.Size=20
.Style=moTrueTypeMarker
.Color=moBlack
EndWith
Nexti
=moBlack
=10
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
DimiAsInteger
Fori=0To399
IfNotPt(i)IsNothingThen
Pt(i),Sym(i)
33+i,Pt1(i),tSym
EndIf
Nexti
EndSub
PrivateSubMap1_Click()
DimiAsInteger,jAsInteger,kAsInteger
ConstMx0=400
ConstMy0=300
ConstMxc=520
ConstMyc=800
k=0
j=0
Fori=0To199
'Fori=200To399
SetPt(i)=(j*Mxc+Mx0,My0+k*Myc)
SetPt1(i)=(j*Mxc+Mx0,My0+400+k*Myc)
Sym(i).CharacterIndex=33+i
j=j+1
Ifj>=20Then
j=0
k=k+1
EndIf
Nexti
True
EndSub
画出交通和市政的预概念符号,符号代码如下:
OptionExplicit
DimPt(400)As
DimPt1(400)As
DimSym(400)AsNew
DimtSymAsNew
PrivateSubForm_Load()
DimiAsInteger
DimSwidthAsInteger
DimSheightAsInteger
DimfntAsNewStdFont
="Wingdings"
'Swidth=
'Sheight=
Swidth=800*15
Sheight=600*15
=Sheight-100
=Swidth-300
=-200
=-200
=100
=100
Fori=0To399
WithSym(i)
.Style=moTrueTypeMarker
.SymbolType=moPointSymbol
'.Font="ESRITransportation&Municipal"
.Font=fnt
.Size=20
.Style=moTrueTypeMarker
.Color=moBlack
EndWith
Nexti
=moBlack
=10
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAs
DimiAsInteger
Fori=0To399
IfNotPt(i)IsNothingThen
Pt(i),Sym(i)
33+i,Pt1(i),tSym
EndIf
Nexti
EndSub
PrivateSubMap1_Click()
DimiAsInteger,jAsInteger,kAsInteger
ConstMx0=400
ConstMy0=300
ConstMxc=520
ConstMyc=800
k=0
j=0
Fori=0To199
'Fori=200To399
SetPt(i)=(j*Mxc+Mx0,My0+k*Myc)
SetPt1(i)=(j*Mxc+Mx0,My0+400+k*Myc)
Sym(i).CharacterIndex=33+i
j=j+1
Ifj>=20Then
j=0
k=k+1
EndIf
Nexti
True
EndSub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 MO 图形 绘制