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

在ArcEngine中建立帶高程Z值的點和線圖層

管線和其附屬物的座標資料都是帶有Z值的

而且有些情況下,一個管段的兩個端點的x,y值一模一樣(垂直的管段)

這樣的線,在直接生成shape圖層的時候,就會產生問題,特別是

使用ArcSDE的C API直接建立到表中的時候你會發現,這樣的資料是生成不了的

解決的方法就是為圖層新增Z值,一個圖層是否帶有高程值,可以在ArcMap中通過檢視

圖層的屬性表得知,帶有Z值的圖元,在Shape欄位中,其型別後面會有個ZM字樣

比如point ZM,Polyline ZM

帶高程值的圖元Shape欄位顯示狀態

建立帶高程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後傳入這個函式,效果是立竿見影啊,立即搞定了,

囧的是,為了這個問題,午飯都沒吃