Engine中如何把没有Z值的Gemetry转为有Z值的Geomtry:报错"the geometry has no Z values"


在用Feedback新建要素时,得到的要素没有Z值,如果数据源(图层要素)有Z值,则新建要素不成功, 报错"the geometry has no Z values"。可有用以下方法解决:
//先判断图层要素是否有Z值
 int index;
                index = pFeature.Fields.FindField("Shape");
                IGeometryDef pGeometryDef;
                pGeometryDef = pFeature.Fields.get_Field(index).GeometryDef  as IGeometryDef;

                IPointCollection  pPointCollection = pGeom as IPointCollection;
                if (pGeometryDef.HasZ)
                {                                     
                    IZAware pZAware = (IZAware)pGeom;
                    pZAware.ZAware = true;                  
                    IZ iz1 = (IZ)pGeom;
                    iz1.SetConstantZ(0); //将Z值设置为0
                }
                else
                {
                    IZAware pZAware = (IZAware)pGeom;
                    pZAware.ZAware = false;
                }
                if (pGeometryDef.HasM)
                {
                    IMAware pMAware = (IMAware)pGeom;
                    pMAware.MAware = true;                  
                }
                else
                {
                    IMAware pMAware = (IMAware)pGeom;
                    pMAware.MAware = false;
                }


(转)在把Geodatabase数据进行要素类间倒腾的时候,如果数据源是没有Z值的,但目标数据源是有Z值的,在进行set a.Shape =b.Shape的时候会出错。

解决办法简单的就是用FME进行转换,把没有要素类的数据源进行转换,默认的Z值都为零。这种方法的缺点就是麻烦。

在用Engine的借口进行转换行不行呢?可以。但是如果直接获得数据源的Geometry然后强行给它赋Z值(使用IZWare=True是不行的),而需要根据这个数据源的Geometry重新New 一个相应的Geometry,然后对每个节点进行赋Z值。

需要注意两个问题:在循环数据源的Geoemtry节点的时候需要注意临时变量需要为long,一般人喜欢dim i as integer,但是节点数据很多会大于3万哦:)

第二个需要注意的问题是:数据源的要素可能是多个部分组成,polyline可能有多个path,而polygon可能有多个ring,呵呵,好好再看看geometry 的Modal pdf文件哦,如果数据源只有一个part,遍历所有pointcollection的point赋Z值是可以的,如果有多个part,稍微有经验的人就知道,这样不行的。呵呵,要一个part一个part的搞哦。

在对要素切割的时候,如果要素是有Z值的,也是同样的道理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值