1、AE开发技术文档
一、数据加载问题 1、加载个人数据库
个人数据库是保存在Access中的数据库。加载方式有两种:通过名字和通过属性加载(也许不只是这两种,AE中实现同一功能可以有多种方式)
A、通过设置属性加载个人数据库
首先通过IPropertySet接口 定义要连接数据库的一些相关属性,在个人数据库中为数据库的路径,例如:
IPropertySet Propset= new PropertySetClass();
Propset.SetProperty(“DATABASE”,@”D:\\test\\Ao\\data\\sh\\Mapdata.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(\找到对应的地物类 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(\
IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass (); IFeatureWorkspace Workspace = Fact.Open(Propset,0) as IFeatureWorkspace;
IFeatureClass Fcls = Workspace.OpenFeatureClass (\ 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:\\test\\Ao\\data\\sh\\MapData.mdb”;
IName n=pWorkspaceName as IName;
IFeatureWorkspace Workspace= n.Open() as IFeatureWorkspace;
IFeatureClass Fcls = Workspace.OpenFeatureClass (\ 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:\\test\\Ao\\data\\sh\\MapData.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函数来添加地物。 public void AddPointByStore() {
//得到要添加地物的图层
IFeatureLayer l=MapCtr.Map.get_Layer(0) as IFeatureLayer; //定义一个地物类,把要编辑的图层转化为定义的地物类 IFeatureClass fc= l.FeatureClass;
//先定义一个编辑的工作空间,然后把它转化为数据集,最后转化为编辑工作空间,
IWorkspaceEdit w=(fc as IDataset).Workspace as IWorkspaceEdit; IFeature f; IPoint p; //开始事务操作
w.StartEditing(false); //////???????????????????????? //开始编辑
w.StartEditOperation(); for(int i=0;i<100;i++) {
//创建一个地物 f=fc.CreateFeature(); p=new PointClass(); //设置点的坐标 p.PutCoord(i,i); //确定图形类型 f.Shape=p; //保存地物 f.Store()