日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ArcGIS Engine基础开发教程(转)

發(fā)布時(shí)間:2024/4/17 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArcGIS Engine基础开发教程(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ArcGIS Engine基礎(chǔ)開發(fā)教程(0)——目錄

《ArcEngine9.3 基礎(chǔ)開發(fā)教程》是面向初中級開發(fā)者的一份簡單易用,功能全面的學(xué)習(xí)資料及參考文檔。教程首先從如何來創(chuàng)建一個(gè)ArcGIS Engine桌面應(yīng)用程序開始,依據(jù)GIS的數(shù)據(jù)獲取(幾何對象與空間參考)、顯示(地圖與地圖布局、圖層符號化、地圖輸出)、處理(地圖查詢)、分析(空間分析)主線來進(jìn)行詳細(xì)講解。每一具體的部分均由目標(biāo)、準(zhǔn)備工作、接口介紹、實(shí)例代碼、演示效果幾方面來闡述。教程圖文并茂,條理清晰,是初學(xué)者最佳的選擇。

講座題目:ArcGIS Engine基礎(chǔ)開發(fā)教程
主講人:fxlcoco
第一講 創(chuàng)建第一個(gè)ArcGIS Engine桌面應(yīng)用程序... 6
第二講 學(xué)習(xí)何對象與空間參考... 15
第三講 學(xué)習(xí)地圖和地圖布局... 44
第四講 學(xué)習(xí)圖層符號化... 64
第五講 學(xué)習(xí)地圖查詢... 91
第六講 學(xué)習(xí)空間分析... 110

第七講 學(xué)習(xí)地圖輸出... 121、

ArcGIS Engine基礎(chǔ)開發(fā)教程(2)——學(xué)習(xí)幾何對象與空間參考

轉(zhuǎn)載自: http://bbs.esrichina-bj.cn/ESRI/thread-46367-1-1.html

2.1目標(biāo)

1.熟悉ArcGIS Engine Geometry模型,通過程序構(gòu)建常用幾何對象

2.熟悉空間參考

3.通過野外測量點(diǎn)構(gòu)建一個(gè)polygon shapefile功能開發(fā)

2.2準(zhǔn)備工作

1.IDE:Visual

2.ArcGIS Engine Developer kit 9.3
??????? 3.自造一份包含X,Y坐標(biāo)的*.txt文本文檔數(shù)據(jù)(即野外測量點(diǎn))

2.3Geometry主要幾何對象模型圖

???????????????????????????????????????????????????????????????? 圖1

Geometry是ArcGIS Engine中使用最為廣泛的對象集之一,用戶在創(chuàng)建、刪除、編輯和進(jìn)行地理分析的時(shí)候,就是處理一個(gè)包含幾何形體的矢量對象;除了顯示要素意外,控件對象選擇,要素符號化,標(biāo)注要素,編輯要素都需要Geometry參與。圖1是Geometry的主要幾何對象模型圖,接下來將一一介紹這些幾何對象

2.4幾何對象

2.4.1Point和MultiPoint幾何對象

2.4.1.1Point幾何對象

Point:是一個(gè)0維的幾何圖形,具有X,Y坐標(biāo)值,以及一些可選的屬性:如高程值(Z值),度量值(M值) 和ID號,點(diǎn)對象用于描述精確定位的對象,例如一個(gè)電話亭在一個(gè)城市的精確位置以下代碼演示如何創(chuàng)建一個(gè)Point對象:

  • IPoint pPoint = new PointClass();
  • pPoint.X = 100;
  • pPoint.Y = 100;
  • 復(fù)制代碼

    2.4.1.2MultiPoint幾何對象

    MultiPoint:點(diǎn)集對象是一系列無序的點(diǎn)的群集,這些點(diǎn)具有相同的屬性信息。例如可以用一個(gè)點(diǎn)集來表示整個(gè)城市天然氣調(diào)壓站。如下圖所示:一個(gè)Multipoint對象由6個(gè)Point對象組成。

    ????????????????????????????????????????????????????????????? 圖2

    以下代碼片段演示如何構(gòu)建Multipoint對象:

    //定義第一個(gè)點(diǎn)

    IPoint pPoint1 = new PointClass();

    pPoint1.X = 100;

    pPoint1.Y = 100;

    //定義第二個(gè)點(diǎn)

    IPoint pPoint2 = new PointClass();

    pPoint2.X = 200;

    pPoint2.Y = 200;

    ……//構(gòu)建其他點(diǎn)

    IPointCollection pMultipoint = new MultipointClass();

    object o=Type.Missing;

    //添加第一個(gè)點(diǎn),不需要設(shè)置點(diǎn)的順序,參數(shù)設(shè)置為Type.Missing

    pMultipoint.AddPoint(pPoint1, ref o, ref o);

    //添加第二個(gè)點(diǎn),不需要設(shè)置點(diǎn)的順序,參數(shù)設(shè)置為Type.MissingpMultipoint.AddPoint(pPoint2, ref o, ref o);

    ……//添加其他點(diǎn)

    2.4.2Segment幾何對象

    2.4.3Path和Ring幾何對象

    2.4.3.1Path幾何對象

    Path是連續(xù)的Segment的集合,除了路徑的第一個(gè)Segment和最后一個(gè)Segment外其余的Segment的起始點(diǎn)都是前一個(gè)Segment的終止點(diǎn),即Path對象的中的Segment不能出現(xiàn)分離,Path可以是任意數(shù)的Line,CircularArc,EllipticArc和BezierCurve的組合。

    ??????????????????????????????????????????????????????? 圖4

    ??? 一個(gè)或多個(gè)Path組成一個(gè)Polyline對象。

    2.4.3.2Ring幾何對象

    ???????? Ring是一個(gè)封閉的Path即起始和終止點(diǎn)有相同的坐標(biāo)值。它有內(nèi)部和外部屬性。

    ????????????????????????????????????????? 圖5

    ???? 一個(gè)或多個(gè)Ring對象組成一個(gè)Polygon對象。

    2.4.4Polyline和Polygon幾何對象

    2.4.4.1Polyline幾何對象

      Polyline對象是由一個(gè)或多個(gè)相連或者不相連的path對象的有序集合,它可以是單個(gè)Path對象組成,也可以是多個(gè)相連的Path對象組成,或者是多個(gè)分離的Path組成,如下圖所示。Polyline通常用來代表線狀地物如道路,河流,管線等等。

    ??????????????????????????????????????????????????????????????????????? 圖6

    一個(gè)Polyline對象必須滿足以下準(zhǔn)則:

    1.組成Polyline對象的所有Path對象必須是有效的。

    2.組成Polyline對象的所有Path對象不能重合,相交或自相交。

    3.組成Polyline對象的多個(gè)Path對象可以連接與某一點(diǎn),也可以分離。

    4.Path對象的長度不能為0.

    IPolyline是Polyline類的主要接口,IPolyline的Reshape方法可以使用一個(gè)Path對象為一個(gè)Polyline對象整形,IPolyline的SimplifyNetwork方法用于簡化網(wǎng)絡(luò)。

    Polyline對象可以使用IGeometryCollection接口添加Path對象的方法來創(chuàng)建,使用該接口需注意以下情況:

    1.每一個(gè)Path對象必須是有效的,或使用IPath::Simplify方法后有效。

    2.由于Polyline是Path對象的有序集合,所以添加Path對象時(shí)必須注意順序和方向。

    3.為了保證Polyline是有效的,可以創(chuàng)建完P(guān)olyline對象后使用ITopologicalOperator接口的Simplify方法。

        以下代碼片段為使用IGeometryCollection接口創(chuàng)建一個(gè)Polyline對象:

    //定義第一個(gè)點(diǎn)

    IPoint pPoint1 = new PointClass();

    pPoint1.X = 100;

    pPoint1.Y = 100;

    //定義第二個(gè)點(diǎn)

    IPoint pPoint2 = new PointClass();

    pPoint2.X = 200;

    pPoint2.Y = 200;

    //創(chuàng)建一個(gè)Line對象

    ILine pLine= new LineClass();

    //設(shè)置Line對象的起始終止點(diǎn)

    pLine.PutCoords(pPoint1,pPoint2);

    //QI到ISegment

    ISegment pSegment= pLine as ISegment;

    //創(chuàng)建一個(gè)Path對象

    SegmentCollection pPath= new PathClass();

    object o=Type.Missing;

    //通過ISegmentCollection接口為Path對象添加Segment對象

    pPath.AddSegment(pSegment,ref o,ref o);

    //創(chuàng)建一個(gè)Polyline對象

    IGeometryCollection pPolyline = new PolylineClass();

    //通過IGeometryCollection為Polyline對象添加Path對象pPolyline.AddGeometry(pPath as IGeometry, ref o, ref o);

    2.4.4.2Polylgon幾何對象

    ?? 2Polylgon對象是由一個(gè)或多個(gè)Ring對象的有序集合,它可以是由單個(gè)Ring 對象構(gòu)成,也可以使用多個(gè)Ring組成如下圖所示。其中Ring可以分為Outer Ring(外環(huán))和Inner Ring(內(nèi)環(huán))之分。外環(huán)和內(nèi)環(huán)都是有方向的,它們的區(qū)別是外環(huán)的方向是順時(shí)針的,內(nèi)環(huán)的方向是逆時(shí)針。Polygon通常用來代表有面積的多邊形矢量對象,如行政區(qū),建筑物等。

    ???????????????????????????????????????????????????????????????? 圖7

    以下代碼片段演示如何構(gòu)建一個(gè)Polygon:

    //創(chuàng)建一個(gè)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對象構(gòu)建Polygon對象

    IGeometryCollection pGeometryColl = new PolygonClass();pGeometryColl.AddGeometry(pRing, ref o, ref o);

    2.4.5Envelope幾何對象

    ? Envelope是所有幾何對象的外接矩形,用于表示幾何對象的最小邊框,所有的幾何對象都有一個(gè)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都是曲線的一種,它們都實(shí)現(xiàn)了ICurve接口。

    ICurve接口的Length屬性用于返回一個(gè)Curve對象的長度。

    ICurve接口的FromPoint和ToPoint屬性可以獲得Curve對象的起止點(diǎn)。

    ICurve接口的Reverseorientation方法可以改變一個(gè)Curve對象的節(jié)點(diǎn)次序即調(diào)動(dòng)Curve對象的起始點(diǎn)和終止點(diǎn)互相調(diào)換。

    ICurve接口的IsClosed屬性則可以判斷一個(gè)Curve對象起始點(diǎn)和終止點(diǎn)是否在一個(gè)位置上。

    ICurve接口的GetSubcurve方法可以復(fù)制一條Curve對象的特定部分,例如一條10千米公路的Curve對象,獲取2-5千米處的公路的曲線代碼片段如下所示:

    //QI到ICurve接口

    ICurve pCurve = pPolyline as ICurve;

    //創(chuàng)建一個(gè)Polyline對象

    ICurve pNewCurve = new PolylineClass();

    bool btrue= true;

    //獲取-5千米間的曲線對象pCurve.GetSubcurve(2, 5, btrue, out pNewCurve);

    此外ICurve的QueryTangent和QueryNormal方法分別用于獲取Curve對象上某一點(diǎn)的曲線的切線和法線。

    2.4.7 Triangle Strip和Trangle Fan, Trangle,Ring幾何對象

    Triangle Strip和Trangle Fan, Trangle,Ring是構(gòu)成MultiPatch幾何對象的構(gòu)建對象。

    2.4.7.1Triangle Strip幾何對象

    TriangelStrip對象是由一系列點(diǎn)定義的曲面片組成,而曲面片是有若干個(gè)三角形所組成,所以這個(gè)曲面可以定義為:(0,1,2) ,(2, 1, 3), (2, 3, 4), (4, 3, 5)。

    ??????????????????????????????????????????????????????????? 圖9

    2.4.7.2Trangle Fan幾何對象

    一個(gè)Trangle Fan對象由一系列點(diǎn)定義的曲面片組成,所不同的是所有的三角形共享一個(gè)頂點(diǎn)。如下圖所示,所以這個(gè)曲面可以定義為:(0,1,2) ,(0,2, 3), (0, 3, 4), (0, 4, 5)。

    ????????????????????????????????????????????????????????????????????? 圖10

    2.4.7.3Triangle幾何對象

    Triangle由三個(gè)點(diǎn)所確定如下圖,一個(gè)Triangle可定義為(0,1,2)等。

    ??????????????????????????????????????????????????? 圖11

    2.4.7.4Ring幾何對象

    Ring和前邊介紹的組成Polygon的Ring一樣,例如下邊一個(gè)房屋組成它的墻是個(gè)OutRing對象,而窗戶和門是InnerRing對象。

    ????????????????????????????????????????????????????????????????????????? 圖12

    2.4.8Multipatch幾何對象

    Multipatch幾何對象用于描述3D圖形,可以由TriangleStrip, TriangleFan, Triangle和ring對象組合構(gòu)成組成。Multipatch可以通過多種方式創(chuàng)建,一種是通過導(dǎo)入外部3D格式數(shù)據(jù)文件(3D Studio Max .3ds files, OpenFlight .flt files, COLLADA .dae files, Sketchup .skp files, VRML .wrl files),另外ArcGIS Engine提供了多種創(chuàng)建Multipatch幾何對象的方法:

    如果創(chuàng)建沒有貼圖紋理,沒有法向,沒有組成部分信息的Multipatch時(shí),只需創(chuàng)建好組成的Multipatch的各個(gè)部分即可,然后通過MultiPatch的IGeometryCollection接口添加各個(gè)組成部分即可。

    如果要為Multipatch每個(gè)組成部分添加紋理信息,法向信息,屬性信息就必須使用GeneralMultiPatchCreator對象來創(chuàng)建,通過其IGeneralMultiPatchInfo接口來為MultiPatch各個(gè)組成部分定義法向,材質(zhì),屬性信息。通過IGeneralMultiPatchInfo接口可以獲取這些MultiPatch的各個(gè)組成部分的信息。

    通過IConstructMultiPatch接口和IExtrude接口操作GeometryEnvironment對象可以通過拉伸Polyline對象(拉伸為墻)和Polygon對象(拉伸為多面體)來創(chuàng)建MultiPatch.

    通過訪問3D符號庫,獲取3DSymbol來渲染點(diǎn),把三維符號放置在點(diǎn)的位置從而生成Multipatch.

    下圖為MultiPatch對象的貼圖原理:

    ????????????????????????????????????????????????????????????????????????????? 圖13

    接下來給大家介紹通過GeneralMultiPatchCreator創(chuàng)建一個(gè)有紋理MultiPatch的方法:需要使用以下三個(gè)對象:

    GeometryMaterial:用于構(gòu)建材質(zhì),通過IGeometryMaterial創(chuàng)建的材質(zhì)可以作為TextureLineSymbol或者 TextureFillSymbol屬性用來創(chuàng)建這些符號,也可以把它添加到GeometryMaterialList對象中,用于GeneralMultipatchCreator對象構(gòu)建Multipatch對象。

    GeometryMaterialList:材質(zhì)對象的容器用于GeneralMultiPatchCreator對象調(diào)用Init方法時(shí)使用。

    GeneralMultiPatchCreator:用于創(chuàng)建有紋理的貼圖的Multipatch.。

    以下代碼片段演示如何創(chuàng)建一個(gè)MultiPatch對象

    ??????? ///

    <summary>

    ??????? ///

    構(gòu)建Multipatch幾何對象

    ??????? ///

    </summary>

    ??????? ///

    <returns>返回Multipatch幾何對象</returns>

    ??????? public IMultiPatch CreateMultipatch()

    {

    ??????????? try

    {

    ??????????????? //創(chuàng)建圖形材質(zhì)對象

    ??????????????? IGeometryMaterial texture = new GeometryMaterialClass();

    texture.TextureImage = @"C:\Temp\MyImage.jpg";

    ??????????????? //創(chuàng)建材質(zhì)列表對象

    ??????????????? IGeometryMaterialList materialList = new GeometryMaterialListClass();

    ??????????????? //向材質(zhì)列表添加材質(zhì)

    materialList.AddMaterial(texture);

    ??????????????? //創(chuàng)建GeneralMultiPatchCreator對象

    ??????????????? IGeneralMultiPatchCreator multiPatchCreator = new GeneralMultiPatchCreatorClass();

    multiPatchCreator.Init(4, 1, false, false, false, 4, materialList);

    ??????????????? //設(shè)置Part:可以使三角扇或環(huán)

    multiPatchCreator.SetPatchType(0, esriPatchType.esriPatchTypeTriangleStrip);

    multiPatchCreator.SetMaterialIndex(0, 0);

    multiPatchCreator.SetPatchPointIndex(0, 0);

    multiPatchCreator.SetPatchTexturePointIndex(0, 0);

    ??????????????? //創(chuàng)建真實(shí)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);

    ??????????????? //設(shè)置貼圖的點(diǎn)

    ??????????????? 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);

    ??????????????? //創(chuàng)建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對象之外,其他幾何對象都是通過其他幾何對象集合構(gòu)建而成。如MultiPoint對象是點(diǎn)的集合,Path對象是Segment對象的集合,Polyline對象是Path對象的集合,Polygon對象是Ring對象的集合,Multipatch對象是Triangle Strip和Trangle Fan, Trangle,Ring對象的集合。

    ArcGIS Engine提供了三個(gè)主要的幾何圖形集合接口用于對幾何對象的操作,分別是IPointCollection,ISegmentCollection和IGeometryCollection,這些接口揭示出ArcGIS Engine的幾何模型的實(shí)質(zhì)——它們是一種組合構(gòu)成的模式,這種組合并不一定按照嚴(yán)格的層次結(jié)構(gòu)組織。

    在前面介紹一些幾何對象的時(shí)候,也給大家演示了部分使用功能,這三個(gè)接口在程序開發(fā)中經(jīng)常使用到,接下來簡單闡述以下這三個(gè)接口的使用方法。

    2.4.9.1IGeometryCollection接口IGeometryCollection接口被Polygon,Polyline, Multipoint, Multipatch, Trangle,T rangle Strip,Trangle Fan和GeometryBag所實(shí)現(xiàn)。IGeometryCollection接口提供的方法可以讓開發(fā)者對一個(gè)幾何對象的組成元素即子對象進(jìn)行添加,改變和移除。例如:

    組成Polyline對象的子對象是Path對象。

    組成Polygon對象的子對象是Ring對象。

    組成Multipoint對象的子對象是Point對象。

    組成MultiPatch對象的子對象是TrangleFan TrangleStrip,Triangle或Ring對象。

    組成GeometryBag對象的是任何類型的幾何體對象,實(shí)際上GeometryBag是一個(gè)可以容納任何類型幾何對象的容器。

    IGeometryCollection的Geometry 屬性可以通過一個(gè)索引值返回一個(gè)組成該幾何對象的某個(gè)子對象,而GeometryCount返回組成該幾何對象的子對象的數(shù)目。

    IGeometry的AddGeometry和AddGeometries方法都用于向一個(gè)幾何對象添加子對象,它們的區(qū)別是前者一次只能添加一個(gè)幾何對象,而后者可以一次添加一個(gè)幾何對象數(shù)組。除此之外,AddGeometry方法可以將子對象添加到幾何的指定索引值的位置,而AddGeometries方法將子對象數(shù)組添加到集合的最后。

    在使用AddGeometry方法添加子對象到Polygon對象的過程中,如果子對象即Ring出現(xiàn)覆蓋現(xiàn)象,那么多邊形就沒有封閉或出現(xiàn)了包含關(guān)系,那么這個(gè)Polygon就不是簡單Polygon,因此通過IGometryCollection來創(chuàng)建一個(gè)Polygon時(shí),需要使用ITopologicalOperator 的Simplify方法保證其有效性。

    通過IGeometryCollection創(chuàng)建一個(gè)Polygon對象的代碼片段如下:

    ///

    <summary>

    ///

    構(gòu)造Polygon對象

    ///

    </summary>

    ///

    <param name="pRingList">Ring對象集合</param>

    ///

    <returns>返回一個(gè)Polygon對象</returns>

    private IPolygon ConstructorPolygon(List<IRing> pRingList)

    {

    try

    {

    //創(chuàng)建一個(gè)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;

    //執(zhí)行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方法可以將一個(gè)Polygon中的所有子對象Ring添加到另外一個(gè)多邊形中,這樣就實(shí)現(xiàn)了合并兩個(gè)多邊形對象為一個(gè)多邊形對象的功能,這非常有用。

    以下代碼片段演示如何合并兩個(gè)Polygon對象為一個(gè)Polgyone對象:

    ///

    <summary>

    ///

    合并兩個(gè)Polygon

    ///

    </summary>

    ///

    <param name="firstPolygon">第一個(gè)Polygon</param>

    ///

    <param name="SecondPolygon">第二個(gè)Polygon</param>

    ///

    <returns>返回合并后的Polygon</returns>

    private IPolygon MergePolygons(IPolygon firstPolygon, IPolygon SecondPolygon)

    {

    try

    {

    //創(chuàng)建一個(gè)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;

    //執(zhí)行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四個(gè)類所實(shí)現(xiàn),它們被稱作是Segment集合對象,使用這個(gè)接口可以處理組成Segment集合對象中的每一個(gè)子Segment對象。使用ISegmentCollection接口可以為一個(gè)Segment集合對象添加,插入,刪除Segment子對象。ISegmentCollection接口SetCircle和SetRectangle方法提供了一種簡單不需要添加Segment的情況下構(gòu)建一個(gè)完成的Path,Ring,Polyline和Polygon的方法。

    2.4.9.3IPointCollection接口

    IPointCollection可以被多個(gè)幾何對象類所實(shí)現(xiàn),這些對象都是由多個(gè)點(diǎn)構(gòu)成如:Mullipoint,Path,Ring,Polyline,Polygon,TriangleFan,TrangleStrip,Trangle,Multipatch等,它們都可以稱作PointCollection對象,通過IPointCollection接口定義的方法可以獲取,添加,插入,查詢,移除幾何對象中的某個(gè)頂點(diǎn)。同以上兩個(gè)接口一樣它也定義了操作一個(gè)點(diǎn)集合對象的方法,例如通過AddPoint方法可以向PointCollection對象中的特定索引位添加一個(gè)點(diǎn)對象,如果不指定位置,則添加到最后。通過IPointCollection的Point屬性通過頂點(diǎn)索引可以得到某一頂點(diǎn)。

    在本章節(jié)最后的Demo 實(shí)例將為大家演示IPointCollection提供的功能。

    2.4.10幾何對象總結(jié)

    在Geometry模型中的幾何對象分為兩種類型,一類是用來直接構(gòu)建要素類的稱為高級幾何對象,一類用來構(gòu)建高級幾何對象相對低一級的幾何對象成為構(gòu)建幾何對象如下表所示:

    幾何對象名稱

    所屬類別

    構(gòu)成子幾何對象

    用于創(chuàng)建和編輯的接口

    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數(shù)據(jù)的骨骼框架,能夠?qū)⑽覀兊臄?shù)據(jù)定位到相應(yīng)的位置,為地圖中的每一點(diǎn)提供準(zhǔn)確的坐標(biāo)。 在同一個(gè)地圖上顯示的地圖數(shù)據(jù)的空間參考必須是一致的,如果兩個(gè)圖層的空間參考不一致,往往會(huì)導(dǎo)致兩幅地圖無法正確拼合,因此開發(fā)一個(gè)GIS系統(tǒng)時(shí),為數(shù)據(jù)選擇正確的空間參考非常重要。

    ArcGIS Engine提供了一系列對象供開發(fā)者管理GIS系統(tǒng)的坐標(biāo)系統(tǒng)。對大部分開發(fā)者而言了解ProjectedCoordinateSystem, GeographicCoordinateSystem, SpatialReference Environment這三個(gè)組件類是非常有必要的,對于高級開發(fā)者而言,可能需要自定義坐標(biāo)系統(tǒng)可以使用這些對象Projection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。

    2.5.2修改空間參考

    以下代碼片段演示了如何改變一個(gè)圖層的空間參考。

  • /// <summary>
  • /// 改變圖層的空間參考
  • /// </summary>
  • /// <param name="pFeatureLayer">圖層</param>
  • /// <param name="pGeoType">空間參考類型</param>
  • private void ChangeLayerRef(IFeatureLayer pFeatureLayer, int gcsType)
  • {
  • try
  • {
  • IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
  • //QI到IGeoDataset
  • IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;
  • //QI到IGeoDatasetSchemaEdit
  • IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit;
  • if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)
  • {
  • //創(chuàng)建SpatialReferenceEnvironmentClass對象
  • ISpatialReferenceFactory2 pSpaRefFactory = new SpatialReferenceEnvironmentClass();
  • //創(chuàng)建地理坐標(biāo)系對象
  • IGeographicCoordinateSystem pNewGeoSys = pSpaRefFactory.CreateGeographicCoordinateSystem(gcsType);//4214代表Beijing1954
  • pGeoDatasetSchemaEdit.AlterSpatialReference(pNewGeoSys);
  • }
  • }
  • catch (Exception Err)
  • {
  • MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • }
  • }
  • ArcGIS Engine基礎(chǔ)開發(fā)教程(3)——學(xué)習(xí)地圖和地圖布局

    轉(zhuǎn)載自: http://bbs.esrichina-bj.cn/ESRI/thread-46577-1-1.html

    本章是ArcGIS Engine基礎(chǔ)開發(fā)教程的第三章,主要給大家大致講解了,地圖和地圖布局的相關(guān)對象。這些對象非常重要,如果這些基本對象都不熟悉就開始搞ArcGIS Engine開發(fā)是不科學(xué)的也走不遠(yuǎn)的。

    3地圖和地圖布局

    3.1地圖

    3.1.1Map對象

    Map對象是ArcGIS Engine的主要對象,本章將給大家介紹地圖組成結(jié)構(gòu),如何創(chuàng)建地圖,如何對組成地圖的對象進(jìn)行操作,在介紹這些內(nèi)容時(shí)盡量結(jié)合ArcMap學(xué)習(xí)效果會(huì)更好。

    在Map對象上能顯示的圖形有兩類一類是地理數(shù)據(jù),一類是元素。地理數(shù)據(jù)包括矢量類型的要素?cái)?shù)據(jù),柵格數(shù)據(jù),Tin等表面數(shù)據(jù)等,這些數(shù)據(jù)都保存在Geodatabase或數(shù)據(jù)文件如shapefile中,它們是用于GIS分析制圖的源數(shù)據(jù);

    而元素是另一種可以顯示在Map上的對象,它分為兩部分一類是圖形元素,一類是框架元素,圖形元素可以顯示出來,而框架元素充當(dāng)了“容器”的角色。在ArcMap中可以使用“Draw”工具在Map上直接繪制一個(gè)矩形,圓形,文本等對象,在布局視圖上也可以給地圖添加指北針,圖例,比例尺等圖形對象,這些都是圖形元素。

    在ArcMap中Map對象是由MXDocument對象的MapFrame對象管理,MapFrame是一個(gè)框架元素。

    Map對象有雙重身份,一方面是數(shù)據(jù)的管理容器,可以加載地理數(shù)據(jù)和圖形元素,扮演了數(shù)據(jù)管理器的角色,另一方面它又可以讓用戶看到這些數(shù)據(jù)即扮演了數(shù)據(jù)顯示器的角色,當(dāng)加載數(shù)據(jù)到Map對象的時(shí)候,Map對象是數(shù)據(jù)的管理者;當(dāng)改變視圖范圍,刷新地圖的時(shí)候它是數(shù)據(jù)的顯示者。

    Map對象主要實(shí)現(xiàn)的接口由IMap, IGraphicContainer, IActiveView, IMapBookmarks等接口。

    IMap接口主要用于管理Map對象中的Layer對象,要素選擇集對象,MapSourround對象,空間參考等對象。

    Map對象可以顯示圖形元素(Graphics Element),Map對象通過IGraphicsContainer接口來管理這些元素對象,包括圖形元素和框架元素。IGraphicsContainer返回的是Map對象中處于活動(dòng)狀態(tài)的Graphics layer引用指針,它可以是一個(gè)Basicgraphicslayer,也可以是CompositeGraphicsLayer中的一個(gè)圖層,或者是一個(gè)FDOGraphicsLayer注記圖層。

    以下代碼片段演示如何添加一個(gè)Element到Map上:

  • ?? ///
  • <summary>
  • ///添加臨時(shí)元素到地圖窗口上
  • ///</summary>
  • ///<param name="pMapCtrl">地圖控件</param>
  • ///<param name="pEle">單個(gè)元素</param>
  • ///<param name="pEleColl">元素集合</param>
  • public static void AddTempElement(AxMapControl pMapCtrl, IElement pEle, IElementCollection pEleColl)
  • {
  • try
  • {
  • IMap pMap = pMapCtrl.Map;
  • IGraphicsContainer pGCs = pMap as IGraphicsContainer;
  • if (pEle != null)
  • pGCs.AddElement(pEle, 0);
  • if (pEleColl != null)
  • ?? if (pEleColl.Count > 0)
  • ????? pGCs.AddElements(pEleColl, 0);
  • ????? IActiveView pAV = (IActiveView)pMap;
  • ???? //需要刷新才能即時(shí)顯示
  • ??? pAV.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pAV.Extent);
  • }
  • catch (Exception Err)
  • {
  • MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • }
  • }
  • IActiveView接口定義了Map對象的數(shù)據(jù)顯示功能。使用該接口可以改變視圖的范圍,刷新視圖。

    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對象可以裝載地理數(shù)據(jù),這些數(shù)據(jù)是以圖層的形式加載到地圖對象上的,圖層對象Layer作為一個(gè)數(shù)據(jù)的“中介”存在,它本身沒有轉(zhuǎn)載地理數(shù)據(jù),而僅僅是獲得了數(shù)據(jù)的引用,用于管理數(shù)據(jù)源的連接。地理數(shù)據(jù)始終保存在Geodatabase或者地理數(shù)據(jù)文件中。

    由于地理數(shù)據(jù)的類型多樣,所以Layer類也擁有眾多子類(具體查看幫助),接下來主要給大家介紹要素圖層—FeatureLayer對象。

    3.1.3FeatureLayer對象

    FeatureLayer類實(shí)現(xiàn)的常用主要接口如下圖所示:IFeatureLayer,IFeatureLayerDefinition,FeatureSelection,IGeoDataset,IGeoFeatureLayer,IIdentify,ILayerEffects。

    IFeatureLayer接口主要用于設(shè)置要素圖層的數(shù)據(jù)源(FeatureClass), IFeatureLayer的DataSourceType獲取FeatureLayer對象的數(shù)據(jù)源類型。此外通過IFeatureLayer的Search方法可以查詢要素圖層上符號某一條件的要素集。

    IGeoFeatureLayer接口繼承了ILayer和IFeatureLayer兩個(gè)接口,用于控制要素圖層的符號化和標(biāo)注等。

    IGeoDataset接口僅有兩個(gè)屬性,它們用于管理地理要素集。Extent可以返回當(dāng)前數(shù)據(jù)集的范圍,是一個(gè)IEnvelope類型的對象;

    SpatialReference屬性則可以讓用戶獲得這個(gè)數(shù)據(jù)集的空間參考。

    IFeatureSelection接口提供管理一個(gè)圖層中的要素的選擇集的方法和屬性。

    以下代碼片段演示如何獲取要素圖層符合條件獲取選擇集

  • /// /// <summary>
  • ??????? /// 獲取要素圖層符合條件獲取選擇集
  • ??????? /// </summary>
  • ??????? /// <param name="pFeatureLayer">要素圖層</param>
  • ??????? /// <param name="WhereClause">過濾條件</param>
  • ??????? /// <returns>返回選擇集</returns>
  • ??????? private IFeatureSelection SelectLayersFeatures(IFeatureLayer pFeatureLayer, string WhereClause)
  • ??????? {
  • ??????????? IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
  • ??????????? if (pFeatureSelection == null) return null;
  • ??????????? IQueryFilter pQueryFilter = new QueryFilterClass();
  • ??????????? pQueryFilter.WhereClause = WhereClause;
  • ??????????? pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
  • ??????????? return pFeatureSelection;
  • ??????? }
  • IFeatureLayerDefinition接口定義了CreateSelectionLayer方法,可以將一個(gè)圖層選擇集中的要素轉(zhuǎn)換為一個(gè)單獨(dú)的要素圖層。

    3.1.4矢量圖層操作實(shí)例

    以下代碼片段演示按行政區(qū)加載圖層數(shù)據(jù)的功能,以此理解IFeatureLayerDefinition的CreateSelectionLayer方法的使用。

    比方說整個(gè)國土資源部有某一類型專題數(shù)據(jù)有若干圖層,每個(gè)圖層數(shù)據(jù)的范圍是整個(gè)中國,這時(shí)國土資源部開發(fā)一套系統(tǒng)可能有這個(gè)需求,每個(gè)省只能加載本省的數(shù)據(jù)。以下函數(shù)即為按按行政區(qū)范圍創(chuàng)建行政區(qū)范圍的圖層。

    比方說我想獲取河南省的數(shù)據(jù)只需傳入行政區(qū)圖層中河南省圖元的Geometry即可。另外如果如果遇到行政區(qū)層必須用esriSpatialRelEnum. esriSpatialRelContains這個(gè)參數(shù),否則行政區(qū)這個(gè)圖層就不能只獲取河南這個(gè)省份,它會(huì)把河南省的周圍省份,河北,湖北,安徽,陜西,山東,山西等省份的圖元也添加創(chuàng)建到新圖層。

  • ???????? /// <summary>
  • ??????? /// 按行政區(qū)范圍創(chuàng)建行政區(qū)范圍的圖層
  • ??????? /// </summary>
  • ??????? /// <param name="pFeatureLayer">源數(shù)據(jù)圖層</param>
  • ??????? /// <param name="pGeometry">行政區(qū)范圍</param>
  • ??????? /// <param name="bXZQ">圖層是否為行政區(qū)</param>
  • ??????? /// <returns>新創(chuàng)建的圖層</returns>
  • ??????? private IFeatureLayer? GetSelectionLayer(IFeatureLayer pFeatureLayer, IGeometry pGeometry,bool bXZQ)
  • ??????? {
  • ??????????? try
  • ??????????? {
  • ??????????????? if (pFeatureLayer != null && pGeometry != null)
  • ??????????????? {
  • ??????????????????? IQueryFilter pQueryFilter;
  • ??????????????????? ISpatialFilter pSpatialFilter = new SpatialFilterClass();
  • ??????????????????? IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
  • ??????????????????? pSpatialFilter.GeometryField = pFeatureLayer.FeatureClass.ShapeFieldName;
  • ??????????????????? pFeatureSelection.Clear();??????????????????
  • ??????????????????? if (!bXZQ)
  • ??????????????????? {
  • ??????????????????????? pSpatialFilter.Geometry = pGeometry;?????????????????????
  • ??????????????????????? pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
  • ??????????????????????? pQueryFilter = pSpatialFilter;???????????????????????
  • ??????????????????????? pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
  • ??????????????????? }
  • ??????????????????? else
  • ??????????????????? {
  • ??????????????????????? pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
  • ??????????????????????? pQueryFilter = pSpatialFilter;???????????????????????
  • ??????????????????????? if(pGeometry is IGeometryCollection)
  • ??????????????????????? {
  • ??????????????????????????? for (int i = 0; i < (pGeometry as IGeometryCollection).GeometryCount; i++)
  • ??????????????????????????? {
  • ??????????????????????????????? pSpatialFilter.Geometry = (pGeometry as IGeometryCollection).get_Geometry(i);
  • ??????????????????????????????? pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
  • ??????????????????????????? }
  • ??????????????????????? }
  • ??????????????????? }?????????????????
  • ??????????????????? IFeatureLayerDefinition pFLDefinition = pFeatureLayer as IFeatureLayerDefinition;
  • ??????????????????? IFeatureLayer pNewFeatureLayer = pFLDefinition.CreateSelectionLayer(pFeatureLayer.Name ,true, null, null);
  • ??????????????????? pNewFeatureLayer.MaximumScale = pFeatureLayer.MaximumScale;
  • ??????????????????? pNewFeatureLayer.MinimumScale = pFeatureLayer.MinimumScale;
  • ??????????????????? pNewFeatureLayer.Selectable = pFeatureLayer.Selectable;
  • ??????????????????? pNewFeatureLayer.Visible = pFeatureLayer.Visible;
  • ??????????????????? pNewFeatureLayer.ScaleSymbols = pFeatureLayer.ScaleSymbols;
  • ??????????????????? return pNewFeatureLayer;
  • ??????????????? }
  • ??????????????? else
  • ??????????????? {
  • ??????????????????? return null;
  • ??????????????? }
  • ??????????? }
  • ??????????? catch (Exception Err)
  • ??????????? {
  • ??????????????? MessageBox.Show(Err.Message, "獲取SelectionLayer", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • ??????????????? return null;
  • ??????????? }
  • ??????? }
  • IIdentify接口定義了獲得要素圖層單個(gè)要素的屬性的

    ILayerFields接口可以直接獲取一個(gè)要素圖層的要素類字段集合

    ILayerEffects接口用來設(shè)置一個(gè)要素圖層的透明度,對比度,對比度。以下代碼片段演示如何設(shè)置要素圖層特效:

  • ? /// <summary>
  • ??????? /// 設(shè)置圖層特效
  • ??????? /// </summary>
  • ??????? /// <param name="pFeatureLayer">要素圖層</param>
  • ??????? /// <param name="brightness">亮度</param>
  • ??????? /// <param name="contrast">對比度</param>
  • ??????? /// <param name="transparency">透明度</param>
  • ??????? private static void SetLayerEffects(IFeatureLayer pFeatureLayer, short brightness, short contrast, short transparency)
  • ??????? {
  • ??????????? ILayerEffects pLayerEffect = pFeatureLayer as ILayerEffects;
  • ??????????? pLayerEffect.Brightness = brightness;
  • ??????????? pLayerEffect.Contrast = contrast;
  • ??????????? pLayerEffect.Transparency = transparency;
  • ??????? }
  • 3.2地圖布局

    3.2.1PageLayout對象

    PageLayout用以顯示地圖數(shù)據(jù),并通過對地圖數(shù)據(jù)進(jìn)行整飾以便對地圖打印輸出滿足不同行業(yè)對GIS出圖功能的需求。PageLayout和Map這兩個(gè)對象看起來非常相似,它們都是視圖對象,可以顯示地圖;也都是圖形元素的容器,可以容納圖形元素(Graphics Element)。但是所能夠保存的圖形類型卻是有差別的。PageLayout除了保存圖形元素外,還可以保存諸如MapFrame的框架元素(Frame Element)。PageLayout控件上的Map對象被PageLayout的MapFrame對象所管理的。

    PageLayout類主要實(shí)現(xiàn)了IPageLayout接口,它定義了用于修改頁面版式(layout)的方法和屬性。

    IPageLayout的方法ZoomToWhole方法可以讓PageLayout以最大尺寸顯示;

    IPageLayout的ZoomToPercent方法可以按照輸入的比例顯示;

    IPageLayout的ZoomToWidth方法可以讓視圖顯示的范圍匹配控件對象的寬度。

    IPageLayout的Page屬性用以獲取Page對象

    IPageLayout的RulerSettings屬性用以獲取RulerSettings對象

    IPageLayout的HorizontalSnapGuides和VerticalSnapGuides屬性用以獲取SnapGuides對象

    如下圖所示:

    3.2.2Page對象

     Page對象主要來管理PageLayout對象中的頁面,它用來加載地理數(shù)據(jù),但不提供分析和查詢功能。Page類的主要接口是IPage,它除了用于管理Page的顏色,尺寸和方向,還可以管理邊框類型和打印區(qū)域等。例如通過IPage的FromID可以直接設(shè)置紙張大小類型(A4,A3等)。 

    3.2.3SnapGrid對象

    SnapGrid是PageLayout上用于擺放元素而設(shè)置的輔助點(diǎn)如圖所示,這些點(diǎn)有規(guī)則呈網(wǎng)狀排列,便于使用者對其元素,它可以直接通過IPageLayout的SnapGrid屬性獲得當(dāng)前PageLayout使用的SnapGrid對象的引用。

    SnapGrid類主要實(shí)現(xiàn)了ISnapGrid接口用于設(shè)置SnapGrid對象的屬性,ISnapGrid的HorizontalSpacing 和VerticalSpacing屬性用于設(shè)置網(wǎng)點(diǎn)之間的水平距離和垂直距離,ISnapGrid的Visible屬性決定了這些網(wǎng)點(diǎn)是否可見,Draw方法將用于在Page對象上繪制一個(gè)SnapGrid對象。

    以下代碼片段演示如何在設(shè)置PageLayout控件上SnapGrid:

  • ?????? /// <summary>
  • ??????? /// 設(shè)置PageLayout上SnapGrid
  • ??????? /// </summary>
  • ??????? /// <param name="pPageLayout">PangeLayout對象</param>
  • ??????? private void SetwSnapGridOnPageLayout(IPageLayout pPageLayout)
  • ??????? {
  • ?????????? if(pPageLayout !=null)
  • ?????????? {
  • ?????????? ISnapGrid pSnapGrid=pPageLayout.SnapGrid;
  • ?????????? pSnapGrid.VerticalSpacing =2;
  • ?????????? pSnapGrid.HorizontalSpacing =2;
  • ?????????? pSnapGrid.IsVisible =true;
  • ?????????? IActiveView pActiveView=pPageLayout as IActiveView;
  • ?????????? pActiveView.Refresh();
  • ?????????? }???????????
  • ??? }
  • 3.2.4SnapGuides對象

     SnapGuides是為了更好的放置地圖而在Pagelayout上設(shè)置的輔助線如圖所示,SnapGuides分為兩種類型一種是水平輔助線通過IPageLayout的HorizontalSnapGuides屬性獲得,另一種是垂直輔助線通過IPageLayout的VerticalSnapGuides屬性獲得。每個(gè)SnapGuides都管理著一個(gè)Guide集合,即不同的類型的輔助線可以同時(shí)存在多條。

    SnapGuides都實(shí)現(xiàn)了ISnapGuides接口,它定義了管理SnapGuide的屬性和方法。

    ISnapGuides的AreVisible設(shè)定SnapGuides是否可見。

    ISnapGuides的GuideCount屬性返回一個(gè)SnapGuides對象中的Guide的個(gè)數(shù)。而使用

    ISnapGuides的Guide屬性可以按索引值獲得某個(gè)具體的Guide對象。

    ISnapGuides的AddGuide方法將一個(gè)Guide放在指定位置上。

    ISnapGuides的RemoveAllGuides和RemoveGuide方法分別可以清楚所有的Guide和按索引值清除Guide.

    以下代碼片段演示如何為PageLayout對象添加輔助線:

  • ?????? /// <summary>
  • ??????? /// 向PageLayout上指定位置添加輔助線
  • ??????? /// </summary>
  • ??????? /// <param name="pPageLayout">PageLayout對象</param>
  • ??????? /// <param name="pPoistion">位置</param>
  • ??????? /// <param name="bHorizontal">true為水平方向輔助線,False為垂直方向輔助線</param>
  • ??????? private void AddGuideOnPageLayout(IPageLayout pPageLayout,double pPoistion,bool bHorizontal)
  • ??????? {
  • ?????????? try
  • ?????????? {
  • ????????????? if(pPageLayout !=null)
  • ????????????? {
  • ????????????????? ISnapGuides pSnapGuides=null;
  • ????????????????? //如果是水平輔助線
  • ????????????????? if(bHorizontal)
  • ????????????????? {
  • ???????????????????? pSnapGuides=pPageLayout.HorizontalSnapGuides;
  • ????????????????? }
  • ????????????????? //如果是垂直輔助線
  • ????????????????? else
  • ????????????????? {
  • ???????????????????? pSnapGuides=pPageLayout.VerticalSnapGuides;
  • ????????????????? }
  • ????????????????? if(pSnapGuides!=null)
  • ????????????????? {
  • ????????????????????? //向PageLayout上添加輔助線
  • ???????????????????? pSnapGuides.AddGuide(pPoistion);
  • ????????????????? }
  • ????????????? }
  • ?????????? }
  • ??????????? catch(Exception Err)
  • ?????????? {
  • ????????????? MessageBox.Show(Err.Message,"提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • ??????????? }
  • }
  • 3.2.5RulerSettings對象

    標(biāo)尺對象是為了輔助圖形元素的放置而出現(xiàn)在PageLayout對象上方和左方的輔助尺如圖所示,通過IPageLayout的RulerSettings屬性可以獲得PageLayout上的RulerSettings對象.

    RulerSettings對象主要實(shí)現(xiàn)了IRulerSettings接口它只有一個(gè)SmallestDivision屬性用于設(shè)置RulerSettings對象的最小刻度值屬性。

    3.2.6Element對象

    在Map對象和PageLayout對象顯示的數(shù)據(jù)除了地理數(shù)據(jù)之外,另一種即為元素?cái)?shù)據(jù)如下圖5所示。

    Element是一個(gè)非常龐大復(fù)雜的對象集合如圖6所示,它主要分為兩大部分:圖形元素(GraphicElement)和框架元素(Frame Element)。

    圖形元素(GraphicElement)包LineElement, MarkerElement, TextElement, GroupElement, FillshapElement,PictureElement,MultiPatchElement等。它們都是作為圖形的形式而存在,在地圖視圖或者PageLayout視圖上時(shí)可見的。框架元素(Frame Element)包括MapFrameElement, MapSurroundElement等它們是作為不可見的容器而存在的。

    Map對象或者PageLayout對象可以通過IGraphicsContainer接口來管理這些元素,使用IGraphicsContainer接口可以添加,刪除和更新位于Map或PageLayout上的元素。使用GroupElement對象還可以將多個(gè)元素編組為單個(gè)實(shí)體來給用戶使用。

    IElement是所有圖形元素(GraphicElement)和框架元素(Frame Element)都實(shí)現(xiàn)的接口,通過IElement接口可以確定Element對象的Geometry屬性,同時(shí)IElment接口也提供了用于查找和繪制元素的方法。Element是個(gè)抽象類,在開發(fā)中必須明確指定使用的Element的類型。另外IElement和ILineElement, ITextElement等并不是父子關(guān)系,后者沒有Geometry屬性。

    3.2.7MapGrid對象

    MapGrid是布局視圖中的一系列參考線和參考點(diǎn)用來幫助地圖使用者快速地確定地圖要素的位置如圖7中的公里格網(wǎng),MapGridBorder,MapGridLabel。MapGrid等。MapGrid對象由MapGrids來管理,一個(gè)MapGrids可以包含多個(gè)MapGrid對象。

    MapGrid是一個(gè)抽象類,它的子類有MeasuredGrid,IndexGrid,MgrsGrid,Graticule和CustomOverlayGrid五種,這些子類的對象由MapGridFactory對象創(chuàng)建。MapGride對象模型圖如圖8和圖9所示

  • ????????? /// <summary>
  • ??????? /// 為PageLayout對象添加格網(wǎng)對象
  • ??????? /// </summary>
  • ??????? /// <param name="pPageLayout"></param>
  • ??????? private void AddMeasuredGridToPageLayout(IPageLayout pPageLayout)
  • ??????? {
  • ????????? try
  • ????????? {
  • ?????????????? //獲取MapFrame對象
  • ??????????????? IActiveView pAcitiveView= pPageLayout as IActiveView;
  • ??????????????? IMap pMap = pAcitiveView.FocusMap;?????????????????????
  • ??????????????? IGraphicsContainer pGraphicsContainer=pAcitiveView as IGraphicsContainer;
  • ??????????????? IMapFrame pMapFrame = pGraphicsContainer.FindFrame(pMap) as IMapFrame;
  • ??????????????? IMapGrids pMapGrids = pMapFrame as IMapGrids;
  • ?????????????? //創(chuàng)建一個(gè)MeasuredGrid對象
  • ??????????????? IMeasuredGrid pMeasureGrid = new MeasuredGridClass();
  • ??????????????? IMapGrid? pMapGrid = pMeasureGrid as IMapGrid;
  • ??????????????? pMeasureGrid.FixedOrigin = true;
  • ??????????????? pMeasureGrid.Units = pMap.MapUnits;
  • ??????????????? pMeasureGrid.XIntervalSize = 1000;
  • ??????????????? pMeasureGrid.YIntervalSize = 1000;
  • ??????????????? pMeasureGrid.XOrigin = -180;
  • ??????????????? pMeasureGrid.YOrigin = -90;
  • ??????????????? //設(shè)置MeasuredGride投影屬性
  • ??????????????? IProjectedGrid pProGrid = pMeasureGrid as IProjectedGrid;
  • ??????????????? pProGrid.SpatialReference = pMap.SpatialReference;
  • ??????????????? pMapGrid.Name = "Measured Grid";
  • ?????????????? //創(chuàng)建一個(gè)CalibratedMapGridBorder對象并設(shè)置為pMapGrid的Border屬性
  • ??????????????? ICalibratedMapGridBorder pCalibratedBorder = new CalibratedMapGridBorderClass();
  • ??????????????? pCalibratedBorder.BackgroundColor = GetRgbColor(255, 255, 255);
  • ??????????????? pCalibratedBorder.ForegroundColor = GetRgbColor(0, 0, 0);
  • ??????????????? pCalibratedBorder.BorderWidth = 0.1;
  • ??????????????? pCalibratedBorder.Interval = 72;
  • ??????????????? pCalibratedBorder.Alternating = true;
  • ??????????????? pMapGrid.Border = pCalibratedBorder as IMapGridBorder;
  • ?????????????? //創(chuàng)建一個(gè)FormattedGridLabel對象
  • ??????????????? IFormattedGridLabel pFormattedGridLabel = new FormattedGridLabelClass();
  • ??????????????? IGridLabel pGridLabel = pFormattedGridLabel as IGridLabel;
  • ??????????????? stdole.StdFont pFont = new stdole.StdFont();
  • ??????????????? pFont.Name = "Arial";
  • ??????????????? pFont.Size = 6;
  • ??????????????? pGridLabel.Font = pFont as stdole.IFontDisp; ;
  • ??????????????? pGridLabel.Color = GetRgbColor(0, 0, 0);
  • ??????????????? pGridLabel.LabelOffset = 4;
  • ??????????????? pGridLabel.set_LabelAlignment(esriGridAxisEnum.esriGridAxisLeft, false);
  • ??????????????? pGridLabel.set_LabelAlignment(esriGridAxisEnum.esriGridAxisRight, false);
  • ??????????????? INumericFormat pNumericFormat = new NumericFormatClass();
  • ??????????????? pNumericFormat.AlignmentOption = esriNumericAlignmentEnum.esriAlignRight;
  • ??????????????? pNumericFormat.RoundingOption = esriRoundingOptionEnum.esriRoundNumberOfSignificantDigits;
  • ??????????????? pNumericFormat.RoundingValue = 0;
  • ??????????????? pNumericFormat.ShowPlusSign = false;???????????????
  • ??????????????? pNumericFormat.ZeroPad = true;
  • ?????????????? pFormattedGridLabel.Format = pNumericFormat as INumberFormat;
  • ??????????????? //設(shè)置pMapGrid的LabelFormat屬性
  • ??????????????? pMapGrid.LabelFormat = pGridLabel;
  • ?????????????? //添加格網(wǎng)
  • ??????????????? pMapGrids.AddMapGrid(pMapGrid);
  • ????????? }
  • ????????? catch(Exception Err)
  • ????????? {
  • ???????????? MessageBox.Show(Err.Message,"提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • ????????? }
  • ??????? }
  • 3.2.8MapSurround對象

    MapSurround對象是與一個(gè)地圖對象關(guān)聯(lián)的用于修飾地圖的輔助圖形元素對象如圖所示。它的形狀或內(nèi)容會(huì)隨著Map屬性的變化而自動(dòng)改變。如Map視圖范圍改變后比例尺(ScaleBar)也會(huì)自動(dòng)調(diào)整比例,比例尺文本(ScaleBarText)也會(huì)相應(yīng)改變它的比例值。

    MapSurround對象由MapSurroundFrame 對象管理,所有的MapSurround對象添加在布局視圖上,每一個(gè)MapSurround對象可以通過IMap接口的MapSurrounds屬性的索引值所獲取。也可以通過IMap接口的MapSurroundCount來遍歷布局視圖上的所有MapSurround對象。

    所有的MapSurround對象都實(shí)現(xiàn)IMapSurround接口,使用IMapSurround接口的Name屬性可以獲得MapSurround對象的名稱,通過IMapSurround的FitToBound方法可以設(shè)置一個(gè)MapSurround對象的大小。

    同時(shí)MapSurround類也實(shí)現(xiàn)了IMapSurroundEvents接口,可以用來觸發(fā)MapSounrround相關(guān)事件如:AfterDraw,BeforeDraw,ContensChanged。

    下圖是MapSurround對象模型

    如下代碼演示如何為PageLayout添加Legend:

  • /// <summary>
  • ?????? /// 為PageLayout對象添加圖例對象
  • ?????? /// </summary>
  • ?????? /// <param name="pPageLayout">PageLayout對象</param>
  • ?????? /// <param name="pEnvelope">圖例添加的位置</param>
  • ?????? private void AddLegendToPageLayout(IPageLayout pPageLayout,IEnvelope pEnvelope)
  • ?????? {
  • ???????? try
  • ???????? {
  • ??????????? IActiveView pActiveView=pPageLayout as IActiveView;
  • ??????????? IMap pMap = pActiveView.FocusMap;?????????????????????
  • ??????????? IGraphicsContainer pGraphicsContainer=pActiveView as IGraphicsContainer;
  • ??????????? IMapFrame pMapFrame = pGraphicsContainer.FindFrame(pMap) as IMapFrame;
  • ??????????? UID pUID = new UID();
  • ??????????? pUID.Value = "{7A3F91E4-B9E3-11d1-8756-0000F8751720}";
  • ??????????? ISymbolBackground pSymbolBackground = new SymbolBackgroundClass();
  • ??????????? IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
  • ??????????? ILineSymbol pLineSymbol = new SimpleLineSymbolClass();
  • ??????????? pFillSymbol.Color = GetRgbColor(255, 255, 255);
  • ??????????? pLineSymbol.Color = GetRgbColor(255, 255, 255);
  • ??????????? pFillSymbol.Outline = pLineSymbol;
  • ??????????? pSymbolBackground.FillSymbol = pFillSymbol;
  • ??????????? IMapSurroundFrame pMapSurroundFrame = pMapFrame.CreateSurroundFrame(pUID, null);
  • ??????????? pMapSurroundFrame.Background = pSymbolBackground;
  • ??????????? IElement pElement = pMapSurroundFrame as IElement;
  • ??????????? pElement.Geometry = pEnvelope;
  • ??????????? IMapSurround pMapSurround = pMapSurroundFrame.MapSurround;
  • ??????????? ILegend pLegend = pMapSurround as ILegend;
  • ??????????? pLegend.ClearItems();
  • ??????????? pLegend.Title = "圖例";
  • ??????????? ITextSymbol pTextSymbol = new TextSymbolClass();
  • ??????????? pTextSymbol.Size = 10;
  • ??????????? pTextSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft;
  • ??????????? ILegendItem pLegendItem = null;
  • ??????????? for (int i = 0; i < pActiveView.FocusMap.LayerCount; i++)
  • ??????????? {
  • ??????????????? ILayer pLayer = pActiveView.FocusMap.get_Layer(i);
  • ??????????????? if (pLayer is IFeatureLayer)
  • ??????????????? {
  • ??????????????????? IFeatureLayer pFLayer = pLayer as IFeatureLayer;
  • ??????????????????? IFeatureClass pFeatureClass = pFLayer.FeatureClass;
  • ??????????????????? if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)
  • ??????????????????? {
  • ??????????????????????? continue;
  • ??????????????????? }
  • ??????????????????? else
  • ??????????????????? {
  • ??????????????????????? pLegendItem = new HorizontalLegendItemClass();
  • ??????????????????????? pLegendItem.Layer = pLayer;
  • ??????????????????????? pLegendItem.Columns = 1;
  • ??????????????????????? pLegendItem.ShowDescriptions = false;
  • ??????????????????????? pLegendItem.ShowHeading = false;
  • ??????????????????????? pLegendItem.ShowLabels = true;
  • ??????????????????????? pLegendItem.LayerNameSymbol = pTextSymbol;
  • ??????????????????????? pLegend.AddItem(pLegendItem);
  • ??????????????????? }
  • ??????????????? }
  • ??????????? }????????????????????????
  • ???????? }????????
  • ???????? catch(Exception Err)
  • ???????? {
  • ???????? }
  • ?????? }
  • 結(jié)果如下圖所示:

    ArcGIS Engine基礎(chǔ)開發(fā)教程(4)— 學(xué)習(xí)圖層符號化

    轉(zhuǎn)載自:http://bbs.esrichina-bj.cn/ESRI/thread-46784-1-1.html

    地圖符號不僅具有確定的空間位置以及空間地物的性質(zhì):例如在一個(gè)城市管線系統(tǒng)中不同的線符號表示不同類型的管線,不同的點(diǎn)符號表示不同類型的設(shè)備等等,而且地圖符號也可以表達(dá)與空間位置相關(guān)的豐富信息:例如人口密度符號可以直觀的表示人口數(shù)量的空間分布情況。所以地圖數(shù)據(jù)的符號化決定著地圖以何種“面目”展現(xiàn)給地圖的使用者,自此空間數(shù)據(jù)的符號化對GIS開發(fā)有非常重要的意義。

    ArcGIS Engine9.3提供了豐富的控件和組件庫來實(shí)現(xiàn)圖層符號化的相關(guān)功能。ArcGIS Engine9.3提供了SymbologyControl控件用于顯示ArcGIS符號庫中的符號(關(guān)于ArcGIS符號請查找相關(guān)文檔),而組件庫中的組件對象分為Color , Symbol, Renderer三大系列,圖層符號化就是通過多個(gè)組件對象來合作完成。

    4.1目標(biāo)

    1.熟悉ArcGIS Engine符號化之Color(顏色)體系

    2.熟悉ArcGIS Engine符號化之Symbol(符號)體系

    3.熟悉ArcGIS Engine符號化之Renderer( 渲染)體系

    4.利用ESRI自帶的符號庫進(jìn)行符號化圖層

    4.2準(zhǔn)備工作

    1.IDE:Visual Studio 2005/2008

    2.ArcGIS Engine Developer kit 9.3

    3.自造一份用于唯一值符號化的點(diǎn)數(shù)據(jù)(文章內(nèi)有說明)

    4.3符號化Color(顏色)體系

    4.3.1ArcGIS顏色模型

    ArcGIS提供Color(顏色)的模型有多種分別是:

    • RGB顏色模型:最常用,所有顏色都是通過紅色(Red)、綠色(Green)、藍(lán)色(Blue)這三原色的混合來顯示。

    • CMY顏色模型:青(Cyan)、洋紅(Magenta)和黃(Yellow)三種顏色的簡寫,是相減混色模式,用這種方法產(chǎn)生的顏色之所以稱為相減色,主要用于印刷中。

    • HSV顏色模型:色彩(H),純度(S),明度(V)。

    • Gray模型:沒有彩色的,灰度圖像由8位信息組成,并使用256級的灰色來模擬顏色層次。

    • HLS模型: Hue(色相)、Luminance(亮度)、Saturation(飽和度)。

    ????? 如上圖所示Color對象是一個(gè)抽象類,它包括5個(gè)子類:它有5個(gè)顏色子類,即CmykColor、RGBColor、HSVColor、HLSColor和GrayColor,它們可以使用IColor接口定義的方法設(shè)置顏色對象的基本屬性。在ArcGIS engine中最常使用的兩種顏色模型是RGB和HSV,RGB類實(shí)現(xiàn)IRgbColor接口,而HSV類則實(shí)現(xiàn)IHsvColor接口,兩個(gè)接口分別定義了設(shè)置一個(gè)RGBColor對象和RGBColor對象需傳遞的值。

    接下來以一個(gè)函數(shù)來通過R,G,B值來構(gòu)建一個(gè)RGBColor對象

    private IRgbColor GetRGB(int r,int g,int b)

    {

    IRgbColor pRgbColor= new RgbColorClass();//構(gòu)建一個(gè)RgbColorClass

    pRgbColor.Red = r;//設(shè)置Red屬性

    pRgbColor.Green = g;//設(shè)置Green屬性pRgbColor.Blue = b;//設(shè)置Blue屬性

    return pRgbColor;

    }

    4.3.2ColorRamp對象

    在地圖符號化的過程中,需要的顏色常常不是一種,而是隨機(jī)或有序產(chǎn)生的一組顏色。如果對某一個(gè)圖層進(jìn)行符號化需要上百種顏色如圖2所示,程序開發(fā)者肯定不能逐個(gè)產(chǎn)生出來。ArcGIS Engine提供了ColorRamp對象:

    ColorRamp類的對象可以產(chǎn)生顏色帶,這個(gè)類實(shí)現(xiàn)了IColorRamp接口,它定義了一系列顏色帶的屬性,如 Size(產(chǎn)生多少種顏色),Colors(顏色帶 IEnumColor)。

    ColorRamp類是一個(gè)抽象類,它包括4個(gè)子類分別是:RandomColorRamp(隨機(jī)顏色帶)、PresetColorRamp(預(yù)設(shè)顏色帶)、AlgorithmicColorRamp(起止顏色帶)、MultiPartColorRamp(疊加顏色帶),它們的說明如表一所示。

    表一

    RandomColorRamp

    使用HSV顏色模型來確定一串顏色

    PresetColorRamp

    預(yù)設(shè)的顏色模式,可存儲13種顏色

    AlgorithmicColorRamp

    用起始顏色、終止顏色確定一個(gè)顏色帶,起始、終止顏色使用HSV模型

    MultiPartColorRamp

    疊加產(chǎn)生顏色帶

    在GIS應(yīng)用開發(fā)中用到比較多得是RandomColorRamp(隨機(jī)顏色帶)和AlgorithmicColorRamp(起止顏色帶)接下來詳細(xì)介紹一下這兩個(gè)顏色帶。

    AlgorithmicColorRamp是通過起止顏色來確定多個(gè)在這兩個(gè)顏色之間的色帶。AlgorithmicColorRamp類實(shí)現(xiàn)了兩個(gè)接口:IColorRamp和IAlgorithmicColorRamp,兩個(gè)接口之間是接口繼承關(guān)系,后者包含了前者所有的方法和屬性。

    4.3.3生成顏色帶實(shí)例

    ?? 接下來制作一個(gè)實(shí)例演示AlgorithmicColorRamp(起止顏色帶)的Demo:

    1.創(chuàng)建一個(gè)窗體,在窗體上添加5個(gè)Picturebox用于分別顯示產(chǎn)生的包含5個(gè)顏色的起始顏色帶中的顏色,如圖3所示

    2.在“生成顏色帶”Button的Click事件中生成顏色帶,代碼片段如下所示:

    private void button1_Click(object sender, EventArgs e)

    {

    //創(chuàng)建一個(gè)新AlgorithmicColorRampClass對象

    IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass();

    //創(chuàng)建起始顏色對象

    IRgbColor startColor = new RgbColor();

    startColor.Red = 255;

    startColor.Green = 0;

    startColor.Blue = 0;

    //創(chuàng)建終止顏色對象

    IRgbColor endColor = new RgbColor();

    endColor.Red = 0;

    endColor.Green = 255;

    endColor.Blue = 0;

    //設(shè)置AlgorithmicColorRampClass的起止顏色屬性

    algColorRamp.ToColor = startColor;

    algColorRamp.FromColor = endColor;

    //設(shè)置梯度類型

    algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;

    //設(shè)置顏色帶顏色數(shù)量

    algColorRamp.Size = 5;

    //創(chuàng)建顏色帶

    bool bture = true;

    algColorRamp.CreateRamp(out bture);

    //使用IEnumColors獲取顏色帶

    IEnumColors pEnumColors = null;

    pEnumColors = algColorRamp.Colors;

    //設(shè)置5個(gè)picturebox的背景色為產(chǎn)生顏色帶的5個(gè)顏色

    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);

    }

    運(yùn)行點(diǎn)擊Button 結(jié)果如圖4所示:

    RandomColorRamp對象產(chǎn)生隨機(jī)顏色帶,RandomColorRamp也需要設(shè)定一個(gè)范圍,但是這個(gè)范圍是HSV顏色模型的,顏色將在這個(gè)范圍內(nèi)隨機(jī)出現(xiàn)。 RandomColorRamp類實(shí)現(xiàn)了IRandomColorRamp接口

    以下是生成RandomColorRamp的代碼片段

    IRandomColorRamp pRandomColorRamp = new RandomColorRampClass();

    //** 制作一系列介于橘黃色和藍(lán)綠色之間的隨機(jī)顏色

    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進(jìn)行操作

    4.4符號化Symbol(符號)體系

    ArcGIS Engine9.3為開發(fā)人員提供了32種符號,主要分為三大類符號MarkerSymbol(點(diǎn)符號)、 LineSymbol(線符號)和FillSymbol(填充符號)來繪制地理要素的幾何圖形。此外還有兩種特殊類型的符號:一種是TextSymbol用于文字標(biāo)注;另一種是3D Chart符號,用于顯示餅圖等三維對象,如需詳細(xì)了解請查找?guī)椭臋n。

    4.4.1MarkerSymbol對象

    MarkerSymbol用于修飾點(diǎn)對象的符號,它擁有十三個(gè)子類如表2所示,其中不同的子類可以產(chǎn)生不同類型的點(diǎn)符號。所有的MarkerSymbol類都實(shí)現(xiàn)了IMarkerSymbol接口,這個(gè)接口定義了標(biāo)記符號的公共方法和屬性,如角度、顏色、大小和X,Y偏移量等。

    表二

    點(diǎn)符號類型

    描述

    ArrowMarkerSymbol

    預(yù)定義的肩頭符號

    BarChartSymbol

    柱狀圖符號

    CharacterMarker3DSymbol

    三維字體符號

    CharacterMarkerSymbol

    字體符號

    Marker3DSymbol

    3D 符號

    MultiLayerMarkerSymbol

    多個(gè)符號疊加產(chǎn)生新點(diǎn)符號

    PictureMarkerSymbol

    圖片符號(bmp或emf)

    PiechartSymbol

    餅圖符號

    SimpleMarker3DSymbol

    簡單3D符號

    SimpleMarkerSymbol

    簡單符號

    StackedChartSymbol

    堆疊符號

    TextMarkerSymbol

    文字符號用來符號化點(diǎn)??

    常用的有以下5種 類型:

    如何創(chuàng)建MarkerSymbol?接下來以SimpleMarkerSymbol構(gòu)建為例演示如何創(chuàng)建一個(gè)點(diǎn)符號:

    //創(chuàng)建SimpleMarkerSymbolClass對象

    ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass();

    //創(chuàng)建RgbColorClass對象為pSimpleMarkerSymbol設(shè)置顏色

    IRgbColor pRgbColor = new RgbColorClass();

    pRgbColor.Red = 255;

    pSimpleMarkerSymbol.Color = pRgbColor as IColor;

    //設(shè)置pSimpleMarkerSymbol對象的符號類型,選擇鉆石

    pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;

    //設(shè)置pSimpleMarkerSymbol對象大小,設(shè)置為5

    pSimpleMarkerSymbol.Size = 5;

    //顯示外框線

    pSimpleMarkerSymbol.Outline = true;

    //為外框線設(shè)置顏色

    IRgbColor pLineRgbColor = new RgbColorClass();

    pLineRgbColor.Green = 255;

    pSimpleMarkerSymbol.OutlineColor = pLineRgbColor as IColor;

    //設(shè)置外框線的寬度

    pSimpleMarkerSymbol.OutlineSize = 1;

    如何使用這個(gè)符號,在接下來介紹Renderer對象的時(shí)候?qū)榇蠹已菔救绾斡脛?chuàng)建的點(diǎn)符號去符號化一個(gè)圖層。

    4.4.2LineSymbol對象

    LineSymbol對象是用于修飾線型幾何對象的符號,它擁有八個(gè)子類如表3所示,其中不同的子類可以產(chǎn)生不同類型的線符號,所有的LineSymbol類都實(shí)現(xiàn)了ILineSymbol接口, ILineSymbol定義了兩個(gè)公共屬性:Color和Width。

    表三

    線符號類型

    描述

    CartographicLineSymbol

    實(shí)心或者虛線線符號

    HashLineSymbol

    離散線符號

    MarkerLineSymbol

    點(diǎn)線符號

    MultiLayerLineSymbol

    多符號疊加產(chǎn)生新線符號

    PictureLineSymbol

    圖片線符號

    SimpleLine3DSymbol

    3D 線符號

    SimpleLineSymbol

    預(yù)定義風(fēng)格的線符號

    TextureLineSymbol (3DAnalyst)

    紋理貼 圖線符號

    常用的LineSymbol如下圖所示:

    如何創(chuàng)建LineSymbol?接下來以MarkerLineSymbol構(gòu)建為例演示如何創(chuàng)建一個(gè)線符號:

    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是用來修飾如多邊形等具有面積的幾何形體的符號對象,它擁有十一個(gè)子類如表4所示它實(shí)現(xiàn)了IFillSymbol,這個(gè)接口定義了兩個(gè)屬性Color和OutLine,以滿足所有類型的FillSymbol對象的公共屬性設(shè)置。

    表四

    填充符號類型

    描述

    ColorRampSymbol (Carto)

    用于渲染Raster數(shù)據(jù)的顏色帶

    ColorSymbol (Carto)

    用于渲染Raster數(shù)據(jù)的顏色符號

    DotDensityFillSymbol

    點(diǎn)密度填充符號

    GradientFillSymbol

    漸變填充符號

    LineFillSymbol

    包含線符號的填充符號

    MarkerFillSymbol

    包含點(diǎn)符號的填充符號

    MultiLayerFillSymbol

    多符號疊加產(chǎn)生新填充符號

    PictureFillSymbol

    圖片填充符號

    RasterRGBSymbol

    用于渲染Raster數(shù)據(jù) RGBSymbol

    SimpleFillSymbol

    簡單填充符號

    TextureFillSymbol

    紋理貼圖填充符號

    常用的FillSymbol如下圖所示:

    如何創(chuàng)建FillSymbol?接下來以MarkerLineSymbol構(gòu)建為例演示如何創(chuàng)建一個(gè)線符號:

    //為填充符號創(chuàng)建外框線符號

    IColor pLineColor = new RgbColorClass();

    ICartographicLineSymbol pCartoLineSymbol = new CartographicLineSymbolClass();

    pCartoLineSymbol.Width = 2;

    pCartoLineSymbol.Color = pLineColor;

    //創(chuàng)建一個(gè)填充符號

    ISimpleFillSymbol pSmplFillSymbol = new SimpleFillSymbol();

    //設(shè)置填充符號的屬性

    IColor pRgbClr = new RgbColorClass();

    IFillSymbol pFillSymbol = pSmplFillSymbol;

    pFillSymbol.Color = pRgbClr;

    pFillSymbol.Outline = pCartoLineSymbol;

    如果沒有ArcGIS Desktop使用經(jīng)驗(yàn)的開發(fā)看了以上代碼片段會(huì)一頭霧水,不明白填充符號的創(chuàng)建為什么還要?jiǎng)?chuàng)建線符號等等,如果有ArcGIS Desktop使用經(jīng)驗(yàn)就會(huì)非常容易理解這些符號的創(chuàng)建的機(jī)制,如圖8是SimpleFillSymbol設(shè)置信息。所以熟悉ArcGIS Desktop的使用對開發(fā)人員進(jìn)行ArcGIS Engine開發(fā)非常有用。

    4.4.4TextSymbol對象

    TextSymbol對象是用于修飾文字元素的,文字元素在要素標(biāo)注等方面很有用處。TextSymbol符號最重要的設(shè)置對象是它的字符,它實(shí)現(xiàn)了三個(gè)主要的接口來設(shè)置字符:ITextSymbol 、 ISimpleTextSymbol 和 IFormattedTextSymbol 。

    ITextSymbol接口是定義文本字符樣式的主要接口,它定義的ITextSymbol::Font屬性是產(chǎn)生一個(gè)TextSymbol符號的關(guān)鍵。可以使用IFontDisp接口來設(shè)置字體的大小和是否是粗體、傾斜等屬性。使用ITextSymbol接口還可以定義TextSymbol對象的顏色、角度、水平排列方式、垂直排列方式和文本等內(nèi)容。

    以下是一個(gè)構(gòu)建TextSymbol的函數(shù):

    ///<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是一個(gè)抽象類,它擁有三個(gè)子類:BarChart、PieChart和StackedChart。如圖9所示:

    BarChartSymbol是最常用的三維著色符號,它使用不同類型的柱子來代表一個(gè)要素類中不同的屬性,而柱子的高度取決于屬性值的大小。

    PieChartSymbol符號進(jìn)行著色的方法是使用一個(gè)餅圖來顯示不同要素類中的不同屬性,不同的屬性按照它們的數(shù)值大小占有一個(gè)餅圖中的不同比例的扇形區(qū)域。

    PieChartSymbol符號進(jìn)行著色的方法是使用一個(gè)餅圖來顯示不同要素類中的不同屬性,不同的屬性按照它們的數(shù)值大小占有一個(gè)餅圖中的不同比例的扇形區(qū)域。

    至于如何創(chuàng)建這些3DChartSymbol符號這里不再提供代碼片段演示,讀者可以根據(jù)前邊學(xué)習(xí)的知識,自己操作ArcGIS Desktop使用3DChartSymbol制作專題圖,然后根據(jù)ArcGIS Engine的幫助文檔開發(fā)創(chuàng)建3DChartSymbol。

    4.5使用ServerStyle

    如果熟悉ArcGIS Desktop的使用,就會(huì)對Style符號庫文件有所了解,相對應(yīng)的在ArcGIS Engine開發(fā)中對應(yīng)的是ServerStyle符號庫,它的結(jié)構(gòu)體系如圖10所示。可以通過專門的轉(zhuǎn)換程序把ArcGIS Desktop Style符號庫轉(zhuǎn)換為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獲取符號庫中符號

    如何獲取到一個(gè)符號庫中符號?接下來以獲取ESRI符號庫中名稱為Rose的符號的流程:

    1.首先構(gòu)建一個(gè)ServerStyleGallery對象

    2.其次使用IStyleGalleryStorage接口的AddFile方法加載ServerStyle文件

    3.遍歷ServerGallery中的Class,如果是FillSymbol使用IStyleGallery的GetItems方法返回一個(gè)可枚舉的包含一系列StyleGalleryItem的EnumStyleGalleryItem對象。

    4.遍歷EnumServerStyleGalleryItme枚舉對象中的StylegalleryItme如果名稱是Rose即可獲取ESRI符號庫中名稱為Rose的StylegalleryItme,然后通過IStyleGalleryItem的Item屬性即可轉(zhuǎn)換為ISymbol。

    整個(gè)流程圖如圖11所示:

    4.6SymbologyControl控件

    SymbologyControl用來顯示ServerStyle符號庫中的符號樣式,可以選擇在該控件上選擇一個(gè)符號用來符號化一個(gè)圖層或者作為一個(gè)Element的符號。使用SymbologyControl可以再設(shè)計(jì)的模式下在其屬性頁中加載ServerStyle符號庫文件,同樣也可以使用的LoadStyleFile和RemoveFile方法加載和移除Serverstyle符號庫文件。運(yùn)行效果如圖12所示:

    4.7符號化之Renderer( 渲染)體系

    ArcGIS Engine9.3對GIS數(shù)據(jù)的符號化分為矢量數(shù)據(jù)渲染和柵格數(shù)據(jù)渲染兩大類。接下來分別介紹FeatureRender和RasterRender。

    4.7.1FeatureRender對象

    FeatureRenderer是一個(gè)抽象類,它有15個(gè)子類負(fù)責(zé)進(jìn)行不同類型的著色運(yùn)算。它們都實(shí)現(xiàn)了IFeatureRenderer接口,這個(gè)接口定義了進(jìn)行要素圖層符號化的公共屬性和方法。

    可以通過IGeoFeatureLayer::Renderer屬性獲得一個(gè)要素圖層的符號化對象

    表四

    要素符號化類型

    描述

    SimpleRender

    簡單符號化

    UniqueValueRender

    唯一值符號化

    BiUniqueValueRender

    雙變量唯一值符號化

    ChartRender

    圖表符號化

    ClassBreaksRenderer

    分類等級符號化

    DotDensityRenderer

    點(diǎn)密度符號化

    ProportionalSymbolRenderer

    根據(jù)屬性值設(shè)置符號大小進(jìn)行符號化

    ScaleDependentRenderer

    依比例尺符號化

    RepresentationRenderer

    制圖表達(dá)符號化

    CoTrackSymbologyRenderer(TrackingAnalyst)

    軌跡符號化(應(yīng)用于TrackingAnaylyst擴(kuò)展模塊)

    EnhancedInfoRenderder(TrackingAnalyst)

    增強(qiáng)信息符號化(應(yīng)用于TrackingAnaylyst擴(kuò)展模塊)

    UniqueValueTextRenderer(TrackingAnalyst)

    唯一值文本符號化(應(yīng)用于TrackingAnaylyst擴(kuò)展模塊)

    NAStopRenderer(NetworkAnalyst)

    停止符號化(應(yīng)用于網(wǎng)絡(luò)分析擴(kuò)展模塊)

    FeatureVertexRenderer(SurveyExt)

    要素定點(diǎn)符號化(應(yīng)用于測量分析擴(kuò)展模塊)

    SharedEdgeRenderer(EditorExt)

    用于繪制拓?fù)湓?

    常用的要素符號化類型主要有以下6種類型,如圖13所示:

    由于篇幅有限不再對每一種符號化類型的使用進(jìn)行講解,在后邊的實(shí)例中將為讀者演示如何進(jìn)行唯一值符號化。

    4.7.2RasterRender對象

    RasterRender是一個(gè)抽象類,它有15個(gè)子類負(fù)責(zé)進(jìn)行不同類型的著色運(yùn)算。它們都實(shí)現(xiàn)了IRasterRender接口,這個(gè)接口定義了柵格圖層符號化的公共屬性和方法。可以通過IRasterLayer::Renderer屬性獲得一個(gè)柵格圖層的符號化對象。

    要素符號化類型

    描述

    RasterRGBRenderer

    柵格RGB符號化

    RasterUniqueValueRenderer

    唯一值符號化

    RasterColormapRenderer

    雙變量唯一值符號化

    RasterClassifyColorRampRenderer

    圖表符號化

    RasterStretchColorRampRenderer

    分類等級符號化

    RasterDiscreteColorRenderer

    點(diǎn)密度 符號化

    ?? 柵格符號化類型結(jié)構(gòu)圖如圖14所示:

    以下代碼片段是對一個(gè)RasterLayer進(jìn)行RasterStretchColorRampRenderer符號化操作:

    ///<summary>

    /// StretchColorRamp符號化RasterLayer

    ///</summary>

    ///<param name="pRasterLayer">RasterLayer</param>

    public void SetStretchColorRampRenderer(IRasterLayer pRasterLayer)

    {

    try

    {

    //創(chuàng)建RasterStretchColorRampRendererClass對象

    IRasterStretchColorRampRenderer pRStretchRender= new RasterStretchColorRampRendererClass();

    //QI到IRasterRenderer

    IRasterRenderer pRasterRender=pRStretchRender as IRasterRenderer;

    pRasterRender.Raster = pRasterLayer as IRaster;

    pRasterRender.Update();

    //創(chuàng)建兩個(gè)起始顏色

    IRgbColor pFromRgbColor = new RgbColorClass();

    pFromRgbColor.Red = 255;

    IRgbColor pToRgbColor = new RgbColorClass();

    pToRgbColor.Blue = 255;

    //創(chuàng)建起止顏色帶

    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;

    //設(shè)置拉伸顏色帶符號化所采用的顏色帶

    pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;

    pRasterRender.Update();

    //符號化RasterLayer

    pRasterLayer.Renderer = pRasterRender;

    }

    catch(Exception Err)

    {

    MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

    }

    }

    轉(zhuǎn)載自: http://bbs.esrichina-bj.cn/ESRI/thread-46784-1-1.html

    4.8利用ESRI自帶的符號庫進(jìn)行唯一值符號化一圖層開發(fā)實(shí)例

    4.8.1目的

    學(xué)會(huì)開發(fā)唯一值符號化要素圖層功能

    4.8.2步驟

    1.準(zhǔn)備點(diǎn)數(shù)據(jù),添加屬性字段“類別”;

    2.并為要素“類別”屬性值分別設(shè)置為“Hospital2”,“School 1”,“Airport”三種屬性值。

    3.實(shí)現(xiàn)唯一值符號化功能

    4.運(yùn)行程序?qū)崿F(xiàn)效果

    4.8.3功能開發(fā)

    實(shí)現(xiàn)唯一值符號化功能代碼如下:

    ///<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>

    ///設(shè)置要素圖層唯一值符號化

    ///</summary>

    ///<param name="pFeatureLayer"></param>

    private void UniqueValueRenderFlyr(IFeatureLayer pFeatureLayer)

    {

    try

    {

    //創(chuàng)建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】);

    //添加唯一值符號化字段值和相對應(yīng)的符號

    pUVRender.AddValue(pFieldValues,pFieldValues,pSymbol);

    }

    //設(shè)置唯一值符號化的字段個(gè)數(shù)和字段名

    pUVRender.FieldCount = 1;

    pUVRender.set_Field(0, "類別");

    IGeoFeatureLayer pGFeatureLyr = pFeatureLayer as IGeoFeatureLayer;

    //設(shè)置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設(shè)計(jì)GIS系統(tǒng)符號化模塊

    大家首先有個(gè)觀念:用ArcEngine開發(fā)C/S應(yīng)用程序時(shí),一個(gè)成熟的GIS項(xiàng)目在加載數(shù)據(jù)這方面是不允許直接把SDE里邊的數(shù)據(jù)以MXD的形式組織起來這是不科學(xué)的,原因如下:

    1.從數(shù)據(jù)安全性考慮

    一個(gè)MXD文檔包含了SDE數(shù)據(jù)庫里與MXD數(shù)據(jù)的詳細(xì)信息,通常對于數(shù)據(jù)擁有者來說是不希望外部能夠獲取這些信息的。

    2.從系統(tǒng)靈活性考慮

    通過程序動(dòng)態(tài)加載所需同層,動(dòng)態(tài)符號化相關(guān)圖層能夠?yàn)槌绦驇砗艽蟮撵`活性,例如根據(jù)不同的用戶的權(quán)限從數(shù)據(jù)庫加載不同的數(shù)據(jù),符號化不同的圖層等等。習(xí)慣直接在MapControl上Load MXD File的就會(huì)有疑問,不通過MXD怎么展現(xiàn)圖層的符號化。

    接下來我將從兩種途徑給大家介紹一下如果動(dòng)態(tài)符號化圖層:

    使用ArcEngine開發(fā)C/S應(yīng)用程序數(shù)據(jù)加載一個(gè)重要的功能模塊,在數(shù)據(jù)加載模塊符號圖層是其技術(shù)核心之一:

    4.9.1通過系統(tǒng)符號化配置表存儲圖層符號化信息符號化圖層。

    首先在關(guān)系型數(shù)據(jù)庫中創(chuàng)建一個(gè)圖層符號化配置表詳細(xì)記錄每一個(gè)圖層的符號化信息,如下表(我只列出簡單符號化的配置表設(shè)計(jì),至于唯一值等大家可以自己根據(jù)需求設(shè)計(jì)):

    圖層ID

    符號化類型

    符號庫ID

    符號名稱

    符號類型

    點(diǎn)圖層1

    簡單符號化

    1

    火車站

    點(diǎn)

    線圖層1

    簡單符號化

    2

    鐵路線

    面圖層1

    簡單符號化

    3

    綠色面

    然后使用ArcEngine提供的每種符號化類型的接口對圖層進(jìn)行符號化渲染。

    4.9.2通過ArcEngine提供的Represatation存儲要素符號化

    Representation是ArcGIS9.3的新特性,能夠通過Representation制作更精美,更復(fù)雜的地圖操作過程,下圖是ArcGIS Desktop中Repre sentation工具條。

    通過一下操作可以把通過Representation工具條制作出來的地圖效果存儲在要素類中(只能是Geodat? abase類型的)。

    從以上可以看出每一個(gè)要素的符號化信息都以Blob方式存儲在相對應(yīng)的數(shù)據(jù)表中,這樣就不需要通過配置表的設(shè)置進(jìn)行動(dòng)態(tài)符號化,直接通過Engine中提供的與Representation相關(guān)的接口和類符號化每一個(gè)圖層。

    轉(zhuǎn)載自: http://bbs.esrichina-bj.cn/ESRI/thread-47411-1-1.html

    地圖查詢

    ??? 地圖查詢、統(tǒng)計(jì)是一個(gè)GIS系統(tǒng)的基本的功能模塊,實(shí)際上統(tǒng)計(jì)功能的前提也是通過查詢獲取結(jié)果以文字或者圖表等報(bào)表的形式展現(xiàn)查詢結(jié)果數(shù)據(jù)。

    地圖查詢有兩種類型的查詢:

    1.空間查詢:在地圖上設(shè)置一定范圍,查詢這一范圍內(nèi)的要素。例如在地圖上畫一范圍查詢這一區(qū)域內(nèi)的所有消防栓,這一范圍的所有消防栓高亮顯示(或者其他顯示方式)并展現(xiàn)出所有的消防栓的屬性信息。

    2.屬性查詢:通過一定的查詢條件獲取目標(biāo)要素。例如我們需要查詢中國行政區(qū)上人口大于5000萬,同時(shí)GDP大于1萬億的省份,通過執(zhí)行查詢,符號條件的省份高亮顯示(或者其他顯示方式)并展現(xiàn)出這些省份的屬性信息。

    ArcGIS Engine9.3為開發(fā)者提供了無需寫代碼即可進(jìn)行查詢功能的Identify工具,但是這個(gè)工具是一個(gè)通用的信息查詢新工具。而開發(fā)者通常需要自己開發(fā)一套符合自己業(yè)務(wù)需求更加靈活的查詢功能模塊,甚至一些功能不僅僅是查詢信息,很多編輯編輯功能以及和業(yè)務(wù)相結(jié)合的功能開發(fā)都用到查詢功能。所以很有必要了解ArcGIS Engine的查詢機(jī)制。

    5.1目標(biāo)

    1.熟悉Cursor,FeatureCursor對象,使用IFeatureCursor接口

    2.熟悉QueryFilter, SpatialFilter對象使用IQueryFilter,ISpatialFilter接口

    3.熟悉要素選擇集SelectionSet對象,會(huì)使用IFeatureSelection,ISelectionSet接口

    4.開發(fā)一個(gè)屬性查詢小功能Demo, 獲取符號查詢條件的Feature,并IFeatureLayerDefinition接口創(chuàng)建一個(gè)新的要素圖層加載到Mapcontrol上

    5.開發(fā)一個(gè)空間多邊形查詢功能的小Demo, 學(xué)會(huì)創(chuàng)建內(nèi)存半透明圖層用于顯示選擇范圍

    5.2準(zhǔn)備工作

    1.IDE:Visual Studio 2005/2008

    2.ArcGIS Engine Developer kit 9.3

    3.準(zhǔn)備一份用于查詢的的矢量數(shù)據(jù)(文章內(nèi)有說明)

    5.3Cursor對象

    Cursor(游標(biāo))本質(zhì)上是一個(gè)指向數(shù)據(jù)的指針,本身并不包含數(shù)據(jù)內(nèi)容,它是連接到Row對象或要素對象的橋梁。

    ?? 游標(biāo)有三種類型,即查詢游標(biāo)、插入游標(biāo)和更新游標(biāo)。每一種游標(biāo)都是通過與之相適應(yīng)的方法來獲得的,如Search、Insert和Update方法。更新和插入游標(biāo)都需要使用一個(gè)過濾器(Filter)對象,因?yàn)樗鼈兪紫缺仨毇@得需要進(jìn)行操作的要素。

    ??????? Cursor對象支持的接口是ICursor,它定義了操作一個(gè)Row集合或一個(gè)Row對象的屬性和方法,下面是獲得插入型、更新型和查詢型游標(biāo)的方法:

    ??????? pCursor = IFeatureClass.Insert()

    使用IFeatureClass的Insert方法返回一個(gè)插入型游標(biāo),它通常用于往表中插入一條記錄。

    ??????? pCursor = IFeatureClass.Update()

    使用IFeatureClass的Update方法會(huì)返回一個(gè)更新型游標(biāo),它用于更新或者刪除一條記錄。

    ??????? pCursor= IFeatureClass.Search()

    使用IFeatureClass的Sarch方法對表進(jìn)行查詢后,可以得到一個(gè)查詢型Cursor對象,它指向一個(gè)或多個(gè)Row對象。

    ????? 以我們這章的內(nèi)容主要使用查詢游標(biāo)。

    ????? FeatureCursor是Cursor的一個(gè)子類,指向一個(gè)或多個(gè)要素,它實(shí)現(xiàn)了IFeatureCursor接口,ArcGIS Engine開發(fā)所對矢量圖層實(shí)現(xiàn)查詢功能都是實(shí)行IFeatureCursor。

    5.4QueryFilter對象與SpatialFilter對象???

    ???? 在關(guān)系型數(shù)據(jù)庫中,查詢條件是通過SQL語句的Where子語句來完成的。在ArcGIS Engine中不能直接使用SQL語句,但ArcGIS Engine提供了QueryFilter和SpatialFilter兩個(gè)過濾器對象來配合完成查詢條件的設(shè)置,從而查詢到想要的數(shù)據(jù)。

    ????????? QueryFilter過濾器主要用于對屬性數(shù)據(jù)查詢條件的設(shè)置,它主要實(shí)現(xiàn)IQueryFilter接口從而實(shí)現(xiàn)屬性查詢功能。

  • IQueryFilter pQueryFilter = new QueryFilterClass();
  • //設(shè)置過濾器對象的屬性
  • pQueryFilter.WhereClause = "人口> 10000000";
  • 復(fù)制代碼

    ????????? SpatialFilter過濾器主要用于空間范圍查詢條件的設(shè)置,它主要實(shí)現(xiàn)ISpatialFilter(繼承 IQueryFilter接口)接口從而實(shí)現(xiàn)空間查詢功能。

  • ISpatialFilter pSpatialFilter = new SpatialFilterClass();
  • //設(shè)置空間過濾器的范圍(多邊形)
  • pSpatialFilter.Geometry = pGeometry;
  • //設(shè)置空間過濾器空間關(guān)系類型
  • pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
  • 復(fù)制代碼

    空間過濾器空間關(guān)系類型主要有以下幾種類型如表一所示:

    表1

    空間過濾器空間關(guān)系類型

    描述(A是待查詢圖形,B是過濾條件圖形)

    esriSpatialRelUndefined

    未定義

    esriSpatialRelIntersects

    A與B圖形相交

    esriSpatialRelEnvelopeIntersects

    A的Envelope和B的Envelope相交

    esriSpatialRelIndexIntersects

    A與B索引相交

    esriSpatialRelTouches

    A與B邊界相接

    esriSpatialRelOverlaps

    A與B相疊加

    esriSpatialRelCrosses

    A與B相交(兩條線相交于一點(diǎn),一條線和一個(gè)面相交)

    esriSpatialRelWithin

    A在B內(nèi)

    esriSpatialRelContains

    A包含B

    esriSpatialRelRelation

    A與B空間關(guān)聯(lián)

    5.5SelectionSet要素選擇集對象

    ? 熟悉ArcGIS Desktop使用的開發(fā)者一定會(huì)知道當(dāng)在ArcMap中顯示查詢結(jié)果的時(shí),所有的符號查詢調(diào)教的要素都以藍(lán)色高亮的形式顯示在地圖控件上,藍(lán)色高亮顯示表示高亮選中,這些高亮顯示選中的要素對應(yīng)一個(gè)要素選擇集對象中。通過IFeatureSelection的SelectionSet屬性可以獲取選擇集,FeatureLayer對象實(shí)現(xiàn)了IFeatureSelection接口。

    實(shí)現(xiàn)代碼如下:

    IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;

    //QI至IFeatureSelection

    IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;

    //創(chuàng)建過濾器

    IQueryFilter pQueryFilter = new QueryFilterClass();

    //設(shè)置過濾器對象的查詢條件

    pQueryFilter.WhereClause = "人口> 10000000";

    //選擇要素

    pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew,false);???????????????

    //獲取選擇集對象

    ISelectionSet pSelectinSet=pFeatureSelection.SelectionSet;

    //設(shè)置選擇集的符號

    pFeatureSelection.SelectionSymbol = pSymbol;

    5.6屬性查詢實(shí)例

    5.6.1程序?qū)崿F(xiàn)目標(biāo):

    ? 查詢?nèi)丝诖笥?000000的城市,并把查詢結(jié)果創(chuàng)建為一個(gè)新的圖層,如圖1-3所示:

    代碼片段如下:

  • private void button1_Click(object sender, EventArgs e)
  • {
  • ?? IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;
  • ??? //QI到FeatureSelection
  • ??? IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
  • ??? //創(chuàng)建過濾器
  • ? IQueryFilter pQueryFilter = new QueryFilterClass();
  • ?? //設(shè)置過濾器對象的查詢條件
  • pQueryFilter.WhereClause = "人口> 5000000";
  • //根據(jù)查詢條件選擇要素
  • pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
  • //QI到ISelectionSet
  • ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
  • if (pSelectionSet.Count > 0)
  • {
  • IFeatureLayerDefinition pFDefinition = pFeatureLayer as IFeatureLayerDefinition;
  • //創(chuàng)建新圖層
  • IFeatureLayer pNewFeatureLayer = pFDefinition.CreateSelectionLayer("newlayerName", true, null, null);
  • pNewFeatureLayer.Name = "查詢結(jié)果城市";
  • axMapControl1.AddLayer(pNewFeatureLayer as ILayer);
  • ? }
  • }
  • ArcGIS Engine基礎(chǔ)開發(fā)教程(5)下——學(xué)習(xí)地圖查詢

  • 5.7空間查詢實(shí)例
  • 5.7.1目標(biāo)
  • ?? 實(shí)現(xiàn)多邊形查詢功能
  • 5.7.2功能開發(fā)
  • ?? 代碼片段如下:
  • 引用的命名空間:
  • [code]
  • using System;
  • using System.Drawing;
  • using System.Collections;
  • using System.ComponentModel;
  • using System.Windows.Forms;
  • using System.Data;
  • using System.IO;
  • using System.Runtime.InteropServices;
  • using System.Collections.Generic;
  • using ESRI.ArcGIS.esriSystem;
  • using ESRI.ArcGIS.Carto;
  • using ESRI.ArcGIS.Controls;
  • using ESRI.ArcGIS.ADF;
  • using ESRI.ArcGIS.SystemUI;
  • using ESRI.ArcGIS.Display;
  • using ESRI.ArcGIS.Geodatabase;
  • using ESRI.ArcGIS.Geometry;
  • using ESRI.ArcGIS.DataSourcesGDB;
  • ///<summary>///
  • 在程序運(yùn)行時(shí)的內(nèi)存中創(chuàng)建矢量要素層,并加到地圖控件最頂端
  • ///</summary> ///
  • <param name="pMapCtrl">地圖控件</param>
  • ///<returns>IFeatureLayer 新加的要素層</returns>
  • private? IFeatureLayer AddFeatureLayerByMemoryWS(AxMapControl pMapCtrl,ISpatialReference pSReference)
  • {?????????
  • ? try
  • ? {
  • ???? if (pMapCtrl == null) return null;
  • #region
  • 創(chuàng)建新的內(nèi)存工作空間
  • IWorkspaceFactory pWSF = new InMemoryWorkspaceFactoryClass();
  • IWorkspaceName pWSName = pWSF.Create("", "Temp", null, 0);
  • IName pName = (IName)pWSName;
  • IWorkspace pMemoryWS = (IWorkspace)pName.Open();
  • #endregion
  • IField oField = new FieldClass();
  • IFields oFields = new FieldsClass();
  • IFieldsEdit oFieldsEdit = null;
  • IFieldEdit oFieldEdit = null;
  • IFeatureClass oFeatureClass = null;
  • IFeatureLayer oFeatureLayer = null;
  • try
  • {
  • FieldsEdit = oFields as IFieldsEdit;
  • oFieldEdit = oField as IFieldEdit;
  • oFieldEdit.Name_2 = "OBJECTID";
  • oFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
  • oFieldEdit.IsNullable_2 = false;
  • oFieldEdit.Required_2 = false;
  • oFieldsEdit.AddField(oField);
  • oField = new FieldClass();
  • oFieldEdit = oField as IFieldEdit;
  • IGeometryDef pGeoDef = new GeometryDefClass();
  • IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef;
  • pGeoDefEdit.AvgNumPoints_2 = 5;
  • pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
  • pGeoDefEdit.GridCount_2 = 1;
  • pGeoDefEdit.HasM_2 = false;
  • pGeoDefEdit.HasZ_2 = false;
  • pGeoDefEdit.SpatialReference_2 = pSReference;
  • oFieldEdit.Name_2 = "SHAPE";
  • oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
  • oFieldEdit.GeometryDef_2 = pGeoDef;
  • oFieldEdit.IsNullable_2 = true;
  • oFieldEdit.Required_2 = true;
  • oFieldsEdit.AddField(oField);
  • oField = new FieldClass();
  • oFieldEdit = oField as IFieldEdit;
  • oFieldEdit.Name_2 = "Code";
  • oFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
  • oFieldEdit.IsNullable_2 = true;
  • oFieldsEdit.AddField(oField);
  • //創(chuàng)建要素類
  • oFeatureClass = (pMemoryWS as IFeatureWorkspace).CreateFeatureClass("Temp", oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
  • oFeatureLayer = new FeatureLayerClass();
  • oFeatureLayer.Name = "TransTemp";
  • oFeatureLayer.FeatureClass = oFeatureClass;
  • //創(chuàng)建唯一值符號化對象
  • IUniqueValueRenderer pURender = new UniqueValueRendererClass();
  • pURender.FieldCount = 1;
  • pURender.set_Field(0, "Code");
  • pURender.UseDefaultSymbol = false;
  • ISimpleFillSymbol pFillSym = new SimpleFillSymbolClass();
  • pFillSym.Style = esriSimpleFillStyle.esriSFSSolid;
  • //半透明顏色
  • IRgbColor pColor = new RgbColorClass();
  • pColor.Red = 255;
  • pColor.Green = 255;
  • pFillSym.Color = pColor;
  • pURender.AddValue("1", "", pFillSym as ISymbol);
  • pFillSym = new SimpleFillSymbolClass();
  • pFillSym.Style = esriSimpleFillStyle.esriSFSSolid;
  • //唯一值符號化內(nèi)存圖層
  • (oFeatureLayer as IGeoFeatureLayer).Renderer = pURender as IFeatureRenderer;
  • ILayerEffects pLyrEffect = oFeatureLayer as ILayerEffects;
  • //透明度
  • pLyrEffect.Transparency = 80;
  • }
  • catch(Exception Err)
  • {
  • ??? MessageBox.Show(Err.Message);
  • }
  • finally
  • {
  • ?? try{
  • ystem.Runtime.InteropServices.Marshal.ReleaseComObject(oField);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(pName);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSF);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSName);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(pMemoryWS);
  • System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
  • }
  • catch
  • {
  • }
  • GC.Collect();
  • }
  • ???? return oFeatureLayer;
  • }
  • ? catch (Exception Err)
  • {
  • MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • return null;}
  • }
  • /// <summary> 在地圖控件上添加透明臨時(shí)圖元/// </summary>
  • /// <param name="pMapCtrl">地圖控件</param>
  • /// <param name="pGeo">Envelope或Polygon幾何實(shí)體</param>
  • /// <param name="bAutoClear">是否清除原有內(nèi)容</param>
  • public? void AddTransTempEle(AxMapControl pMapCtrl, IGeometry pGeo, bool bAutoClear)
  • ??????? {
  • ??????????? try
  • ??????????? {
  • ??????????????? if (pMapCtrl == null) return;
  • ??????????????? if (pGeo == null) return;
  • ??????????????? if (pGeo.IsEmpty) return;
  • ??????????????? IGeometry pPolygon = null;
  • ??????????????? if (pGeo is IEnvelope)
  • ??????????????? {
  • ??????????????????? object Miss = Type.Missing;
  • ??????????????????? pPolygon = new PolygonClass();
  • ??????????????????? IGeometryCollection pGeoColl = pPolygon as IGeometryCollection;
  • ??????????????????? pGeoColl.AddGeometry(pGeo, ref Miss, ref Miss);
  • ??????????????? }
  • ??????????????? else if (pGeo is IPolygon)
  • ??????????????? {
  • ??????????????????? (pGeo as ITopologicalOperator).Simplify();
  • ??????????????????? pPolygon = pGeo;
  • ??????????????? }
  • ??????????????? else
  • ??????????????? {
  • ??????????????????? MessageBox.Show( "幾何實(shí)體類型不匹配","提示" ,MessageBoxButtons.OK, MessageBoxIcon.Information);
  • ??????????????????? return;
  • ??????????????? }
  • ??????????????? //獲取透明要素層
  • ??????????????? IFeatureLayer pFlyr = null;
  • ??????????????? for (int i = 0; i < pMapCtrl.LayerCount; i++)
  • ??????????????? {
  • ??????????????????? if (pMapCtrl.get_Layer(i).Name == "TransTemp")
  • ??????????????????? {
  • ??????????????????????? pFlyr = pMapCtrl.get_Layer(i) as IFeatureLayer;
  • ??????????????????????? break;
  • ??????????????????? }
  • ??????????????? }
  • ??????????????? //透明臨時(shí)層不存在需要?jiǎng)?chuàng)建
  • ??????????????? if (pFlyr == null)
  • ??????????????? {???
  • ??????????????????? pFlyr = AddFeatureLayerByMemoryWS(pMapCtrl,pMapCtrl.SpatialReference);
  • ??????????????????? if (pFlyr == null)
  • ??????????????????? {
  • ??????????????????????? MessageBox.Show("創(chuàng)建透明臨時(shí)圖層發(fā)生異常", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • ??????????????????????? return;
  • ??????????????????? }
  • ??????????????? }
  • ??????????????? IFeatureClass pFC = pFlyr.FeatureClass;
  • ??????????????? if (bAutoClear)
  • ??????????????? {
  • ??????????????????? if (pFC.FeatureCount(null) > 0)
  • ??????????????????? {
  • ??????????????????????? IFeatureCursor pFCursor = pFC.Search(null, false);
  • ??????????????????????? if (pFCursor != null)
  • ??????????????????????? {
  • ??????????????????????????? IFeature pFeature = pFCursor.NextFeature();
  • ??????????????????????????? if (pFeature != null)
  • ??????????????????????????? {
  • ??????????????????????????????? while (pFeature != null)
  • ??????????????????????????????? {
  • ??????????????????????????????????? pFeature.Delete();
  • ??????????????????????????????????? pFeature = pFCursor.NextFeature();
  • ??????????????????????????????? }
  • ??????????????????????????? }
  • ??????????????????????????? System.Runtime.InteropServices.Marshal.ReleaseComObject(pFCursor);
  • ??????????????????????? }
  • ??????????????????? }
  • ??????????????? }
  • ??????????????? //創(chuàng)建要素
  • ??????????????? IFeature pNFeature = pFC.CreateFeature();
  • ??????????????? pNFeature.Shape = pPolygon;
  • ??????????????? pNFeature.set_Value(pFC.FindField("Code"),"1");
  • ??????????????? pNFeature.Store();
  • ??????????????? pMapCtrl.Refresh(esriViewDrawPhase.esriViewGeography, pFlyr, pFlyr.AreaOfInterest);
  • ??????????? }
  • ??????????? catch (Exception Err)
  • ??????????? {
  • ??????????????? MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • ??????????? }
  • ??????? }
  • /// <summary>
  • ??????? /// 獲取查詢要素
  • ??????? /// </summary>
  • ??????? /// <param name="pFeatureLayer">要素圖層</param>
  • ??????? /// <param name="pGeometry">圖形范圍參數(shù)</param>
  • ??????? /// <returns>符號條件要素集合</returns>
  • ??????? private List<IFeature> GetSeartchFeatures( IFeatureLayer pFeatureLayer,IGeometry pGeometry)
  • ??????? {
  • ??????????? try
  • ??????????? {
  • ??????????????? List<IFeature> pList = new List<IFeature>();
  • ??????????????? //創(chuàng)建SpatialFilter空間過濾器對象
  • ??????????????? ISpatialFilter pSpatialFilter = new SpatialFilterClass();
  • ??????????????? IQueryFilter pQueryFilter = pSpatialFilter as ISpatialFilter;
  • ??????????????? //設(shè)置過濾器的Geometry
  • ??????????????? pSpatialFilter.Geometry = pGeometry;
  • ??????????????? //設(shè)置空間關(guān)系類型
  • ??????????????? pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
  • ??????????????? //獲取FeatureCursor游標(biāo)
  • ??????????????? IFeatureCursor pFeatureCursor = pFeatureLayer.Search(pQueryFilter, false);
  • ??????????????? //遍歷FeatureCursor
  • ??????????????? IFeature pFeature = pFeatureCursor.NextFeature();
  • ??????????????? while (pFeature != null)
  • ??????????????? {
  • ??????????????????? //獲取要素對象
  • ??????????????????? pList.Add(pFeature);
  • ??????????????????? pFeature = pFeatureCursor.NextFeature();
  • ??????????????? }
  • ??????????????? System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
  • ??????????????? return pList;
  • ??????????? }
  • ??????????? catch (Exception Err)
  • ??????????? {
  • ??????????????? MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  • ??????????????? return null;
  • ??????????? }
  • ??????? }
  • ? bool bSearch = false; //定義bool變量用于啟動(dòng)多邊形查詢功能
  • ??????? private void button1_Click(object sender, EventArgs e)
  • ??????? {
  • ??????????? try
  • ??????????? {
  •         //向地圖控件添加內(nèi)存圖層
  • ??????????????? IFeatureLayer pFeatureLayer = this.AddFeatureLayerByMemoryWS(this.axMapControl1,this.axMapControl1.SpatialReference);
  • ??????????????? this.axMapControl1.AddLayer(pFeatureLayer);
  • ?????????????? //設(shè)置鼠標(biāo)樣式為十字絲
  • ??????????????? this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
  •         //啟動(dòng)范圍查詢功能
  • ??????????????? bSearch = true;
  • ???????? }
  • 添加一個(gè)新的Form在Form上添加一個(gè)DataGridView控件用于顯示查詢結(jié)果信息。如圖4所示:

  • private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
  • ??????? {
  • ??????????? if (bSearch)
  • ??????????? {
  • ??????????????? //設(shè)置鼠標(biāo)樣式為十字絲
  • ??????????????? this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
  • ??????????????? //獲取畫定范圍的Geometry
  • ??????????????? IGeometry pGeometry = this.axMapControl1.TrackPolygon();
  • ??????????????? //添加半透名臨時(shí)圖形
  • ??????????????? this.AddTransTempEle(this.axMapControl1, pGeometry, false);
  • ??????????????? IFeatureLayer pFeatureLayer=this.axMapControl1.get_Layer(1) as IFeatureLayer;
  • ??????????????? //執(zhí)行查詢獲取符號條件的要素
  • ??????????????? List<IFeature> pFList = this.GetSeartchFeatures(pFeatureLayer, pGeometry);
  • ??????????????? attribute pAttribute = new attribute();
  • ??????????????? //設(shè)置信息顯示窗體中DataGridView的屬性
  • ??????????????? //設(shè)置行數(shù)pFList.Count+1包括字段名哪一行即表頭
  • ??????????????? pAttribute.dataGridView1.RowCount = pFList.Count+1;???????????????
  • ??????????????? //設(shè)置邊界風(fēng)格
  • ??????????????? pAttribute.dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Sunken;
  • ??????????????? //設(shè)置列數(shù)
  • ??????????????? pAttribute.dataGridView1.ColumnCount = pFList[0].Fields.FieldCount;
  • ??????????????? //遍歷第一個(gè)要素的字段用于給列頭賦值(字段的名稱)
  • ??????????????? for(int m=0;m<pFList[0].Fields.FieldCount;m++)
  • ??????????????? {
  • ??????????????????? pAttribute.dataGridView1.Columns[m].HeaderText = pFList[0].Fields.get_Field(m).AliasName;
  • ??????????????? }
  • ??????????????? //遍歷要素
  • ??????????????? for (int i = 0; i < pFList.Count; i++)
  • ??????????????? {
  • ?????????????????? IFeature pFeature=pFList;
  • ??????????????? for(int j=0;j<pFeature.Fields.FieldCount;j++)
  • ?????????????????? {
  • ?????????????????????? //填充字段值
  • ?????????????????????? pAttribute.dataGridView1[j, i].Value = pFeature.get_Value(j).ToString();
  • ?????????????????? }
  • ??????????????? }
  • ??????????????? pAttribute.Show();
  • ??????????? }
  • ??????? }
  • 5.7.3功能演示

    ?? 1.單擊按鈕向地圖控件上添加一內(nèi)存圖層,并啟動(dòng)多邊形查詢功能如圖5示:

    ?????? 2.點(diǎn)擊鼠標(biāo)左鍵在地圖上畫以多邊形范圍,雙擊結(jié)束,將看到在所畫的范圍以半透明的形式添加在地圖之上,并顯示出查詢結(jié)果的屬性信息如圖所示:

    5.7.4 Demo總結(jié):

    1.使用IWorkspaceFactory,IWorkspaceName,IName,IWorkspace等接口以及InMemoryWorkspaceFactoryClass對象創(chuàng)建在程序運(yùn)行時(shí)的內(nèi)存中的矢量要素層

    2.復(fù)習(xí)IUniqueValueRenderer等接口以及UniqueValueRendererClass對象唯一值符號化要素圖層

    3.使用ILayerEffects接口創(chuàng)建半透明效果要素圖層

    4.使用ISpatialFilter,IQueryFilter 等接口以及SpatialFilterClass對象獲取符號條件的FeatureCursor,并學(xué)會(huì)通過遍歷整個(gè)FeatureCursor中Feature對象,獲取符號查詢條件的Feature集合

    5.使用IFeatureLayerDefinition根據(jù)要素選擇集創(chuàng)建新要素圖層

    5.8附IFeatureClass.Search(IQuery Filter,bool Recycling)參數(shù)說明

    FeatureClass的Search方法大家經(jīng)常用到,很多人對Search方法的其中一個(gè)參數(shù)bool Recycling不是很理解。先做以下解釋:

    1.pFeatureCursor存儲的是所有符合條件的Feature對象的引用,

    2.Recycling的意思是回收,參數(shù)Recycling為True的時(shí)當(dāng)執(zhí)行這個(gè)方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的圖形值在內(nèi)存中所占的地址就會(huì)被銷毀回收,為False的時(shí)候當(dāng)執(zhí)行這個(gè)方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的圖形值依然存在在內(nèi)存中。

    1.參數(shù)Recycling設(shè)置為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參數(shù)設(shè)置為TRUE也就是說每執(zhí)行一個(gè)NextFeautre方法上一條記錄的Feature值在內(nèi)存中被回收,所以到最后遍歷pFeatures集合的時(shí)候所有的IFeature引用指向的Feature對象都為Null。所以會(huì)引發(fā)一下錯(cuò)誤(如下圖7所示):

    .參數(shù)Recycling設(shè)置為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參數(shù)設(shè)置為False也就是說每執(zhí)行一個(gè)NextFeautre方法上一條記錄的Feature值在內(nèi)存中依然存在,所以到最后遍歷pFeatures集合的時(shí)候所有的IFeature引用指向的Feature對象都依然存在。所以會(huì)執(zhí)行的很Happy(如下圖8所示):

    轉(zhuǎn)載于:https://www.cnblogs.com/mazhenyu/archive/2011/02/25/1965179.html

    總結(jié)

    以上是生活随笔為你收集整理的ArcGIS Engine基础开发教程(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。