AE開(kāi)發(fā)實(shí)例代碼總結(jié)_第1頁(yè)
AE開(kāi)發(fā)實(shí)例代碼總結(jié)_第2頁(yè)
AE開(kāi)發(fā)實(shí)例代碼總結(jié)_第3頁(yè)
AE開(kāi)發(fā)實(shí)例代碼總結(jié)_第4頁(yè)
AE開(kāi)發(fā)實(shí)例代碼總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1、AE開(kāi)發(fā)技術(shù)文檔一、數(shù)據(jù)加載問(wèn)題1、加載個(gè)人數(shù)據(jù)庫(kù)個(gè)人數(shù)據(jù)庫(kù)是保存在Access中的數(shù)據(jù)庫(kù)。加載方式有兩種:通過(guò)名字和通過(guò)屬性加載(也許不只是這兩種,AE中實(shí)現(xiàn)同一功能可以有多種方式)A、通過(guò)設(shè)置屬性加載個(gè)人數(shù)據(jù)庫(kù)首先通過(guò)IPropertySet接口 定義要連接數(shù)據(jù)庫(kù)的一些相關(guān)屬性,在個(gè)人數(shù)據(jù)庫(kù)中為數(shù)據(jù)庫(kù)的路徑,例如:IPropertySet Propset= new PropertySetClass(); Propset.SetProperty(“DATABASE”,”D:testAodatashMapdata.mdb”);當(dāng)定義完屬性并設(shè)置屬性后就可以進(jìn)行打開(kāi)數(shù)據(jù)庫(kù)的操作了,在ArcE

2、ngine開(kāi)發(fā)中存在IWorkspaceFactory 、IFeatureWorkspace 、IFeatureClass 、IFeatureLayer等幾個(gè)常用的用于打開(kāi)和操作數(shù)據(jù)空間地物的接口。IWorkspaceFactory 是一個(gè)用于創(chuàng)建和打開(kāi)工作空間的接口,它是一個(gè)抽象的接口,我們?cè)诰唧w應(yīng)用時(shí)要用對(duì)應(yīng)的工作空間實(shí)例化它,如下: IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass (); 如果我們打開(kāi)的是SDE 數(shù)據(jù)庫(kù)就要用 SdeWorkspaceFactoryClass 實(shí)例化Fact。當(dāng)我們完成了工作空間的實(shí)例化后就

3、可以根據(jù)上邊設(shè)置的屬性打開(kāi)對(duì)應(yīng)的Access 數(shù)據(jù)庫(kù)了。打開(kāi)方式如下: IFeatureWorkspace Workspace = Fact.Open( Propset,0) as IFeatureWorkspace; 打開(kāi)Access 工作空間后接下來(lái)的事情是做什么了,很簡(jiǎn)單,找到對(duì)應(yīng)的地物類,賦給相應(yīng)的層,通過(guò)MapControl 控件添加對(duì)應(yīng)的層,然后刷新地圖。以下為添加某一層的代碼: IFeatureClass Fcls = Workspace.OpenFeatureClass("District");/找到對(duì)應(yīng)的地物類 IFeatureLayer Fly = ne

4、w FeatureLayerClass();/建立新圖層 Fly.FeatureClass = Fcls; /將地物賦給相應(yīng)的層MapCtr.Map.AddLayer (Fly);/添加層 MapCtr.ActiveView.Refresh();/刷新地圖 其中District 為地物類的名字,MapCtr 為AE中MapControl 的對(duì)象。上邊的通過(guò)屬性設(shè)置加載數(shù)據(jù)空間的方式還可以用于SDE 數(shù)據(jù)庫(kù),在SDE 數(shù)據(jù)庫(kù)加載時(shí)會(huì)介紹。以下為通過(guò)設(shè)置屬性加載Access 數(shù)據(jù)庫(kù)的完整C#代碼:public void AddAccessDBByPro() IPropertySet Propset

