1. 程式人生 > 其它 >在ArcEngine中建立帶高程Z值的點和線圖層 在ArcEngine中建立帶高程Z值的點和線圖層

在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值,

 

  1. IGeometryDef pGeometryDef = new GeometryDef(); // 為esriFieldTypeGeometry型別的欄位建立幾何定義,包括型別和空間參照   
  2.                     IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;  
  3.                     pGeometryDefEdit.GeometryType_2 = geometryType;  
  4.                     pGeometryDefEdit.HasZ_2 = true;//圖層是有高程值的  
  5.                     pGeometryDefEdit.SpatialReference_2 = axmapcontrol.SpatialReference;                      
  6.                     pFieldEdit.GeometryDef_2 = pGeometryDef;  
 

 

 

第二步:新增圖元,需要使用IZAware介面指定其ZAware為true

 

  1. IPoint pFromPoint = new PointClass();  
  2. pFromPoint.PutCoords(fromX, fromY);                                                             
  3.                                 pFromPoint.Z = formZ;  
  4.                                 IZAware fromZAware = pFromPoint as IZAware;  
  5.                                 fromZAware.ZAware = true;  
  6.                                 //IZ iFromZ = (IZ)pFromPoint;  
  7.                                 IPoint pToPoint = new PointClass();  
  8.                                 pToPoint.PutCoords(toX, toY);                                  
  9.                                 pToPoint.Z = toZ;  
  10.                                 IZAware toZAware = pToPoint as IZAware;  
  11.                                 toZAware.ZAware = true;  
  12.                                 //IZ iToZ = (IZ)pToPoint;  
  13.                                   
  14.                                   
  15.                                 IPolyline pPolyline = new PolylineClass();  
  16.                                 IZAware iPolylineAware = (IZAware)pPolyline;  
  17.                                 iPolylineAware.ZAware = true;  
  18.                                 pPolyline.FromPoint = pFromPoint;  
  19.                                 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值,

 

  1. IGeometryDef pGeometryDef = new GeometryDef(); // 為esriFieldTypeGeometry型別的欄位建立幾何定義,包括型別和空間參照   
  2.                     IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;  
  3.                     pGeometryDefEdit.GeometryType_2 = geometryType;  
  4.                     pGeometryDefEdit.HasZ_2 = true;//圖層是有高程值的  
  5.                     pGeometryDefEdit.SpatialReference_2 = axmapcontrol.SpatialReference;                      
  6.                     pFieldEdit.GeometryDef_2 = pGeometryDef;  
 

 

 

第二步:新增圖元,需要使用IZAware介面指定其ZAware為true

 

  1. IPoint pFromPoint = new PointClass();  
  2. pFromPoint.PutCoords(fromX, fromY);                                                             
  3.                                 pFromPoint.Z = formZ;  
  4.                                 IZAware fromZAware = pFromPoint as IZAware;  
  5.                                 fromZAware.ZAware = true;  
  6.                                 //IZ iFromZ = (IZ)pFromPoint;  
  7.                                 IPoint pToPoint = new PointClass();  
  8.                                 pToPoint.PutCoords(toX, toY);                                  
  9.                                 pToPoint.Z = toZ;  
  10.                                 IZAware toZAware = pToPoint as IZAware;  
  11.                                 toZAware.ZAware = true;  
  12.                                 //IZ iToZ = (IZ)pToPoint;  
  13.                                   
  14.                                   
  15.                                 IPolyline pPolyline = new PolylineClass();  
  16.                                 IZAware iPolylineAware = (IZAware)pPolyline;  
  17.                                 iPolylineAware.ZAware = true;  
  18.                                 pPolyline.FromPoint = pFromPoint;  
  19.                                 pPolyline.ToPoint = pToPoint;  
 

 

 原文地址:http://blog.csdn.net/nickwar/article/details/5752679