导航:首页 > 编程语言 > ae开发空间分析代码

ae开发空间分析代码

发布时间:2025-07-14 20:14:36

Ⅰ 如何编辑SDE数据

1. 打开 SDE 数据。 SDE 数据一定要使用工作空间工厂去初始化工作空间,在工作空间打开 FeatureClass,这是 最常规的操作。下面通过一段 C#代码连接 SDE,打开并返回一个 IWorkspace。 public IWorkspace FindWsByDefault() { IPropertySet propSet = new PropertySetClass(); propSet.SetProperty("Server", Lan); propSet.SetProperty("Instance", yangyang); propSet.SetProperty("Database", ""); propSet.SetProperty("User", user); propSet.SetProperty("Password", pwd); propSet.SetProperty("Version", version); IWorkspaceFactory factory = new SdeWorkspaceFactoryClass(); IWorkspace workspace = factory.Open(propSet, 0); return workspace; } 通过上述代码打开了 SDE 的工作空间,接下来要做的就是获取要编辑的 FeatureClass。写一 个函数,通过 FeatureClass 的别名和所在的 Dataset 返回 FeatureClass。做法是先遍历所有的 DataSet, 找到符合要求的 Dataset 之后遍历里面的要素, 返回与参与别名一致的 FeatureClass (顺便说一下,FeatureClass 在没有指定别名的时候默认与 FeatureClass 名称相同) //查找指定要素 public IFeatureClass FindClassByName(IWorkspace ws, string className, string dsName) { IEnumDataset enumDs; if (dsName != "") { enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureDataset); IFeatureDataset featureDs = enumDs.Next() as IFeatureDataset; while (featureDs != null) { if (featureDs.Name == dsName) { return GetFcFromDataset(featureDs, className); } featureDs = enumDs.Next() as IFeatureDataset; } } else { enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureClass); return GetFcFromEnumDataset(enumDs,className); } return null; } //在数据集中查找要素类 private IFeatureClass GetFcFromDataset(IFeatureDataset featDs, string className) { IFeatureClass featClass; IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer; for (int i = 0; i < fcContainer.ClassCount; i++) { featClass = fcContainer.get_Class(i); if (featClass.AliasName == className) { return featClass; } } return null; } //在要素类集合中查找要素类 private IFeatureClass GetFcFromEnumDataset(IEnumDataset enumDs, string className) { IFeatureClass featClass = enumDs.Next() as IFeatureClass; while (featClass != null) { if (featClass.AliasName == className) { return featClass; } featClass = enumDs.Next() as IFeatureClass; } return null; } //通过要素类名和数据集名在指定的工作空间中寻找要素类 public IFeatureClass FindClassByName(string className, string datasetName) { IWorkspace ws = FindWsByDefault(); IFeatureClass featClass = FindClassByName(ws, className, datasetName); return featClass; } 特别需要留意的是最后一个函数 FindClassByName(,,先是打开 SDE 的工作空间,在这 ) 个工作空间返回符合条件的要素集。通过这样的指向才能对 SDE 的 FeatureClass 进行写入 和删除的操作。 可以把上述代码写成一个静态类, 这样就可以很方便的通过数据集名称和要 数集别名指向要编辑的 FeatureClass 了。 值得一提的是, 很多新手都没有养成这种良好的习惯, 就是先打开工作空间再进行数据的编 辑 ,即便是使用 shp 文件或是 MDB 数据。他们习惯性的使用 MapControl 去加载 MXD 文 件,然后在 MapControl 通过 MapControl.get_layer(index)的方法去获取图层,然后将其转为 IFeatureLayer 或是 IFeatureClass 进行操作。 事实上,MXD 已经不用开发者写一句加载图层的代码就完成了对图层的加载,确实比较方 便。 但是它有很多看不见的操作没有表现出来, 加载完数据之后就把工作空间给自动关闭了。 对于 shp 文件和 MDB 数据,通过读取地图控件的图层是可以直接达到写入的目的,但一旦 有用户进行操作该图层文件就会被锁死,这就是不支持版本技术的表现。而 SDE 数据由于 存在版本(原理不多说了) ,因此有需要去确保数据的安全性和一致性,必须使用工作空间 的形式去打开。如果用读取 MapControl 图层的方法去获取 FeatureClass,实际上获取的是一 个没有打开的编辑操作的 FeatureClass,在 ESRI 的帮助文档里面我们不难发现它是只读的, 就像在 ArcMap 里面没有用 Editor 执行 startEdit 一样。 2. 编辑 SDE 数据 利用上述的方法获取了 FeatureClass 后就可以用常规的方式对其进行编辑,如 delete()和 CreateFeature(),或是更改属性值。但是仍然会出现无法编辑数据的现象,这种现象通常提 示没有足够的授权去编辑数据,这就涉及到 AE 对 SDE 数据编辑的授权,也就是 gdbedite 的授权(主要是在 AE9.2 里面) 。 关于 GDBEdite 的授权,懒羊羊已经在之前发过一份比较完整的文档,但还是在这里再归纳 一下。 ArcEngine9.2 在用户许可上做了很大的改动,应用程序是强制初始化许可,也就是说必须使 用 LicenseControl 或 AO 接口初始化许可, 否则应用程序无法启动。 Engine9.1 未采取强制初 始化许可策略,而是应用程序创建时就初始化标准 Engine 许可。在一般情况下,我们会用 将 LicenseControl 拖放到主窗体上完成初始化。但当 Engine 程序需要使用 ArcGIS Engine Enterprise Geodatabase(以下简称 GDB Update)许可的时候,我们就往往会由于意识不到应 该使用该许可,以及无法正确的初始化该许可而陷入麻烦。 对于许可这东西,首先要学会看软件产品的购货单。下表是一份关于 ArcEngine9.2 的购货 单。 下面对 GDB update 许可进行讨论 1. 什么情况下需要 GDB Update 许可 当需要对 SDE 里数据进行编辑时,以及需要在 SDE 和 Personal Geodatabase 中创建复杂 ArcGIS 对象时,需要使用 GDB Update 许可。 对 SDE 里的数据编辑,很好理解,大致就是进行数据插入,删除,更新;对表添加、删除 和修改,表结构的变化(添加、删除列)等,因为这些动作都会造成后台数据库的写操作。 对于 Personal Geodatabase,进行简单数据对象和编辑,包括创建、删除和修改普通表都是不 需要 GDB Update 许可的, 但对于复杂的 Geodatabse 对象的创建、 删除和修改, 则需要 GDB Update 许可,其中复杂的 Geodatabse 对象包括几何网络,网络分析模型,拓扑,关系类。 这也是为什么往往有写好了一个创建几何网络或拓扑的程序后,执行起来会被报“需要 Geodatabase Update 许可”的错。 2. 怎样初始化 GDB Update 许可 当我们意识到需要使用 Engine 的 GDB Update 许可时,怎样才能将它正确的初始化呢? Engine 给我们提供了两种初始化许可的方法: 1) 使用 LicenseControl 控件。将该控件拖放到主窗体之上,勾选适当的许可,并确保 程序启动该窗体可加载,就可以完成许可初始化。如下图: 2) 使用 IAoInitialize.Initialize 方法加入适当的参数进行初始化 下面是 C#的代码 private IAoInitialize m_AoInitialize = new AoInitializeClass(); private void Form1_Load(object sender, EventArgs e) { m_AoInitialize.Initialize(esriLicenseProctCode.esriLicenseProctCo deEngineGeoDB); } 在窗体加载的时候初始化 GDB 许可。 当然, 对于一个健壮的程序而言, 我们还需要在初始化之前先判断将被初始化的许可是否可 用,应先使用 IsProctCodeAvailable 方法进行判断,需要初始化扩展模块的许可,可使用 CheckOutExtension 方法。

阅读全文

与ae开发空间分析代码相关的资料

热点内容
淘宝动图代码 浏览:272
word文档2007怎么另存为 浏览:960
有多少组数据可以写文章 浏览:597
ecshop修改标题文件 浏览:166
复兴壹号是什么app 浏览:903
lolS7世界赛用什么版本 浏览:277
程序猿新闻 浏览:284
华为手机如何卸载app的震动 浏览:951
js仿淘宝详情页轮播图 浏览:51
文件复制到u盘空间变大 浏览:43
怎么打开加密的zip文件 浏览:421
自学编程怎么入门零基础 浏览:37
iphone日历在哪个文件夹 浏览:881
转发的聊天记录属于什么文件 浏览:13
jquery播放图片代码 浏览:598
哪个有网站 浏览:321
js计算数据量大小 浏览:762
苹果手机怎么把app图标改成图片 浏览:258
爰夫卡读数据不知保存在哪个地方 浏览:517
u盘启动克隆工具exe 浏览:770

友情链接