幾何對象
Point:是一個0維的幾何圖形,具有X,Y座標值,以及一些可選的屬性:如高程值(Z值),度量值(M值) 和ID號,點對象用於描述精確定位的對象。
MultiPoint:點集對象是一系列無序的點的羣集,這些點具有相同的屬性信息。例如可以用一個點集來表示整個城市天然氣調壓站。
以下代碼片段演示如何構建Multipoint對象:
//定義第一個點
IPoint
pPoint1 = new
PointClass(); pPoint1.X = 100; pPoint1.Y = 100;
//定義第二個點
IPoint
pPoint2 = new
PointClass();
pPoint2.X = 200; pPoint2.Y = 200;
……//構建其他點
IPointCollection
pMultipoint = new
MultipointClass();
object
o=Type.Missing;
//添加第一個點,不需要設置點的順序,參數設置爲Type.Missing
pMultipoint.AddPoint(pPoint1,
ref o,
ref o);
//添加第二個點,不需要設置點的順序,參數設置爲Type.Missing
pMultipoint.AddPoint(pPoint2,
ref o,
ref o); ……//添加其他點
Segment幾何對象
Path是連續的Segment的集合,除了路徑的第一個Segment和最後一個Segment外其餘的Segment的起始點都是前一個Segment的終止點,即Path對象的中的Segment不能出現分離,Path可以是任意數的Line,CircularArc,EllipticArc和BezierCurve的組合。
一個或多個Path組成一個Polyline對象。
Ring是一個封閉的Path即起始和終止點有相同的座標值。它有內部和外部屬性。
一個或多個Ring對象組成一個Polygon對象。
Polyline對象是由一個或多個相連或者不相連的path對象的有序集合,它可以是單個Path對象組成,也可以是多個相連的Path對象組成,或者是多個分離的Path組成,如下圖所示。Polyline通常用來代表線狀地物如道路,河流,管線等等
一個Polyline對象必須滿足以下準則:
1.組成Polyline對象的所有Path對象必須是有效的。
2.組成Polyline對象的所有Path對象不能重合,相交或自相交。
3.組成Polyline對象的多個Path對象可以連接與某一點,也可以分離。
4.Path對象的長度不能爲0.
IPolyline是Polyline類的主要接口,IPolyline的Reshape方法可以使用一個Path對象爲一個Polyline對象整形,IPolyline的SimplifyNetwork方法用於簡化網絡。
Polyline對象可以使用IGeometryCollection接口添加Path對象的方法來創建,使用該接口需注意以下情況:
1.每一個Path對象必須是有效的,或使用IPath::Simplify方法後有效。
2.由於Polyline是Path對象的有序集合,所以添加Path對象時必須注意順序和方向。
3.爲了保證Polyline是有效的,可以創建完Polyline對象後使用ITopologicalOperator接口的Simplify方法。
以下代碼片段爲使用IGeometryCollection接口創建一個Polyline對象:
//定義第一個點
IPoint
pPoint1 = new
PointClass(); pPoint1.X = 100; pPoint1.Y = 100;
//定義第二個點
IPoint
pPoint2 = new
PointClass(); pPoint2.X = 200;
pPoint2.Y = 200;
//創建一個Line對象
ILine
pLine= new
LineClass();
//設置Line對象的起始終止點
pLine.PutCoords(pPoint1,pPoint2);
//QI到ISegment
ISegment
pSegment= pLine as
ISegment;
//創建一個Path對象
SegmentCollection
pPath= new
PathClass();
object
o=Type.Missing;
//通過ISegmentCollection接口爲Path對象添加Segment對象
pPath.AddSegment(pSegment,ref
o,ref
o);
//創建一個Polyline對象
IGeometryCollection
pPolyline = new
PolylineClass();
//通過IGeometryCollection爲Polyline對象添加Path對象
pPolyline.AddGeometry(pPath
as IGeometry,
ref o,
ref o);
2Polylgon對象是由一個或多個Ring對象的有序集合,它可以是由單個Ring 對象構成,也可以使用多個Ring組成如下圖所示。其中Ring可以分爲Outer Ring(外環)和Inner Ring(內環)之分。外環和內環都是有方向的,它們的區別是外環的方向是順時針的,內環的方向是逆時針。Polygon通常用來代表有面積的多邊形矢量對象,如行政區,建築物等
以下代碼片段演示如何構建一個Polygon:
//創建一個Ring對象,通過ISegmentCollection接口向其中添加Segment對象
ISegmentCollection
pSegCollection = new
RingClass();
object
o = Type.Missing;
pSegCollection.AddSegment(pSegment1,
ref o,
ref o);
pSegCollection.AddSegment(pSegment2,
ref o,
ref o);
//QI到IRing接口封閉Ring對象,使其有效
IRing
pRing = pSegCollection
as IRing;
pRing.Close();
//使用Ring對象構建Polygon對象
IGeometryCollection
pGeometryColl = new
PolygonClass();
pGeometryColl.AddGeometry(pRing,
ref o,
ref o);
Envelope是所有幾何對象的外接矩形,用於表示幾何對象的最小邊框,所有的幾何對象都有一個Envelope對象,IEnvelope是Envelope對象的主要接口,通過它可以獲取幾何對象的XMax,XMin,YMax,YMin,Height,Width屬性。通過IEnvelope的Expand方法還可以按比例縮放Envelope對象的範圍。
6Curve對象幾何對象
除去Point,MultiPoint和Envelope外,其他所有的幾何體都可以看做是Curve(曲線)。Line,Polyline,Polygon,CircularArc,BezierCurve,EllipticArc和CircularArc都是曲線的一種,它們都實現了ICurve接口。
ICurve接口的Length屬性用於返回一個Curve對象的長度。
ICurve接口的FromPoint和ToPoint屬性可以獲得Curve對象的起止點。
ICurve接口的Reverseorientation方法可以改變一個Curve對象的節點次序即調動Curve對象的起始點和終止點互相調換。
ICurve接口的IsClosed屬性則可以判斷一個Curve對象起始點和終止點是否在一個位置上。
ICurve接口的GetSubcurve方法可以複製一條Curve對象的特定部分,例如一條10千米公路的Curve對象,獲取2-5千米處的公路的曲線代碼片段如下所示:
//QI到ICurve接口
ICurve
pCurve = pPolyline as
ICurve;
//創建一個Polyline對象
ICurve
pNewCurve = new
PolylineClass();
bool
btrue= true;
//獲取-5千米間的曲線對象
pCurve.GetSubcurve(2, 5, btrue,
out pNewCurve);
此外ICurve的QueryTangent和QueryNormal方法分別用於獲取Curve對象上某一點的曲線的切線和法線。
2.4.7 Triangle Strip和Trangle Fan, Trangle,Ring幾何對象
Triangle Strip和Trangle Fan, Trangle,Ring是構成MultiPatch幾何對象的構建對象。
2.4.7.1Triangle Strip幾何對象
TriangelStrip對象是由一系列點定義的曲面片組成,而曲面片是有若干個三角形所組成,所以這個曲面可以定義爲:(0,1,2) ,(2, 1, 3), (2, 3, 4), (4, 3, 5)。
2Trangle Fan幾何對象
一個Trangle Fan對象由一系列點定義的曲面片組成,所不同的是所有的三角形共享一個頂點。如下圖所示,所以這個曲面可以定義爲:(0,1,2) ,(0,2, 3), (0, 3, 4), (0, 4, 5)。
3Triangle幾何對象
Triangle由三個點所確定如下圖,一個Triangle可定義爲(0,1,2)等。
4Ring幾何對象
Ring和前邊介紹的組成Polygon的Ring一樣,例如下邊一個房屋組成它的牆是個OutRing對象,而窗戶和門是InnerRing對象
8Multipatch幾何對象
Multipatch幾何對象用於描述3D圖形,可以由TriangleStrip, TriangleFan, Triangle和ring對象組合構成組成。Multipatch可以通過多種方式創建,一種是通過導入外部3D格式數據文件(3D Studio Max .3ds files, OpenFlight .flt files, COLLADA .dae files, Sketchup .skp files, VRML .wrl files),另外ArcGIS Engine提供了多種創建Multipatch幾何對象的方法:
如果創建沒有貼圖紋理,沒有法向,沒有組成部分信息的Multipatch時,只需創建好組成的Multipatch的各個部分即可,然後通過MultiPatch的IGeometryCollection接口添加各個組成部分即可。
如果要爲Multipatch每個組成部分添加紋理信息,法向信息,屬性信息就必須使用GeneralMultiPatchCreator對象來創建,通過其IGeneralMultiPatchInfo接口來爲MultiPatch各個組成部分定義法向,材質,屬性信息。通過IGeneralMultiPatchInfo接口可以獲取這些MultiPatch的各個組成部分的信息。
通過IConstructMultiPatch接口和IExtrude接口操作GeometryEnvironment對象可以通過拉伸Polyline對象(拉伸爲牆)和Polygon對象(拉伸爲多面體)來創建MultiPatch.
通過訪問3D符號庫,獲取3DSymbol來渲染點,把三維符號放置在點的位置從而生成Multipatch.
接下來給大家介紹通過GeneralMultiPatchCreator創建一個有紋理MultiPatch的方法:需要使用以下三個對象:
GeometryMaterial:用於構建材質,通過IGeometryMaterial創建的材質可以作爲TextureLineSymbol或者 TextureFillSymbol屬性用來創建這些符號,也可以把它添加到GeometryMaterialList對象中,用於GeneralMultipatchCreator對象構建Multipatch對象。
GeometryMaterialList:材質對象的容器用於GeneralMultiPatchCreator對象調用Init方法時使用。
GeneralMultiPatchCreator:用於創建有紋理的貼圖的Multipatch.。 9Geometry集合接口
通過前邊對於具體的Geometry對象的介紹可知,除了Point對象之外,其他幾何對象都是通過其他幾何對象集合構建而成。如MultiPoint對象是點的集合,Path對象是Segment對象的集合,Polyline對象是Path對象的集合,Polygon對象是Ring對象的集合,Multipatch對象是Triangle Strip和Trangle Fan, Trangle,Ring對象的集合。
ArcGIS Engine提供了三個主要的幾何圖形集合接口用於對幾何對象的操作,分別是IPointCollection,ISegmentCollection和IGeometryCollection,這些接口揭示出ArcGIS Engine的幾何模型的實質——它們是一種組合構成的模式,這種組合並不一定按照嚴格的層次結構組織。
在前面介紹一些幾何對象的時候,也給大家演示了部分使用功能,這三個接口在程序開發中經常使用到,接下來簡單闡述以下這三個接口的使用方法。
2.4.9.1IGeometryCollection接口IGeometryCollection接口被Polygon,Polyline, Multipoint, Multipatch, Trangle,T rangle Strip,Trangle Fan和GeometryBag所實現。IGeometryCollection接口提供的方法可以讓開發者對一個幾何對象的組成元素即子對象進行添加,改變和移除。例如:
組成Polyline對象的子對象是Path對象。
組成Polygon對象的子對象是Ring對象。
組成Multipoint對象的子對象是Point對象。
組成MultiPatch對象的子對象是TrangleFan TrangleStrip,Triangle或Ring對象。
組成GeometryBag對象的是任何類型的幾何體對象,實際上GeometryBag是一個可以容納任何類型幾何對象的容器。
IGeometryCollection的Geometry 屬性可以通過一個索引值返回一個組成該幾何對象的某個子對象,而GeometryCount返回組成該幾何對象的子對象的數目。
IGeometry的AddGeometry和AddGeometries方法都用於向一個幾何對象添加子對象,它們的區別是前者一次只能添加一個幾何對象,而後者可以一次添加一個幾何對象數組。除此之外,AddGeometry方法可以將子對象添加到幾何的指定索引值的位置,而AddGeometries方法將子對象數組添加到集合的最後。
在使用AddGeometry方法添加子對象到Polygon對象的過程中,如果子對象即Ring出現覆蓋現象,那麼多邊形就沒有封閉或出現了包含關係,那麼這個Polygon就不是簡單Polygon,因此通過IGometryCollection來創建一個Polygon時,需要使用ITopologicalOperator 的Simplify方法保證其有效性。 .4.9.2ISegmentCollection接口
ISegmentCollection接口被Path,Ring,Polyline和Polygon四個類所實現,它們被稱作是Segment集合對象,使用這個接口可以處理組成Segment集合對象中的每一個子Segment對象。使用ISegmentCollection接口可以爲一個Segment集合對象添加,插入,刪除Segment子對象。ISegmentCollection接口SetCircle和SetRectangle方法提供了一種簡單不需要添加Segment的情況下構建一個完成的Path,Ring,Polyline和Polygon的方法。
2.4.9.3IPointCollection接口
IPointCollection可以被多個幾何對象類所實現,這些對象都是由多個點構成如:Mullipoint,Path,Ring,Polyline,Polygon,TriangleFan,TrangleStrip,Trangle,Multipatch等,它們都可以稱作PointCollection對象,通過IPointCollection接口定義的方法可以獲取,添加,插入,查詢,移除幾何對象中的某個頂點。同以上兩個接口一樣它也定義了操作一個點集合對象的方法,例如通過AddPoint方法可以向PointCollection對象中的特定索引位添加一個點對象,如果不指定位置,則添加到最後。通過IPointCollection的Point屬性通過頂點索引可以得到某一頂點。
在本章節最後的Demo 實例將爲大家演示IPointCollection提供的功能。
2.4.10幾何對象總結
在Geometry模型中的幾何對象分爲兩種類型,一類是用來直接構建要素類的稱爲高級幾何對象,一類用來構建高級幾何對象相對低一級的幾何對象成爲構建幾何對象如下表所示:
幾何對象名稱
|
所屬類別
|
構成子幾何對象
|
用於創建和編輯的接口
|
Polyline
|
高級
|
Path
|
IGeometryCollection, IPointCollection
|
Polygon
|
高級
|
Ring
|
IGeometryCollection, IPointCollection
|
MultiPoint
|
高級
|
Point
|
IGeometryCollection, IPointCollection
|
MultiPatch
|
高級
|
TrangleFan,Ring TrangleStrip ,Trangle,
|
IGeometryCollection, IPointCollection
|
Ring
|
低級
|
Segment
|
ISegmentCollection, IPointCollection
|
Path
|
低級
|
Segment
|
ISegmentCollection, IPointCollection
|
Segment
|
低級
|
Point
|
IPoint,ILine,
ICurve
|
TriangleFan
|
低級
|
Point
|
IGeometryCollection, IPointCollection
|
TriangleStrip
|
低級
|
Point
|
IGeometryCollection, IPointCollection
|
Triangle
|
低級
|
Point
|
IGeometryCollection, IPointCollection
|
Point
|
高級/低級
|
無
|
IPoint
|
|