AE 向已存在的要素类中添加字段

简介:

风过无痕 原文 向已存在的要素类中添加字段

 

以前,在用AE写程序的时候,为了方便,一般都是直接新建一个MapControl窗体应用程序。这次需要解决的问题用不到窗口,就突发奇想,直接新建了一个Console应用程序。然后,就按照以前的习惯引用了必要的命名空间,对其进行显式声明,直接开始写代码。可是,事后才发现其实这里隐藏着一个问题。后来,在调试的时候,发现运行到一处,就是下面的这段:

IWorkspace pWorkspace = pWSF.OpenFromFile(path, 0);
IFeatureWorkspace pFWS = pWorkspace as IFeatureWorkspace;
pFC = pFWS.OpenFeatureClass(file);

运行到这里的时候,程序会报HRESULT_0x80040228错误。起初的时候,我以为是打开featureclass的代码有误,于是就仔细的看了几遍,可是都没有发现哪里不对。无奈之下,上网Google了一下,才发现是License验证的问题。这才醒悟,以前都是利用的MapControl程序,License验证之类的工作,都是工程初始化的时候就完成了。这里是新建的一个Console程序,却忘了手动的来进行验证。问题发现了,解决的办法也就很简单了。在VS中,单击项目,选中Add ArcGIS Checking选项即可。

  做了以上的工作之后,代码继续的运行。在向featureclass中的某个字段进行赋值的时候,弹出错误窗口,调试程序发现是字段没有添加成功。我起初写的向要素类中添加字段的函数如下:

复制代码
static void AddFiled(IFeatureClass pFC,string name)
{

IFields pFields = pFC.Fields;
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = name;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
pFields.AddField(pField);

}
复制代码

看着,好像是没有错误。后来,查看了文档,才发现问题之所在。在向已存在的要素类中添加字段的时候,需要用到ICLASS接口。于是,进一步的调整代码如下,问题得以解决。

复制代码
static void AddFiled(IFeatureClass pFC,string name)
{
DeleteFile(pFC, name);
IFields pFields = pFC.Fields;
IClass pClass = pFC as IClass;
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = name;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
pClass.AddField(pField);
}
复制代码

 

除此之外,还碰到了一个印象比较深刻的问题,就是在几经尝试之后,终于确定了在AE中,要素类中的OID字段,无法获取。即像这样:

int i = Convert.ToInt32(pFeature.get_Value(pFeature.Fields.FindField(“OID”)));

以上代码,在AE中是通不过的。这样,我只好改变原始的想法,另外的在featureclass中添加了一新的tempID字段,用来生成包含空间关系的邻接矩阵。

 

总结:

  1)在写AE程序的时候,一定要进行License的验证。如果是WinForm程序,可以向窗口上拖放一个ArcGIS License控件;如果是Console程序,可以添加ArcGIS License Checking代码,实现的方式上面已经提及。

  2)在向已存在的要素类中添加新字段的时候,需要用到IClass接口。

  3)要素类中的OID字段,无法利用代码进行获取。

 

最近的几天,又在网上陆续的发现了好多示例代码,还是继续的使用着IFieldsEdit接口的AddField方法,以致使我都不由的怀疑起来,是不是我一直以来想的都不对。在此疑惑之下,才有了这次行动,来验证到底利用IFieldsEdit接口能不能成功的向已存在的FeatureClass中添加新的字段。

  一番行动下来,事实告诉我,我并没有错,利用IFieldsEdit接口中的方法确实不能向已存在的FeatureClass中添加新字段。但同时,我也发现了一个问题,苦思之下仍然无解,就趁此机会一并拿出和大家分享交流吧。

  说一下我所用的方法吧。很简单,我分别通过两种方法来添加字段,然后检查字段是否成功的添加。可是,就是在这个过程中,我也发现了一个我没有想明白的问题。这是后话,还是一步一步的说吧。

  首先,老规矩,贴出来我写的垃圾代码吧。

  1)通过IFieldsEdit接口的AddField方法的函数

复制代码
static void AddField_IFields(IFeatureClass pFC, string name)
{
IFields pFields = pFC.Fields;
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = name;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
pFieldsEdit.AddField(pField);
}
复制代码

 

2)通过IClass接口的AddField方法的函数

复制代码
static void AddField_IClass(IFeatureClass pFc, string name)
{
IFields pFields = pFc.Fields;
IClass pClass = pFc as IClass;
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = name;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
pClass.AddField(pField);
}
复制代码

 

准备工作做好后,我们就可以进行下一步的工作,向FeatureClass中添加字段,并查找其在属性表中的序号,来验证其是否添加成功。代码如下:

