王媛媛
(吉林省水利水電勘測設計研究院,吉林 長春 130012)
隨著GIS技術和計算機軟、硬件技術的快速發展和推廣,二維GIS應用已經不能滿足目前很多方面的應用需求。二維GIS只能提供給用戶平面的信息,而現實世界中,客觀事物總是存在于三維空間的[1],對于三維空間中客觀事物,用戶只能通過想象或者工作經驗來推斷。與二維GIS相比,三維GIS通過構建三維模型場景給用戶表現更真實的地理空間[2]。目前進行三維建模的作業流程是對場景模型進行逐一建模,業界通常使用的軟件有3DMax、SketchUp等軟件[3]。優點是軟件的用戶群體多、模型精確度較高;缺點是建模操作較繁瑣、工作量大。ESRI公司的CityEngine軟件最大的特點就是程序通過定義一系列的規則來驅動和約束三維場景的自動構建三維模型。這種技術改變了傳統建模的方式,大大減少了重復性勞動和人力的投入。
三維場景一般包含三維地形、影像、三維建筑物、道路、水系等要素。這些三維數據一般都是由二維的GIS數據經過三維技術處理獲得的[4]。三維地形數據即DEM數據,有TIN和Grid兩種格式;三維建筑物、道路和水系模型分別由二維的建筑物、道路、水系數據圖層添加DEM高程信息來獲取其三維數據進而創建三維模型。因此,在建模之前,需要收集場景區域的DEM、DOM、建筑物(面)、道路(面或線)、水系(面)等GIS數據。
使用ArcGIS工具將這些收集到的GIS數據進行處理,剔除錯誤、粗差并使之統一坐標系,編輯處理矢量數據的屬性,添加字段,使GIS數據包含建模所需的基本信息。
將GIS數據導入到CityEngine場景中,創建場景及規則文件,創建規則變量并映射到GIS數據的相應屬性,指定建模規則,應用規則文件批量構建場景內的三維模型,最后單獨編輯場景中特殊模型。這樣就完成了三維場景的批量建模工作,下面詳細分析該技術路線的設計與實現過程。
2.1.1 統一數據坐標系
收集到的場景區域的DEM、DOM、建筑物(面)、道路(面或線)、水系(面)等GIS數據,由于不一定是同源獲取的,所以經常會遇到數據的坐標系不統一的情況,雖然CityEngine軟件支持不同坐標系的數據在加載時自動進行數據投影,但是為了避免數據的投影變形,最好還是需要將所有的原始數據的坐標系進行統一。如果是同橢球不同投影帶坐標系之間的轉換,可以使用ARCGIS的坐標系投影工具將源坐標系投影到目標系;如果是不同橢球坐標系之間的轉換,可以收集或實測場景區的轉換參數,然后再使用ARCGIS的坐標系投影工具將源坐標系投影到目標系[5]。關于數據坐標系轉換的詳細說明本文中不作介紹。
2.1.2 二維GIS數據制作三維GIS數據
GIS數據包括空間數據和屬性數據,空間數據用來表達地理空間實體的位置、大小、形狀、方向以及幾何拓撲關系,屬性數據用來表達空間實體的空間屬性以外的其他屬性特征,屬性數據主要是對空間數據的補充說明。GIS數據通常以點、線、面要素來分類組織和管理。二維的GIS數據為了能更好地貼合到三維地形(即DEM)上,需要將二維的GIS數據轉換成三維GIS數據。