5、 = new PropertySetClass(); Propset.SetProperty("DATABASE","D:testAodatashMapData.mdb" ); IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass (); IFeatureWorkspace Workspace = Fact.Open(Propset,0) as IFeatureWorkspace; IFeatureClass Fcls = Workspace.OpenFeatureClass ("Di

6、strict"); IFeatureLayer Fly = new FeatureLayerClass(); Fly.FeatureClass = Fcls; MapCtr.Map.AddLayer(Fly); MapCtr.ActiveView.Refresh(); B、通過(guò)數(shù)據(jù)庫(kù)名字加載個(gè)人數(shù)據(jù)庫(kù)public void AddAccessDBByName()IworkspaceName pWorkspaceName = new WorkspaceNameClass();pWorkspaceName.WorkspaceFactoryProgID= “esriDataSourcesG

7、DB.AccessWorkspaceFactory”;pWorkspaceName.PathName =“D:testAodatashMapData.mdb”;IName n=pWorkspaceName as IName;IFeatureWorkspace Workspace= n.Open() as IFeatureWorkspace;IFeatureClass Fcls = Workspace.OpenFeatureClass ("District"); IFeatureLayer Fly = new FeatureLayerClass(); Fly.FeatureC

8、lass = Fcls; MapCtr.Map.AddLayer(Fly); MapCtr.ActiveView.Refresh(); 首先創(chuàng)建一個(gè)個(gè)人數(shù)據(jù)庫(kù)工作空間名,再指定工作空間名的ProgID,以確定打開(kāi)的是什么類型的工作空間,例如在打開(kāi)Access個(gè)人數(shù)據(jù)庫(kù)時(shí),使用下面代碼;IworkspaceName pWorkspaceName = new WorkspaceNameClass();pWorkspaceName.WorkspaceFactoryProgID= “esriDataSourcesGDB.AccessWorkspaceFactory”;pWorkspaceName.Pa

9、thName =“D:testAodatashMapData.mdb”;屬性WorkspaceFactoryProgID可以確保工作空間是AccessWorkspaceFactory,即個(gè)人數(shù)據(jù)庫(kù),同時(shí)要指定打開(kāi)數(shù)據(jù)庫(kù)路徑。為了打開(kāi)數(shù)據(jù)庫(kù),打開(kāi)工作空間必須使用IName接口(思考有沒(méi)有其他辦法),所以接著定義IName、對(duì)象,并把工作空間名轉(zhuǎn)換成IName類型,并賦值給IName對(duì)象,然后通過(guò)IName對(duì)象的open方法打開(kāi)相應(yīng)的工作空間,代碼如下:IName n=pWorkspaceName as IName;IFeatureWorkspace Workspace= n.Open() as

10、IFeatureWorkspace;2、AE開(kāi)發(fā)編輯功能數(shù)據(jù)編輯問(wèn)題1. 需要了解的概念長(zhǎng)事務(wù) 短事務(wù) 編輯空間 抽象類,類,和組件對(duì)象類2、最基本的添加點(diǎn)線面功能添加點(diǎn)(方法有多種,基本思路一樣,只是少量的接口有變化)通過(guò)FeatureClass的CreatFeature函數(shù)來(lái)添加地物。public void AddPointByStore()/得到要添加地物的圖層IFeatureLayer l=MapCtr.Map.get_Layer(0) as IFeatureLayer;/定義一個(gè)地物類,把要編輯的圖層轉(zhuǎn)化為定義的地物類IFeatureClass fc= l.FeatureClass;

11、/先定義一個(gè)編輯的工作空間,然后把它轉(zhuǎn)化為數(shù)據(jù)集,最后轉(zhuǎn)化為編輯工作空間,IWorkspaceEdit w=(fc as IDataset).Workspace as IWorkspaceEdit;IFeature f;IPoint p;/開(kāi)始事務(wù)操作w.StartEditing(false); /?/開(kāi)始編輯w.StartEditOperation();for(int i=0;i<100;i+)/創(chuàng)建一個(gè)地物f=fc.CreateFeature();p=new PointClass();/設(shè)置點(diǎn)的坐標(biāo)p.PutCoord(i,i);/確定圖形類型f.Shape=p;/保存地物f.Sto

12、re()/結(jié)束編輯w.StopEditOperation();/結(jié)束事務(wù)操作w.StopEditing(true);二、添加線方法跟添加點(diǎn)一樣,不同的只是地物類型不一樣而已,AE中各類庫(kù)的介紹1、 問(wèn)題一:什么是UI組件?2、 類庫(kù)介紹空間拓?fù)溥\(yùn)算1、高級(jí)幾何對(duì)象:點(diǎn)(point)、多點(diǎn)(multipoint)、線(polyline)、面(polygon)、multipatch等。(multipatch:多片,三維地形圖中的地圖符號(hào)包括點(diǎn)狀符號(hào)、線狀符號(hào)、面狀符號(hào)、體狀符號(hào)以及多片(MultiPatch)符號(hào)等)2、拓?fù)洌嚎臻g拓?fù)涿枋龅氖伦匀唤绲乩韺?duì)象的空間位置關(guān)系,即相鄰、重合、連通等。是在

