首先编译好你的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>
显示结果就是一个有经纬线的球体