圖1 “2Dto3D面”GP工具架構圖
點要素:通過ArcToolbox的“Interpolate Shape”工具轉化為3D點要素。并在屬性字段中指定點要素的類型(如樹木、路燈桿等)、高度等基本信息。
線要素:如果是雙線道路,需要提取道路的中心線,然后再使用“Interpolate Shape”工具轉化為3D線要素。并在屬性字段中指定道路要素的寬度、車道數、路面材質(如瀝青、水泥、砂石等)等基本信息。同理,其他線要素也要在屬性中指定其必要的基本信息。
面要素:如果是雙線道路面,需要提取道路的中心線,將其轉化為線要素,再按上面線要素處理;如果是水系面,使用“面轉線”工具將面轉換為線要素[6],然后轉換為3D要素,再使用“要素轉面”工具轉化為3D面要素;如果是建筑物基座面,處理會較為復雜,可以制作一個GP模型工具[7],命名為“2Dto3D面”,其架構如圖1所示。運行該工具會輸出兩個要素類:“Building1_footprints3D”、“Building1_footprints3D_bufferline”。“Building1_footprints3D”是實際的3D建筑物基底面,其高程是建筑物基底面中心點在DEM上的投影高程,是一個平面;而“Building1_footprints3D_bufferline”是3D線要素,它的高程就是它在DEM上的插值高程,它將參與地形的編輯,使得建筑物基底面能更好地與地形貼合。編輯屬性字段添加建筑物的樓層數、層高、屋頂類型、墻面材質等基本信息。
2.1.3 DEM編輯
使用ArcGIS加載這些數據源,可以看到在場景中一些3D要素并不能很好的與地形貼合(比如建筑物的基底),所以接下來要做的就是將地形的局部區域進行編輯,使之與3D要素更好地貼合。以建筑物基底處理為例來進行說明。如果DEM數據是TIN格式,則直接使用“編輯TIN”工具加入上面生成的“Building1_footprints3D_bufferline”要素類即可。如果DEM數據是Grid格式,則只需將Grid格式轉換成TIN格式,再重復上步完成DEM編輯。
2.2.1 主體建模
目前進行三維建模一般都使用3DMax、SketchUp等軟件對場景模型進行逐一建模,以建筑物為例,很多建筑物的樣式基本是一樣的或者是類似的,按照目前的工作模式大大增加了重復性勞動。CityEngine最大的特點就是可以通過定義一系列的規則來驅動和約束三維場景中的模型的自動構建,進而達到批量自動建模的目的。
首先新建工程“CityEngine project”,新建場景“CityEngine scene”,命名該場景并設置該場景所使用的坐標系統為源數據的坐標系統。在場景中創建Terrain Layer加載DEM和DOM數據。然后在場景中導入三維GIS矢量數據及其屬性,這樣我們就能在后續的建模中通過映射實體屬性來動態控制模型的自動創建。創建一個新規則,當然也可以導入一個已有的規則,下面以建筑物為例來說明如何通過定制規則自動創建建筑物模型。
選中建筑物層上所有的幾何實體,通過鼠標右鍵工具“Assign Rule File…”引用到新建的規則文件,然后編寫規則,如圖2所示短短幾行代碼就可以自動生成所有的建筑物模型,建筑物高度為3m。當然還可以通過映射變量“height”到幾何實體的屬性,這樣就可以根據屬性值來生成不同高度的建筑物模型了[8]。

圖2 cga規則文件及局部效果

圖3 cag規則文件及局部效果圖
2.2.2 屋頂建模
由于建筑物的屋頂多樣化,考慮北方房屋多以平頂、雙坡頂、四坡頂為多,下面就以這幾類屋頂的建模規則定制進行詳細說明。
平頂:最簡單,建筑物默認屋頂即為平頂。也可使用roofShed[9]函數,傾角設置為0。
雙坡頂:需要comp(f)函數將頂面分割出,然后使用roofGable[9]函數,其可以包含1~5個參數,一般默認3個就可以了,坡頂的角度(單位:度)、x方向房檐延伸長度(單位:m)、y方向房檐延伸長度(單位:m)。
四坡頂:需要comp(f)函數將頂面分割出,然后使用roofHip[9]函數,其可以包含1~3個參數,一般默認2個就可以了,坡頂的角度(單位:度)、四周房檐延伸長度(單位:m)。
圖3即為映射實體屋頂的不同屬性值自動構建的房屋白模。
2.2.3 紋理貼圖
最后就是對模型的美化工程了,給模型貼上紋理圖案,使模型看起來更接近于真實世界中的建筑物。我們可以將DOM影像數據作為建筑物的屋頂貼圖,其他門、窗、墻壁材質貼圖可以實地拍照采集。門窗的紋理貼圖為同類型,如圖4中“Door”貼圖代碼所示。屋頂貼圖使用的是DOM影像,需要進行紋理的平移操作[10],如圖4中“Roof”貼圖所示,由于注釋比較詳細,在此就不在贅述了。
至此,建筑物的三維建模就已經完成了。使用規則創建模型的優勢是可以通過改變規則來輕松地修改模型,規則帶來了高效的同時,一點也沒有降低三維建模的靈活度。例如,你可以通過規則來自動創建大部分的建筑物,而其中的個別建筑物,你可以通過在該建筑物的Inspector屬性框中修改其屬性來更詳細控制建筑物模型的創建。
如果已經有一些三維模型,這些模型是使用其他建模軟件生成的,CityEngine可以很好的支持這些已有三維模型。如果模型帶有空間地理坐標,可以直接將這些模型文件拖入到CityEngine場景中,當然也可以使用菜單“File/Import”導入工具,使用指定類型的導入器將選中的模型導入到場景中。反之,如果模型沒有空間地理坐標信息,可以使用矢量輪廓面來為模型定位。

圖4 cag規則文件及局部效果圖
基于CityEngine規則建模技術,通過創建規則文件,既能靈活地利用二維GIS數據,尤其是其屬性數據,又能廣泛兼容地利用多種外部資源(如紋理、已有模型等)來批量創建出較高質量的模型,大大減少了創建三維場景的建模工作量,極大地提高工作效率。