OsgGIS的project其實就是一個指令集.執行該指令集就可以從要素和柵格資料中編譯出OSG的3D幾何體.(對於開發人員而言,意味著使用osgGISProjects::Project類).可以通過xml檔案定義整個project 然後使用osggis_build命令列工具來編譯.
本文對project所使用的xml定義檔案做基本的解釋.
專案檔:
有兩種方式都可以建立一個項目:通過編程或者通過xml檔案.我們選擇使用xml檔案作為project檔案的架構是因為:1)xml便於人們閱讀和理解2)很多人都很熟悉xml檔案的文法格式3)已經存在大量的工具來讀寫和裝換xml資料.
project檔案類似於Makefile,它定義了一些列的構建目標和規則.下面是一個基本的project檔案:
view plaincopy
to clipboardprint?
- <?xml version="1.0" ?>
- <project name="sample">
-
- <!-- A layer is a primary build target: -->
- <layer name="roads" source="roads" target="out/roads.ive">
- <slice min_range="0" max_range="1e6" graph="roads"/>
- </layer>
-
- <!-- A source references a vector GIS source layer: -->
- <source name="roads">
- <uri>source/roads.shp</uri>
- </source>
-
- <!-- A filter graph defines the assembly pipeline for turning features into 3D geometry: -->
- <graph name="roads">
- <filter type="Transform">
- <property name="localize" value="true"/>
- </filter>
- <filter type="BuildGeom">
- <property name="color" value="vec4(1,.6,.4,1)"/>
- </filter>
- <filter type="Collect"/>
- <filter type="BuildNodes"/>
- </graph>
-
- </project>
<?xml version="1.0" ?><br /><project name="sample"></p><p> <!-- A layer is a primary build target: --><br /> <layer name="roads" source="roads" target="out/roads.ive"><br /> <slice min_range="0" max_range="1e6" graph="roads"/><br /> </layer></p><p> <!-- A source references a vector GIS source layer: --><br /> <source name="roads"><br /> <uri>source/roads.shp</uri><br /> </source></p><p> <!-- A filter graph defines the assembly pipeline for turning features into 3D geometry: --><br /> <graph name="roads"><br /> <filter type="Transform"><br /> <property name="localize" value="true"/><br /> </filter><br /> <filter type="BuildGeom"><br /> <property name="color" value="vec4(1,.6,.4,1)"/><br /> </filter><br /> <filter type="Collect"/><br /> <filter type="BuildNodes"/><br /> </graph></p><p></project><br />
所有的元素都定義在<project>下.其中<layer> <source>和<graph>分別定義了project中的不同的組件.下面我們來一一說明.
文法規則
下面是project檔案中的一些文法規則:
1.次序性:元素在xml檔案中出現的次序是不重要的。有更多元素通過name來引用其他元素.被引用的元素在xml檔案中的位置是不重要的.
2.獨特性:元素的name只要求在相同元素類型的所有元素中唯一.例如:每一個source元素的名字應該是所有的source中是唯一的.一個source和一個layer同名是可以的。
3.路徑分割符:在所有平台上,路徑分隔字元都是前斜線("/").
4.屬性名稱:在屬性名稱中連字號(-)和底線(_)是被認為是同一個字元.也就是說,use-terrain-srs和user_terrain_srs是同一個名稱.
包含檔案(include file)
project檔案有可能會很巨大而且很複雜,比如:
1.需要編譯好幾十個圖層
2.同一組資料來源(datasource)需要在不同的項目中共用
3.同一組資源檔需要在不同的項目中共用
可以通過include元素來合并project檔案.被include的檔案自己本身也需要有project元素.
下面是範例代碼:
view plaincopy
to clipboardprint?
- <project name="sample">
-
- <include>data/source.xml</include>
- <include>resources.xml</include>
-
- ...
- </project>
<project name="sample"></p><p> <include>data/source.xml</include><br /> <include>resources.xml</include></p><p> ...<br /></project><br />
include元素可以在文檔中的任何位置出現,和其它元素一樣,其位置不構成任何影響.
路徑和URI(Paths and URIs)
許多元素都會引用外部檔案,例如資料檔案或者其他需要include的專案檔.檔案的路徑可以是絕對路徑也可以是相對路徑。如果是相對路徑,那麼相對是指相對於包含此引用的專案檔自身的路徑.(應該是指直接包含) 下面是範例代碼:
view plaincopy
to clipboardprint?
- ...
- <source name="trees">
- <uri>c:/data/trees.shp</uri>
- </source>
-
- <source name="roads">
- <uri>source_data/roads.shp</uri>
- </source>
- ...
...<br /> <source name="trees"><br /> <uri>c:/data/trees.shp</uri><br /> </source> </p><p> <source name="roads"><br /> <uri>source_data/roads.shp</uri><br /> </source><br /> ...<br />
在樹元素(name="trees")中uri引用了一個絕對路徑.而在道路元素(name="roads")中,uri引用了一個相對路徑。這個相對路徑是相對於包含此source介面的專案檔的位置的.
Project Elements下面是project檔案中的主要元素
- <project> - 頂級元素
- <layer> - 編譯一個圖層的起點
- <graph> -將圖層組合為情境圖的管道
- <source> - 引用向量資料來源
- <terrain> - 引用地形資料來源
- <resource> - 引用外部的紋理、模型或者其他資源
- <include>? - 引用外部檔案
- <script>? - 嵌入式的Lua代碼
- <map> - 運行時地圖定義