第6章图形对象的操作.docx
- 文档编号:7837408
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:47
- 大小:350.17KB
第6章图形对象的操作.docx
《第6章图形对象的操作.docx》由会员分享,可在线阅读,更多相关《第6章图形对象的操作.docx(47页珍藏版)》请在冰豆网上搜索。
第6章图形对象的操作
第6章 图形对象的操作
图形对象的操作主要为图形的交、并、差、异或计算,以及Buffer(缓冲区计算)、Offset(偏离计算)、Inset(缩放计算)、计算Line的长度、计算面状对象的面积等。
对于如图6.1所示2个Polygon,其交、并、差、异或后产生的图形如图6.2所示。
6.1 Intersect(交)
6.1.1 Intersect方法介绍
利用Intersect方法可以返回2个图形对象的相交图形。
Intersect方法的语法为:
SetresultShape=object.Intersect(intersectShape[,extent])
其中;
resultShape:
操作后返回的图形对象;
object:
第1个图形对象
intersectShape:
第2个图形对象;
extent:
一个矩形范围。
注意:
(1)如果2个图形没有相交,返回Nothing。
(2)根据相交的图形对象类型的不同,得到的结果也不同,如表6.1所列。
当返回结果为多个可能时,用shapeType属性判别返回对象的类别。
(3)可以使用自相交线段,但不能使用自相交多边形,否则系统会报错(在VB中为Error5000)。
(4)返回图形只能是2D的。
6.1.2Intersect的基本示例
在Form上添加一个Map控件,2个Command控件。
运行时,单击Command1,显示2个Polygon,单击Command2,显示相交后的Polygon。
(工程Chapter601-Form01)
OptionExplicit
DimPolyAsMapObjects2.Polygon
DimPoly1AsMapObjects2.Polygon
DimPoly2AsMapObjects2.Polygon
PrivateSubCommand1_Click()
DimpAsPoint
DimPtsAsMapObjects2.Points
'第一个Polygon
SetPoly1=NewMapObjects2.Polygon
SetPts=NewMapObjects2.Points
Setp=Map1.ToMapPoint(100,100)
Pts.Addp
Setp=Map1.ToMapPoint(5500,1500)
Pts.Addp
Setp=Map1.ToMapPoint(800,3200)
Pts.Addp
Poly1.Parts.AddPts
'第二个Polygon
SetPoly2=NewMapObjects2.Polygon
SetPts=NewMapObjects2.Points
Setp=Map1.ToMapPoint(500,500)
Pts.Addp
Setp=Map1.ToMapPoint(3500,1500)
Pts.Addp
Setp=Map1.ToMapPoint(200,3000)
Pts.Addp
Poly2.Parts.AddPts
SetPoly=Nothing
Map1.TrackingLayer.RefreshTrue
EndSub
PrivateSubCommand2_Click()
IfNotPoly1IsNothingThen
SetPoly=Poly1.Intersect(Poly2)
Map1.TrackingLayer.RefreshTrue
Else
MsgBox"先点击“显示Polygon”按钮!
"
EndIf
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAsstdole.OLE_HANDLE)
DimsymAsNewSymbol,sym1AsNewSymbol,sym2AsNewSymbol
sym.Color=moRed
sym1.Color=moGreen
sym2.Color=moCyan
IfNotPolyIsNothingThen
SetPoly1=Nothing
SetPoly2=Nothing
Map1.DrawShapePoly,sym
Else
IfNotPoly1IsNothingThen
Map1.DrawShapePoly1,sym1
EndIf
IfNotPoly2IsNothingThen
Map1.DrawShapePoly2,sym2
EndIf
EndIf
EndSub
6.1.3 求矩形和一个地区相交
本例计算一个任意矩形和墨西哥的—个州界的交。
在Form上添加Map1和Label1控件,添加程序如下:
(工程Chapter601-Form02)
OptionExplicit
DimresultShapeAsMapObjects2.Polygon
DimrecSelectionAsMapObjects2.Recordset
DimintersectShapeAsMapObjects2.Polygon
DimrectAsMapObjects2.Rectangle
PrivateSubMap1_AfterLayerDraw(ByValindexAsInteger,ByValcanceledAsBoolean,ByValhDCAsstdole.OLE_HANDLE)
Dimsym1AsNewMapObjects2.Symbol
IfNotrectIsNothingThen
sym1.Color=moYellow
Map1.DrawShaperect,sym1
EndIf
IfNotrecSelectionIsNothingThen
sym1.Color=moOrange
Map1.DrawShaperecSelection,sym1
EndIf
IfNotresultShapeIsNothingThen
sym1.Color=moRed
Map1.DrawShaperesultShape,sym1
EndIf
EndSub
SubDrawLayer()
DimdcAsNewDataConnection
DimlayerAsMapLayer
dc.Database=App.Path+"\..\"+"Mexico"
IfNotdc.ConnectThen
MsgBox"在指定的文件夹下没找到图层数据文件!
"
End
EndIf
Setlayer=NewMapLayer
Setlayer.GeoDataset=dc.FindGeoDataset("States")
layer.Symbol.Color=moLimeGreen
Map1.Layers.Addlayer
Setlayer=NewMapLayer
Setlayer.GeoDataset=dc.FindGeoDataset("Rivers")
layer.Symbol.Color=moRed
Map1.Layers.Addlayer
EndSub
PrivateSubForm_Load()
DrawLayer
Label1.Caption="在地图上画矩形。
"
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
DimstrExpressionAsString
DimAiAsSingle
ConstAk=1000
Setrect=Map1.TrackRectangle
strExpression="STATE_ID=25"'查找编码为25的州;
SetrecSelection=Map1.Layers("States").SearchExpression(strExpression)
SetintersectShape=recSelection.Fields("Shape").Value
SetresultShape=rect.Intersect(intersectShape)
IfresultShapeIsNothingThen
Label1.Caption="没有相交。
"
Else
Ai=Format(resultShape.Area*Ak,"0.00")
Label1.Caption="相交面积="&Ai&"平方公里。
"
EndIf
Map1.Refresh
EndSub
运行程序时,直接在地图上画矩形,在下部的标签上就可以显示是否相交,或相交的面积,如图6.3所示。
图6.3 矩形与地区的相交
6.1.4 求矩形和多个地区相交
利用查询特征的方法,还可以计算出一个任意图形和多个地区相交的情况。
下例是求多边形和墨西哥的所有州相交。
在Form上添加Map1和Label1控件,添加程序如下:
(工程Chapter601-Form02a)
OptionExplicit
DimresultShape(32)AsMapObjects2.Polygon
DimrecSelection(32)AsMapObjects2.Recordset
DimrectAsMapObjects2.Polygon
'把查找的区域用黄色显示,找到区域用红色显示;
PrivateSubMap1_AfterLayerDraw(ByValindexAsInteger,ByValcanceledAsBoolean,ByValhDCAsstdole.OLE_HANDLE)
Dimsym(32)AsNewMapObjects2.Symbol
Dimsym1AsNewMapObjects2.Symbol
DimRiAsInteger
IfNotrectIsNothingThen
sym1.Color=moYellow
Map1.DrawShaperect,sym1
EndIf
ForRi=1To32
IfNotresultShape(Ri)IsNothingThen
sym(Ri).Color=moRed
Map1.DrawShaperesultShape(Ri),sym(Ri)
EndIf
NextRi
EndSub
SubDrawLayer()
DimdcAsNewDataConnection
DimlayerAsMapLayer
dc.Database=App.Path+"\..\"+"Mexico"
IfNotdc.ConnectThen
MsgBox"在指定的文件夹下没找到图层数据文件!
"
End
EndIf
Setlayer=NewMapLayer
Setlayer.GeoDataset=dc.FindGeoDataset("States")
layer.Symbol.Color=moLimeGreen
Map1.Layers.Addlayer
Setlayer=NewMapLayer
Setlayer.GeoDataset=dc.FindGeoDataset("Rivers")
layer.Symbol.Color=moRed
Map1.Layers.Addlayer
Setlayer=NewMapLayer
Setlayer.GeoDataset=dc.FindGeoDataset("Cities")
layer.Symbol.Color=moBlue
Map1.Layers.Addlayer
EndSub
PrivateSubForm_Load()
DrawLayer
Label1.Caption="在地图上画多边形。
"
EndSub
PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
DimAmAsSingle
ConstAk=1000
DimintersectShape(32)AsMapObjects2.Polygon
DimstrExpressionAsString
DimRiAsInteger
Setrect=Map1.TrackPolygon
Am=0
ForRi=1To32
strExpression="STATE_ID="&Ri
SetrecSelection(Ri)=Map1.Layers("States").SearchExpression(strExpression)
SetintersectShape(Ri)=recSelection(Ri).Fields("Shape").Value
SetresultShape(Ri)=rect.Intersect(intersectShape(Ri))
IfNotresultShape(Ri)IsNothingThen
Am=resultShape(Ri).Area+Am
EndIf
NextRi
IfAm<0.001Then
Label1.Caption="没有相交。
"
Else
Label1.Caption="相交面积="&Format(Am*Ak,"0.00")&"平方公里。
"
EndIf
Map1.Refresh
EndSub
运行后的效果如图6.4所示。
图6.4 多边形和多个地区的交
6.2 Union(交)
6.2.1 Union方法介绍
利用Union方法返回2个图形对象的合并图形。
Union方法的语法为:
SetresultShape=object.Union(unionShape[,extert])
其中:
resultShape:
操作后返回的图形对象;
object:
第1个图形对象;
unionShape:
第2个图形对象;
extert:
一个矩形范围。
注意:
(1)如果2个图形没有相交部分,也可以返回一个并集,如工程Chapter601-Form03所示。
(2)根据选择的图形对象类型的不同,得到的结果也不同,如表6.2所列。
当返回结果为多个可能时,用ShapeType属性判别返回对象的类别。
(3)以使用自相交线段,但不能使用自相交多边形,否则系统会报措(在VB中为Error5000)。
(4)返回图形只能是2D的。
6.2.2Union的基本示例
在Form上添加一个Map控件,2个command控件。
运行时,单击command1,显示2个Polygon,单击command2,显示Union操作后的Polygon。
(工程Chapter601-Form03)
OptionExplicit
DimPolyAsMapObjects2.Polygon
DimPoly1AsMapObjects2.Polygon
DimPoly2AsMapObjects2.Polygon
PrivateSubCommand1_Click()
DimpAsPoint
DimPtsAsMapObjects2.Points
'第一个Polygon
SetPoly1=NewMapObjects2.Polygon
SetPts=NewMapObjects2.Points
Setp=Map1.ToMapPoint(100,100)
Pts.Addp
Setp=Map1.ToMapPoint(5500,1500)
Pts.Addp
Setp=Map1.ToMapPoint(800,3200)
Pts.Addp
Poly1.Parts.AddPts
'第二个Polygon
SetPoly2=NewMapObjects2.Polygon
SetPts=NewMapObjects2.Points
Setp=Map1.ToMapPoint(500,500)
Pts.Addp
Setp=Map1.ToMapPoint(3500,1500)
Pts.Addp
Setp=Map1.ToMapPoint(200,3000)
Pts.Addp
Poly2.Parts.AddPts
SetPoly=Nothing
Map1.TrackingLayer.RefreshTrue
EndSub
PrivateSubCommand2_Click()
IfNotPoly1IsNothingThen
SetPoly=Poly1.Union(Poly2)
Map1.TrackingLayer.RefreshTrue
Else
MsgBox"先点击“显示Polygon”按钮!
"
EndIf
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAsstdole.OLE_HANDLE)
DimsymAsNewSymbol,sym1AsNewSymbol,sym2AsNewSymbol
sym.Color=moRed
sym1.Color=moGreen
sym2.Color=moCyan
IfNotPolyIsNothingThen
SetPoly1=Nothing
SetPoly2=Nothing
Map1.DrawShapePoly,sym
Else
IfNotPoly1IsNothingThen
Map1.DrawShapePoly1,sym1
EndIf
IfNotPoly2IsNothingThen
Map1.DrawShapePoly2,sym2
EndIf
EndIf
EndSub
6.3 Difference(差)
6.3.1 Difference方法介绍
差集计算利用Difference方法返回两个图解对象之差。
Difference方法的语法为:
SetresultShape=object.Difference(subtractShape[,extert])
其中:
resultShape:
操作后返回的图形对象;
object:
第1个图形对象;
subtractShape:
第2个图形对象;
extert:
一个矩形范围。
注意:
(1)计算关系为:
resultShape=object-subtractShape。
(2)如果两个对象没有差集,resultShape的值为nothing。
(3)根据图形对象类型的不同,得到的结果也不同,如表6.3所列
当返回结果为多个可能时,用ShapeType属性判别返回对象的类别。
(4)以使用自相交线段,但不能使用自相交多边形,否则系统会报措(在VB中为Error5000)。
(5)返回图形只能是2D的。
6.3.2Difference的基本示例
在Form上添加一个Map控件,2个command控件。
运行时,单击command1,显示2个Polygon,单击command2,显示Difference操作后的Polygon。
(工程Chapter601-Form04)
OptionExplicit
DimPolyAsMapObjects2.Polygon
DimPoly1AsMapObjects2.Polygon
DimPoly2AsMapObjects2.Polygon
PrivateSubCommand1_Click()
DimpAsPoint
DimPtsAsMapObjects2.Points
'第一个Polygon
SetPoly1=NewMapObjects2.Polygon
SetPts=NewMapObjects2.Points
Setp=Map1.ToMapPoint(100,100)
Pts.Addp
Setp=Map1.ToMapPoint(5500,1500)
Pts.Addp
Setp=Map1.ToMapPoint(800,3200)
Pts.Addp
Poly1.Parts.AddPts
'第二个Polygon
SetPoly2=NewMapObjects2.Polygon
SetPts=NewMapObjects2.Points
Setp=Map1.ToMapPoint(500,500)
Pts.Addp
Setp=Map1.ToMapPoint(3500,1500)
Pts.Addp
Setp=Map1.ToMapPoint(200,3000)
Pts.Addp
Poly2.Parts.AddPts
SetPoly=Nothing
Map1.TrackingLayer.RefreshTrue
EndSub
PrivateSubCommand2_Click()
IfNotPoly1IsNothingThen
SetPoly=Poly1.Difference(Poly2)
Map1.TrackingLayer.RefreshTrue
Else
MsgBox"先点击“显示Polygon”按钮!
"
EndIf
EndSub
PrivateSubMap1_AfterTrackingLayerDraw(ByValhDCAsstdole.OLE_HANDLE)
DimsymAs
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 图形对象的操作 图形 对象 操作