13、同一個(gè)要素集下的要素類之間的關(guān)系的集合,所以要參與一個(gè)拓?fù)涞乃幸仡?,必須在同一個(gè)要素集內(nèi)(也就是具有同一個(gè)空間參考),這樣進(jìn)行的拓?fù)錂z查才是精確的。3、一個(gè)要素集可以有多個(gè)拓?fù)洌總€(gè)要素類最多只能參與一個(gè)拓?fù)?,一個(gè)拓?fù)渲锌梢远x多個(gè)規(guī)則,是地理對(duì)象空間屬性的一部分,在目前ESRI提供的數(shù)據(jù)存儲(chǔ)方式中,Coverage和GeoDatabase能夠建立拓?fù)洌鳶hape格式的數(shù)據(jù)不能建立拓?fù)洹?、 esriTRTAny 任何拓?fù)湟?guī)則,查詢拓?fù)涞臅r(shí)候用(ESRI提供的拓?fù)潢P(guān)系)5、AE中提供了ITopologicalOperator接口用于拓?fù)溥\(yùn)算,ITopologicalOperator接口

14、用來(lái)通過(guò)對(duì)已存在的幾何對(duì)象做空間拓?fù)溥\(yùn)算,以產(chǎn)生新的集合對(duì)象。ITopologicalOperator接口在GIS開(kāi)發(fā)中的使用非常廣泛,通常GIS系統(tǒng)中的緩沖區(qū)分析、裁剪幾何圖形、幾何圖形差分操作、幾何圖形合并操作等都需要此接口。Boundary 方法用于幾何圖形對(duì)象的邊界。Polygon的幾何對(duì)象的Boundary是組成它的Polyline幾何對(duì)象,Polyline幾何對(duì)象的Boundary是組成它的頂點(diǎn)Point幾何對(duì)象,而Point的幾何對(duì)象的Boundary是空對(duì)象。Buffer 用于集合對(duì)象緩沖區(qū)分析拓?fù)洳僮?,該方法用于給一個(gè)高級(jí)幾何對(duì)象產(chǎn)生一個(gè)緩沖區(qū),無(wú)論是Polygon、Poly

15、line、還是Point,他們的緩沖區(qū)都是具有面積的幾何對(duì)象。Clip 用于對(duì)幾何對(duì)象進(jìn)行裁剪空間拓?fù)洳僮?。Clip方法可用一個(gè)Envelope對(duì)象對(duì)一個(gè)幾何對(duì)象進(jìn)行裁剪,結(jié)果是幾何對(duì)象被Envelope對(duì)象所包圍的部分。ConstructUion用于將多個(gè)枚舉對(duì)象與單個(gè)幾何對(duì)象合并為單個(gè)幾何對(duì)象。ConvexHull 用于構(gòu)建幾何對(duì)象的凸多邊形。ConvexHull方法用于產(chǎn)生一個(gè)幾何圖形的最小的邊框凸多邊形(沒(méi)有凹面包含幾何圖形的最小多邊形)Cut 用于切割幾何對(duì)象,不支持GeometryBags幾何對(duì)象,它可以指定一條切割曲線和一個(gè)幾何圖形,經(jīng)過(guò)切割運(yùn)算后把幾何圖形分為左右兩部分,左右兩

16、部分是相對(duì)曲線的方向而言的。點(diǎn)與多點(diǎn)不可被分割。Polyline和Polygon只有與切割曲線相交時(shí)才能執(zhí)行Cut方法。Difference 用于從一個(gè)幾何圖形中減去其與另一個(gè)圖形相交的部分,產(chǎn)生兩個(gè)幾何對(duì)象的差集。Intersection方法用于兩個(gè)同緯度幾何對(duì)象的交集部分。Simplify用于使幾何對(duì)象拓?fù)湟恢隆ymmetricDifference對(duì)稱差分可將兩個(gè)幾何圖形的并集部分減去兩個(gè)幾何圖形交集的部分。開(kāi)發(fā)實(shí)例一、 鷹眼功能的實(shí)現(xiàn):分析:鷹眼圖的操作主要由以下幾個(gè)動(dòng)作,當(dāng)在一個(gè)控件中移動(dòng)一幅圖的時(shí)候另一控件中的圖也發(fā)生變化,當(dāng)在主控件中重新加載一幅圖的時(shí)候,另外一個(gè)控件的圖也發(fā)生相

