关于shape can,t have z values的问题解决方法
2018-01-13 11:53
274 查看
我碰到此问题是在做将“CAD数据导入到SDE数据库”时发现的,当时其主要原因是由于由于mutipatch数据形式的存在,问题已经解决,现拿出解决方法和大家分享。
这是我直接在项目中截取的一段代码,其中红色部分为解决的主要方法,大家可以举一反三,其中点、线、面的数据格式都是一样的,我试验过了~~~
管线和其附属物的坐标数据都是带有Z值的
而且有些情况下,一个管段的两个端点的x,y值一模一样(垂直的管段)
这样的线,在直接生成shape图层的时候,就会产生问题,特别是
使用ArcSDE的C API直接创建到表中的时候你会发现,这样的数据是生成不了的
解决的方法就是为图层添加Z值,一个图层是否带有高程值,可以在ArcMap中通过查看
图层的属性表得知,带有Z值的图元,在Shape字段中,其类型后面会有个ZM字样
比如point ZM,Polyline ZM
![](http://hi.csdn.net/attachment/201007/21/4846_12796944235aA5.png)
创建带高程Z值的图层时,只设置Point的Z属性是没有用的,默认情况下
ArcEngine会忽略Z值,
两步走,解决问题:
第一步:创建Shape图层,使用IFeatureWorkspace.CreateFeatureClass
此函数的第二个参数是IFields,字段定义,在字段定义中对Shape字段的类型
使用IGeometryDefEdit.HasZ_2 = true指定其包含Z值,
[c-sharp] view
plain copy
IGeometryDef pGeometryDef = new GeometryDef(); // 为esriFieldTypeGeometry类型的字段创建几何定义,包括类型和空间参照
IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
pGeometryDefEdit.GeometryType_2 = geometryType;
pGeometryDefEdit.HasZ_2 = true;//图层是有高程值的
pGeometryDefEdit.SpatialReference_2 = axmapcontrol.SpatialReference;
pFieldEdit.GeometryDef_2 = pGeometryDef;
第二步:添加图元,需要使用IZAware接口指定其ZAware为true
[c-sharp] view
plain copy
IPoint pFromPoint = new PointClass();
pFromPoint.PutCoords(fromX, fromY);
pFromPoint.Z = formZ;
IZAware fromZAware = pFromPoint as IZAware;
fromZAware.ZAware = true;
//IZ iFromZ = (IZ)pFromPoint;
IPoint pToPoint = new PointClass();
pToPoint.PutCoords(toX, toY);
pToPoint.Z = toZ;
IZAware toZAware = pToPoint as IZAware;
toZAware.ZAware = true;
//IZ iToZ = (IZ)pToPoint;
IPolyline pPolyline = new PolylineClass();
IZAware iPolylineAware = (IZAware)pPolyline;
iPolylineAware.ZAware = true;
pPolyline.FromPoint = pFromPoint;
pPolyline.ToPoint = pToPoint;
顺便提一下ArcSDE C API中的此种问题,
一开始我以为比较简单,使用SE_layerinfo_set_3D就能解决问题,
但老有几条记录导入不了,使用field calculator查看一下图元的Z值才发现,
高程都变成整数了,我可以确定传入的数据是double型的,但是调用
SE_shape_generate_point和SE_shape_generate_line之后,生成的数据就是高程为整数
查了查,网上有代码说使用SE_coordref_set_precision设置坐标为高精度的,
我在创建layerinfo和插入shape的时候都进行了设置,却没有任何效果,只好暂时作罢.
20100723更新:
上面高程精度丢失问题解决了,
本来以为很简单,直接生成shape再用ArcCatalog导入到ArcSDE中,
用的时候发现,有几个图层死活导入不了,
提示错误是 ORA-01426: numeric overflow ,
于是还是得写代码直接导入,今天折腾了将近一天,想法是用C++直接调用SDE的C API来做,试试看值传入的有没有问题,
搞到下午,折腾的差不多了的时候,突然发现这个函数SE_coordref_set_z_by_range
使用高程的最大值最小值加0.001后传入这个函数,效果是立竿见影啊,立即搞定了
IFeatureClass pLineFeatureClass = GetFeatureClassbyName(pLineFeatureName); IPolyline pPolyline = PointCollection as IPolyline; IFeature newLineFeature = pLineFeatureClass.CreateFeature(); try { newLineFeature.Shape = pPolyline; } catch { IGeometry pGeo = pPolyline; IZAware pZAware = pGeo as IZAware; pZAware.ZAware = false; newLineFeature.Shape = pGeo; } newLineFeature.Store();
这是我直接在项目中截取的一段代码,其中红色部分为解决的主要方法,大家可以举一反三,其中点、线、面的数据格式都是一样的,我试验过了~~~
管线和其附属物的坐标数据都是带有Z值的
而且有些情况下,一个管段的两个端点的x,y值一模一样(垂直的管段)
这样的线,在直接生成shape图层的时候,就会产生问题,特别是
使用ArcSDE的C API直接创建到表中的时候你会发现,这样的数据是生成不了的
解决的方法就是为图层添加Z值,一个图层是否带有高程值,可以在ArcMap中通过查看
图层的属性表得知,带有Z值的图元,在Shape字段中,其类型后面会有个ZM字样
比如point ZM,Polyline ZM
![](http://hi.csdn.net/attachment/201007/21/4846_12796944235aA5.png)
创建带高程Z值的图层时,只设置Point的Z属性是没有用的,默认情况下
ArcEngine会忽略Z值,
两步走,解决问题:
第一步:创建Shape图层,使用IFeatureWorkspace.CreateFeatureClass
此函数的第二个参数是IFields,字段定义,在字段定义中对Shape字段的类型
使用IGeometryDefEdit.HasZ_2 = true指定其包含Z值,
[c-sharp] view
plain copy
IGeometryDef pGeometryDef = new GeometryDef(); // 为esriFieldTypeGeometry类型的字段创建几何定义,包括类型和空间参照
IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
pGeometryDefEdit.GeometryType_2 = geometryType;
pGeometryDefEdit.HasZ_2 = true;//图层是有高程值的
pGeometryDefEdit.SpatialReference_2 = axmapcontrol.SpatialReference;
pFieldEdit.GeometryDef_2 = pGeometryDef;
第二步:添加图元,需要使用IZAware接口指定其ZAware为true
[c-sharp] view
plain copy
IPoint pFromPoint = new PointClass();
pFromPoint.PutCoords(fromX, fromY);
pFromPoint.Z = formZ;
IZAware fromZAware = pFromPoint as IZAware;
fromZAware.ZAware = true;
//IZ iFromZ = (IZ)pFromPoint;
IPoint pToPoint = new PointClass();
pToPoint.PutCoords(toX, toY);
pToPoint.Z = toZ;
IZAware toZAware = pToPoint as IZAware;
toZAware.ZAware = true;
//IZ iToZ = (IZ)pToPoint;
IPolyline pPolyline = new PolylineClass();
IZAware iPolylineAware = (IZAware)pPolyline;
iPolylineAware.ZAware = true;
pPolyline.FromPoint = pFromPoint;
pPolyline.ToPoint = pToPoint;
顺便提一下ArcSDE C API中的此种问题,
一开始我以为比较简单,使用SE_layerinfo_set_3D就能解决问题,
但老有几条记录导入不了,使用field calculator查看一下图元的Z值才发现,
高程都变成整数了,我可以确定传入的数据是double型的,但是调用
SE_shape_generate_point和SE_shape_generate_line之后,生成的数据就是高程为整数
查了查,网上有代码说使用SE_coordref_set_precision设置坐标为高精度的,
我在创建layerinfo和插入shape的时候都进行了设置,却没有任何效果,只好暂时作罢.
20100723更新:
上面高程精度丢失问题解决了,
本来以为很简单,直接生成shape再用ArcCatalog导入到ArcSDE中,
用的时候发现,有几个图层死活导入不了,
提示错误是 ORA-01426: numeric overflow ,
于是还是得写代码直接导入,今天折腾了将近一天,想法是用C++直接调用SDE的C API来做,试试看值传入的有没有问题,
搞到下午,折腾的差不多了的时候,突然发现这个函数SE_coordref_set_z_by_range
使用高程的最大值最小值加0.001后传入这个函数,效果是立竿见影啊,立即搞定了
相关文章推荐
- 关于shape can,t have z values的问题解决方法(原)
- 关于使用VS.Net2003调试器出现的问题及相关解决方法
- 关于DIV被SELECT遮挡问题的解决方法
- 关于数据库对象所有者非dbo时的可能造成的问题及解决方法
- 关于使用VS.Net2003调试器出现的问题及相关解决方法
- 关于使用VS.Net2003调试器出现的问题及相关解决方法 (转)
- 关于数据动态绑定问题的解决方法
- 关于RUNDLL32.exe占用大量CPU的问题以及解决方法
- 关于spoolsv.exe进程耗尽CPU资源问题的解决方法
- 关于水晶报表中CrystalDecisions.CrystalReports.Engine.LogOnException问题的解决方法
- 关于ISA2004内网卡网线拔插造成ISA代理失效问题的一种解决方法(下列错误而失败:0x80072
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- 关于二级域名Cookie的问题及解决方法
- 关于IE出现问题的解决方法
- 关于Eclipse RCP的两个小问题和解决方法
- 关于tomcat服务器优化,常遇到的一些简单问题的解决方法 (z)
- 关于DateTime在Pocket PC客户端不能正确存入数据库的问题及解决方法
- 关于IE出现问题的解决方法
- 碰上一个关于用户验证的问题,不知道您有没有解决方法