The Geometry has no Z values 解决办法
我们在ArcEngine开发过程中进行创建要素时,简单的IFeatureClass.CreateFeature之后,然后把IGeometry对象赋给Feature.shape,会引发“The Geometry has no Z values”的错误提示。类似的错误在做地图标注过程中也会出现。
/// 设置Z值和M值,解决The Geometry has no Z values错误
/// </summary>
/// <param name=”pF”>要素</param>
/// <param name=”pGeo”>几何</param>
public static void SetZValue(IFeature pF, IGeometry pGeo)
{
int index;
index = pF.Fields.FindField(“Shape”);
IGeometryDef pGeometryDef;
pGeometryDef = pF.Fields.get_Field(index).GeometryDef as IGeometryDef;
{
IZAware pZAware = (IZAware)pGeo;
pZAware.ZAware = true;
IZ iz1 = (IZ)pGeo;
iz1.SetConstantZ(0); //将Z值设置为0
//注意:在ArcEngine10.2中用下面的两行代码来设置
//IPoint point = (IPoint)pGeo;
// point.Z = 0;
}
else
{
IZAware pZAware = (IZAware)pGeo;
pZAware.ZAware = false;
}
//设置M值
if (pGeometryDef.HasM)
{
IMAware pMAware = (IMAware)pGeo;
pMAware.MAware = true;
}
else
{
IMAware pMAware = (IMAware)pGeo;
pMAware.MAware = false;
}
}//function
解决办法简单的就是用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值的,也是同样的道理
转载自:https://blog.csdn.net/u010212353/article/details/51509467