17、應(yīng)的變化,同時(shí)我們?cè)邙B(niǎo)瞰的控件中加入一紅色邊框,注意這個(gè)其實(shí)是一個(gè)面,只是填充的顏色是透明的而已。通過(guò)分析我們知道,我們要添加兩個(gè)MapControl控件,名字分別是axMapControl1和axMapControl2,其中axMapControl1為主圖,而axMapControl2為鳥(niǎo)瞰圖。方法:步驟一:對(duì)于名稱為axMapControl1的MapControl控件,只需要在axMapControl1的OnExtentUpdated和OnMapReplaced中分別添加以下代碼:private void axMapControl1_OnExtentUpdated(object sende

18、r, IMapControlEvents2_OnExtentUpdatedEvent e) / 得到新范圍 IEnvelope pEnvelope = (IEnvelope)e.newEnvelope; IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer; IActiveView pActiveView = pGraphicsContainer as IActiveView; /在繪制前,清除axMapControl2中的任何圖形元素 pGraphicsContainer.DeleteA

19、llElements(); IRectangleElement pRectangleEle = new RectangleElementClass(); IElement pElement = pRectangleEle as IElement; pElement.Geometry = pEnvelope; /設(shè)置鷹眼圖中的紅線框 IRgbColor pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 255; /產(chǎn)生一個(gè)線符號(hào)對(duì)象 IL

20、ineSymbol pOutline = new SimpleLineSymbolClass(); pOutline.Width = 3;的屬性 IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = pColor; pFillSymbol.Outline = pOutline; IFillShapeElement pFillShapeEle = pElement as IFillShapeElement; pFillShapeEle.Symbol = pFillSymbol; pGraphicsCo

21、ntainer.AddElement(IElement)pFillShapeEle, 0); pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) if (axMapControl1.LayerCount > 0) axMapControl2.Map = new MapClass();for (int

22、 i = 0; i <= axMapControl1.Map.LayerCount - 1; i+) axMapControl2.AddLayer(axMapControl1.get_Layer(i); axMapControl2.Extent = axMapControl1.Extent; axMapControl2.Refresh(); 步驟二:對(duì)于名稱為axMapControl2的MapControl控件,只需要在axMapControl2的OnMouseMove和OnMouseDown中分別添加以下代碼:private void axMapControl2_OnMouseMove

23、(object sender, IMapControlEvents2_OnMouseMoveEvent e) if (e.button = 1) IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); axMapControl1.CenterAt(pPoint); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); private void axMapControl2_OnMouseDow

24、n(object sender, IMapControlEvents2_OnMouseDownEvent e) if (axMapControl2.Map.LayerCount > 0) if (e.button = 1) IPoint pPoint = new PointClass();pPoint.PutCoords(e.mapX, e.mapY); axMapControl1.CenterAt(pPoint); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, nul

25、l); else if (e.button = 2) IEnvelope pEnv = axMapControl2.TrackRectangle(); axMapControl1.Extent = pEnv; axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 二、 顯示屬性表的信息我們知道ArcMap中的Table of Contents有很多功能,如下圖:而ArcGIS Engine提供的TOCControl控件幾乎沒(méi)有提供,那么這些都是需要自己開(kāi)發(fā)的,在這里我做

26、一個(gè)顯示屬性表的功能。分析:要顯示某一個(gè)圖層的屬性表,首先要將這個(gè)圖層選中,然后在另外一個(gè)Form中將選中的這個(gè)圖層的屬性信息進(jìn)行顯示。方法:添加一個(gè)上下文菜單,添加一個(gè)新的Form窗體,在這個(gè)新的窗體上添加GridView控件,并在TOCControl控件的OnMouseDown事件下添加如下代碼(pGlobalFeatureLayer是我定義的一個(gè)全局變量):private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent e) if (

27、axMapControl1.LayerCount > 0) esriTOCControlItem pItem = new esriTOCControlItem(); pGlobalFeatureLayer = new FeatureLayerClass(); IBasicMap pBasicMap = new MapClass(); object pOther = new object();object pIndex = new object(); axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pGlobalF

