在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值,
第二步:新增圖元,需要使用IZAware介面指定其ZAware為true
順便提一下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後傳入這個函式,效果是立竿見影啊,立即搞定了,
囧的是,為了這個問題,午飯都沒吃