AE开发实例代码总结

上传人:Wo****B 文档编号:99912647 上传时间:2022-06-01 格式:DOC 页数:21 大小:38KB
返回 下载 相关 举报
AE开发实例代码总结_第1页
第1页 / 共21页
AE开发实例代码总结_第2页
第2页 / 共21页
AE开发实例代码总结_第3页
第3页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
AE开发实例代码总结1、AE开发技术文档 一、数据加载问题 1、加载个人数据库 个人数据库是保存在Access中的数据库。加载方式有两种:通过名字和通过属性加载也许不只是这两种,AE中实现同一功能可以有多种方式 A、通过设置属性加载个人数据库 首先通过IPropertySet接口 定义要连接数据库的一些相关属性,在个人数据库中为数据库的途径,例如: IPropertySet Propset= new PropertySetClass; Propset.SetProperty(“DATABASE”,”D:testAodatashMapdata.mdb”); 当定义完属性并设置属性后就可以进展翻开数据库的操作了,在ArcEngine开发中存在IWorkspaceFactory 、IFeatureWorkspace 、IFeatureClass 、IFeatureLayer等几个常用的用于翻开和操作数据空间地物的接口。IWorkspaceFactory 是一个用于创立和翻开工作空间的接口,它是一个抽象的接口,我们在详细应用时要用对应的工作空间实例化它,如下: IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass ; 假如我们翻开的是SDE 数据库就要用 SdeWorkspaceFactoryClass 实例化Fact。当我们完成了工作空间的实例化后就可以根据上边设置的属性翻开对应的Access 数据库了。翻开方式如下: IFeatureWorkspace Workspace = Fact.Open( Propset,0) as IFeatureWorkspace; 翻开Access 工作空间后接下来的事情是做什么了,很简单,找到对应的地物类,赋给相应的层,通过MapControl 控件添加对应的层,然后刷新地图。以下为添加某一层的代码: IFeatureClass Fcls = Workspace.OpenFeatureClass(“District“);/找到对应的地物类 IFeatureLayer Fly = new FeatureLayerClass;/建立新图层 Fly.FeatureClass = Fcls; /将地物赋给相应的层 MapCtr.Map.AddLayer (Fly);/添加层 MapCtr.ActiveView.Refresh;/刷新地图 其中District 为地物类的名字,MapCtr 为AE中MapControl 的对象。上边的通过属性设置加载数据空间的方式还可以用于SDE 数据库,在SDE 数据库加载时会介绍。 以下为通过设置属性加载Access 数据库的完好C#代码: public void AddAccessDBByPro IPropertySet Propset = new PropertySetClass; Propset.SetProperty(“DATABASE“,“D:testAodatashMapData.mdb“ ); IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass ; IFeatureWorkspace Workspace = Fact.Open(Propset,0) as IFeatureWorkspace; IFeatureClass Fcls = Workspace.OpenFeatureClass (“District“); IFeatureLayer Fly = new FeatureLayerClass; Fly.FeatureClass = Fcls; MapCtr.Map.AddLayer(Fly); MapCtr.ActiveView.Refresh; B、通过数据库名字加载个人数据库 public void AddAccessDBByName IworkspaceName pWorkspaceName = new WorkspaceNameClass;pWorkspaceName.WorkspaceFactoryProgID= “esriDataSourcesGDB.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.FeatureClass = Fcls; MapCtr.Map.AddLayer(Fly); MapCtr.ActiveView.Refresh; 首先创立一个个人数据库工作空间名,再指定工作空间名的ProgID,以确定翻开的是什么类型的工作空间,例如在翻开Access个人数据库时,使用下面代码; IworkspaceName pWorkspaceName = new WorkspaceNameClass;pWorkspaceName.WorkspaceFactoryProgID= “esriDataSourcesGDB.AccessWorkspaceFactory”; pWorkspaceName.PathName =“D:testAodatashMapData.mdb”; 属性WorkspaceFactoryProgID可以确保工作空间是AccessWorkspaceFactory,即个人数据库,同时要指定翻开数据库途径。为了翻开数据库,翻开工作空间必须使用IName接口考虑有没有其他方法,所以接着定义IName、对象,并把工作空间名转换成IName类型,并赋值给IName对象,然后通过IName对象的open方法翻开相应的工作空间,代码如下: IName n=pWorkspaceName as IName;IFeatureWorkspace Workspace= n.Open as IFeatureWorkspace; 2、AE开发编辑功能 数据编辑问题 1. 需要理解的概念 长事务 短事务 编辑空间 抽象类,类,和组件对象类 2、最根本的添加点线面功能 添加点方法有多种,根本思路一样,只是少量的接口有变化 通过FeatureClass的CreatFeature函数来添加地物。 /确定图形类型 f.Shape=p; /保存地物 f.Store /完毕编辑 w.StopEditOperation; /完毕事务操作 w.StopEditing(true); 二、添加线 方法跟添加点一样,不同的只是地物类型不一样而已, AE中各类库的介绍 1、 问题一:什么是UI组件? 2、 类库介绍 空间拓扑运算 1、高级几何对象:点point、多点multipoint、线polyline、面polygon、multipatch等。multipatch:多片,三维地形图中的地图符号包括点状符号、线状符号、面状符号、体状符号以及多片MultiPatch符号等 2、拓扑:空间拓扑描绘的事自然界地理对象的空间位置关系,即相邻、重合、连通等。是在同一个要素集下的要素类之间的关系的集合,所以要参与一个拓扑的所有要素类,必须在同一个要素集内也就是具有同一个空间参考,这样进展的拓扑检查才是准确的。 3、一个要素集可以有多个拓扑,但每个要素类最多只能参与一个拓扑,一个拓扑中可以定义多个规那么,是地理对象空间属性的一局部,在目前ESRI提供的数据存储方式中,Coverage和GeoDatabase可以建立拓扑,而Shape格式的数据不能建立拓扑。 4、 esriTRTAny 任何拓扑规那么,查询拓扑的时候用ESRI提供的拓扑关系 5、AE中提供了ITopologicalOperator接口用于拓扑运算,ITopologicalOperator接口用来通过对已存在的几何对象做空间拓扑运算,以产生新的集合对象。ITopologicalOperator接口在GIS开发中的使用非常广泛,通常GIS系统中的缓冲区分析p 、裁剪几何图形、几何图形差分操作、几何图形合并操作等都需要此接口。 Boundary 方法用于几何图形对象的边界。Polygon的几何对象的Boundary是组成它的Polyline几何对象,Polyline几何对象的Boundary是组成它的顶点Point几何对象,而Point的几何对象的Boundary是空对象。 Buffer 用于集合对象缓冲区分析p 拓扑操作,该方法用于给一个高级几何对象产生一个缓冲区,无论是Polygon、Polyline、还是Point,他们的缓冲区都是具有面积的几何对象。 Clip 用于对几何对象进展裁剪空间拓扑操作。Clip方法可用一个Envelope对象对一个几何对象进展裁剪,结果是几何对象被Envelope对象所包围的局部。 ConstructUion用于将多个枚举对象与单个几何对象合并为单个几何对象。 ConvexHull 用于构建几何对象的凸多边形。ConvexHull方法用于产生一个几何图形的最小的边框凸多边形没有凹面包含几何图形的最小多边形 Cut 用于切割几何对象,不支持GeometryBags几何对象,它可以指定一条切割曲线和一个几何图形,经过切割运算后把几何图形分为左右两局部,左右两局部是相对曲线的方向而言的。点与多点不可被分割。Polyline和Polygon只有与切割曲线相交时才能执行Cut方法。 Difference 用于从一个几何图形中减去其与另一个图形相交的局部,产生两个几何对象的差集。 Intersection方法用于两个同纬度几何对象的交集局部。 Simplify用于使几何对象拓扑一致。 SymmetricDifference对称差分可将两个几何图形的并集局部减去两个几何图形交集的局部。 开发实例 一、 鹰眼功能的实现: 分析p :鹰眼图的操作主要由以下几个动作,当在一个控件中挪动一幅图的时候另一控件中的图也发生变化,当在主控件中重新加载一幅图的时候,另外一个控件的图也发生相应的变化,同时我们在鸟瞰的控件中参加一红色边框,注意这个其实是一个面,只是填充的颜色是透明的而已。通过分析p 我们知道,我们要添加两个MapControl控件,名字分别是axMapControl1和axMapControl2,其中axMapControl1为主图,而axMapControl2为鸟瞰图。 方法:步骤一:对于名称为axMapControl1的MapControl控件,只需要在axMapControl1的OnExtentUpdated和OnMapReplaced中分别添加以下代码: 而ArcGIS Engine提供的TOCControl控件几乎没有提供,那么这些都是需要自己开发的,在这里我做一个显示属性表的功能。 分析p :要显示某一个图层的属性表,首先要将这个图层选中,然后在另外一个Form中将选中的这个图层的属性信息进展显示。 方法:添加一个上下文菜单,添加一个新的Form窗体,在这个新的窗体上添加GridView控件,并在TOCControl控件的OnMouseDown事件下添加如下代码pGlobalFeatureLayer是我定义的一个全局变量: private void 翻开属性表ToolStripMenuItem_Click(object sender, EventArgs e) FormTable Ft = new FormTable(pGlobalFeatureLayer as IFeatureLayer); Ft.Show; 在新的窗体中添加一个将属性表显示到GridView控件中的函数,如下: DB2、Informix、PostgreSQL 数据库翻开方式以及方法: 1、 翻开个人数据库: public IWorkspace GetMDBWorkspace(String _pGDBName) IWorkspaceFactory pWsFac = new AccessWorkspaceFactoryClass; IWorkspace pWs = pWsFac.OpenFromFile(_pGDBName,0); return pWs; 2、 翻开文件数据库: public IWorkspace GetFGDBWorkspace(String _pGDBName) IWorkspaceFactory pWsFac = new FileGDBWorkspaceFactoryClass; IWorkspace pWs = pWsFac.OpenFromFile(_pGDBName, 0); return pWs; 3、 翻开SDE数据库: 翻开SDE数据库我们使用的是Open方法,要用这个方法,我们就要对IPropertySet对象设置,要翻开SDE数据库,我们要获取SDE数据库的效劳器地址,数据库实例,数据库,用户,密码等参数。而IPropertySet就好比一个Key-Value的对象,用来帮组我们设置这些,然后传到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“, _pServerIP); pPropertySet.SetProperty(“INSTANCE“, _pInstance); pPropertySet.SetProperty(“DATABASE“, _pDatabase); pPropertySet.SetProperty(“USER“, _pUser); pPropertySet.SetProperty(“PASSWORD“, _pPassword); pPropertySet.SetProperty(“VERSION“, _pVersion); ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 workspaceFactory; workspaceFactory = (ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2)new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass; return workspaceFactory.Open(pPropertySet, 0); 注意,翻开SDE数据库需要用到ArcGIS Engine运行时的企业级答应。即此时的License需要特别设置ArcEngine的Lisence应使用企业数据库类型,在From1_Load事件中初始化lisence,不能使用lisence控件设置,否那么提示没有答应lisence。 详细的解决代码如下: private void From1_Load(object sender,EventArg e) IAoInitialize pao=new AoInitializeClass; pao.Initialize(esriLisenceProductCode.esriLisenceProductCodeEngineGeoDB); 4.4.2 获取数据库中的要素类 在ArcGIS Engine中,要得到某一个类,首要要获取工作空间,然后进入工作空间再得到相应的东西,也就是以下两个步骤: l 获取工作空间;l 获取相应的要素类。 private void button2_Click(object sender, EventArgs e) string WsName = WsPath; if (WsName != “) IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass; IWorkspace pWs = pWsFt.OpenFromFile(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); /假如是数据集 else if (pDataset.Type = esriDatasetType.esriDTFeatureDataset) IEnumDataset pESubDataset = pDataset.Subsets; IDataset pSubDataset = pESubDataset.Next; while (pSubDataset != null) FeatureClassBox.Items.Add(pSubDataset.Name);/ -这是从哪里来的?- pSubDataset = pESubDataset.Next; pDataset = pEDataset.Next; FeatureClassBox.Text = FeatureClassBox.Items0.ToString; 判断要素是否被编辑: ArcGIS Engine 提供了一个IDatasetEdit的接口用来判断我们的数据是否处于编辑状态,该接口只有一个方法,如下: 例如代码如下: public bool ISEdit (IFeatureClass pFeatureClass) IDatasetEdit pDataEdit = pFeatureClass as IDatasetEdit; return pDataEdit.IsBeingEdited; 如何删除要素类: IFeatureWorkspace这个接口主要是用于管理基于矢量数据的,如表,要素类,要素数据集等。 要想删除一个要素类,那么必须先得到这个。,如要翻开一个名称为PointTest的要素类,只需要在OpenFeatureClass中传入这个要素类的名称,代码如下: IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass; IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0); IFeatureWorkspace pFWs = pWs as IFeatureWorkspace; IFeatureClass pFClass = pFWs.OpenFeatureClass(“PointTest“); 假如是在ArcMap中,我们会切换到Catalog中然后进入相应的数据库,然后删除相应的要素类,这种操作会让我们想到FeatureClas这个对象会提供删除的方法,其实不然,这个删除的方法是定义在Dataset这个对象中。 private void button1_Click(object sender, EventArgs e) string WsName = WsPath; if( WsName !=“) IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass; IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0); IFeatureWorkspace pFWs = pWs as IFeatureWorkspace; IFeatureClass pFClass = pFWs.OpenFeatureClass(“PointTest“); IDataset pDatset = pFClass as IDataset; pDatset.Delete; 删除前: 删除后: 上面这个例子只是用了空间过滤,没有用到属性过滤,我们将上面的代码略微改动下,加上一句代码即可, 结果对照: 使用查询图层快速阅读: 我们可以按照以下步骤来执行一个QueryLayer。 Point是一个0维的几何图形,具有X,Y坐标值,以及一些可选的属性:如高程值(Z值),度量值(M值) M这个属性在线性参考和动态分段中经常用到和ID号,点对象用于描绘准确定位的对象。同时,点对象还可以有Z和M两个可选属性,。以下代码演示如何创立一个Point对象: / <summary / 获取点 / </summary / <param name=“x“</param / <param name=“y“</param / <returns</returns private IPoint ConstructPoint(double x, double y) IPoint pPoint = new PointClass; pPoint.PutCoords(x, y); return pPoint; MultiPoint对象是一系列无序的点的群集,这些点具有一样的属性信息。例如可以用一个点集来表示整个城市天然气调压站。如下列图所示:一个Multipoint对象由8个Point对象组成。 以下代码片段演示如何构建Multipoint对象: private object pMissing = Type.Missing; public IGeometry GetMultipointGeometry const double MultipointPointCount = 25; IPointCollection pPointCollection = new MultipointClass; for (int i = 0; i < MultipointPointCount; i+) pPointCollection.AddPoint(GetPoint, ref pMissing, ref pMissing); return pPointCollection as IGeometry; private IPoint GetPoint const double Min = -10; const double Max = 10; Random pRandom = new Random; double x = Min + (Max - Min) * pRandom.NextDouble; double y = Min + (Max - Min) * pRandom.NextDouble; return ConstructPoint(x, y); Segment对象 Segment对象是一个有起点和终点的“线“,也就是说Segement只有两个点,至于两点之间的线是直的,还是曲的,需要其余的参数定义。所以Segment是由起点,终点和参数三个方面决定的。Segment有4个子类,它的4个子类直线,圆弧,椭圆弧,贝赛尔曲线。 ISegment有两个很有用的方法如下列图: 这两个方法用于将该Segment进展分割成小的Segement Path几何对象 Path是连续的Segment的集合,除了途径的第一个Segment和最后一个Segment外其余的Segment的起始点都是前一个Segment的终止点,即Path对象的中的Segment不能出现别离,Path可以是任意数的Segment子类的组合。 该Path对象有很多我们经常用到的方法,如平滑曲线,对曲线抽稀等操作 Ring几何对象 Ring是一个封闭的Path即起始和终止点有一样的坐标值,它有内部和外部属性。 Polyline几何对象 Polyline对象是由一个或多个相连或者不相连的path对象的有序集合,通常用来代表线状地物如道路,河流,管线等等.该对象在ArcGIS Engine中的模型图如下: 这并不意味着用户必须按照这种层次去构造polyline,实际上Point集合直接构成Polyline,组成Polyline的这些途径既可以是连续的,也可以是不连续的。 Polyline是有序path组成的集合,可以拥有M、Z和ID属性值,Polyline对象的IPointCollection接口包含了所有的节点信息,IGeometryCollection接口可以获取polyline的paths,ISegmentCollection接口可以获取 polyline的segments。 一个Polyline对象必须满足以下准那么: 1.组成Polyline对象的所有Path对象必须是有效的。 2.组成Polyline对象的所有Path对象不能重合,相交或自相交。 3.组成Polyline对象的多个Path对象可以连接与某一点,也可以别离。 4.Path对象的长度不能为0. IPolyline是Polyline类的主要接口,IPolyline的Reshape方法可以使用一个Path对象为一个Polyline对象整形,IPolyline的SimplifyNetwork方法用于简化网络。 Polyline对象可以使用IGeometryCollection接口添加Path对象的方法来创立,使用该接口需注意以下情况: 1.每一个Path对象必须是有效的,或使用IPath:Simplify方法后有效。 2.由于Polyline是Path对象的有序集合,所以添加Path对象时必须注意顺序和方向。 3.为了保证Polyline是有效的,可以创立完Polyline对象后使用ITopologicalOperator接口的Simplify方法。 下面代码片段演示了一个Polyline的构成: private object pMissing = Type.Missing; public IGeometry GetPolylineGeometry const double PathCount = 3; const double PathVertexCount = 3; IGeometryCollection pGeometryCollection = new PolylineClass; for (int i = 0; i < PathCount; i+) IPointCollection pPointCollection = new PathClass; for (int j = 0; j < PathVertexCount; j+) pPointCollection.AddPoint(GetPoint, ref pMissing, ref pMissing); pGeometryCollection.AddGeometry(pPointCollection as IGeometry, ref pMissing, ref pMissing); return pGeometryCollection as IGeometry; private IPoint GetPoint const double Min = -10; const double Max = 10; Random random = new Random; double x = Min + (Max - Min) * random.NextDouble; double y = Min + (Max - Min) * random.NextDouble; return ConstructPoint(x, y); Segment,Path,Ring和Polyline的区别 在这四者当中Segment是最小的单位详细的构成道路可以分为两个条: Segment-Path-Ring封闭的Path Segment-Path-Polyline 我们可以这样说Segment是Path,只不过是这个Path由一个Segment组成,Ring也是一种Path,只不过是一个起点和终点重合的Path,至于Polyline那就很明显了,他们的区别可以从下列图看出: Polygon对象 Polylgon对象是由一个或多个Ring对象的有序集合,它可以是由单个Ring 对象构成,也可以使用多个Ring组成。Polygon通常用来代表有面积的多边形矢量对象,如行政区,建筑物等。Polygon的组成构造可以看下列图: Polygon对象实现了一个接口IArea,而该接口用来对Poylgon的中心,重心,以及面积进展访问,下面片段用来获取Polygoe的面积: IArea pArea = pPolygon as IArea; Double S= pArea. Area IGeometryCollection接口 通过IGeometryCollection创立一个Polygon对象的代码片段如下: 2、 GIS效劳器可以通过网络发布地理信息,它包括ArcGIS Server、ArcIMS和ArcSDE三种软件。ArcGIS Server,通常用于建构企业级别的互联网GIS应用 ;ArcIMS那么是一个可定制扩展的,可以在网络上发布地理信息的网络地图发布系统;ArcSDE是一个空间数据引擎,他可以用于管理关系数据库,以实现地理数据的海量存储等高级特性。 第 21 页 共 21 页
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!