28、eatureLayer, ref pOther, ref pIndex); if (e.button = 2) context.Show(axTOCControl1, e.x, e.y); 在上下文菜單的打開(kāi)屬性表的Click事件中添加如下代碼: private void 打開(kāi)屬性表ToolStripMenuItem_Click(object sender, EventArgs e) FormTable Ft = new FormTable(pGlobalFeatureLayer as IFeatureLayer); Ft.Show(); 在新的窗體中添加一個(gè)將屬性表顯示到GridView控件

29、中的函數(shù),如下: public void Itable2Dtable() IFields pFields; pFields = pFeatureLayer.FeatureClass.Fields; dtGridView.ColumnCount = pFields.FieldCount; for (int i = 0; i < pFields.FieldCount;i+ ) string fldName = pFields.get_Field(i).Name; dtGridView.Columnsi.Name = fldName; dtGridView.Columnsi.ValueType

30、 = System.Type.GetType(ParseFieldType(pFields.get_Field(i).Type); IFeatureCursor pFeatureCursor;pFeatureCursor = pFeatureLayer.FeatureClass.Search(null, false); IFeature pFeature; pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) string fldValue = new stringpFields.FieldCount; for (i

31、nt i = 0; i < pFields.FieldCount; i+) string fldName; fldName = pFields.get_Field(i).Name; if (fldName=pFeatureLayer .FeatureClass .ShapeFieldName) fldValuei = Convert.ToString(pFeature.Shape.GeometryType); else fldValuei = Convert.ToString(pFeature.get_Value(i); dtGridView.Rows.Add(fldValue); pF

32、eature = pFeatureCursor.NextFeature(); 數(shù)據(jù)庫(kù)知識(shí):DB2、Informix、PostgreSQL數(shù)據(jù)庫(kù)打開(kāi)方式以及方法:1、 打開(kāi)個(gè)人數(shù)據(jù)庫(kù):public IWorkspace GetMDBWorkspace(String _pGDBName) IWorkspaceFactory pWsFac = new AccessWorkspaceFactoryClass(); IWorkspace pWs = pWsFac.OpenFromFile(_pGDBName,0);return pWs; 2、 打開(kāi)文件數(shù)據(jù)庫(kù):public IWorkspace GetF

33、GDBWorkspace(String _pGDBName) IWorkspaceFactory pWsFac = new FileGDBWorkspaceFactoryClass(); IWorkspace pWs = pWsFac.OpenFromFile(_pGDBName, 0); return pWs; 3、 打開(kāi)SDE數(shù)據(jù)庫(kù):打開(kāi)SDE數(shù)據(jù)庫(kù)我們使用的是Open方法,要用這個(gè)方法,我們就要對(duì)IPropertySet對(duì)象設(shè)置,要打開(kāi)SDE數(shù)據(jù)庫(kù),我們要獲取SDE數(shù)據(jù)庫(kù)的服務(wù)器地址,數(shù)據(jù)庫(kù)實(shí)例,數(shù)據(jù)庫(kù),用戶,密碼等參數(shù)。而IPropertySet就好比一個(gè)Key-Value的對(duì)象,用來(lái)

34、幫組我們?cè)O(shè)置這些,然后傳到Open方法中。public IWorkspace GetSDEWorkspace(String _pServerIP, String _pInstance, String _pUser, String _pPassword, String _pDatabase, String _pVersion) ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass(); pPropertySet.SetProperty("SERVER&

35、quot;, _pServerIP); pPropertySet.SetProperty("INSTANCE", _pInstance); pPropertySet.SetProperty("DATABASE", _pDatabase); pPropertySet.SetProperty("USER", _pUser); pPropertySet.SetProperty("PASSWORD", _pPassword); pPropertySet.SetProperty("VERSION", _p

36、Version); ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 workspaceFactory; workspaceFactory = (ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2)new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass(); return workspaceFactory.Open(pPropertySet, 0); 注意,打開(kāi)SDE數(shù)據(jù)庫(kù)需要用到ArcGIS Engine運(yùn)行時(shí)的企業(yè)級(jí)許可。(即此時(shí)的License需要特別設(shè)置ArcE

37、ngine的Lisence應(yīng)使用企業(yè)數(shù)據(jù)庫(kù)類型,在From1_Load事件中初始化lisence,不能使用lisence控件設(shè)置,否則提示沒(méi)有許可lisence。)具體的解決代碼如下:private void From1_Load(object sender,EventArg e)IAoInitialize pao=new AoInitializeClass();pao.Initialize(esriLisenceProductCode.esriLisenceProductCodeEngineGeoDB);4.4.2 獲取數(shù)據(jù)庫(kù)中的要素類 在ArcGIS Engine中,要得到某一個(gè)類,首要要

