arcengine 这个集合中找不到此项目

近期在ArcEngine开发过程中碰到很多“这个集合中找不到此项目”的错误,每次引发的原因都不一样,解决方案也有所不同,特做以下整理,若之后遇到其它情况和解决方案,将会不定时更新

1.Feature.Shape 几何赋值报错

原因:

  • 可能是一个有z值一个没有z值引起的
  • 也可能是新几何与图层坐标系不一致导致的,若z值的处理方法解决不了,则考虑坐标转换确保他们坐标系统一

z值问题解决方案如下:

方法1:

  • 给几何对象设置z值
public static IGeometryDef GetGeometryDef(IFeatureClass featureClass)
{
     var fieldName = featureClass.ShapeFieldName;
     var index = featureClass.FindField(fieldName);
     return featureClass.Fields.Field[index].GeometryDef;
 }
/// <summary>
/// 给几何信息设置z值
/// </summary>
/// <param name="geo"></param>
/// <param name="geometryDef"></param>
public static void SetZ(IGeometryDef geometryDef, ref IGeometry geo)
{
    if (geometryDef.HasZ)
    {
        IZAware zAware = geo as IZAware;
        zAware.ZAware = true;
        switch (geo.GeometryType)
        {
            case esriGeometryType.esriGeometryPoint:
                IPoint point = geo as IPoint;
                point.Z = point.Z is double.NaN ? 0 : point.Z;
                geo = point;
                break;
            case esriGeometryType.esriGeometryMultipoint:
                IPointCollection collection = geo as IPointCollection;
                for (int i = 0; i < collection.PointCount; i++)
                {
                    var p = collection.Point[i];
                    p.Z = 0;
                    collection.UpdatePoint(i, p);
                }
                geo = collection as IMultipoint;
                break;
            default:
                IZ iz = geo as IZ;
                if (iz != null)
                    iz.SetConstantZ(0);
                break;
        }
    }
}

方法2:

  • 去除图层的z值
IGeometryDefEdit geoDefEdit = geometryDef as IGeometryDefEdit;
geoDefEdit.HasZ_2 = false;

2.Feature.Store报错

原因:
var cursor=layer.Search(filter,true)
设置了recycling属性为true,若只是查询属性信息,没有问题,但是若是修改要素,由于被自动回收会报集合中找不到此项目的错误,改为false即可,如下所示:
在这里插入图片描述

3.layer.FeatureClass.CreateFeature()报该错误

一般这种情况是数据问题,你会发现即使直接在arcmap中创建要素也会报该错误,此时解决方案是图层右键——数据——导出数据,再次编辑你会发现没有该问题了。这可能是数据生产过程有什么bug
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用C# ArcObjects代码将一个图层的字段复制到另一个图层。下面是一个简单的示例代码: ```csharp //打开源图层和目标图层 IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactory(); IWorkspace workspace = workspaceFactory.OpenFromFile("C:\data.gdb", 0); IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace; IFeatureClass sourceFeatureClass = featureWorkspace.OpenFeatureClass("sourceClassName"); IFeatureClass targetFeatureClass = featureWorkspace.OpenFeatureClass("targetClassName"); //获取源图层的字段集合 IFields sourceFields = sourceFeatureClass.Fields; //遍历源图层的字段,并将其添加到目标图层 for (int i = 0; i < sourceFields.FieldCount; i++) { IField sourceField = sourceFields.get_Field(i); if (sourceField.Type != esriFieldType.esriFieldTypeGeometry && sourceField.Type != esriFieldType.esriFieldTypeOID) { IFieldEdit fieldEdit = new FieldClass(); fieldEdit.Name_2 = sourceField.Name; fieldEdit.Type_2 = sourceField.Type; fieldEdit.Length_2 = sourceField.Length; fieldEdit.Scale_2 = sourceField.Scale; fieldEdit.Precision_2 = sourceField.Precision; targetFeatureClass.AddField(fieldEdit as IField); } } ``` 在这个示例代码,我们首先打开源图层和目标图层。然后,我们获取源图层的字段集合,并遍历它们。对于每个字段,我们检查它是否为几何类型或对象ID类型。如果不是,我们使用源字段的信息创建一个新的字段,并将其添加到目标图层。这样,目标图层将具有与源图层相同的字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShirmyMao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值