osgEarth支持.earth格式的文件,裏面保存了數字地球相關信息的配置XML,只須要讀取這個配置文件,就能夠直接獲得相應的數字地球相關效果。但實際使用中仍是感受到有些不便,有些效果沒辦法保存下來,因此不少時候仍是使用代碼實現比較好。osgEarth最基礎的就是顯示一個數字地球了。html
具體的實現代碼以下:ios
#include <Windows.h> #include <iostream> #include <string> #include <osgViewer/Viewer> #include <osgDB/ReadFile> #include <osgEarth/MapNode> #include <osgEarthDrivers/gdal/GDALOptions> #include <osgEarthDrivers/cache_filesystem/FileSystemCache> #include <osgEarth/ImageLayer> #include <osgEarthUtil/EarthManipulator> using namespace std; int main() { osgEarth::ProfileOptions profileOpts; //地圖配置:設置緩存目錄 osgEarth::Drivers::FileSystemCacheOptions cacheOpts; string cacheDir = "D:/Work/OSGNewBuild/tmp"; cacheOpts.rootPath() = cacheDir; // osgEarth::MapOptions mapOpts; mapOpts.cache() = cacheOpts; mapOpts.profile() = profileOpts; //建立地圖節點 osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map(mapOpts); osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(map); osgEarth::Drivers::GDALOptions gdal; gdal.url() = "D:/Work/OSGNewBuild/osgearth-2.10.1/data/world.tif"; osg::ref_ptr<osgEarth::ImageLayer> layer = new osgEarth::ImageLayer("BlueMarble", gdal); map->addLayer(layer); osgViewer::Viewer viewer; viewer.setSceneData(mapNode); osg::ref_ptr< osgEarth::Util::EarthManipulator> mainManipulator = new osgEarth::Util::EarthManipulator; viewer.setCameraManipulator(mainManipulator); viewer.setUpViewInWindow(100, 100, 800, 600); return viewer.run(); }
這裏有兩個點值得注意,其一是使用了緩存機制,能夠在瀏覽的時候變瀏覽邊生成緩存,因此設置了一個緩存目錄;其二是加載了一個底圖數據,是osgEarth中自帶的。運行的效果以下:web
除了顯示三維數字地球以外,osgEarth其實還能夠顯示成平面地圖,只須要設置具體的參數就能夠了。例如這裏顯示成web墨卡託投影的二維平面地圖:緩存
#include <Windows.h> #include <iostream> #include <string> #include <osgViewer/Viewer> #include <osgDB/ReadFile> #include <osgEarth/MapNode> #include <osgEarthDrivers/gdal/GDALOptions> #include <osgEarthDrivers/cache_filesystem/FileSystemCache> #include <osgEarth/ImageLayer> #include <osgEarthUtil/EarthManipulator> #include <gdal_priv.h> using namespace std; int main() { CPLSetConfigOption("GDAL_DATA", "D:/Work/OSGNewBuild/OpenSceneGraph-3.6.4/3rdParty/x64/gdal-data"); string wktString = "EPSG:3857"; //web墨卡託投影 //string wktString = "EPSG:4326"; //wgs84 osgEarth::ProfileOptions profileOpts; profileOpts.srsString() = wktString; //osgEarth::Bounds bs(535139, 3365107, 545139, 3375107); //osgEarth::Bounds bs(73, 3, 135, 53); //profileOpts.bounds() = bs; //地圖配置:設置緩存目錄 osgEarth::Drivers::FileSystemCacheOptions cacheOpts; string cacheDir = "D:/Work/OSGNewBuild/tmp"; cacheOpts.rootPath() = cacheDir; // osgEarth::MapOptions mapOpts; mapOpts.cache() = cacheOpts; mapOpts.coordSysType() = osgEarth::MapOptions::CSTYPE_PROJECTED; mapOpts.profile() = profileOpts; //建立地圖節點 osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map(mapOpts); osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(map); osgEarth::Drivers::GDALOptions gdal; gdal.url() = "D:/Work/OSGNewBuild/osgearth-2.10.1/data/world.tif"; osg::ref_ptr<osgEarth::ImageLayer> layer = new osgEarth::ImageLayer("BlueMarble", gdal); map->addLayer(layer); osgViewer::Viewer viewer; viewer.setSceneData(mapNode); osg::ref_ptr< osgEarth::Util::EarthManipulator> mainManipulator = new osgEarth::Util::EarthManipulator; viewer.setCameraManipulator(mainManipulator); viewer.setUpViewInWindow(100, 100, 800, 600); return viewer.run(); }
Web墨卡託投影平面座標系的EPSG代碼是3857,因此只須要直接傳入相應的代碼就好了。對於比較複雜或者自定義的座標系,其實也能夠直接傳入wkt字符串,由於osgEarth是經過GDAL來處理空間座標參考的,GDAL又是經過proj4來處理空間座標參考的,因此這個時候須要經過GDAL設置一下環境變量GDAL_DATA(具體能夠參見《GDAL座標轉換》)。ui
顯示的效果以下所示:
url
顯然,跟Web墨卡託投影的特性同樣,橢球被投影成了方形的平面地圖。spa