38、獲取工作空間,然后進(jìn)入工作空間再得到相應(yīng)的東西,也就是以下兩個(gè)步驟: l 獲取工作空間; l 獲取相應(yīng)的要素類。 我們定義一個(gè)函數(shù)用來(lái)獲取個(gè)人數(shù)據(jù)庫(kù)的路徑public string WsPath() string WsFileName="" OpenFileDialog OpenFile = new OpenFileDialog(); OpenFile.Filter = "個(gè)人數(shù)據(jù)庫(kù)(MDB)|*.mdb" DialogResult DialogR = OpenFile.ShowDialog(); if (DialogR = DialogResult.C

39、ancel) else WsFileName = OpenFile.FileName; return WsFileName; 要獲取要素類,首先獲取工作空間,然后對(duì)工作空間中的要素類進(jìn)行遍歷,代碼如下: private void button2_Click(object sender, EventArgs e) string WsName = WsPath(); if (WsName != "") IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass(); IWorkspace pWs = pWsFt.OpenF

40、romFile(WsName, 0); IEnumDataset pEDataset =pWs.get_Datasets(esriDatasetType.esriDTAny);IDataset pDataset = pEDataset.Next(); while (pDataset != null) if (pDataset.Type =esriDatasetType.esriDTFeatureClass) FeatureClassBox.Items.Add(pDataset.Name); /如果是數(shù)據(jù)集 else if (pDataset.Type = esriDatasetType.esr

41、iDTFeatureDataset) IEnumDataset pESubDataset = pDataset.Subsets; IDataset pSubDataset = pESubDataset.Next(); while (pSubDataset != null) FeatureClassBox.Items.Add(pSubDataset.Name);/ -這是從哪里來(lái)的?-pSubDataset = pESubDataset.Next(); pDataset = pEDataset.Next(); FeatureClassBox.Text = FeatureClassBox.Item

42、s0.ToString(); 判斷要素是否被編輯:ArcGIS Engine 提供了一個(gè)IDatasetEdit的接口用來(lái)判斷我們的數(shù)據(jù)是否處于編輯狀態(tài),該接口只有一個(gè)方法,如下:示例代碼如下:public bool ISEdit (IFeatureClass pFeatureClass) IDatasetEdit pDataEdit = pFeatureClass as IDatasetEdit; return pDataEdit.IsBeingEdited(); 如何刪除要素類:IFeatureWorkspace這個(gè)接口主要是用于管理基于矢量數(shù)據(jù)的,如表,要素類,要素?cái)?shù)據(jù)集等。要想刪除一個(gè)

43、要素類,那么必須先得到這個(gè)。,如要打開(kāi)一個(gè)名稱為PointTest的要素類,只需要在OpenFeatureClass中傳入這個(gè)要素類的名稱,代碼如下: IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass(); IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0); IFeatureWorkspace pFWs = pWs as IFeatureWorkspace; IFeatureClass pFClass = pFWs.OpenFeatureClass("PointTest&qu

44、ot;);如果是在ArcMap中,我們會(huì)切換到Catalog中然后進(jìn)入相應(yīng)的數(shù)據(jù)庫(kù),然后刪除相應(yīng)的要素類,這種操作會(huì)讓我們想到FeatureClas這個(gè)對(duì)象會(huì)提供刪除的方法,其實(shí)不然,這個(gè)刪除的方法是定義在Dataset這個(gè)對(duì)象中。 private void button1_Click(object sender, EventArgs e) string WsName = WsPath(); if( WsName !="") IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass(); IWorkspace pWs

45、 = pWsFt.OpenFromFile(WsName, 0); IFeatureWorkspace pFWs = pWs as IFeatureWorkspace; IFeatureClass pFClass = pFWs.OpenFeatureClass("PointTest");IDataset pDatset = pFClass as IDataset; pDatset.Delete(); 刪除前:刪除后:創(chuàng)建要素類創(chuàng)建要素類用到了IFeatureWorkspace.CreateFeatureClass方法。所需接口:IField,IFieldEdit,IFiel

