查询时出错 An expected Field was not found or could not be retrieved properly. [SHAPE.AREA] 解决方法

        本来做的事情是将SDE中任意范围内的要素按查询条件导出到文件地理数据库,最初使用的是IFeatureDataConverter接口的ConvertFeatureClass方法,可是后来发现这个方法不支持注记要素类的导出,且会将其变成多边形要素。于是想到按几何查询条件将一个个要素写入到新建的要素类中,实现代码如下:

IFeatureClass targetFeatureClass = (targetWorkspace as IFeatureWorkspace).CreateFeatureClass(fcName,
                    sourceFeatureClass.Fields, null, null, sourceFeatureClass.FeatureType, "shape", "");
IFeatureCursor pFeatureCursor = sourceFeatureClass.Search(pSpatialFilter, false);
IFeature sFeature = pFeatureCursor.NextFeature();
while (sFeature != null)
{
     AddFeatureToFC(targetFeatureClass, sFeature);
     sFeature = pFeatureCursor.NextFeature();
}
Marshal.ReleaseComObject(pFeatureCursor);
        可是每当运行到

IFeatureCursor pFeatureCursor = sourceFeatureClass.Search(pSpatialFilter, false);
        时就会报错 An expected Field was not found or could not be retrieved properly. [SHAPE.AREA] ,有时候会报错Failed sending the dataset deleted notification to a workspace extension.  [Survey Database]。代码上的微调会导致出现不同的错误,至今还没搞明白是为什么。不过也发现,只有注记要素类才会发生这种错误,其他点线面要素类是不会发生的。

        搜索时,发现竹子也遇到了这个问题,原因应该是在创建数据库时引用了sourceFeatureClass.Fields,创建之后两者共用一套Fields,查询时会有冲突。实际上因为注记要素类和其他要素类不同,他是采用FDO(Feature Data Object)技术处理的,在FDO中有模式(Schema)这一概念,我的理解,是因为上述代码中的过程中,新旧两个要素类引用了相同的模式,至于为什么引用了相同的模式会出错,我就不得而知了。关于FDO的技术,可以参考博客GIS解决之道---深入FDO、AutoCAD Map 3D和MapGuide

        知道了原因,那就容易找到解决方案了,核心是在创建新要素类时不要引用原来的Fields,方法有两种:

        一种方法是用IClone克隆一个,代码如下

IClone clone = sourceFeatureClass.Fields as IClone;
IFields pFields = clone.Clone() as IFields;

        另一种方法是如竹子,自己新建Fields



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值