1. 程式人生 > >關於單體化和屬性文件的說明

關於單體化和屬性文件的說明

坐標 字段 法向量 選中 兩個 情況下 模型 開始 open

關於單體化
單體化效果做出來也有段時間了,可能還是有些問題沒有講清楚,我們這裏再說下
單體化矢量的制作
單體化的原理就是一個通過矢量文件構造一個個封閉的幾何體去附著到被分類的對象(傾斜或者地形),所以第一步我們需要制作這樣的矢量。在GIS行業裏,最常見的矢量數據就是shp格式,而arggis的arcmap就是編輯shp的官方工具,所以我們下來展示如何用arcmap制作一個 大雁塔的分層示例。
第一步,先要用arcgis另一個工具arccatalog 新建一個 shp數據圖層
技術分享圖片
arccatalog新建矢量圖層
技術分享圖片
新建矢量圖層
註意這裏選polygon類型,也就是多邊形圖層。
設置為wgs84坐標系統

然後右鍵屬性

技術分享圖片
右鍵屬性
技術分享圖片
增加字段
我們這裏增加四個字段:
name,類型為text,這個用來記錄我們的 大雁塔級別的名稱
minheight,類型為float,用來記錄 這一層底面的絕對高程
maxheight,類型為float,用來記錄 這一層頂面的絕對高程
height,類型為float,用來記錄 這一層頂面相對底面的相對高度
也就是 height = maxheight - minheight
這裏其實 maxheight 和 height 二選一就可以了,只是在cesiumlab處理的時候有一個選項可以來設定頂面高度是否是絕對高程。
第二步,在arcmap裏繪制矢量面
在arcmap 裏把這個shp 和 底圖影像數據加進來
技術分享圖片
arcmap裏加載

註意我這裏的底圖數據是用的我們自定義的一個arcmap插件,它可以加載各種在線的底圖數據,這裏我加載的谷歌無偏移影像。當然對於專業做gis的公司,這都不是問題,要麽有自己的底圖影像數據,要麽是有類似的插件。(PS:我們的插件可以有償轉讓)。
我們拖拽定位到大雁塔附件
技術分享圖片
大雁塔附近
調出editor工具,點開始編輯
技術分享圖片
editor工具
技術分享圖片
create feature

使用右側的createfeature 工具,選擇 polygon工具
在圖上鼠標單擊勾多邊形
這裏註意兩個問題:1,單體化矢量面盡量大一些,只要不和旁邊的單體化矢量面相交就行,因為我們的傾斜數據,底圖數據本身都有誤差,如果太過緊湊,反倒不能完全包含傾斜數據,導致效果不好。2,單體化矢量面盡量簡單一些,也就是多邊形的頂點更少一些,越多的多邊形頂點,我們生成的封閉體越復雜,渲染效率越低。

我們來填寫下它的屬性
技術分享圖片
填寫屬性
技術分享圖片
矢量面屬性
minheight為什麽填寫了425 ? 這個高度值是我在lab裏預覽大雁塔傾斜的時候看到的
技術分享圖片
cesiumlab中查看點擊位置高度
lab裏點擊高度是425.68,我們填寫的425,因為這是最下面一層,我們可以向下增加一些余量。

maxheight為什麽填439? 同樣道理,這裏也是手工在lab裏點擊第一層最頂端看到的
技術分享圖片
第一層頂端高度
height的值就很好理解了,就是兩者的插值 = 439 - 425 = 14
第一層我們就設置完畢了。
第二層我們直接在arcmap裏選中第一層,然後ctrl+c,ctrl+v復制一個面就行了

技術分享圖片
第二層屬性

第二層屬性裏的幾個值
minheight當然等於第一層的maxheight
maxheight也是在lab裏預覽裏看到的
height = maxheight - minheight
其他層的就不做了,這兩個能說明問題就可以了。
註意編輯完成之後,editor工具欄裏選擇 stop editing
單體化矢量的處理
我們先做一個非單體化的處理效果
技術分享圖片
lab中處理

註意我們先在使用的 maxheight 和 minheight,因為maxheight是絕對高度,所以我們需要在其他選項裏,勾選絕對高度
技術分享圖片
默認處理效果
我們再試下,用height字段處理,這時候,不能選擇 絕對高度 選項
技術分享圖片
lab處理2
你麽可以驗證下,這兩種處理結果是一樣的。
下來我們做一個單體化效果處理
技術分享圖片
單體化處理

單體化處理的時候,一定要勾選 分類單體 選項,如果不能勾選,是因為免費登陸版不支持,請向我們申請測試授權。
技術分享圖片
單體化矢量效果

為什麽是黑色的,目前lab為了精簡單體化矢量的數據量,並沒有填充法向量,所以cesium默認效果就這樣的。
單體化效果的預覽
要測試單體化效果,需要把傾斜數據 和 單體化數據增加到一個場景裏(具體代碼請翻看以前關於單體化的文章裏介紹的)這裏只說一個快速的方法。
請確認cesiumlab正在運行,那麽打開如下網址
http://localhost:9000/demo/classification.html?url1={傾斜數據服務地址}&url2={單體化矢量服務地址}
比如在剛才我處理的就是這樣的