46、ds,IFieldsEdit,IGeometryDef,IGeometryDefEdit接口(注意 在NET中,會(huì)遇到以“_2”結(jié)尾的屬性,這些屬性是可寫(xiě)的。)/定義一個(gè)幾何字段,類型為點(diǎn)類型 ISpatialReference pSpatialReference = axMapControl1.ActiveView.FocusMap.SpatialReference; IGeometryDefEdit pGeoDef = new GeometryDefClass(); IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit; pG

47、eoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; pGeoDefEdit.SpatialReference_2 = pSpatialReference;/定義一個(gè)字段集合對(duì)象 IFields pFields = new FieldsClass(); IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields; /定義單個(gè)的字段 IField pField = new FieldClass(); IFieldEdit pFieldEdit = (IFieldEdit)pField; pF

48、ieldEdit.Name_2 = "SHAPE" pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; pFieldsEdit.AddField(pField); pFieldEdit.GeometryDef_2 = pGeoDef; /定義單個(gè)的字段,并添加到字段集合中 pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = "STCD" pFieldEdit.Type_2 = esriF

49、ieldType.esriFieldTypeString; pFieldsEdit.AddField(pField); /定義單個(gè)的字段,并添加到字段集合中pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = "SLM10" pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; pFieldsEdit.AddField(pField); /定義單個(gè)的字段,并添加到字段集合中 pField = new FieldCl

50、ass(); pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = "SLM20" pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; pFieldsEdit.AddField(pField); /定義單個(gè)的字段,并添加到字段集合中 pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = "SLM40" pFieldEdit.Type_2 =

51、esriFieldType.esriFieldTypeString; pFieldsEdit.AddField(pField); IWorkspaceFactory pFtWsFct = new AccessWorkspaceFactory();IFeatureWorkspace pWs = pFtWsFct.OpenFromFile("E:arcgisEngines.mdb", 0) as IFeatureWorkspace;IFeatureClass pFtClass = pWs.CreateFeatureClass("Test", pFields,

52、 null, null, esriFeatureType.esriFTSimple, "SHAPE", null)/?如何改變字段的別名?public void ChangeFieldAliasName(ITable pTable, string pOriFieldName, string pDesFieldName) IClassSchemaEdit pClassSchemaEdit = (IClassSchemaEdit)pTable; /給對(duì)象加上鎖 ISchemaLock pSchemaLock = (ISchemaLock)pTable; pSchemaLock.

53、ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock); if (pTable.FindField(pOriFieldName) != -1) pClassSchemaEdit.AlterFieldAliasName(pOriFieldName, pDesFieldName); pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);使用IFeatureSelection接口高亮顯示在介紹IMap接口那一節(jié),我們用IMap的IMap.SelectFeature方

54、法實(shí)現(xiàn)了對(duì)查詢的要素高亮顯示,現(xiàn)在我們用IFeatureSelection接口實(shí)現(xiàn)查詢高亮顯示IMap pMap = axMapControl1.Map; IFeatureLayer pFeaturelayer = GetLayer(pMap, "Roads") as IFeatureLayer; IFeatureSelection pFeatureSelection = pFeaturelayer as IFeatureSelection; IQueryFilter pQuery = new QueryFilterClass(); pQuery.WhereClause =

55、 "TYPE=" +"'paved'" pFeatureSelection.SelectFeatures(pQuery,esriSelectionResultEnum.esriSelectionResultNew,false); axMapControl1.ActiveView.Refresh();其中GetLayer函數(shù)是我們寫(xiě)的一個(gè)根據(jù)圖層的名稱獲取圖層的方法,代碼如下private ILayer GetLayer(IMap pMap, string LayerName) IEnumLayer pEnunLayer; pEnunLay

56、er = pMap.get_Layers(null, false); pEnunLayer.Reset(); ILayer pRetureLayer; pRetureLayer = pEnunLayer.Next(); while (pRetureLayer != null) if (pRetureLayer.Name = LayerName) break; pRetureLayer = pEnunLayer.Next(); return pRetureLayer; 提問(wèn):以下三種方式的區(qū)別在哪里?axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);axMapControl1.ActiveView.Refresh();axMapControl1.Refresh();創(chuàng)建符合要求的表:public ITable CreateT

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論