ArcGIS Engine基础开发教程(转)
ArcGIS Engine基礎開發教程(0)——目錄
《ArcEngine9.3 基礎開發教程》是面向初中級開發者的一份簡單易用,功能全面的學習資料及參考文檔。教程首先從如何來創建一個ArcGIS Engine桌面應用程序開始,依據GIS的數據獲取(幾何對象與空間參考)、顯示(地圖與地圖布局、圖層符號化、地圖輸出)、處理(地圖查詢)、分析(空間分析)主線來進行詳細講解。每一具體的部分均由目標、準備工作、接口介紹、實例代碼、演示效果幾方面來闡述。教程圖文并茂,條理清晰,是初學者最佳的選擇。
講座題目:ArcGIS Engine基礎開發教程
主講人:fxlcoco
第一講 創建第一個ArcGIS Engine桌面應用程序... 6
第二講 學習何對象與空間參考... 15
第三講 學習地圖和地圖布局... 44
第四講 學習圖層符號化... 64
第五講 學習地圖查詢... 91
第六講 學習空間分析... 110
第七講 學習地圖輸出... 121、
ArcGIS Engine基礎開發教程(2)——學習幾何對象與空間參考
轉載自: http://bbs.esrichina-bj.cn/ESRI/thread-46367-1-1.html
2.1目標
1.熟悉ArcGIS Engine Geometry模型,通過程序構建常用幾何對象
2.熟悉空間參考
3.通過野外測量點構建一個polygon shapefile功能開發
2.2準備工作
1.IDE:Visual
2.ArcGIS Engine Developer kit 9.3
??????? 3.自造一份包含X,Y坐標的*.txt文本文檔數據(即野外測量點)
2.3Geometry主要幾何對象模型圖
???????????????????????????????????????????????????????????????? 圖1
Geometry是ArcGIS Engine中使用最為廣泛的對象集之一,用戶在創建、刪除、編輯和進行地理分析的時候,就是處理一個包含幾何形體的矢量對象;除了顯示要素意外,控件對象選擇,要素符號化,標注要素,編輯要素都需要Geometry參與。圖1是Geometry的主要幾何對象模型圖,接下來將一一介紹這些幾何對象
2.4幾何對象
2.4.1Point和MultiPoint幾何對象
2.4.1.1Point幾何對象
Point:是一個0維的幾何圖形,具有X,Y坐標值,以及一些可選的屬性:如高程值(Z值),度量值(M值) 和ID號,點對象用于描述精確定位的對象,例如一個電話亭在一個城市的精確位置以下代碼演示如何創建一個Point對象:
復制代碼
2.4.1.2MultiPoint幾何對象
MultiPoint:點集對象是一系列無序的點的群集,這些點具有相同的屬性信息。例如可以用一個點集來表示整個城市天然氣調壓站。如下圖所示:一個Multipoint對象由6個Point對象組成。
????????????????????????????????????????????????????????????? 圖2
以下代碼片段演示如何構建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.MissingpMultipoint.AddPoint(pPoint2, ref o, ref o);
……//添加其他點
2.4.2Segment幾何對象
2.4.3Path和Ring幾何對象
2.4.3.1Path幾何對象
Path是連續的Segment的集合,除了路徑的第一個Segment和最后一個Segment外其余的Segment的起始點都是前一個Segment的終止點,即Path對象的中的Segment不能出現分離,Path可以是任意數的Line,CircularArc,EllipticArc和BezierCurve的組合。
??????????????????????????????????????????????????????? 圖4
??? 一個或多個Path組成一個Polyline對象。
2.4.3.2Ring幾何對象
???????? Ring是一個封閉的Path即起始和終止點有相同的坐標值。它有內部和外部屬性。
????????????????????????????????????????? 圖5
???? 一個或多個Ring對象組成一個Polygon對象。
2.4.4Polyline和Polygon幾何對象
2.4.4.1Polyline幾何對象
Polyline對象是由一個或多個相連或者不相連的path對象的有序集合,它可以是單個Path對象組成,也可以是多個相連的Path對象組成,或者是多個分離的Path組成,如下圖所示。Polyline通常用來代表線狀地物如道路,河流,管線等等。
??????????????????????????????????????????????????????????????????????? 圖6
一個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);
2.4.4.2Polylgon幾何對象
?? 2Polylgon對象是由一個或多個Ring對象的有序集合,它可以是由單個Ring 對象構成,也可以使用多個Ring組成如下圖所示。其中Ring可以分為Outer Ring(外環)和Inner Ring(內環)之分。外環和內環都是有方向的,它們的區別是外環的方向是順時針的,內環的方向是逆時針。Polygon通常用來代表有面積的多邊形矢量對象,如行政區,建筑物等。
???????????????????????????????????????????????????????????????? 圖7
以下代碼片段演示如何構建一個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);
2.4.5Envelope幾何對象
? Envelope是所有幾何對象的外接矩形,用于表示幾何對象的最小邊框,所有的幾何對象都有一個Envelope對象,IEnvelope是Envelope對象的主要接口,通過它可以獲取幾何對象的XMax,XMin,YMax,YMin,Height,Width屬性。通過IEnvelope的Expand方法還可以按比例縮放Envelope對象的范圍,如下圖所示:
2.4.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)。
??????????????????????????????????????????????????????????? 圖9
2.4.7.2Trangle Fan幾何對象
一個Trangle Fan對象由一系列點定義的曲面片組成,所不同的是所有的三角形共享一個頂點。如下圖所示,所以這個曲面可以定義為:(0,1,2) ,(0,2, 3), (0, 3, 4), (0, 4, 5)。
????????????????????????????????????????????????????????????????????? 圖10
2.4.7.3Triangle幾何對象
Triangle由三個點所確定如下圖,一個Triangle可定義為(0,1,2)等。
??????????????????????????????????????????????????? 圖11
2.4.7.4Ring幾何對象
Ring和前邊介紹的組成Polygon的Ring一樣,例如下邊一個房屋組成它的墻是個OutRing對象,而窗戶和門是InnerRing對象。
????????????????????????????????????????????????????????????????????????? 圖12
2.4.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.
下圖為MultiPatch對象的貼圖原理:
????????????????????????????????????????????????????????????????????????????? 圖13
接下來給大家介紹通過GeneralMultiPatchCreator創建一個有紋理MultiPatch的方法:需要使用以下三個對象:
GeometryMaterial:用于構建材質,通過IGeometryMaterial創建的材質可以作為TextureLineSymbol或者 TextureFillSymbol屬性用來創建這些符號,也可以把它添加到GeometryMaterialList對象中,用于GeneralMultipatchCreator對象構建Multipatch對象。
GeometryMaterialList:材質對象的容器用于GeneralMultiPatchCreator對象調用Init方法時使用。
GeneralMultiPatchCreator:用于創建有紋理的貼圖的Multipatch.。
以下代碼片段演示如何創建一個MultiPatch對象
??????? ///
<summary>
??????? ///
構建Multipatch幾何對象
??????? ///
</summary>
??????? ///
<returns>返回Multipatch幾何對象</returns>
??????? public IMultiPatch CreateMultipatch()
{
??????????? try
{
??????????????? //創建圖形材質對象
??????????????? IGeometryMaterial texture = new GeometryMaterialClass();
texture.TextureImage = @"C:\Temp\MyImage.jpg";
??????????????? //創建材質列表對象
??????????????? IGeometryMaterialList materialList = new GeometryMaterialListClass();
??????????????? //向材質列表添加材質
materialList.AddMaterial(texture);
??????????????? //創建GeneralMultiPatchCreator對象
??????????????? IGeneralMultiPatchCreator multiPatchCreator = new GeneralMultiPatchCreatorClass();
multiPatchCreator.Init(4, 1, false, false, false, 4, materialList);
??????????????? //設置Part:可以使三角扇或環
multiPatchCreator.SetPatchType(0, esriPatchType.esriPatchTypeTriangleStrip);
multiPatchCreator.SetMaterialIndex(0, 0);
multiPatchCreator.SetPatchPointIndex(0, 0);
multiPatchCreator.SetPatchTexturePointIndex(0, 0);
??????????????? //創建真實points.
??????????????? WKSPointZ upperLeft = new WKSPointZ();
??????????????? WKSPointZ lowerLeft = new WKSPointZ();
??????????????? WKSPointZ upperRight = new WKSPointZ();
??????????????? WKSPointZ lowerRight = new WKSPointZ();
upperLeft.X = 0;
upperLeft.Y = 0;
upperLeft.Z = 0;
upperRight.X = 300;
upperRight.Y = 0;
upperRight.Z = 0;
lowerLeft.X = 0;
lowerLeft.Y = 0;
lowerLeft.Z = -100;
lowerRight.X = 300;
lowerRight.Y = 1;
lowerRight.Z = -100;
multiPatchCreator.SetWKSPointZ(0, ref upperRight);
multiPatchCreator.SetWKSPointZ(1, ref lowerRight);
multiPatchCreator.SetWKSPointZ(2, ref upperLeft);
multiPatchCreator.SetWKSPointZ(3, ref lowerLeft);
??????????????? //設置貼圖的點
??????????????? WKSPoint textureUpperLeft = new WKSPoint();
??????????????? WKSPoint textureLowerLeft = new WKSPoint();
??????????????? WKSPoint textureUpperRight = new WKSPoint();
??????????????? WKSPoint textureLowerRight = new WKSPoint();
textureUpperLeft.X = 0; textureUpperLeft.Y = 0;
textureUpperRight.X = 1; textureUpperRight.Y = 0;
textureLowerLeft.X = 0; textureLowerLeft.Y = 1;
textureLowerRight.X = 1; textureLowerRight.Y = 1;
multiPatchCreator.SetTextureWKSPoint(0, ref textureUpperRight);
multiPatchCreator.SetTextureWKSPoint(1, ref textureLowerRight);
multiPatchCreator.SetTextureWKSPoint(2, ref textureUpperLeft);
multiPatchCreator.SetTextureWKSPoint(3, ref textureLowerLeft);
??????????????? //創建MultiPatch對象
??????????????? IMultiPatch multiPatch = multiPatchCreator.CreateMultiPatch() as IMultiPatch;
??????????????? return multiPatch;
}
??????????? catch (Exception Err)
{
??????????????? MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
2.4.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方法保證其有效性。
通過IGeometryCollection創建一個Polygon對象的代碼片段如下:
///
<summary>
///
構造Polygon對象
///
</summary>
///
<param name="pRingList">Ring對象集合</param>
///
<returns>返回一個Polygon對象</returns>
private IPolygon ConstructorPolygon(List<IRing> pRingList)
{
try
{
//創建一個Polygon對象
IGeometryCollection pGCollection = new PolygonClass();
object o = Type.Missing;
//遍歷Ring集合
for(int i=0;i<pRingList.Count;i++)
{
//通過IGeometryCollection接口的AddGeometry方法向Polygon對象中添加Ring子對象
pGCollection.AddGeometry(pRingList, ref o, ref o);
}
//QI至ITopologicalOperator
ITopologicalOperator pTopological = pGCollection as ITopologicalOperator;
//執行Simplify操作
pTopological.Simplify();
IPolygon pPolygon=pGCollection as IPolygon;
//返回Polygon對象
return pPolygon;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,,MessageBoxIcon.Information);
return null;
}
}
同樣可以通過IGeometryCollection的AddGeometryCollection方法可以將一個Polygon中的所有子對象Ring添加到另外一個多邊形中,這樣就實現了合并兩個多邊形對象為一個多邊形對象的功能,這非常有用。
以下代碼片段演示如何合并兩個Polygon對象為一個Polgyone對象:
///
<summary>
///
合并兩個Polygon
///
</summary>
///
<param name="firstPolygon">第一個Polygon</param>
///
<param name="SecondPolygon">第二個Polygon</param>
///
<returns>返回合并后的Polygon</returns>
private IPolygon MergePolygons(IPolygon firstPolygon, IPolygon SecondPolygon)
{
try
{
//創建一個Polygon對象
IGeometryCollection pGCollection1=new PolygonClass();
IGeometryCollection pGCollection2 = firstPolygon as IGeometryCollection;
IGeometryCollection pGCollection3 = SecondPolygon as IGeometryCollection;
//添加firstPolygon
pGCollection1.AddGeometryCollection(pGCollection2);
//添加SecondPolygon
pGCollection1.AddGeometryCollection(pGCollection3);
//QI至ITopologicalOperator
ITopologicalOperator pTopological = pGCollection1 as ITopologicalOperator;
//執行Simplify操作
pTopological.Simplify();
IPolygon pPolygon=pGCollection1 as IPolygon;
//返回Polygon對象
return pPolygon;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,,MessageBoxIcon.Information);
return null;
}
}
2.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
2.5 空間參考
2.5.1空間參考簡介
空間參考(Spatial Reference)是GIS數據的骨骼框架,能夠將我們的數據定位到相應的位置,為地圖中的每一點提供準確的坐標。 在同一個地圖上顯示的地圖數據的空間參考必須是一致的,如果兩個圖層的空間參考不一致,往往會導致兩幅地圖無法正確拼合,因此開發一個GIS系統時,為數據選擇正確的空間參考非常重要。
ArcGIS Engine提供了一系列對象供開發者管理GIS系統的坐標系統。對大部分開發者而言了解ProjectedCoordinateSystem, GeographicCoordinateSystem, SpatialReference Environment這三個組件類是非常有必要的,對于高級開發者而言,可能需要自定義坐標系統可以使用這些對象Projection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。
2.5.2修改空間參考
以下代碼片段演示了如何改變一個圖層的空間參考。
ArcGIS Engine基礎開發教程(3)——學習地圖和地圖布局
轉載自: http://bbs.esrichina-bj.cn/ESRI/thread-46577-1-1.html
本章是ArcGIS Engine基礎開發教程的第三章,主要給大家大致講解了,地圖和地圖布局的相關對象。這些對象非常重要,如果這些基本對象都不熟悉就開始搞ArcGIS Engine開發是不科學的也走不遠的。
3地圖和地圖布局
3.1地圖
3.1.1Map對象
Map對象是ArcGIS Engine的主要對象,本章將給大家介紹地圖組成結構,如何創建地圖,如何對組成地圖的對象進行操作,在介紹這些內容時盡量結合ArcMap學習效果會更好。
在Map對象上能顯示的圖形有兩類一類是地理數據,一類是元素。地理數據包括矢量類型的要素數據,柵格數據,Tin等表面數據等,這些數據都保存在Geodatabase或數據文件如shapefile中,它們是用于GIS分析制圖的源數據;
而元素是另一種可以顯示在Map上的對象,它分為兩部分一類是圖形元素,一類是框架元素,圖形元素可以顯示出來,而框架元素充當了“容器”的角色。在ArcMap中可以使用“Draw”工具在Map上直接繪制一個矩形,圓形,文本等對象,在布局視圖上也可以給地圖添加指北針,圖例,比例尺等圖形對象,這些都是圖形元素。
在ArcMap中Map對象是由MXDocument對象的MapFrame對象管理,MapFrame是一個框架元素。
Map對象有雙重身份,一方面是數據的管理容器,可以加載地理數據和圖形元素,扮演了數據管理器的角色,另一方面它又可以讓用戶看到這些數據即扮演了數據顯示器的角色,當加載數據到Map對象的時候,Map對象是數據的管理者;當改變視圖范圍,刷新地圖的時候它是數據的顯示者。
Map對象主要實現的接口由IMap, IGraphicContainer, IActiveView, IMapBookmarks等接口。
IMap接口主要用于管理Map對象中的Layer對象,要素選擇集對象,MapSourround對象,空間參考等對象。
Map對象可以顯示圖形元素(Graphics Element),Map對象通過IGraphicsContainer接口來管理這些元素對象,包括圖形元素和框架元素。IGraphicsContainer返回的是Map對象中處于活動狀態的Graphics layer引用指針,它可以是一個Basicgraphicslayer,也可以是CompositeGraphicsLayer中的一個圖層,或者是一個FDOGraphicsLayer注記圖層。
以下代碼片段演示如何添加一個Element到Map上:
IActiveView接口定義了Map對象的數據顯示功能。使用該接口可以改變視圖的范圍,刷新視圖。
IActiveView的PartialRefresh(esriViewGeography, pLayer, null)用于刷新指定圖層:
IActiveView的PartialRefresh(esriViewGeography, null, null) 用于刷新刷新所有圖層:
IActiveView的PartialRefresh(esriViewGeoSelection, null, null) 用于刷新所選擇的對象:
IActiveView的PartialRefresh(esriViewGraphics, null, null) 用于刷新圖形元素:
IActiveView的PartialRefresh(esriViewGraphics, pElement, null) 用于刷新指定圖形元素
IActiveView的PartialRefresh(esriViewGraphics, null, null) 用于刷新所有圖形元素
IActiveView的PartialRefresh(esriViewGraphicSelection, null, null)用于刷新所選擇的圖元。
IMapBookmark接口用于管理所有的空間書簽對象。
3.1.2圖層對象
Map對象可以裝載地理數據,這些數據是以圖層的形式加載到地圖對象上的,圖層對象Layer作為一個數據的“中介”存在,它本身沒有轉載地理數據,而僅僅是獲得了數據的引用,用于管理數據源的連接。地理數據始終保存在Geodatabase或者地理數據文件中。
由于地理數據的類型多樣,所以Layer類也擁有眾多子類(具體查看幫助),接下來主要給大家介紹要素圖層—FeatureLayer對象。
3.1.3FeatureLayer對象
FeatureLayer類實現的常用主要接口如下圖所示:IFeatureLayer,IFeatureLayerDefinition,FeatureSelection,IGeoDataset,IGeoFeatureLayer,IIdentify,ILayerEffects。
IFeatureLayer接口主要用于設置要素圖層的數據源(FeatureClass), IFeatureLayer的DataSourceType獲取FeatureLayer對象的數據源類型。此外通過IFeatureLayer的Search方法可以查詢要素圖層上符號某一條件的要素集。
IGeoFeatureLayer接口繼承了ILayer和IFeatureLayer兩個接口,用于控制要素圖層的符號化和標注等。
IGeoDataset接口僅有兩個屬性,它們用于管理地理要素集。Extent可以返回當前數據集的范圍,是一個IEnvelope類型的對象;
SpatialReference屬性則可以讓用戶獲得這個數據集的空間參考。
IFeatureSelection接口提供管理一個圖層中的要素的選擇集的方法和屬性。
以下代碼片段演示如何獲取要素圖層符合條件獲取選擇集
IFeatureLayerDefinition接口定義了CreateSelectionLayer方法,可以將一個圖層選擇集中的要素轉換為一個單獨的要素圖層。
3.1.4矢量圖層操作實例
以下代碼片段演示按行政區加載圖層數據的功能,以此理解IFeatureLayerDefinition的CreateSelectionLayer方法的使用。
比方說整個國土資源部有某一類型專題數據有若干圖層,每個圖層數據的范圍是整個中國,這時國土資源部開發一套系統可能有這個需求,每個省只能加載本省的數據。以下函數即為按按行政區范圍創建行政區范圍的圖層。
比方說我想獲取河南省的數據只需傳入行政區圖層中河南省圖元的Geometry即可。另外如果如果遇到行政區層必須用esriSpatialRelEnum. esriSpatialRelContains這個參數,否則行政區這個圖層就不能只獲取河南這個省份,它會把河南省的周圍省份,河北,湖北,安徽,陜西,山東,山西等省份的圖元也添加創建到新圖層。
IIdentify接口定義了獲得要素圖層單個要素的屬性的
ILayerFields接口可以直接獲取一個要素圖層的要素類字段集合
ILayerEffects接口用來設置一個要素圖層的透明度,對比度,對比度。以下代碼片段演示如何設置要素圖層特效:
3.2地圖布局
3.2.1PageLayout對象
PageLayout用以顯示地圖數據,并通過對地圖數據進行整飾以便對地圖打印輸出滿足不同行業對GIS出圖功能的需求。PageLayout和Map這兩個對象看起來非常相似,它們都是視圖對象,可以顯示地圖;也都是圖形元素的容器,可以容納圖形元素(Graphics Element)。但是所能夠保存的圖形類型卻是有差別的。PageLayout除了保存圖形元素外,還可以保存諸如MapFrame的框架元素(Frame Element)。PageLayout控件上的Map對象被PageLayout的MapFrame對象所管理的。
PageLayout類主要實現了IPageLayout接口,它定義了用于修改頁面版式(layout)的方法和屬性。
IPageLayout的方法ZoomToWhole方法可以讓PageLayout以最大尺寸顯示;
IPageLayout的ZoomToPercent方法可以按照輸入的比例顯示;
IPageLayout的ZoomToWidth方法可以讓視圖顯示的范圍匹配控件對象的寬度。
IPageLayout的Page屬性用以獲取Page對象
IPageLayout的RulerSettings屬性用以獲取RulerSettings對象
IPageLayout的HorizontalSnapGuides和VerticalSnapGuides屬性用以獲取SnapGuides對象
如下圖所示:
3.2.2Page對象
Page對象主要來管理PageLayout對象中的頁面,它用來加載地理數據,但不提供分析和查詢功能。Page類的主要接口是IPage,它除了用于管理Page的顏色,尺寸和方向,還可以管理邊框類型和打印區域等。例如通過IPage的FromID可以直接設置紙張大小類型(A4,A3等)。
3.2.3SnapGrid對象
SnapGrid是PageLayout上用于擺放元素而設置的輔助點如圖所示,這些點有規則呈網狀排列,便于使用者對其元素,它可以直接通過IPageLayout的SnapGrid屬性獲得當前PageLayout使用的SnapGrid對象的引用。
SnapGrid類主要實現了ISnapGrid接口用于設置SnapGrid對象的屬性,ISnapGrid的HorizontalSpacing 和VerticalSpacing屬性用于設置網點之間的水平距離和垂直距離,ISnapGrid的Visible屬性決定了這些網點是否可見,Draw方法將用于在Page對象上繪制一個SnapGrid對象。
以下代碼片段演示如何在設置PageLayout控件上SnapGrid:
3.2.4SnapGuides對象
SnapGuides是為了更好的放置地圖而在Pagelayout上設置的輔助線如圖所示,SnapGuides分為兩種類型一種是水平輔助線通過IPageLayout的HorizontalSnapGuides屬性獲得,另一種是垂直輔助線通過IPageLayout的VerticalSnapGuides屬性獲得。每個SnapGuides都管理著一個Guide集合,即不同的類型的輔助線可以同時存在多條。
SnapGuides都實現了ISnapGuides接口,它定義了管理SnapGuide的屬性和方法。
ISnapGuides的AreVisible設定SnapGuides是否可見。
ISnapGuides的GuideCount屬性返回一個SnapGuides對象中的Guide的個數。而使用
ISnapGuides的Guide屬性可以按索引值獲得某個具體的Guide對象。
ISnapGuides的AddGuide方法將一個Guide放在指定位置上。
ISnapGuides的RemoveAllGuides和RemoveGuide方法分別可以清楚所有的Guide和按索引值清除Guide.
以下代碼片段演示如何為PageLayout對象添加輔助線:
3.2.5RulerSettings對象
標尺對象是為了輔助圖形元素的放置而出現在PageLayout對象上方和左方的輔助尺如圖所示,通過IPageLayout的RulerSettings屬性可以獲得PageLayout上的RulerSettings對象.
RulerSettings對象主要實現了IRulerSettings接口它只有一個SmallestDivision屬性用于設置RulerSettings對象的最小刻度值屬性。
3.2.6Element對象
在Map對象和PageLayout對象顯示的數據除了地理數據之外,另一種即為元素數據如下圖5所示。
Element是一個非常龐大復雜的對象集合如圖6所示,它主要分為兩大部分:圖形元素(GraphicElement)和框架元素(Frame Element)。
圖形元素(GraphicElement)包LineElement, MarkerElement, TextElement, GroupElement, FillshapElement,PictureElement,MultiPatchElement等。它們都是作為圖形的形式而存在,在地圖視圖或者PageLayout視圖上時可見的。框架元素(Frame Element)包括MapFrameElement, MapSurroundElement等它們是作為不可見的容器而存在的。
Map對象或者PageLayout對象可以通過IGraphicsContainer接口來管理這些元素,使用IGraphicsContainer接口可以添加,刪除和更新位于Map或PageLayout上的元素。使用GroupElement對象還可以將多個元素編組為單個實體來給用戶使用。
IElement是所有圖形元素(GraphicElement)和框架元素(Frame Element)都實現的接口,通過IElement接口可以確定Element對象的Geometry屬性,同時IElment接口也提供了用于查找和繪制元素的方法。Element是個抽象類,在開發中必須明確指定使用的Element的類型。另外IElement和ILineElement, ITextElement等并不是父子關系,后者沒有Geometry屬性。
3.2.7MapGrid對象
MapGrid是布局視圖中的一系列參考線和參考點用來幫助地圖使用者快速地確定地圖要素的位置如圖7中的公里格網,MapGridBorder,MapGridLabel。MapGrid等。MapGrid對象由MapGrids來管理,一個MapGrids可以包含多個MapGrid對象。
MapGrid是一個抽象類,它的子類有MeasuredGrid,IndexGrid,MgrsGrid,Graticule和CustomOverlayGrid五種,這些子類的對象由MapGridFactory對象創建。MapGride對象模型圖如圖8和圖9所示
3.2.8MapSurround對象
MapSurround對象是與一個地圖對象關聯的用于修飾地圖的輔助圖形元素對象如圖所示。它的形狀或內容會隨著Map屬性的變化而自動改變。如Map視圖范圍改變后比例尺(ScaleBar)也會自動調整比例,比例尺文本(ScaleBarText)也會相應改變它的比例值。
MapSurround對象由MapSurroundFrame 對象管理,所有的MapSurround對象添加在布局視圖上,每一個MapSurround對象可以通過IMap接口的MapSurrounds屬性的索引值所獲取。也可以通過IMap接口的MapSurroundCount來遍歷布局視圖上的所有MapSurround對象。
所有的MapSurround對象都實現IMapSurround接口,使用IMapSurround接口的Name屬性可以獲得MapSurround對象的名稱,通過IMapSurround的FitToBound方法可以設置一個MapSurround對象的大小。
同時MapSurround類也實現了IMapSurroundEvents接口,可以用來觸發MapSounrround相關事件如:AfterDraw,BeforeDraw,ContensChanged。
下圖是MapSurround對象模型
如下代碼演示如何為PageLayout添加Legend:
結果如下圖所示:
ArcGIS Engine基礎開發教程(4)— 學習圖層符號化
轉載自:http://bbs.esrichina-bj.cn/ESRI/thread-46784-1-1.html
地圖符號不僅具有確定的空間位置以及空間地物的性質:例如在一個城市管線系統中不同的線符號表示不同類型的管線,不同的點符號表示不同類型的設備等等,而且地圖符號也可以表達與空間位置相關的豐富信息:例如人口密度符號可以直觀的表示人口數量的空間分布情況。所以地圖數據的符號化決定著地圖以何種“面目”展現給地圖的使用者,自此空間數據的符號化對GIS開發有非常重要的意義。
ArcGIS Engine9.3提供了豐富的控件和組件庫來實現圖層符號化的相關功能。ArcGIS Engine9.3提供了SymbologyControl控件用于顯示ArcGIS符號庫中的符號(關于ArcGIS符號請查找相關文檔),而組件庫中的組件對象分為Color , Symbol, Renderer三大系列,圖層符號化就是通過多個組件對象來合作完成。
4.1目標
1.熟悉ArcGIS Engine符號化之Color(顏色)體系
2.熟悉ArcGIS Engine符號化之Symbol(符號)體系
3.熟悉ArcGIS Engine符號化之Renderer( 渲染)體系
4.利用ESRI自帶的符號庫進行符號化圖層
4.2準備工作
1.IDE:Visual Studio 2005/2008
2.ArcGIS Engine Developer kit 9.3
3.自造一份用于唯一值符號化的點數據(文章內有說明)
4.3符號化Color(顏色)體系
4.3.1ArcGIS顏色模型
ArcGIS提供Color(顏色)的模型有多種分別是:
-
RGB顏色模型:最常用,所有顏色都是通過紅色(Red)、綠色(Green)、藍色(Blue)這三原色的混合來顯示。
-
CMY顏色模型:青(Cyan)、洋紅(Magenta)和黃(Yellow)三種顏色的簡寫,是相減混色模式,用這種方法產生的顏色之所以稱為相減色,主要用于印刷中。
-
HSV顏色模型:色彩(H),純度(S),明度(V)。
-
Gray模型:沒有彩色的,灰度圖像由8位信息組成,并使用256級的灰色來模擬顏色層次。
-
HLS模型: Hue(色相)、Luminance(亮度)、Saturation(飽和度)。
????? 如上圖所示Color對象是一個抽象類,它包括5個子類:它有5個顏色子類,即CmykColor、RGBColor、HSVColor、HLSColor和GrayColor,它們可以使用IColor接口定義的方法設置顏色對象的基本屬性。在ArcGIS engine中最常使用的兩種顏色模型是RGB和HSV,RGB類實現IRgbColor接口,而HSV類則實現IHsvColor接口,兩個接口分別定義了設置一個RGBColor對象和RGBColor對象需傳遞的值。
接下來以一個函數來通過R,G,B值來構建一個RGBColor對象
private IRgbColor GetRGB(int r,int g,int b)
{
IRgbColor pRgbColor= new RgbColorClass();//構建一個RgbColorClass
pRgbColor.Red = r;//設置Red屬性
pRgbColor.Green = g;//設置Green屬性pRgbColor.Blue = b;//設置Blue屬性
return pRgbColor;
}
4.3.2ColorRamp對象
在地圖符號化的過程中,需要的顏色常常不是一種,而是隨機或有序產生的一組顏色。如果對某一個圖層進行符號化需要上百種顏色如圖2所示,程序開發者肯定不能逐個產生出來。ArcGIS Engine提供了ColorRamp對象:
ColorRamp類的對象可以產生顏色帶,這個類實現了IColorRamp接口,它定義了一系列顏色帶的屬性,如 Size(產生多少種顏色),Colors(顏色帶 IEnumColor)。
ColorRamp類是一個抽象類,它包括4個子類分別是:RandomColorRamp(隨機顏色帶)、PresetColorRamp(預設顏色帶)、AlgorithmicColorRamp(起止顏色帶)、MultiPartColorRamp(疊加顏色帶),它們的說明如表一所示。
表一
RandomColorRamp
使用HSV顏色模型來確定一串顏色
PresetColorRamp
預設的顏色模式,可存儲13種顏色
AlgorithmicColorRamp
用起始顏色、終止顏色確定一個顏色帶,起始、終止顏色使用HSV模型
MultiPartColorRamp
疊加產生顏色帶
在GIS應用開發中用到比較多得是RandomColorRamp(隨機顏色帶)和AlgorithmicColorRamp(起止顏色帶)接下來詳細介紹一下這兩個顏色帶。
AlgorithmicColorRamp是通過起止顏色來確定多個在這兩個顏色之間的色帶。AlgorithmicColorRamp類實現了兩個接口:IColorRamp和IAlgorithmicColorRamp,兩個接口之間是接口繼承關系,后者包含了前者所有的方法和屬性。
4.3.3生成顏色帶實例
?? 接下來制作一個實例演示AlgorithmicColorRamp(起止顏色帶)的Demo:
1.創建一個窗體,在窗體上添加5個Picturebox用于分別顯示產生的包含5個顏色的起始顏色帶中的顏色,如圖3所示
2.在“生成顏色帶”Button的Click事件中生成顏色帶,代碼片段如下所示:
private void button1_Click(object sender, EventArgs e)
{
//創建一個新AlgorithmicColorRampClass對象
IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass();
//創建起始顏色對象
IRgbColor startColor = new RgbColor();
startColor.Red = 255;
startColor.Green = 0;
startColor.Blue = 0;
//創建終止顏色對象
IRgbColor endColor = new RgbColor();
endColor.Red = 0;
endColor.Green = 255;
endColor.Blue = 0;
//設置AlgorithmicColorRampClass的起止顏色屬性
algColorRamp.ToColor = startColor;
algColorRamp.FromColor = endColor;
//設置梯度類型
algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;
//設置顏色帶顏色數量
algColorRamp.Size = 5;
//創建顏色帶
bool bture = true;
algColorRamp.CreateRamp(out bture);
//使用IEnumColors獲取顏色帶
IEnumColors pEnumColors = null;
pEnumColors = algColorRamp.Colors;
//設置5個picturebox的背景色為產生顏色帶的5個顏色
this.pictureBox1.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox2.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox3.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox4.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
this.pictureBox5.BackColor = ColorTranslator.FromOle(pEnumColors.Next().RGB);
}
運行點擊Button 結果如圖4所示:
RandomColorRamp對象產生隨機顏色帶,RandomColorRamp也需要設定一個范圍,但是這個范圍是HSV顏色模型的,顏色將在這個范圍內隨機出現。 RandomColorRamp類實現了IRandomColorRamp接口
以下是生成RandomColorRamp的代碼片段
IRandomColorRamp pRandomColorRamp = new RandomColorRampClass();
//** 制作一系列介于橘黃色和藍綠色之間的隨機顏色
pRandomColorRamp.StartHue = 40;
pRandomColorRamp.EndHue = 120;
pRandomColorRamp.MinValue = 65;
pRandomColorRamp.MaxValue = 90;
pRandomColorRamp.MinSaturation = 25;
pRandomColorRamp.MaxSaturation = 45;
pRandomColorRamp.Size = 20;
pRandomColorRamp.Seed = 23;
bool bture = true;
pRandomColorRamp.CreateRamp(out bture);
IEnumColors pEnumColors = pRandomColorRamp.Colors
//** 對pEnumColors進行操作
4.4符號化Symbol(符號)體系
ArcGIS Engine9.3為開發人員提供了32種符號,主要分為三大類符號MarkerSymbol(點符號)、 LineSymbol(線符號)和FillSymbol(填充符號)來繪制地理要素的幾何圖形。此外還有兩種特殊類型的符號:一種是TextSymbol用于文字標注;另一種是3D Chart符號,用于顯示餅圖等三維對象,如需詳細了解請查找幫助文檔。
4.4.1MarkerSymbol對象
MarkerSymbol用于修飾點對象的符號,它擁有十三個子類如表2所示,其中不同的子類可以產生不同類型的點符號。所有的MarkerSymbol類都實現了IMarkerSymbol接口,這個接口定義了標記符號的公共方法和屬性,如角度、顏色、大小和X,Y偏移量等。
表二
點符號類型
描述
ArrowMarkerSymbol
預定義的肩頭符號
BarChartSymbol
柱狀圖符號
CharacterMarker3DSymbol
三維字體符號
CharacterMarkerSymbol
字體符號
Marker3DSymbol
3D 符號
MultiLayerMarkerSymbol
多個符號疊加產生新點符號
PictureMarkerSymbol
圖片符號(bmp或emf)
PiechartSymbol
餅圖符號
SimpleMarker3DSymbol
簡單3D符號
SimpleMarkerSymbol
簡單符號
StackedChartSymbol
堆疊符號
TextMarkerSymbol
文字符號用來符號化點??
常用的有以下5種 類型:
如何創建MarkerSymbol?接下來以SimpleMarkerSymbol構建為例演示如何創建一個點符號:
//創建SimpleMarkerSymbolClass對象
ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass();
//創建RgbColorClass對象為pSimpleMarkerSymbol設置顏色
IRgbColor pRgbColor = new RgbColorClass();
pRgbColor.Red = 255;
pSimpleMarkerSymbol.Color = pRgbColor as IColor;
//設置pSimpleMarkerSymbol對象的符號類型,選擇鉆石
pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;
//設置pSimpleMarkerSymbol對象大小,設置為5
pSimpleMarkerSymbol.Size = 5;
//顯示外框線
pSimpleMarkerSymbol.Outline = true;
//為外框線設置顏色
IRgbColor pLineRgbColor = new RgbColorClass();
pLineRgbColor.Green = 255;
pSimpleMarkerSymbol.OutlineColor = pLineRgbColor as IColor;
//設置外框線的寬度
pSimpleMarkerSymbol.OutlineSize = 1;
如何使用這個符號,在接下來介紹Renderer對象的時候將為大家演示如何用創建的點符號去符號化一個圖層。
4.4.2LineSymbol對象
LineSymbol對象是用于修飾線型幾何對象的符號,它擁有八個子類如表3所示,其中不同的子類可以產生不同類型的線符號,所有的LineSymbol類都實現了ILineSymbol接口, ILineSymbol定義了兩個公共屬性:Color和Width。
表三
線符號類型
描述
CartographicLineSymbol
實心或者虛線線符號
HashLineSymbol
離散線符號
MarkerLineSymbol
點線符號
MultiLayerLineSymbol
多符號疊加產生新線符號
PictureLineSymbol
圖片線符號
SimpleLine3DSymbol
3D 線符號
SimpleLineSymbol
預定義風格的線符號
TextureLineSymbol (3DAnalyst)
紋理貼 圖線符號
常用的LineSymbol如下圖所示:
如何創建LineSymbol?接下來以MarkerLineSymbol構建為例演示如何創建一個線符號:
IArrowMarkerSymbol pArrowMarker = new ArrowMarkerSymbolClass();
IRgbColor pRgbColor = new RgbColorClass();
pRgbColor.Red = 255;
pArrowMarker.Color = pRgbColor as IColor;
pArrowMarker.Length = 10;
pArrowMarker.Width = 8;
pArrowMarker.Style = esriArrowMarkerStyle.esriAMSPlain;
IMarkerLineSymbol pMarkerLine = new MarkerLineSymbolClass();
pMarkerLine.MarkerSymbol = arrowMarker;
IRgbColor pLineColor = new RgbColorClass();
pLineColor.Blue = 255;
pMarkerLine.Color = pLineColor as IColor;
4.4.3FillSymbol對象
FillSymbol是用來修飾如多邊形等具有面積的幾何形體的符號對象,它擁有十一個子類如表4所示它實現了IFillSymbol,這個接口定義了兩個屬性Color和OutLine,以滿足所有類型的FillSymbol對象的公共屬性設置。
表四
填充符號類型
描述
ColorRampSymbol (Carto)
用于渲染Raster數據的顏色帶
ColorSymbol (Carto)
用于渲染Raster數據的顏色符號
DotDensityFillSymbol
點密度填充符號
GradientFillSymbol
漸變填充符號
LineFillSymbol
包含線符號的填充符號
MarkerFillSymbol
包含點符號的填充符號
MultiLayerFillSymbol
多符號疊加產生新填充符號
PictureFillSymbol
圖片填充符號
RasterRGBSymbol
用于渲染Raster數據 RGBSymbol
SimpleFillSymbol
簡單填充符號
TextureFillSymbol
紋理貼圖填充符號
常用的FillSymbol如下圖所示:
如何創建FillSymbol?接下來以MarkerLineSymbol構建為例演示如何創建一個線符號:
//為填充符號創建外框線符號
IColor pLineColor = new RgbColorClass();
ICartographicLineSymbol pCartoLineSymbol = new CartographicLineSymbolClass();
pCartoLineSymbol.Width = 2;
pCartoLineSymbol.Color = pLineColor;
//創建一個填充符號
ISimpleFillSymbol pSmplFillSymbol = new SimpleFillSymbol();
//設置填充符號的屬性
IColor pRgbClr = new RgbColorClass();
IFillSymbol pFillSymbol = pSmplFillSymbol;
pFillSymbol.Color = pRgbClr;
pFillSymbol.Outline = pCartoLineSymbol;
如果沒有ArcGIS Desktop使用經驗的開發看了以上代碼片段會一頭霧水,不明白填充符號的創建為什么還要創建線符號等等,如果有ArcGIS Desktop使用經驗就會非常容易理解這些符號的創建的機制,如圖8是SimpleFillSymbol設置信息。所以熟悉ArcGIS Desktop的使用對開發人員進行ArcGIS Engine開發非常有用。
4.4.4TextSymbol對象
TextSymbol對象是用于修飾文字元素的,文字元素在要素標注等方面很有用處。TextSymbol符號最重要的設置對象是它的字符,它實現了三個主要的接口來設置字符:ITextSymbol 、 ISimpleTextSymbol 和 IFormattedTextSymbol 。
ITextSymbol接口是定義文本字符樣式的主要接口,它定義的ITextSymbol::Font屬性是產生一個TextSymbol符號的關鍵。可以使用IFontDisp接口來設置字體的大小和是否是粗體、傾斜等屬性。使用ITextSymbol接口還可以定義TextSymbol對象的顏色、角度、水平排列方式、垂直排列方式和文本等內容。
以下是一個構建TextSymbol的函數:
///<summary>
///生成文本符號
///</summary>
///<param name="pTxtSymbol">文本符號</param>
///<param name="sFontName">字體名稱</param>
///<param name="iFont">字體大小</param>
///<param name="iColor">字體顏色</param>
public static void MakeTextSymbol(ref ITextSymbol pTxtSymbol, string sFontName, int iFont, int iColor)
{
try
{
pTxtSymbol.Font.Name = sFontName;
pTxtSymbol.Font.Size = (decimal)iFont;
IRgbColor pRGBColor = new RgbColorClass();
pRGBColor.RGB = iColor;
pTxtSymbol.Color = (IColor)pRGBColor;
pTxtSymbol.Angle = 0;
pTxtSymbol.RightToLeft = false;
pTxtSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHACenter;
pTxtSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
4.4.5 3DChartSymbol對象
3DChartSymbol是一個抽象類,它擁有三個子類:BarChart、PieChart和StackedChart。如圖9所示:
BarChartSymbol是最常用的三維著色符號,它使用不同類型的柱子來代表一個要素類中不同的屬性,而柱子的高度取決于屬性值的大小。
PieChartSymbol符號進行著色的方法是使用一個餅圖來顯示不同要素類中的不同屬性,不同的屬性按照它們的數值大小占有一個餅圖中的不同比例的扇形區域。
PieChartSymbol符號進行著色的方法是使用一個餅圖來顯示不同要素類中的不同屬性,不同的屬性按照它們的數值大小占有一個餅圖中的不同比例的扇形區域。
至于如何創建這些3DChartSymbol符號這里不再提供代碼片段演示,讀者可以根據前邊學習的知識,自己操作ArcGIS Desktop使用3DChartSymbol制作專題圖,然后根據ArcGIS Engine的幫助文檔開發創建3DChartSymbol。
4.5使用ServerStyle
如果熟悉ArcGIS Desktop的使用,就會對Style符號庫文件有所了解,相對應的在ArcGIS Engine開發中對應的是ServerStyle符號庫,它的結構體系如圖10所示。可以通過專門的轉換程序把ArcGIS Desktop Style符號庫轉換為ArcGIS Engine所能夠使用的ServerStyle符號庫。
用于獲取ServerStyle符號庫中的符號主要涉及到以下接口如表所示:
表
接口名稱
功能描述
IStyleGallery
用于管理Style Gallery
IStyleGalleryStorage
管理Style Gallery中的符號庫文件
IStyleGalleryClass
控制符號庫中Style Gallery Class
IEnumStyleGalleryItem
枚舉一組Style Gallery items
IStyleGalleryItem
定義Style Galle ry itme
4.5.1獲取符號庫中符號
如何獲取到一個符號庫中符號?接下來以獲取ESRI符號庫中名稱為Rose的符號的流程:
1.首先構建一個ServerStyleGallery對象
2.其次使用IStyleGalleryStorage接口的AddFile方法加載ServerStyle文件
3.遍歷ServerGallery中的Class,如果是FillSymbol使用IStyleGallery的GetItems方法返回一個可枚舉的包含一系列StyleGalleryItem的EnumStyleGalleryItem對象。
4.遍歷EnumServerStyleGalleryItme枚舉對象中的StylegalleryItme如果名稱是Rose即可獲取ESRI符號庫中名稱為Rose的StylegalleryItme,然后通過IStyleGalleryItem的Item屬性即可轉換為ISymbol。
整個流程圖如圖11所示:
4.6SymbologyControl控件
SymbologyControl用來顯示ServerStyle符號庫中的符號樣式,可以選擇在該控件上選擇一個符號用來符號化一個圖層或者作為一個Element的符號。使用SymbologyControl可以再設計的模式下在其屬性頁中加載ServerStyle符號庫文件,同樣也可以使用的LoadStyleFile和RemoveFile方法加載和移除Serverstyle符號庫文件。運行效果如圖12所示:
4.7符號化之Renderer( 渲染)體系
ArcGIS Engine9.3對GIS數據的符號化分為矢量數據渲染和柵格數據渲染兩大類。接下來分別介紹FeatureRender和RasterRender。
4.7.1FeatureRender對象
FeatureRenderer是一個抽象類,它有15個子類負責進行不同類型的著色運算。它們都實現了IFeatureRenderer接口,這個接口定義了進行要素圖層符號化的公共屬性和方法。
可以通過IGeoFeatureLayer::Renderer屬性獲得一個要素圖層的符號化對象
表四
要素符號化類型
描述
SimpleRender
簡單符號化
UniqueValueRender
唯一值符號化
BiUniqueValueRender
雙變量唯一值符號化
ChartRender
圖表符號化
ClassBreaksRenderer
分類等級符號化
DotDensityRenderer
點密度符號化
ProportionalSymbolRenderer
根據屬性值設置符號大小進行符號化
ScaleDependentRenderer
依比例尺符號化
RepresentationRenderer
制圖表達符號化
CoTrackSymbologyRenderer(TrackingAnalyst)
軌跡符號化(應用于TrackingAnaylyst擴展模塊)
EnhancedInfoRenderder(TrackingAnalyst)
增強信息符號化(應用于TrackingAnaylyst擴展模塊)
UniqueValueTextRenderer(TrackingAnalyst)
唯一值文本符號化(應用于TrackingAnaylyst擴展模塊)
NAStopRenderer(NetworkAnalyst)
停止符號化(應用于網絡分析擴展模塊)
FeatureVertexRenderer(SurveyExt)
要素定點符號化(應用于測量分析擴展模塊)
SharedEdgeRenderer(EditorExt)
用于繪制拓撲元素
常用的要素符號化類型主要有以下6種類型,如圖13所示:
由于篇幅有限不再對每一種符號化類型的使用進行講解,在后邊的實例中將為讀者演示如何進行唯一值符號化。
4.7.2RasterRender對象
RasterRender是一個抽象類,它有15個子類負責進行不同類型的著色運算。它們都實現了IRasterRender接口,這個接口定義了柵格圖層符號化的公共屬性和方法。可以通過IRasterLayer::Renderer屬性獲得一個柵格圖層的符號化對象。
要素符號化類型
描述
RasterRGBRenderer
柵格RGB符號化
RasterUniqueValueRenderer
唯一值符號化
RasterColormapRenderer
雙變量唯一值符號化
RasterClassifyColorRampRenderer
圖表符號化
RasterStretchColorRampRenderer
分類等級符號化
RasterDiscreteColorRenderer
點密度 符號化
?? 柵格符號化類型結構圖如圖14所示:
以下代碼片段是對一個RasterLayer進行RasterStretchColorRampRenderer符號化操作:
///<summary>
/// StretchColorRamp符號化RasterLayer
///</summary>
///<param name="pRasterLayer">RasterLayer</param>
public void SetStretchColorRampRenderer(IRasterLayer pRasterLayer)
{
try
{
//創建RasterStretchColorRampRendererClass對象
IRasterStretchColorRampRenderer pRStretchRender= new RasterStretchColorRampRendererClass();
//QI到IRasterRenderer
IRasterRenderer pRasterRender=pRStretchRender as IRasterRenderer;
pRasterRender.Raster = pRasterLayer as IRaster;
pRasterRender.Update();
//創建兩個起始顏色
IRgbColor pFromRgbColor = new RgbColorClass();
pFromRgbColor.Red = 255;
IRgbColor pToRgbColor = new RgbColorClass();
pToRgbColor.Blue = 255;
//創建起止顏色帶
IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass();
pAlgorithmicColorRamp.Size = 255;
pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor;
pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor;
bool btrue= true;
pAlgorithmicColorRamp.CreateRamp(out btrue);
//選擇拉伸顏色帶符號化的波段
pRStretchRender.BandIndex = 0;
//設置拉伸顏色帶符號化所采用的顏色帶
pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;
pRasterRender.Update();
//符號化RasterLayer
pRasterLayer.Renderer = pRasterRender;
}
catch(Exception Err)
{
MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
轉載自: http://bbs.esrichina-bj.cn/ESRI/thread-46784-1-1.html
4.8利用ESRI自帶的符號庫進行唯一值符號化一圖層開發實例
4.8.1目的
學會開發唯一值符號化要素圖層功能
4.8.2步驟
1.準備點數據,添加屬性字段“類別”;
2.并為要素“類別”屬性值分別設置為“Hospital2”,“School 1”,“Airport”三種屬性值。
3.實現唯一值符號化功能
4.運行程序實現效果
4.8.3功能開發
實現唯一值符號化功能代碼如下:
///<summary>
///獲取符號庫中符號
///</summary>
///<param name="sServerStylePath">符號庫全路徑名稱</param>
///<param name="sGalleryClassName">GalleryClass名稱</param>
///<param name="symbolName">符號名稱</param>
///<returns>符號</returns>
private ISymbol GetSymbol(string sServerStylePath, string sGalleryClassName, string symbolName)
{
try
{
//ServerStyleGallery對象
IStyleGallery pStyleGaller = new ServerStyleGalleryClass();
IStyleGalleryStorage pStyleGalleryStorage = pStyleGaller as IStyleGalleryStorage;
IEnumStyleGalleryItem pEnumSyleGalleryItem=null;
IStyleGalleryItem pStyleGallerItem = null;
IStyleGalleryClass pStyleGalleryClass = null;
//使用IStyleGalleryStorage接口的AddFile方法加載ServerStyle文件
pStyleGalleryStorage.AddFile(sServerStylePath);
//遍歷ServerGallery中的Class
for (int i = 0; i < pStyleGaller.ClassCount; i++)
{
pStyleGalleryClass = pStyleGaller.get_Class(i);
if (pStyleGalleryClass.Name != sGalleryClassName)
??? continue;
//獲取EnumStyleGalleryItem對象
pEnumSyleGalleryItem = pStyleGaller.get_Items(sGalleryClassName, sServerStylePath, "");
pEnumSyleGalleryItem.Reset();
//遍歷pEnumSyleGalleryItem
pStyleGallerItem = pEnumSyleGalleryItem.Next();
while (pStyleGallerItem != null)
{
if (pStyleGallerItem.Name == symbolName)
{
//獲取符號
ISymbol pSymbol = pStyleGallerItem.Item as ISymbol;
System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);
return pSymbol;
}
pStyleGallerItem = pEnumSyleGalleryItem.Next();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);
? return null;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return null;
}
}
///<summary>
///設置要素圖層唯一值符號化
///</summary>
///<param name="pFeatureLayer"></param>
private void UniqueValueRenderFlyr(IFeatureLayer pFeatureLayer)
{
try
{
//創建UniqueValueRendererClass對象
IUniqueValueRenderer pUVRender = new UniqueValueRendererClass();
List<string> pFieldValues= new List<string>();
pFieldValues.Add("Hospital 2");
pFieldValues.Add("School 1");
pFieldValues.Add("Airport");
for(int i=0;i<pFieldValues.Count;i++)
{
??? ISymbol pSymbol= new SimpleMarkerSymbolClass();
??? pSymbol =GetSymbol(@"C:\Program Files\ArcGIS\Styles\ESRI.ServerStyle","Marker Symbols",pFieldValues【i】);
//添加唯一值符號化字段值和相對應的符號
pUVRender.AddValue(pFieldValues,pFieldValues,pSymbol);
}
//設置唯一值符號化的字段個數和字段名
pUVRender.FieldCount = 1;
pUVRender.set_Field(0, "類別");
IGeoFeatureLayer pGFeatureLyr = pFeatureLayer as IGeoFeatureLayer;
//設置IGeofeatureLayer的Renderer屬性
pGFeatureLyr.Renderer = pUVRender as IFeatureRenderer;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void button1_Click(object sender, EventArgs e)
{
IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;
UniqueValueRenderFlyr(pFeatureLayer);
this.axMapControl1.Refresh();
}
4.9設計GIS系統符號化模塊
大家首先有個觀念:用ArcEngine開發C/S應用程序時,一個成熟的GIS項目在加載數據這方面是不允許直接把SDE里邊的數據以MXD的形式組織起來這是不科學的,原因如下:
1.從數據安全性考慮
一個MXD文檔包含了SDE數據庫里與MXD數據的詳細信息,通常對于數據擁有者來說是不希望外部能夠獲取這些信息的。
2.從系統靈活性考慮
通過程序動態加載所需同層,動態符號化相關圖層能夠為程序帶來很大的靈活性,例如根據不同的用戶的權限從數據庫加載不同的數據,符號化不同的圖層等等。習慣直接在MapControl上Load MXD File的就會有疑問,不通過MXD怎么展現圖層的符號化。
接下來我將從兩種途徑給大家介紹一下如果動態符號化圖層:
使用ArcEngine開發C/S應用程序數據加載一個重要的功能模塊,在數據加載模塊符號圖層是其技術核心之一:
4.9.1通過系統符號化配置表存儲圖層符號化信息符號化圖層。
首先在關系型數據庫中創建一個圖層符號化配置表詳細記錄每一個圖層的符號化信息,如下表(我只列出簡單符號化的配置表設計,至于唯一值等大家可以自己根據需求設計):
圖層ID
符號化類型
符號庫ID
符號名稱
符號類型
點圖層1
簡單符號化
1
火車站
點
線圖層1
簡單符號化
2
鐵路線
線
面圖層1
簡單符號化
3
綠色面
面
然后使用ArcEngine提供的每種符號化類型的接口對圖層進行符號化渲染。
4.9.2通過ArcEngine提供的Represatation存儲要素符號化
Representation是ArcGIS9.3的新特性,能夠通過Representation制作更精美,更復雜的地圖操作過程,下圖是ArcGIS Desktop中Repre sentation工具條。
通過一下操作可以把通過Representation工具條制作出來的地圖效果存儲在要素類中(只能是Geodat? abase類型的)。
從以上可以看出每一個要素的符號化信息都以Blob方式存儲在相對應的數據表中,這樣就不需要通過配置表的設置進行動態符號化,直接通過Engine中提供的與Representation相關的接口和類符號化每一個圖層。
轉載自: http://bbs.esrichina-bj.cn/ESRI/thread-47411-1-1.html
地圖查詢
??? 地圖查詢、統計是一個GIS系統的基本的功能模塊,實際上統計功能的前提也是通過查詢獲取結果以文字或者圖表等報表的形式展現查詢結果數據。
地圖查詢有兩種類型的查詢:
1.空間查詢:在地圖上設置一定范圍,查詢這一范圍內的要素。例如在地圖上畫一范圍查詢這一區域內的所有消防栓,這一范圍的所有消防栓高亮顯示(或者其他顯示方式)并展現出所有的消防栓的屬性信息。
2.屬性查詢:通過一定的查詢條件獲取目標要素。例如我們需要查詢中國行政區上人口大于5000萬,同時GDP大于1萬億的省份,通過執行查詢,符號條件的省份高亮顯示(或者其他顯示方式)并展現出這些省份的屬性信息。
ArcGIS Engine9.3為開發者提供了無需寫代碼即可進行查詢功能的Identify工具,但是這個工具是一個通用的信息查詢新工具。而開發者通常需要自己開發一套符合自己業務需求更加靈活的查詢功能模塊,甚至一些功能不僅僅是查詢信息,很多編輯編輯功能以及和業務相結合的功能開發都用到查詢功能。所以很有必要了解ArcGIS Engine的查詢機制。
5.1目標
1.熟悉Cursor,FeatureCursor對象,使用IFeatureCursor接口
2.熟悉QueryFilter, SpatialFilter對象使用IQueryFilter,ISpatialFilter接口
3.熟悉要素選擇集SelectionSet對象,會使用IFeatureSelection,ISelectionSet接口
4.開發一個屬性查詢小功能Demo, 獲取符號查詢條件的Feature,并IFeatureLayerDefinition接口創建一個新的要素圖層加載到Mapcontrol上
5.開發一個空間多邊形查詢功能的小Demo, 學會創建內存半透明圖層用于顯示選擇范圍
5.2準備工作
1.IDE:Visual Studio 2005/2008
2.ArcGIS Engine Developer kit 9.3
3.準備一份用于查詢的的矢量數據(文章內有說明)
5.3Cursor對象
Cursor(游標)本質上是一個指向數據的指針,本身并不包含數據內容,它是連接到Row對象或要素對象的橋梁。
?? 游標有三種類型,即查詢游標、插入游標和更新游標。每一種游標都是通過與之相適應的方法來獲得的,如Search、Insert和Update方法。更新和插入游標都需要使用一個過濾器(Filter)對象,因為它們首先必須獲得需要進行操作的要素。
??????? Cursor對象支持的接口是ICursor,它定義了操作一個Row集合或一個Row對象的屬性和方法,下面是獲得插入型、更新型和查詢型游標的方法:
??????? pCursor = IFeatureClass.Insert()
使用IFeatureClass的Insert方法返回一個插入型游標,它通常用于往表中插入一條記錄。
??????? pCursor = IFeatureClass.Update()
使用IFeatureClass的Update方法會返回一個更新型游標,它用于更新或者刪除一條記錄。
??????? pCursor= IFeatureClass.Search()
使用IFeatureClass的Sarch方法對表進行查詢后,可以得到一個查詢型Cursor對象,它指向一個或多個Row對象。
????? 以我們這章的內容主要使用查詢游標。
????? FeatureCursor是Cursor的一個子類,指向一個或多個要素,它實現了IFeatureCursor接口,ArcGIS Engine開發所對矢量圖層實現查詢功能都是實行IFeatureCursor。
5.4QueryFilter對象與SpatialFilter對象???
???? 在關系型數據庫中,查詢條件是通過SQL語句的Where子語句來完成的。在ArcGIS Engine中不能直接使用SQL語句,但ArcGIS Engine提供了QueryFilter和SpatialFilter兩個過濾器對象來配合完成查詢條件的設置,從而查詢到想要的數據。
????????? QueryFilter過濾器主要用于對屬性數據查詢條件的設置,它主要實現IQueryFilter接口從而實現屬性查詢功能。
復制代碼
????????? SpatialFilter過濾器主要用于空間范圍查詢條件的設置,它主要實現ISpatialFilter(繼承 IQueryFilter接口)接口從而實現空間查詢功能。
復制代碼
空間過濾器空間關系類型主要有以下幾種類型如表一所示:
表1
空間過濾器空間關系類型
描述(A是待查詢圖形,B是過濾條件圖形)
esriSpatialRelUndefined
未定義
esriSpatialRelIntersects
A與B圖形相交
esriSpatialRelEnvelopeIntersects
A的Envelope和B的Envelope相交
esriSpatialRelIndexIntersects
A與B索引相交
esriSpatialRelTouches
A與B邊界相接
esriSpatialRelOverlaps
A與B相疊加
esriSpatialRelCrosses
A與B相交(兩條線相交于一點,一條線和一個面相交)
esriSpatialRelWithin
A在B內
esriSpatialRelContains
A包含B
esriSpatialRelRelation
A與B空間關聯
5.5SelectionSet要素選擇集對象
? 熟悉ArcGIS Desktop使用的開發者一定會知道當在ArcMap中顯示查詢結果的時,所有的符號查詢調教的要素都以藍色高亮的形式顯示在地圖控件上,藍色高亮顯示表示高亮選中,這些高亮顯示選中的要素對應一個要素選擇集對象中。通過IFeatureSelection的SelectionSet屬性可以獲取選擇集,FeatureLayer對象實現了IFeatureSelection接口。
實現代碼如下:
IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;
//QI至IFeatureSelection
IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
//創建過濾器
IQueryFilter pQueryFilter = new QueryFilterClass();
//設置過濾器對象的查詢條件
pQueryFilter.WhereClause = "人口> 10000000";
//選擇要素
pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew,false);???????????????
//獲取選擇集對象
ISelectionSet pSelectinSet=pFeatureSelection.SelectionSet;
//設置選擇集的符號
pFeatureSelection.SelectionSymbol = pSymbol;
5.6屬性查詢實例
5.6.1程序實現目標:
? 查詢人口大于5000000的城市,并把查詢結果創建為一個新的圖層,如圖1-3所示:
代碼片段如下:
ArcGIS Engine基礎開發教程(5)下——學習地圖查詢
添加一個新的Form在Form上添加一個DataGridView控件用于顯示查詢結果信息。如圖4所示:
5.7.3功能演示
?? 1.單擊按鈕向地圖控件上添加一內存圖層,并啟動多邊形查詢功能如圖5示:
?????? 2.點擊鼠標左鍵在地圖上畫以多邊形范圍,雙擊結束,將看到在所畫的范圍以半透明的形式添加在地圖之上,并顯示出查詢結果的屬性信息如圖所示:
5.7.4 Demo總結:
1.使用IWorkspaceFactory,IWorkspaceName,IName,IWorkspace等接口以及InMemoryWorkspaceFactoryClass對象創建在程序運行時的內存中的矢量要素層
2.復習IUniqueValueRenderer等接口以及UniqueValueRendererClass對象唯一值符號化要素圖層
3.使用ILayerEffects接口創建半透明效果要素圖層
4.使用ISpatialFilter,IQueryFilter 等接口以及SpatialFilterClass對象獲取符號條件的FeatureCursor,并學會通過遍歷整個FeatureCursor中Feature對象,獲取符號查詢條件的Feature集合
5.使用IFeatureLayerDefinition根據要素選擇集創建新要素圖層
5.8附IFeatureClass.Search(IQuery Filter,bool Recycling)參數說明
FeatureClass的Search方法大家經常用到,很多人對Search方法的其中一個參數bool Recycling不是很理解。先做以下解釋:
1.pFeatureCursor存儲的是所有符合條件的Feature對象的引用,
2.Recycling的意思是回收,參數Recycling為True的時當執行這個方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的圖形值在內存中所占的地址就會被銷毀回收,為False的時候當執行這個方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的圖形值依然存在在內存中。
1.參數Recycling設置為True
? IFeatureClass pFeatureClass = (this.axMapControl1.get_Layer(0) as IFeatureLayer).FeatureClass;
??????????? IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true);
??????????? //IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
??????????? List<IFeature> pFeatures = new List<IFeature>();
??????????? IFeature pFeature = pFeatureCursor.NextFeature();
??????????? while (pFeature != null)
??????????? {
??????????????? pFeatures.Add(pFeature);
??????????????? pFeature = pFeatureCursor.NextFeature();
??????????? }
??????????? for (int i = 0; i < pFeatures.Count; i++)
??????????? {
??????????????? MessageBox.Show(((pFeatures.Shape as IPolygon) as IArea).Area.ToString());
??????????? }
分析:pFeatures集合存儲了指向FeatureClass上所有Feature的引用,但是由于Recycling參數設置為TRUE也就是說每執行一個NextFeautre方法上一條記錄的Feature值在內存中被回收,所以到最后遍歷pFeatures集合的時候所有的IFeature引用指向的Feature對象都為Null。所以會引發一下錯誤(如下圖7所示):
.參數Recycling設置為False
??? IFeatureClass pFeatureClass = (this.axMapControl1.get_Layer(0) as IFeatureLayer).FeatureClass;
??????????? //IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true);
??????????? IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
??????????? List<IFeature> pFeatures = new List<IFeature>();
??????????? IFeature pFeature = pFeatureCursor.NextFeature();
??????????? while (pFeature != null)
??????????? {
??????????????? pFeatures.Add(pFeature);
??????????????? pFeature = pFeatureCursor.NextFeature();
??????????? }
??????????? for (int i = 0; i < pFeatures.Count; i++)
??????????? {
??????????????? MessageBox.Show(((pFeatures.Shape as IPolygon) as IArea).Area.ToString());
??????????? }
分析:pFeatures集合存儲了指向FeatureClass上所有Feature的引用,但是由于Recycling參數設置為False也就是說每執行一個NextFeautre方法上一條記錄的Feature值在內存中依然存在,所以到最后遍歷pFeatures集合的時候所有的IFeature引用指向的Feature對象都依然存在。所以會執行的很Happy(如下圖8所示):
轉載于:https://www.cnblogs.com/mazhenyu/archive/2011/02/25/1965179.html
總結
以上是生活随笔為你收集整理的ArcGIS Engine基础开发教程(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉字转拼音(VB版)
- 下一篇: 82%开源软件兼容Windows