在ArcEngine中建立帶高程Z值的點和線圖層 在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;
原文地址:http://blog.csdn.net/nickwar/article/details/5752679
管線和其附屬物的座標資料都是帶有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;