Geometry是一種基本類。它是一種抽象類。是ArcGIS Engine中使用最爲廣泛的對象集之一,用戶在創建、刪除、編輯和進行地理分析的時候,就是處理一個包含幾何形體的矢量對象;除了顯示要素以外,控件對象選擇,要素符號化,標註要素,編輯要素都需要Geometry參與。
在Geometry模型中的幾何對象分爲兩種類型,一類是用來直接構建要素類的稱爲高級幾何對象,一類用來構建高級幾何對象的相對低一級的幾何對象稱爲構建幾何對象如下表所示。
幾何對象名稱 | 中文名 | 所屬類別 | 構成子幾何對象 | 用於創建和編輯的接口 |
Polyline | 多義線 | 高級 | Path | IGeometryCollection,IPointCollection |
Polygon | 多邊形 | 高級 | Ring | IGeometryCollection,IPointCollection |
MultiPoint | 點集 | 高級 | Point | IGeometryCollection,IPointCollection |
MultiPatch | 多面體 | 高級 |
TrangleFan,Ring, TrangleStrip,Trangles |
IGeometryCollection,IPointCollection |
Ring | 環 | 低級 | Segment | ISegmentCollection,IPointCollection |
Path | 路徑 | 低級 | Segment | ISegmentCollection,IPointCollection |
Segment | 線 | 低級 | Point | IPoint,ILine, ICurve |
TriangleFan | 三角扇 | 低級 | Point | IGeometryCollection,IPointCollection |
TriangleStrip | 三角片 | 低級 | Point | IGeometryCollection,IPointCollection |
Triangles | 三角形 | 低級 | Point | IGeometryCollection,IPointCollection |
Point | 點 | 高級/低級 | 無 | IPoint |
幾何對象
1、Point:是一個0維的幾何圖形,具有X,Y座標值,以及一些可選的屬性:如高程值(Z值),度量值(M值)。
2、MultiPoint:點集對象是一系列無序的點的羣集,這些點具有相同的屬性信息。例如可以用一個點集來表示整個城市天然氣調壓站。以下代碼片段演示如何構建Multipoint對象。
//定義第一個點
IPoint pPoint1 = new PointClass();
pPoint1.X = 100;
pPoint1.Y = 100;
//定義第二個點
IPoint pPoint2 = new PointClass();
pPoint2.PutCoords(200, 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);
//……添加其他點
3、Segment:是一個有起點和終點的“線“,也就是說Segement只有兩個點,至於兩點之間的線是直的,還是曲的,需要其餘的參數定義。所以Segment是由起點,終點和參數三個方面決定的。Segment 有4個子類,直線 Line,圓弧 CircularArc,橢圓弧 EllipticArc,貝賽爾曲線 BezierCurve。
4、Path:是連續的Segment的集合,除了路徑的第一個Segment和最後一個Segment外,其餘的Segment的起始點都是前一個Segment的終止點,即Path對象的中的Segment不能出現分離。一個或多個Path組成一個Polyline對象。
5、Ring:是一個封閉的Path即起始和終止點有相同的座標值。它有內部和外部屬性。一個或多個Ring對象組成一個Polygon對象。
6、Polyline:是由一個或多個相連或者不相連的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對象
ISegmentCollection 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);
以下代碼片段爲通過點集生成線:
//通過點集生成線
IPolyline polyline = new PolylineClass();
//思路是通過點集接口IPointCollection添加線的點,創建線和麪同樣可用此方法
IPointCollection pointColl = polyline as IPointCollection;
IPoint point = new PointClass();
point.PutCoords(100, 200);
pointColl.AddPoint(point);
point = new PointClass();
point.PutCoords(300, 100);
pointColl.AddPoint(point);
//通過點集生成線 完成~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//獲取線的起點和終點
IPoint pointStart = polyline.FromPoint;
IPoint pointEnd = polyline.ToPoint;
//獲取線的長度
double length = polyline.Length;
//獲取線的矩形範圍(envelop),面的獲取方式也一樣
IEnvelope envelope = polyline.Envelope;
//獲取線是否是閉合的線
bool isClosed = polyline.IsClosed;
//把線的方向反轉,就是起點和終點,點的順序反轉
polyline.ReverseOrientation();
//獲取線的所有點,對於面同樣可用此方法
for (int i = 0; i < pointColl.PointCount; i++)
{
IPoint point1 = pointColl.Point[i];
}
7、Polylgon:是由一個或多個Ring對象的有序集合,它可以是由單個Ring對象構成,也可以使用多個Ring組成。其中Ring可以分爲Outer Ring(外環)和Inner Ring(內環)之分。外環和內環都是有方向的,它們的區別是外環的方向是順時針的,內環的方向是逆時針。Polygon通常用來代表有面積的多邊形矢量對象,如行政區,建築物等。Polygon是由 Ring 構成,而Ring又是Segment構成,但是這並不意味着用戶必須按照這種層次去構造 Polygon,實際上用 Point 的集合可以構成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);
Polygon對象實現了一個接口 IArea,而該接口用來對 Poylgon 的中心、重心,以及面積進行訪問,下面片段用來獲取 Polygon 的面積:
IArea pArea = pPolygon as IArea;
double S = pArea.Area;
8、Envelope:是所有幾何對象的外接矩形,用於表示幾何對象的最小邊框,所有的幾何對象都有一個Envelope對象,不過點的envelop沒有意義,IEnvelope是Envelope對象的主要接口,通過它可以獲取幾何對象的XMax,XMin,YMax,YMin,Height,Width屬性。通過IEnvelope的Expand方法還可以按比例縮放Envelope對象的範圍。CenterAt方法把矩形中心點移到某個點(實際是整個矩形移動)。
//通過座標創建矩形
IEnvelope envelope2 = new EnvelopeClass();
envelope2.PutCoords(100, 200, 300, 400);
9、Curve:除去Point,MultiPoint和Envelope外,其他所有的幾何體都可以看做是Curve(曲線)。Line,Polyline,Polygon,CircularArc,BezierCurve,EllipticArc和CircularArc都是曲線的一種,它們都實現了ICurve接口。Length屬性用於返回一個Curve對象的長度。FromPoint和ToPoint屬性可以獲得Curve對象的起止點。Reverseorientation方法可以改變一個Curve對象的節點次序即調動Curve對象的起始點和終止點互相調換。IsClosed屬性則可以判斷一個Curve對象起始點和終止點是否在一個位置上。ICurve接口的GetSubcurve方法可以複製一條Curve對象的特定部分,例如一條10千米公路的Curve對象,獲取2-5千米處的公路的曲線代碼片段如下所示。
//QI到ICurve接口
ICurve pCurve = pPolyline as ICurve;
//創建一個Polyline對象
ICurve pNewCurve = new PolylineClass();
bool btrue = true;
//獲取2-5千米間的曲線對象
pCurve.GetSubcurve(2, 5, btrue, out pNewCurve);
此外ICurve的QueryTangent和QueryNormal方法分別用於獲取Curve對象上某一點的曲線的切線和法線。
10、TriangelStrip:是由一系列點定義的曲面片組成,而曲面片是有若干個三角形所組成,所以這個曲面可以定義爲:(0,1,2) ,(2, 1, 3), (2, 3, 4), (4, 3, 5)。
11、Trangle Fan:一個Trangle Fan對象由一系列點定義的曲面片組成,所不同的是所有的三角形共享一個頂點。所以這個曲面可以定義爲:(0,1,2) ,(0,2, 3), (0, 3, 4), (0, 4, 5)。
12、Triangles:由三個點所確定,一個Triangles可定義爲(0,1,2)等。
13、Multipatch:用於描述3D圖形,可以由TriangleStrip,TriangleFan,Triangles和ring對象組合構成組成。Multipatch可以通過多種方式創建,一種是通過導入外部3D格式數據文件(3D Studio Max .3ds files, OpenFlight .flt files, COLLADA .dae files, Sketchup .skp files, VRML .wrl files),另外ArcGIS Engine提供了多種創建Multipatch幾何對象的方法:
1)如果創建沒有貼圖紋理,沒有法向,沒有組成部分信息的Multipatch時,只需創建好組成的Multipatch的各個部分即可,然後通過MultiPatch的IGeometryCollection接口添加各個組成部分即可。
2)如果要爲Multipatch每個組成部分添加紋理信息,法向信息,屬性信息就必須使用GeneralMultiPatchCreator對象來創建,通過其IGeneralMultiPatchInfo接口來爲MultiPatch各個組成部分定義法向,材質,屬性信息。通過IGeneralMultiPatchInfo接口可以獲取這些MultiPatch的各個組成部分的信息。
3)通過IConstructMultiPatch接口和IExtrude接口操作GeometryEnvironment對象可以通過拉伸Polyline對象(拉伸爲牆)和Polygon對象(拉伸爲多面體)來創建MultiPatch.
4)通過訪問3D符號庫,獲取3DSymbol來渲染點,把三維符號放置在點的位置從而生成Multipatch。
接下來介紹通過GeneralMultiPatchCreator創建一個有紋理MultiPatch的方法,需要使用以下三個對象:
GeometryMaterial:用於構建材質,通過IGeometryMaterial創建的材質可以作爲TextureLineSymbol或者TextureFillSymbol屬性用來創建這些符號,也可以把它添加到GeometryMaterialList對象中,用於GeneralMultipatchCreator對象構建Multipatch對象。
GeometryMaterialList:材質對象的容器用於GeneralMultiPatchCreator對象調用Init方法時使用。
GeneralMultiPatchCreator:用於創建有紋理的貼圖的Multipatch。
集合接口
通過前面對於具體的Geometry對象的介紹可知,除了Point對象之外,其他幾何對象都是通過其他幾何對象集合構建而成。如MultiPoint對象是點的集合,Path對象是Segment對象的集合,Polyline對象是Path對象的集合,Polygon對象是Ring對象的集合,Multipatch對象是Triangle Strip和Trangle Fan, Trangles,Ring對象的集合。
//獲取幾何類型,可以區分出點,線,面等
esriGeometryType geometryType = geometry.GeometryType;
ArcGIS Engine提供了三個主要的幾何圖形集合接口用於對幾何對象的操作,分別是IPointCollection,ISegmentCollection和IGeometryCollection,這些接口揭示出ArcGIS Engine的幾何模型的實質——它們是一種組合構成的模式,這種組合並不一定按照嚴格的層次結構組織。在前面介紹一些幾何對象的時候,也給大家演示了部分使用功能,以下三個接口在程序開發中經常使用到,接下來簡單闡述以下這三個接口的使用方法。
1、IGeometryCollection接口
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方法保證其有效性。
2、ISegmentCollection接口
ISegmentCollection接口被Path,Ring,Polyline和Polygon四個類所實現,它們被稱作是Segment集合對象,使用這個接口可以處理組成Segment集合對象中的每一個子Segment對象。使用ISegmentCollection接口可以爲一個Segment集合對象添加,插入,刪除Segment子對象。ISegmentCollection接口SetCircle和SetRectangle方法提供了一種簡單不需要添加Segment的情況下構建一個完成的Path,Ring,Polyline和Polygon的方法。
3、IPointCollection接口
IPointCollection可以被多個幾何對象類所實現,這些對象都是由多個點構成如:Mullipoint,Path,Ring,Polyline,Polygon,TriangleFan,TrangleStrip,Trangle,Multipatch等,它們都可以稱作PointCollection對象,通過IPointCollection接口定義的方法可以獲取,添加,插入,查詢,移除幾何對象中的某個頂點。同以上兩個接口一樣它也定義了操作一個點集合對象的方法,例如通過AddPoint方法可以向PointCollection對象中的特定索引位添加一個點對象,如果不指定位置,則添加到最後。通過IPointCollection的Point屬性通過頂點索引可以得到某一頂點。