在ArcEngine中创建带高程Z值的点和线图层
在ArcEngine中创建带高程Z值的点和线图层
管线和其附属物的坐标数据都是带有Z值的
而且有些情况下,一个管段的两个端点的x,y值一模一样(垂直的管段)
这样的线,在直接生成shape图层的时候,就会产生问题,特别是
使用ArcSDE的C API直接创建到表中的时候你会发现,这样的数据是生成不了的
解决的方法就是为图层添加Z值,一个图层是否带有高程值,可以在ArcMap中通过查看
图层的属性表得知,带有Z值的图元,在Shape字段中,其类型后面会有个ZM字样
比如point ZM,Polyline ZM
创建带高程Z值的图层时,只设置Point的Z属性是没有用的,默认情况下
ArcEngine会忽略Z值,
两步走,解决问题:
第一步:创建Shape图层,使用IFeatureWorkspace.CreateFeatureClass
此函数的第二个参数是IFields,字段定义,在字段定义中对Shape字段的类型
使用IGeometryDefEdit.HasZ_2 = true指定其包含Z值,
- 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
- 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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2020-03-15 ArcGIS Pro定制和开发-执行GP环境变量的设置
2018-03-15 洛伦兹变换
2018-03-15 世界史上最著名的十大思想实验