轉載自:http://blog.csdn.net/archielau/article/details/8472940
首先編譯好你的OSG、OSGEarth和第三方插件等,這裏有一個已經編譯好的VS2010+OSGEarth,
原文來自 http://bbs.osgchina.org/forum.php?mod=viewthread&tid=9555&extra=page%3D1
OSG3.1.4和osgEarth2.3 VC10編譯包
下載地址:
http://pan.baidu.com/share/link?shareid=107009&uk=2801833827
osg3.14和osgEarth2.3源代碼地址:
http://pan.baidu.com/share/link?shareid=97964&uk=2801833827
http://pan.baidu.com/share/link?shareid=97963&uk=2801833827
Highlights include:
* iOS 支持
* 實時陰影
* 默認使用Quadtree地形引擎,速度比之前的osgterrain更快,佔用內存更少,生成的地形邊緣更光滑。
* TFS (Tiled Feature Service) 矢量打包
* Boundary tool for stitched-in site models
* 圖像層色彩調整
* New GL/GLES shader generator
除了以上新功能,我對界面進行了簡單的漢化,並讓矢量標籤默認支持中文,如下圖:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
osgEarth目錄結構如圖
首先設置環境變量
OSG_ROOT爲osgearth文件所在目錄
OSG_ROOT X:\dir\OSG
OSG_FILE_PATH %OSG_ROOT%\data
OSG_WINDOW 600 15 800 800
Path %OSG_ROOT%\bin;
設置文件目錄屬性
Osgearth的一個主要目標是易於應用集成,實際上有2種方式去整合osgearth.
第一種方式你可以建立一個earth file,然後在你的應用程序中加載它.
第二種使用osgearth API的時候以編程方式動態建立一個地圖。
這裏我們使用第一種,使用OpenSceneGraph現有的插件來讀寫數據,不需要osgEarth的lib和頭文件,但是需要把dll拷貝到osg的bin目錄下面
1、首先配置相應的包含文件和庫文件目錄,添加相應的鏈接器
新建一項目,我命名爲consoleGlobe
附加依賴項爲,其中並沒有加入osgEarth相關
- OpenThreadsd.lib
- osgd.lib
- osgDBd.lib
- osgFXd.lib
- osgGAd.lib
- osgManipulatord.lib
- osgParticled.lib
- osgShadowd.lib
- osgSimd.lib
- osgTerraind.lib
- osgTextd.lib
- osgUtild.lib
- osgViewerd.lib
編寫代碼
- #include "stdafx.h"
- #include <osgViewer/viewer>
- #include <osg/Node>
- #include <osg/geode>
- #include <osg\group>
- #include <osgDB/readfile>
- #include <osgDB/writefile>
- #include <osgUtil\optimizer>
- int _tmain(int argc, _TCHAR* argv[])
- {
- osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer();
- osg::ref_ptr<osg::Group> root=new osg::Group();
- osg::ref_ptr<osg::Node> node=osgDB::readNodeFile("mymap.earth");
- root->addChild(node.get());
- osgUtil::Optimizer optimizer;
- optimizer.optimize(root.get());
- viewer->setSceneData(root.get());
- viewer->realize();
- viewer->run();
- return 0;
- }
mymap.earth是一個earth 文件,earth其實是文本格式的文件
內容如下
- <map name="MyMap" type="geocentric" version="2">
- <image name="bluemarble" driver="gdal">
- <url>world.tif</url>
- </image>
- </map>
其中world.tif使用的是相對路徑,也就是當前目錄,
在VS中調試狀態時當前目錄指項目目錄consoleGlobe下的consoleGlobe子目錄(個人認爲是consoleGlobe.vcxproj項目文件所在目錄),如圖所示,把文件放到此目錄下;
當程序單獨運行時,當前目錄指exe文件所在目錄也就是consoleGlobe.exe所在的Debug目錄或Release目錄,需要把相應文件拷貝到此。
對於上級目錄使用../
比如../../tests/mask.earth,tests在OSGEarth目錄下,與項目目錄consoleGlobe同一目錄,../../爲consoleGlobe.vcxproj所在目錄的上上級目錄。
結果如下
所以osgEarth開發一個很簡單的方式是建立一個earth file,然後在應用程序中加載它。
那麼首先來介紹下本文中earth文件的內容。
osgEarth File
osgEarth 使用一個基於XML的文件格式,被稱爲Earth File的文件來說明數據是怎樣加載進OSG的。
XML可擴展的標識語言XML(Extensible Markup Language)是一種元標註語言,即定義了用於定義其他特定領域有關語義的、結構化的標記語言,這些標記語言將文檔分成許多部件並對這些部件加以標識。
Earth File的核心作用是指明以下3點:
你創建的地圖類型(geocentric 或projected)
可使用的圖像、三面圖elevation、矢量和模型數據
你的數據緩存在哪裏
這是Earth File 文件庫,包含大量Earth files並告訴你如何使用它們:https://github.com/gwaldron/osgearth/tree/master/tests/
在本示例程序中,mymap.earth 從從WMS服務器讀取數據,並渲染在一個圓形地球的三維模型上。
- <map name="MyMap" type="geocentric" version="2">
- <image name="bluemarble" driver="gdal">
- <url>/data/world.tif</url>
- </image>
- </map>
map標籤
<map>指明這個文件建立了一個地圖
name屬性
可讀的地圖名稱,是一個可選屬性,這裏地圖的名稱是“MyMap”
type屬性
表明是geocentric類型
Osgearth能夠識別或者讀取2種方式的地圖:
Geocentric: 如果地圖類型屬性是地心的geocentric,圓形的round, 球體的globe 或者是地球 earth,那麼這個地圖就是以一個完整地球形狀的。請注意只有以地心爲座標的墨卡託模型才能被呈現成一個地心座標的球體。
Projected:如果地圖類型屬性是Projected或者是平面(flat)的,那麼這個地圖就是一個平面投影的樣子,這個類型的map在投影座標系統中是非常有用的,比如UTM。當然了墨卡託模型和整個地球也是可以用這種類型的map來表現的,比如2D製圖應用程序。
version屬性
是一個必選屬性,表明制定地球文件格式的版本. 使用osgEarth 2.x. 那版本號就是“2”
image標籤
圖像圖層。也是一個可選的。
name屬性
指定圖片的源名稱,這裏GeoTIFF圖片源名稱是“bluemarble”(GeoTiff是包含地理信息的一種Tiff格式的文件)。
driver屬性
圖像/高程圖層驅動器,驅動driver屬性告訴osgearth哪個驅動去加載這些圖片,所有子元素針對特定的驅動。這裏使用gdal。
GDAL 是Geospatial Data Abstraction Layer的縮寫。是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。
url標籤
統一資源定位符(URL,英語 Uniform / Universal Resource Locator 的縮寫)也被稱爲網頁地址,是因特網上標準的資源的地址(Address)。指明瞭數據來源,既可以是網絡地址也可以是本地地址,這裏用斜槓“/”表示目錄層級。
當然。earth file文件裏也可以不指名圖像
- <map name="empty" type="geocentric" version="2">
- </map>
顯示結果就是一個有經緯線的球體