geometry没有Z值或者geometryZ值为空解决方案

近日碰到在执行feature.shape=geo的操作时会报geometry没有z值(the geometry has no z values)以及geometry的z值为空(the geometry has no null values)的错误,这通常是因为使用的数据源是用其它软件导出的,默认是有z值的,但是arcgis默认是没有z值的,以致产生了矛盾。然而网上找的许多解决方案并不完善,因此优化后解决方案如下:

确保创建的字段是有z值的

///获取参考几何信息
 public static IGeometryDef GetGeometryDef(IFeatureClass featureClass)
 {
      var fieldName = featureClass.ShapeFieldName;
      var index = featureClass.FindField(fieldName);
      return featureClass.Fields.Field[index].GeometryDef;
  }
 ///创建字段
public IFields CreateFields(esriGeometryType type,IGeometryDef geometryDef)
 {
      IFields fields = new FieldsClass();
      var fieldsEdit = fields as IFieldsEdit;

      #region objectid

      IField field = new FieldClass();
      var fieldEdit = field as IFieldEdit;
      fieldEdit.Name_2 = "OBJECTID";
      fieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
      fieldEdit.IsNullable_2 = false;
      fieldEdit.Required_2 = false;
      fieldsEdit.AddField(field);

      #endregion

      #region Shape
      IField field_shp = new FieldClass();
      var fieldEdit_shp = field_shp as IFieldEdit;
      IGeometryDef geoDef = new GeometryDefClass();
      var geoDefEdit = (IGeometryDefEdit)geoDef;
      geoDefEdit.GeometryType_2 = type;
      geoDefEdit.GridCount_2 = geometryDef.GridCount;
      geoDefEdit.HasM_2 = geometryDef.HasM;
      //使图层具有Z值(无,则创建一个二维文件,不具备Z值)
      geoDefEdit.HasZ_2 = geometryDef.HasZ;
      geoDefEdit.SpatialReference_2 = geometryDef.SpatialReference;
      fieldEdit_shp.Name_2 = "SHAPE";
      fieldEdit_shp.Type_2 = esriFieldType.esriFieldTypeGeometry;
      fieldEdit_shp.GeometryDef_2 = geoDef;
      fieldEdit_shp.IsNullable_2 = true;
      fieldEdit_shp.Required_2 = true;
      fieldsEdit.AddField(field_shp);
      #endregion
      
      return fields;
  }

给几何设置z值

/// <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 = 0;
                 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;
         }
     }
 }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShirmyMao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值