技術分享圖片
lab裏的服務地址

註意服務地址需要加上tileset.json
比如我機器完整的地址是這樣的
http://localhost:9000/demo/classification.html?url1=http://localhost:9002/api/folder/98b17b3012174607b07f0068a154889a/tileset.json&url2=http://localhost:9002/api/folder/bfc43dbf3b69446d8fb9147fa2503510/tileset.json
技術分享圖片
單體化預覽效果
關於屬性文件
cesiumlab的場景處理工具,默認情況下對於3dtiles只能附加兩個字段的屬性,一個是file,一個是name。
file是來自lab的任務處理界面上,每選定一個輸入文件,默認的file值就是文件名
技術分享圖片
file屬性
name屬性來自模型的節點(node)名稱,如果對模型格式不太了解的,那麽的卻是不知道這個node名在哪裏,最簡單的方式就是用max打開模型,在左側會列出節點名稱。
技術分享圖片
max中的node名稱

如圖,我們這個示例場景裏有兩個node,一個叫Box001,一個叫GeoSphere001

3d max中 應該註意的問題
對於這樣一個max場景,我們的處理工具其實是支持很多種格式導出,比如fbx,dae,obj等等。我一直在說推薦大家使用dae,原因在於dae是標準交換格式,它能保存完整的場景結構,不會隨便去合並對象。
但是對於dae導出有兩個插件,一個是max自帶autodesk collada,一個是opencollada
技術分享圖片
dae導出插件
前者的缺點是:導出巨慢無比,而且對於一些較大場景導出會失敗
後者的缺點是:無法保留正確的場景結構圖,尤其是左側的node name

但是為了綁定正確的屬性,我們必須使用前者導出。
我們先導出一個dae,使用默認參數在cesiumlab中處理一下
技術分享圖片
lab中效果

可見左側場景結構是正確的。
右側的屬性面板也是正確的,存儲了file和name屬性。
至於lab裏看到不透明,這個需要解釋下,我用的這張圖片是png格式,帶透明通道的,但是3ds max裏它默認不會使用透明通道。所以效果不同。
屬性文件的格式
對於其他額外屬性,我們可以通過屬性文件的方式綁定到lab裏,因為這個沒有經過太多測試,而且它不僅僅是對文件屬性綁定,而且還支持對模型的位置重新調整,擔心引起更多麻煩,一直沒有過多解釋。
屬性文件實際是支持兩種格式,一種csv,一種shp
對於專業gis用戶,shp格式多一些,對於普通用戶可能csv更方便一些,下來我們以csv為例來說明
追加屬性字段
使用excel編輯一個如下的文件,註意第一行為字段名稱,不可以設置為中文
技術分享圖片
excel屬性文件

name 字段的兩個值,就是我們剛才在max文件裏看到的兩個節點的名稱
其他字段都是我們想附加的屬性(不要問我一般有什麽附加字段,這個根據你需要啊),這裏我做測試,隨便加了兩個,一個表示朝向(chaoxiang),一個表示面積(mianji)

保存為utf8編碼的csv
技術分享圖片
保存為utf8編碼的csv

對於剛才的max模型,我們再來處理一下

輸入裏選擇我們剛才導出的dae
屬性文件裏選擇我們的屬性文件

技術分享圖片
選擇屬性文件
正確解析後,lab界面上會顯示額外的一些信息
2個對象,表示這個屬性文件只有兩條記錄
漢字編碼,這個一般不用選擇
名稱字段,這個就是我們需要和 dae(或者max左側列表)中的 node name去映射的字段
其他三個字段後面說
技術分享圖片
追加的屬性字段
可見屬性已經被追加到 name 對應的模型上去了
有了這些屬性,我們就能利用cesium的3d tiles style 對它進行分析,比如我們把面積大於 1000的對象改為紅色
技術分享圖片
屬性分析
通過屬性字段調整模型位置
我們再來修改下excel文件,如下圖所示
技術分享圖片
增加位置字段

增加了三個字段 longitude,latitude,altitude,很明顯這就是經度緯度高度
我們希望通過這三個字段來把 name 對應的模型放置到這個位置

我們再來lab裏處理一下
技術分享圖片
lab裏設置經緯高字段
這回我們再預覽的時候,默認視角看不到東西,因為兩個對象相隔甚遠
點擊左側場景樹,快速定位,可以看到這個模型已經放到設置的位置了
技術分享圖片
lab裏預覽結果
其他該註意的地方
由於csv的格式裏沒有所謂字段類型,但是對於經緯度三個字段必須為float類型的,也就是說,如果excel這麽寫,可能導致lab無法識別該字段為float,也就不能選擇為經緯度字段

技術分享圖片
不可識別的經緯度字段

其次我們是通過 每個對象AABB包圍盒的 下中心 來 映射設置的這個經緯度的。另外通過屬性文件的這個映射優先級要高於 lab對於輸入文件的裏的 位置選項。 也就是如果某個 node 能在屬性 文件裏找到 經緯度位置,就不會使用 輸入文件的位置選項 去計算。
後記
再次感謝大家對CesiumLab的喜愛和支持,希望Lab能和你一起成長
技術分享圖片

關於單體化和屬性文件的說明