复制代码
static void Main(string[] args)
{
//ESRI License Initializer generated code.
m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeEngine },
new esriLicenseExtensionCode[] { });
string strFile = @"D:\Test\select.shp";
IFeatureClass pFC = ReturnFC(strFile);
string name1 = "ByIFields";
string name2 = "ByIClass";
AddField_IFields(pFC, name1);
AddField_IClass(pFC, name2);
int index_IFields = GetFieldIndex(pFC, name1);
int index_IClass = GetFieldIndex(pFC, name2);
Console.WriteLine("{0}字段的序号是:{1}",name1,index_IFields);
Console.WriteLine("{0}字段的序号是:{1}", name2,index_IClass);
Console.ReadKey();
}
复制代码

  貌似通过这两种方法,都成功的向FeatureClass中添加了字段,可以成功的查询到加入的字段在属性表中的序号。好,我们先暂且不管这个。继续的往下做。我们将添加字段的那两条语句注释掉,然后重新的运行一下程序。

  工作做到这里,我们就会发现问题了。在向FeatureClass中添加完字段后,如果立刻进行查找,我们就会得到我们想到的结果,那就是添加成功。而如果,我们什么都不做,重新的对添加进去的字段进行查找的时候,我们就会发现,通过IFieldsEdit接口的AddField方法并没有向FeatureClass中加入新字段。属性表也可以表明这一点。

  因此,结论如下:向已存在的FeatureClass中添加新字段,需要使用IClass接口的AddField方法,而如果使用IFieldsEdit接口的AddField方法并不能成功的添加。但是,为何在添加字段后接着进行验证,可以返回积极的结果,暂时我还不知道原因。可能咨询一下ESRI公司是个可能的途径,同时也希望知道的同学可以给我一些指导。

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6113322.html ,如需转载请自行联系原作者





相关文章
|
SQL 人工智能 自然语言处理
Copilot的优势
【2月更文挑战第13天】Copilot的优势
495 5
Copilot的优势
|
JavaScript 前端开发 算法
JavaScript 中的 if 判断:深入理解、实战应用与进阶技巧
【4月更文挑战第7天】探索 JavaScript 中的 if 判断语句,它是构建逻辑清晰程序的基础。了解其概念、语法、应用示例及编程技巧,包括条件控制、else if 结构、三目运算符。注意条件表达式简洁性,避免 falsy 值陷阱,利用逻辑运算符优化,并减少 if 嵌套。实践这些技巧将提升编程能力和代码质量。
680 0
|
5月前
|
Kubernetes 数据安全/隐私保护 容器
K8s中Flannel网络插件安装提示forbidden无权限的解决方法
总的来说,解决“forbidden无权限”的问题,需要从权限和配置两个方面来考虑。只有当用户或者服务账户有足够的权限,且Flannel的配置文件设置正确,才能成功地安装Flannel。希望这个解答能够帮助你解决问题。
261 13
|
7月前
|
数据挖掘 虚拟化
虚拟化数据恢复—VMware虚拟化环境下重装系统导致服务器崩溃的数据恢复
VMware虚拟化平台 vmfs文件系统 工作人员误操作重装操作系统,服务器崩溃。 重装系统会导致文件系统元文件被覆盖。要恢复数据,必须找到&提取重装系统前的文件系统残留信息,通过提取出来的元文件信息恢复虚拟磁盘。通过拼接虚拟磁盘来恢复服务器数据。
151 13
|
12月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
250 1
使用Netty实现文件传输的HTTP服务器和客户端
|
12月前
|
缓存 安全 前端开发
Electron on macOS: 揭秘 MacUpdater 如何实现无缝自动更新?
本文首发于微信公众号“前端徐徐”,详细探讨了 Electron 应用在 macOS 平台上的更新原理。文章分析了 `MacUpdater` 类的实现,包括与 Electron 原生更新器的集成、更新检测和下载、代理服务器管理、环境适配、安全性保障、错误处理和日志记录、更新安装流程控制以及缓存管理等关键功能。通过这些技术细节,展示了如何在 macOS 上实现高效、安全的 Electron 应用更新。
412 0
Electron on macOS: 揭秘 MacUpdater 如何实现无缝自动更新?
|
Linux SoC
Linux设备树(DTS)介绍
**设备树(DTS)是Linux中用于描述硬件信息的文本文件,旨在减少内核与平台相关代码的耦合。DTS文件包含静态硬件配置,不支持动态变更。它被编译成DTB二进制文件,供内核在启动时解析以了解硬件布局。设备树解决了ARM体系结构代码维护的复杂性问题,通过解耦实现vendor修改的独立和共二进制目标。设备树overlay允许对配置进行增量修改,遵循特定规则,如dts覆盖dtsi,先引用后修改。调试时,可使用内置工具反编译dtb或dtbo映像为dts文本以检查内容。**
901 7
|
监控 Java
【Java】已解决:Java.lang.OutOfMemoryError: GC overhead limit exceeded
【Java】已解决:Java.lang.OutOfMemoryError: GC overhead limit exceeded
3419 0
|
自然语言处理 API 语音技术
Python加百度语音API实现文字转语音功能
Python加百度语音API实现文字转语音功能
497 0
markdown编写数学公式
在计算机这一块,我们肯定会接触到数学,数学中又包含很多公式,但是到现在,手写这些公式应该不陌生,但是如果让你电脑敲出来,你绝对很懵逼,这也造成了我们有时候写笔记时一些公式没办法在电脑上像我们手写一样灵活,今天在这里分享给大家使用markdown描述公式的语法
601 1
markdown编写数学公式