• OSGEARTH三维地形开源项目


    第一章   OSGEarth介绍

    第二章   OSGEarth编译环境配置

    OSGEarth的编译环境配置随着版本的不同、运行平台的不同,也有很大的差异。本章主要以Windows XP SP3(x86)为平台,Visual Studio 2010 为编译环境来介绍OSGEarth2.0的变异环境配置。

    第一节  OSGEarth V2.0相关资源

    OSGEarth的相关资源可以通过其官方网站(http://www.osgearth.org/wiki/Downloads)获取(所有资源文件均在关盘的source文件夹中)主要资源说明和网址如下表:

    资源名称

    版本要求

    推荐下载

    OpenSceneGraph

    V2.8.0以上

    http://www.openscenegraph.org/downloads/stable_releases/OpenSceneGraph-3.0/source/OpenSceneGraph-3.0.0.zip

    GDAL

    V1.6以上

    http://download.osgeo.org/gdal/gdal181.zip

    http://download.osgeo.org/gdal/gdal-1.8.1.tar.gz

    CURL

    V7.21以上

    http://curl.haxx.se/download/curl-7.22.0.zip

    GEOS

    V3.2以上

    http://download.osgeo.org/geos/geos-3.3.1.tar.bz2

    SQLite

    V3.2以上

    源文件:http://www.sqlite.org/sqlite-amalgamation-3070900.zip

    Dll:http://www.sqlite.org/sqlite-dll-win32-x86-3070900.zip

    MiniZip

    V1.0以上

    头文件:http://www.winimage.com/zLibDll/unzip101h.zip

    源代码:http://www.winimage.com/zLibDll/zlib125.zip

    Dll文件:http://www.winimage.com/zLibDll/zlib125dll.zip

    Expat

    V2.0.1以上

    code:http://sourceforge.net/projects/expat/

    exe:http://files.cnblogs.com/eaglezhao/expat-win32bin-2.0.1.rar

    OSGEarth

    V2.0

    git://github.com/gwaldron/osgearth.git

    OSGEarth源代码使用tortoisegit软件存放,因此需要下载并安装:1.安装 Git-1.7.0.2-preview20100309.exe

    (http://msysgit.googlecode.com/files/Git-1.7.0.2-preview20100309.exe)

     2.安装ortoiseGit-1.7.4.0-32bit.msi

    (http://tortoisegit.googlecode.com/files/TortoiseGit-1.7.4.0-32bit.msi)

    安装过程中可能还需要其他的资源或者程序支持,具体在安装过程进行说明。

    第二节  Open Scene Graph安装与配置

    为了提高OSGEarth在编译过程中执行速度,降低计算机硬件要求,因此选用windows XP SP3作为测试系统平台,vs2010作为windows平台下最新的编译软件,具有windows平台的兼容性考虑,编译出来的EXE文件可以顺利的部署在vista,win7上。

    2.1  CMake介绍与安装

    CMake 是个跨平台的自动化建构系统,它用组态档控制建构过程(build process)的方式和 Unix 的 Make 相似,只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。CMake 可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支援 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支援静态与动态程式库的建构。

    支持VS2010的CMake版本为v2.8以上,本书选择V2.8.4。下载地址:

    http://ishare.iask.sina.com.cn/f/14399926.html或者http://www.cmake.org/

    关于的cmake的具体用法请参看

    http://techbase.kde.org/Development/Tutorials/CMake_(zh_CN)

    或者

    http://www.cmake.org/Wiki/CMake

    下载完成后安装,在安装选项的位置选择:

    其他可选择默认安装。

    2.2  Open Scene Graph介绍

    Open Scene Graph(简称OSG)使用OpenGL技术开发,是一套基于C++平台的应用程序接口(API),它让程序员能够更加快速、便捷地创建高性能、跨平台的交互式图形程序。它作为中间件(middleware)为应用软件提供了各种高级渲染特性,IO,以及空间结构组织函数;而更低层次的OpenGL硬件抽象层(HAL)实现了底层硬件显示的驱动。

    2.2.1优势

    OpenGL技术为图形元素(多边形、线、点……)和状态(光照、材质、阴影……)的编程提供了标准化的接口。而OSG开发的主要意义在于,将3D场景定义为空间中一系列连续的对象,以进行三维世界的管理。正是由于场景及其参数定义的特点,通过状态转化、绘图管道和自定制等操作,OSG还可以用于优化渲染性能。

    从系统开发人员的角度看,相比工业标准OpenGL 或其它的图形库,OSG的优点显而易见。除了开源和平台无关性以外,它封装并提供了数量众多的提升程序运行时性能的算法、针对包括分页数据库在内的几乎所有主流数据格式的直接数据接口、以及对脚本语言系统Python 和Tcl 的支持,特别的,支持脚本语言系统的意义不仅限于用户可以使用除C++语言以外的工具进行图形系统的开发,事实上,对弱类型计算机语言的支持将突破现有交互式图形系统在人-机交互性能方面的最终限制。 OSG采用以下思想和工具进行构建:

    1.      ANSI标准C++;

    2.      C++标准模板库(STL);

    3.      设计模式(Designpatterns)。 

    这些工具使得OSG的开发者可以在自己喜好的平台上进行开发,并且依据用户所要求的平台进行配置。

    2.2.2硬件需求

    如今的OSG 已经可以在多种硬件平台和操作系统上运行,并且能够在大部分计算机系统上正常使用。   处理器:OSG 可以在大部分的CPU 上编译通过。OSG 具备线程安全性,并且可以有效利用多处理器和双核结构的特性。OSG 可以在32 位或者64 位处理器上运行通过。 

    图形:你的计算机系统需要配置一块AGP 或者PCI 总线的图形显示卡。OSG可以在大部分用于建模,仿真和游戏的专业级或大众级图形设备上运行。可以运行OSG 的图形设备必须高效地支持OpenGL,因此你应当从设备商处获得最新的OpenGL 设备驱动程序。OSG 对显卡RAM 的需求因用户的使用而异,但是256MB 应当足够了。OSG 可以在多管(multi-pipe)显示系统上运行,并且可以利用多显卡来提升渲染速度。 

    RAM:最小的系统RAM 内存需求是由显示数据的数量和类型决定的。推荐配置为1GB,大型数据集的开发可能需要更多的内存支持。 

    磁盘:和RAM 一样,磁盘空间的需求大小由数据量决定。对于任何程序来说,更高速和更大容量的磁盘无疑可以减少数据读取的时间。

    2.2.3软件需求

    可以运行OSG的平台需要具备OpenGL的支持能力,以及C++的编译环境,支持OSG的系统包括Solaris,IRIX,Windows,Mac OSX,HP-UX,Sony Platystation等等,不过XBox除外。 和OpenGL类似,OSG的核心并没有提供窗口系统的功能。因此用户可以自由选择所需的图形开发接口,如GLUT,X11/Motif,Win32,MacOS X,Qt,wxWindows,Fox等。

    2.3  Open Scene Graph 安装

    Open Scene Graph安装与编译还需要下载两个资源:

    1.      Osg第三方库(3rdParty_VC10_x86_x64.zip),网址:

    http://members.iinet.net.au/~bchrist/3rdParty_VC10_x86_x64.zip

    2.      数据包(OpenSceneGraph-Data-3.0.0.zip),网址:

    http://www.openscenegraph.org/downloads/stable_releases/OpenSceneGraph-3.0/data/OpenSceneGraph-Data-3.0.0.zip

    2.3.1建立文件地址与资源解压

    第一步:选择一个磁盘(X),保证磁盘具有30G左右的可用空间,并创建文件夹,X:/OSG/;(作者使用了E盘,后续如果出现E盘表示选择磁盘)。

    第二步:将OpenSceneGraph-3.0.0.zip到X:/OSG/OpenSceneGraph文件夹中;3rdParty_VC10_x86_x64.zip解压到X:/OSG/3rdParty文件夹中;OpenSceneGraph-Data-3.0.0.zip解压到X:/OSG/OpenSceneGraph-Data文件夹中。

    X:/OSG/OpenSceneGraph文件夹截图:

    X:/OSG/3rdParty文件夹截图:

    X:/OSG/OpenSceneGraph-Data文件夹截图:

    2.3.2 安装源代码

    第一步:启动CMake -gui.exe并设置文件地址,将编译地址设置为E:/osg/OpenSceneGraph/vs2010。

    第二步:点击“configure”:

    以此出现以下过程:

    点击“YES”:

    选择“visual studio 2010”,点击“Finish”:

    2.3.3   配置CMAKE相关设置

    第一步:配置环境变量

    第一步:设置基本参数

    ACTUAL_3RDPARTY_DIR值:E:/OSG/3rdParty;

    BUILD_OSG_EXAMPLES值:ON

    CMAKE_INSTALL_PREFIX值:E:/osg/OpenSceneGraph/vs2010

    第二部:点击Configure;

    (红色标记为需要修改或设置不清楚的地方)。

    第三步:将Advanced打勾,将BUILD_MFC_ EXAMPLE设置为on,然后进行最后一次的Configure配置。

    第四步:点击Generate,自此建构完成。

    (只有出现了“Generating done”才表示生成完成,否则需要根据提示修改CMAKE的相关设置)

    打开文件夹E:osgOpenSceneGraphvs2010,可以看见:

    2.3.4   编译Open Scene Graph

    第一步:用VS2010打开OpenSceneGraph.sln(此文件在E:OSGOpenSceneGraphVS2010下),过程可能需要较长时间,请耐心等待。

    第二步:配置VS2010的相关设置。

    点击“生成”,估计需要3-6个小时。

    第三步:验证生成的文件

    在E盘新建E:osgearthOpenSceneGraph文件夹。(说明:E:osgearth文件夹是用来编译osgearth的文件夹)将E:osgOpenSceneGraphvs2010下的bin,include,lib文件夹拷贝到E:osgearthOpenSceneGraph下(可以删除vs2010生成的临时文件,即bin中保留dll和exe文件,include不用处理,lib中保留lib文件),将E:osgOpenSceneGraph-Data下的数据拷贝到E: osgearthOpenSceneGraphdata下;这几个文件是OSG需要的。

             测试文件:

    1.      打开E: osgearthOpenSceneGraphinosgviewerMFC.exe

    2.      打开E: osgearthOpenSceneGraphdata文件中的.osg或者.osgt文件,使用鼠标拖动观察程序运行情况。

    如果运行正常,表明编译已经成功,否则需要查看编译过程中是否错误。在退出程序是出现下面对话框是正常现象。

     

    第三节  CURL安装与配置

    3.1  CURL介绍

    curl是利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。Windows操作系统下的网络蚂蚁,网际快车(FlashGet)的功能它都可以做到。准确的说,curl支持文件的上传和下载,所以是一个综合传输工具,但是按照传统,用户习惯称curl为下载工具。

    curl是瑞典curl组织开发的,您可以访问 http://curl.haxx.se/获取它的源代码和相关说明。curl的最新版本是7.22.0。在http://curl.haxx.se/docs/您可以下载到UNIX格式的man帮助,里面有详细的curl工具的使用说明。

    3.2  CURL编译

    首先解压curl-7.22.0.zip到当前文件夹。

    第二步:使用vs2010打开vc6curl.dsw,出现的提示全部选择“是”。

     

    第三步:设置生成

     

     

    编译完成的界面显示:

     

    第四步:文件转移。在E盘新建E:osgearthcurl文件夹。(本书编译文件夹:D:数字地球curl-7.22.0)将D:数字地球curl-7.22.0includecurl文件夹中.h文件复制到E:osgearthcurlinclude和E:osgearth3rdpartyincludecurl文件夹中;将D:数字地球curl-7.22.0lib文件夹中(包含子文件夹)的dll和lib文件复制到E:osgearthcurllib和E:osgearth3rdpartylib文件夹中。

    第四节  GDAL安装与配置

    4.1  GDAL介绍

    GDAL(GeospatialData Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。    OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI的ArgGIS 9.2,Google Earth和跨平台的GRASS GIS系统。利用GDAL/OGR库,可以使基于Linux的地理空间数据管理系统提供对矢量和栅格文件数据的支持。

    4.1.1 GDAL

    GDAL提供对多种栅格数据的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas ImagineImages(img),ASCII DEM(dem) 等格式。 

    1)  GDAL抽象数据模型   

    GDAL使用抽象数据模型(abstract datamodel)来解析它所支持的数据格式,抽象数据模型包括数据集(dataset),坐标系统,仿射地理坐标转换(AffineGeoTransform), 大地控制点(GCPs),元数据(Metadata),栅格波段(Raster Band),颜色表(ColorTable),子数据集域(Subdatasets Domain),图像结构域(Image_StructureDomain),XML域(XML:Domains)。

    2)  GDAL基础类   

    GDALMajorObject类:带有元数据的对象。GDALDdataset类:通常是从一个栅格文件中提取的相关联的栅格波段集合和这些波段的元数据;GDALDdataset也负责所有栅格波段的地理坐标转换(georeferencingtransform)和坐标系定义。   

    GDALDriver类:文件格式驱动类,GDAL会为每一个所支持的文件格式创建一个该类的实体,来管理该文件格式。GDALDriverManager类:文件格式驱动管理类,用来管理GDALDriver类。  

    4.1.2 OGR   

    OGR提供对矢量数据格式的读写支持,它所支持的文件格式包括:ESRI Shapefiles, S-57, SDTS, PostGIS,Oracle Spatial, Mapinfomid/mif , Mapinfo TAB。OGR包括如下几部分:

    Geometry:类Geometry(包括OGRGeometry等类)封装了OpenGIS的矢量数据模型,并提供了一些几何操作,WKB(Well KnowsBinary)和WKT(Well KnownText)格式之间的相互转换,以及空间参考系统(投影)。

    SpatialReference:类OGRSpatialReference封装了投影和基准面的定义。

    Feature:类OGRFeature封装了一个完整feature的定义,一个完整的feature包括一个geometry和geometry的一系列属性。   

    FeatureDefinition:类OGRFeatureDefn里面封装了feature的属性,类型、名称及其默认的空间参考系统等。一个OGRFeatureDefn对象通常与一个层(layer)对应。  

    Layer:类OGRLayer是一个抽象基类,表示数据源类OGRDataSource里面的一层要素(feature)。   

    Data Source:类OGRDataSource是一个抽象基类,表示含有OGRLayer对象的一个文件或一个数据库。

    Drivers:类OGRSFDriver对应于每一个所支持的矢量文件格式。类OGRSFDriver由类OGRSFDriverRegistrar来注册和管理。

    4.2  GDAL编译

    第一步:将文件解压并打开makegdal10.sln。(本书解压文件夹为D:数字地球gdal-1.8.1gdal-1.8.1)

    第二步:文件转移。

    GDAL编译完成后的文件存放于C:warmerdald,包含文件bin,data,html三个子文件夹。

    新建文件夹:E:osgearthgdal;将C:warmerdaldin和C:warmerdalddata拷贝到E:osgearthgdal文件夹下;将D:数字地球gdal-1.8.1gdal-1.8.1下得子文件夹alg,gcore,ogr和port中所有的.h文件拷贝到E:osgearthgdalinclude下; 将D:数字地球gdal-1.8.1gdal-1.8.1中所有的lib和dll文件复制到E:osgearthgdallib文件夹下。

    第五节  GEOS安装与配置

    5.1  GEOS介绍

    GEOS(几何引擎——开源)是一个Java拓扑套件(JTS)的C++移植。因此,它的目的是在C++中包含完整的JTS移植。这包括了所有的OpenGIS“简单SQL特征”:空间预测函数和空间操作员,以及具体的JTS拓扑功能

    5.2  GEOS编译

    第一步:将文件解压到D:geos-3.3.1文件夹;

    第二步:启动CMake -gui.exe并设置文件地址,将编译地址设置为D:/geos-3.3.1/vs2010。

    第三步:点击“configure”:

    第三步:修改参数。Cmake_install_PREFIX值为D:/geos-3.3.1/vs2010.并在此点击“configure”。

    第四步:点击“Generate”

    D:/geos-3.3.1/vs2010文件夹截图:

    第五步:打开D:/geos-3.3.1/vs2010/geos.sln

    设置相关参数(主要为了debug和release生成的文件名不一致)

    工程名称

    Debug目标文件名

    Release目标文件名

    Geos

    Geosd

    Geos

    geos-static

    libgeosd

    libgeos

    geos_c

    geosd_c

    geos_c

    点击“生成”->“批生成”

    开始编译,编译结果截图:

    第六步:文件转移。

    在D:/geos-3.3.1/vs2010文件夹中搜索lib和dll文件,并将搜索到的文件复制到E:osgearthgeoslib文件夹中;

    将D:geos-3.3.1include中文件复制到E:osgearthgeosinclude文件夹中。

    第六节  Expat安装与配置

    6.1  Expat介绍

    Expat 是一个用C语言开发的、用来解析XML文档的开发库,它最初是开源的、Mozilla 项目下的一个XML解析器。Expat是一个面向流的解析器。您注册的解析器回调(或handler)功能,然后开始搜索它的文档。当解析器识别该文件的指定的位置,它会调用该部分相应的处理程序(如果您已经注册的一个)。该文件被输送到解析器,会被分割成多个片断,并分段装到内存中。因此expat可以解析那些巨大的文件。

    6.2  Expat配置

    第一步:直接下载expat-win32bin-2.0.1.rar文件,解压后安装。

    第二步:文件转移

    将C:Program FilesExpat2.0.1Sourcelib文件夹中的h文件复制到E:osgearthexpatINCLUDE文件夹中;

    将C:Program FilesExpat2.0.1Bin文件复制到E:osgearthexpatlib文件夹中。

    第七节  SQLite安装与配置

    7.1  SQLite介绍

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起MySQL、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

    7.2  SQLite编译与配置

    第一步:解压文件。

    1.将sqlite-amalgamation-3070900.zip文件中的文件复制到E:osgearthsqliteinclude中;

    2.将sqlite-dll-win32-x86-3070900.zip中文件复制到E:osgearthsqlitelib中;

    3.从VS2010的安装文件夹中的Visual Studio10/VC/bin中找到LIB.exe和Link.exe复制到E:osgearthsqlitelib;

    4.将 C:Program FilesMicrosoft Visual Studio 10.0Common7IDEmspdb100.dll复制到E:osgearthsqlitelib;

    第二步:编译lib文件。

    1.      打开cmd窗口,进入E:osgearthsqlitelib;

    2.      输入命令:LIB/DEF:sqlite3.def。生成lib文件

    编译后E:osgearthsqlitelib文件夹截图:

    第八节  Minizip安装与配置

    8.1  MiniZip介绍

    ZIP,是一个计算机文件的压缩的算法,原名Deflate(真空),发明者为菲尔·卡茨(PhilKatz)),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为 application/zip 。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7-Zip格式。从性能上比较,RAR格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。 WinMount可以把ZIP挂载到虚拟盘,无需解压,随机读取,这又是另一大创新。

    ZIP是一种相当简单的分别压缩每个文件的存档格式。分别压缩文件允许不必读取另外的数据而检索独立的文件;理论上,这种格式允许对不同的文件使用不同的算法。不管用何种方法,对这种格式的一个告诫是对于包含很多小文件的时候,存档会明显的比压缩成一个独立的文件(在类Unix系统中一个经典的例子是普通的tar.gz存档是由一个使用gzip压缩的TAR存档组成)要大。 ZIP的规约指出文件可以不经压缩或者使用不同的压缩算法来存储。然而,在实际上,ZIP几乎差不多总是在使用卡茨(Katz)的DEFLATE算法。   

    ZIP支持基于对称加密系统的一个简单的密码,现在已知有严重的缺陷,已知明文攻击,字典攻击和暴力攻击。ZIP也支持分卷压缩。在近来一段时间,ZIP加入了包括新的压缩和加密方法的新特征,不过这些新特征并没有被许多工具所支持并且没有得到广泛应用。

    8.2  MiniZip的编译与配置

    将unzip101h.zip中的文件复制到E:osgearthminizipinclude;将zlib125dll.zip中文件夹dll32和static32中的lib文件和dll文件复制到E:osgearthminiziplib中。Osgearth编译需要的minizip文件已经处理完成

    如果想对源代码进行编译的话,可以按照以下步骤进行:

    第一步:启动CMake -gui.exe并设置文件地址,将编译地址设置为D:zlib125zlib-1.2.5vs2010,然后“configure”

    第二步:删除文件D:zlib125zlib-1.2.5zcongf.h;

    设置Cmake_install_PREFIX值为D:zlib125zlib-1.2.5vs2010;然后再次“configure”

    “Generate”

    D:zlib125zlib-1.2.5vs2010截图

    第三步:打开并编译zlib.Sln。

    第九节Virtual Planet Builder安装与配置

    9.1 Virtual Planet Builder介绍

    VirtualPlanetBuilder是一种地形数据库创作工具,是能够阅读各种地理图象和高程数据并建立小面积地形数据库,乃至大规模如整个地球的庞大数据库。这些数据库可以上传到互联网,并能够提供象在线googleearth一样的风格漫游整个地球的数据库,或保持对本地磁盘高速接入等所需的专业飞行模拟器。前面所讲的VirtualPlanetBuilder建立的数据库,如果要运行该数据库产生一个可视化的场景,那么你将需要一个基于openscenegraph的应用程序。其实,VirtualPlanetBuilder本身是一个基于openscenegraph实时图形工具箱,它可以创建基于openscenegraph的二进制的最高效率的数据库。如果你的应用程序不是基于openscenegraph,而你要使用OSG中的数据库的话,那么你需要写一个后处理的工具来把该数据库从openscenegraph的格式转换为你自己的格式。VirtualPlanetBuilder已经从原来的传最初的数据叶生成工具逐渐的完善了,现在它只是其中的一个部分而已!现在官方计划进一步的对它进行扩展和完善,以便有可能创建几十千兆的数据页,并通过网上电脑间的传输来创建他们,让每台参与的工作的电脑一起来创造完整的数据库。我们也将提供对数据库的支持,以便优化低带宽限制,实现基于web数据库的三维可视化。对未来的发展详情请看:

    http://www.openscenegraph.org/projects/VirtualPlanetBuilder/wiki/DevelopmentPlans

    相关信息配置:

    http://www.openscenegraph.org/projects/osg/wiki/Support/UserGuides/osgdem

    9.2 Virtual Planet Builder编译

    第一步:需要编译完成OSG和GDAL,见osg和gdal编译安装部分。

    第二步:下载相关的地图文件

    http://www.cc.gatech.edu/projects/large_models/ps.html

    第三步:Vpb安装需要插件下载

    http://www.openscenegraph.org/projects/VirtualPlanetBuilder/wiki/Dependencies

    squish-1.11.zip,80k

    第四步:设置环境变量

    第一步:下载并检查相关的版本

    1.使用SVN下载VirtualPlanetBuilder

    http://www.openscenegraph.org/svn/VirtualPlanetBuilder/trunk

     

    下载(或者更新)完成后,打开文件夹中的news.Txt:

    这里的就是版本号,文件夹的标注可能有误。

    2.下载VirtualPlanetBuilder对应osg的版本。

    下载相关的版本:http://www.openscenegraph.org/projects/osg/wiki/Downloads/PreviousReleases

    这里需要注意,osg的相关版本可能是临时版本,需要使用release版本。如果是使用http://www.openscenegraph.org/svn/VirtualPlanetBuilder/trunk进行下载的,可以使用最新的版本。

    下载已经编译好了的osg生成文件,注意编译器版本和操作系统

    http://openscenegraph.alphapixel.com/osg/downloads/free-openscenegraph-binary-downloads

    下载debug和release两个版本。

    OpenSceneGraph-3.0.1-VS10.0.30319-x86-release-12741.7z

    OpenSceneGraph-3.0.1-VS10.0.30319-x86-debug-12741.7z

    重命名debugin文件夹中gdalxx.dll为gdalxxd.dll,libexpat.dll为libexpatd.dll。将release和debug中的bin,lib,include,share,data文件夹合并,如果出现重名,将debug中的文件名在扩展名之前加d,(123.dll=123d.dll)

    查看gdal的版本,查看OpenSceneGraph-3.0.1ingdalxx.dll,XX就是gdal的版本。

    3.下载VirtualPlanetBuilder对应的gdal

    下载编译好的文件:

    http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries

    下载源文件:

    http://trac.osgeo.org/gdal/wiki/DownloadSource

    处理的方法参看gdal编译。

    4.设置相关的环境变量

    OSG_DIR值:E:osgOpenSceneGraph-x.x.x;(E:osgOpenSceneGraphvs2010,在2010编辑中获取)

    GDAL_DIR值:E:osggdal-1.x.x;

    PATH值中添加:%GDAL_DIR%LIB;%GDAL_DIR%BIN;%OSG_DIR%INCLUDE;

    %OSG_DIR%LIB;%OSG_DIR%BIN; %OSG_DIR%include;%OSG_DIR%share;%OSG_DIR%data;

    注意:有些编译环境可能需要:squish-1.11.zip,下载地址如下:

    http://www.openscenegraph.org/projects/VirtualPlanetBuilder/wiki/Dependencies

    5.编译处理,CMAKE

    编辑configure和generate,生成文件*.sln

    打开:VIRTUALPLANETBUILDER.sln,修改下面文件:vpb项目下SpatialProperties.cpp文件

    使用release编译,debug模式编译有错误。

    Release编译结果:

    将VirtualPlanetBuilder-0.9.12vs2010libRelase中的vpb.dll,vpb.lib

    复制到VirtualPlanetBuilder-0.9.12vs2010inRelase中。

    测试编译结果:

    Cmd;

    Cd x:osgVirtualPlanetBuilder-0.9.12vs2010inRelease

    Osgdem –help

    出现下面的界面表明编译成功

    6. 测试地形数据

    下载相关的地图文件:

    http://www.cc.gatech.edu/projects/large_models/ps.html

    ps_height_16k.png,ps_texture_16k.png

    使用的命令行是:

    gdal_translate ps_height_16k.pngps_height_16k.tif

    gdaladdo -r average ps_height_16k.tif 2 4 816 32

    gdal_translate ps_texture_16k.pngps_texture_16k.tif

    gdaladdo -r average ps_texture_16k.tif 2 48 16 32

    osgdem --xx 10 --yy 10 -tps_texture_16k.tif --xx 10 --yy 10 -d ps_height_16k.tif -l 6 -v 0.1 -o test.ive-a test.osga

    osgviewer test.ive

     

    最后  其他资源的配置

    X.1  Open Scene Graph 第三方支持库

    http://openscenegraph.alphapixel.com/osg/downloads/openscenegraph-third-party-library-downloads

    下载windows-VS10.0.30319-x86-release.7z和windows-VS10.0.30319-x86-debug.7z两个针对VS2010的压缩包。将两个压缩包的内容复制到E:osgearth3rdparty。

    也可以下载http://members.iinet.net.au/~bchrist/3rdParty_VC10_x86_x64.zip,将x86文件中的文件复制到E:osgearth3rdparty。(这个压缩包的资源相对较全)

    X.2  libzip库

    Libzip 的功能与minizip相同,但由于使用的位置不同,为了后续配置osgearth,在此进行说明:

    http://files.cnblogs.com/eaglezhao/libzip(vs10).rar下载libzip(vs10).rar,将libzip(vs10).rar中的文件复制到E:osgearthlibzip文件夹。

    X.3  Osgearth资源下载

    第一步:安装Git-1.7.6-preview20110708.exe,默认安装。

    第二步:安装TortoiseGit-1.7.4.0-32bit.msi,默认安装。

    第三步:创建一个文件夹E:osgearthdata。

    第四步:下载资源

    在url中输入:git://github.com/gwaldron/osgearth.git

    点击“ok”,下载过程可能需要较长时间。

    下载完成后,将D:osgearth文件中所有文件复制到E:osgearthosgearth文件夹中。同时将D:osgearth进行压缩备份。D:osgearth文件将可以接收osgearth文件的更新。

    从此为止,我们的osgearth环境就算搭建完成。


     

    第三章    OSGEarth编译

    上一章我们做的所有工作都是为了配置OSGEarth,

    第一节  sln生成

    VS2010的sln文件生成是OSGEarth的关键。作者在配置出现很多错误,从而导致了使用VS2010编译出现很多问题。

    1.1  CMAKE配置

    第一步:启动CMake -gui.exe并设置文件地址,将编译地址设置为E:OSGEARTHOSGEARTHvs2010,然后“configure”

     

    第二步:添加参数

    参数名称

    类型

    DYNAMIC_OSGEARTH

    Bool

    On

    OSG_DIR

    Path

    E:/OSGearth/OpenSceneGraph

    添加方法:点击“Add Entry”,弹出 Add CacheEntry对话框(如下图所示)

     

    完成后cmake参数列表顶端出现添加的两个参数:

     

    第二步:设置相关参数

    主要针对“*-NOTFOUND”参数值的参数。

    参数名称

    CMAKE_INSTALL_PREFIX

    E:/osgearth/osgearth/vs2010

    CMAKE_LINKER

    (清空)

    CURL_INCLUDE_DIR

    E:/osgearth/3rdparty/include

    CURL_LIBRARY

    E:/osgearth/3rdparty/lib/libcurl.lib

    CURL_LIBRARY_DEBUG

    E:/osgearth/3rdparty/lib/libcurld.lib

    GDAL_INCLUDE_DIR

    E:/osgearth/gdal/include

    GDAL _LIBRARY

    E:/osgearth/gdal/lib/gdal_i.lib

    GEOS_INCLUDE_DIR

    E:/osgearth/geos/include

    GEOS _LIBRARY

    E:/osgearth/geos/lib/geos.lib

    GEOS _LIBRARY_DEBUG

    E:/osgearth/geos/lib/geosd.lib

    LIBZIP_INCLUDE_DIR

    E:/osgearth/libzip/include

    LIBZIP _LIBRARY

    E:/osgearth/libzip/lib/zip.lib

    OPENTHREADS_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/OpenThreads.lib

    OPENTHREADS _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/OpenThreadsD.lib

    OSGDB_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgDB.lib

    OSGDB_LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgDBD.lib

    OSGFX_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgFX.lib

    OSGFX _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgFXD.lib

    OSGGA_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgGA.lib

    OSGGA _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgGAD.lib

    OSGMANIPULATOR_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgManipulator.lib

    OSGMANIPULATOR _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgManipulatorD.lib

    OSGSHADOW_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgShadow.lib

    OSGSHADOW _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgShadowD.lib

    OSGSIM_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgSim.lib

    OSGSIM _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgSimD.lib

    OSGTERRAIN_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgTerrain.lib

    OSGTERRAIN _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgTerrainD.lib

    OSGTEXT_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgText.lib

    OSGTEXT _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgTextD.lib

    OSGUTIL_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgUtil.lib

    OSGUTIL _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgUtilD.lib

    OSGVIEWER_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgViewer.lib

    OSGVIEWER _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgViewerD.lib

    OSGWIDGET_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osgWidget.lib

    OSGWIDGET _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgWidgetD.lib

    OSG_GEN_INCLUDE_DIR

    E:/osgearth/OpenSceneGraph/include

    OSG_INCLUDE_DIR

    E:/osgearth/OpenSceneGraph/include

    OSG_LIBRARY

    E:/osgearth/OpenSceneGraph/lib/osg.lib

    OSG _LIBRARY_DEBUG

    E:/osgearth/OpenSceneGraph/lib/osgd.lib

    OSG_VERSION_EXE

    (清空)

    SQLITE3_INCLUDE_DIR

    E:/osgearth/sqlite/include

    SQLITE3_LIBRARY

    E:/osgearth/sqlite/lib/sqlite3.lib

    ZLIB_INCLUDE_DIR

    E:/osgearth/minizip/include

    ZLIB_LIBRARY

    E:/osgearth/minizip/LIB/zlibstat.lib

    MINIZIP_INCLUDE_DIR

    E:/osgearth/minizip/include

    MINIZIP _LIBRARY

    E:/osgearth/minizip/LIB/zlibstat.lib

    如下图:

     

     

     

    设置完成后再次“configure”

     

    第三步:生成vs2010文件。

    点击“Generate”,结果如下:

     

    E:osgearthosgearthvs2010文件夹截图:

     

    1.2  VS2010配置

    第一步:使用vs2010打开E:osgearthosgearthvs2010OSGEARTH.sln文件。

     

    第二步:打开all_build工程属性,设置库目录和包含目录。

     

    包含目录:

     

    库目录:

     

    保存所有文件,这样SLN文件就可以使用了。

    第二节  OSGEarth编译与测试

    2.1  OSGEarth编译

    第一步:配置系统环境变量。

    新设置OSG_FILE_PATH变量,值为E:OSGearthOSGEARTHdata;E:OSGearthGDALdata;

    向PATH添加值:

    E:OSGearth3rdPartyin;

    E:OSGearthOSGEARTHinDebug;

    E:OSGearthOSGEARTHinRelease;

    第二步:使用“生成”->“批生产”,选择all_build(debug|win32和release|win32)进行生成。

     

    在生成的过程中会提示出现以下错误:

    错误提示

    处理方法

    无法打开包括文件:“geos/platform.h”

    将D:geos-3.3.1vs2010includegeos文件夹中的文件复制到E:osgearthgeosincludegeos中

    无法打开包括文件:“zlib.h”

    将D:zlib125zlib-1.2.5中zlib.H文件复制到E:osgearthlibzipinclude文件夹中

    在编译过程中存在4个文件无法编译成功,但是不影响正常的测试。

     

    第三步:修改这些错误。

    上述错误的问题主要出现在E:osgearthosgearthsrcapplicationsosgearth_imageoverlayosgearth_imageoverlay.cpp文件的36-39行。

     

    原因是OSG_MIN_VERSION_REQUIRED(2,9,6)限制了osg的版本。本文使用了v3.0.1版,因此需要添加需要添加ImageOverlayEditor文件。

    (目前还没有解决)

     

    2.2  OSGEarth测试

    测试release版本:

    1.打开cmd窗口,进入E:osgearthosgearthvs2010inRelease;

    2.输入命令: osgearth_viewer.exe E:osgearthosgearth estsgdal_tiff.earth;会出现一个提示

     

    3.复制所需的dll到E:osgearthosgearthvs2010inRelease文件夹中。可能需要重复好多次。

    4.测试成功会出现下面界面:

     


     

    第四章   OSGEarth学习

     

    这是个人在学习osgEarth时根据体会或从别的地方看到的做的一个简单整理,有些东东就是官方文档翻译过来的,都是根据自己的需要感觉需要记录下来什么东西就随便记录下来了,也没有个条理,都是用到哪记到哪,别见怪。对个人在初期使用osgEarth时有很多帮助,所以特发上来,希望对大家也有帮助

    osgEarth学习笔记

    1.        通过earth文件创建图层时,可以指定多个影像数据源和多个高程数据源,数据源的顺序决定渲染顺序,在earth文件中处于最前的在渲染时处于最底层渲染;所以如果有高低精度不同的影响数据或者高程数据,在创建earth文件时要将粗精度的数据放在上方xml节点,高精度的放在其下面的节点;

    2.        osgEarth自带多种驱动器,不同的驱动器驱动不同的数据源,自己也可以扩展驱动器读取相应的数据;

    3.        可以通过profile属性指定数据的投影方式或者数据分页方式以及地理空间延展;osgEarth通过profile创建数据四叉树,每个四叉树节点数据瓦片通过TileKey类来标示;一个地形数据能否正常工作要看创建它的驱动器是否能够创建和对应profile兼容的数据瓦片;比如,如果要生成地球数据,就需要指定global-geodetic 或者global-mercatorprofile,相应的数据源要能够在这种profile下生成相应的地形数据;

    4.        通过earth文件,最基本的也是最主要的功能是我们可以指定生成地形的坐标属性(地理坐标或投影坐标)影像数据、高程数据、矢量数据、模型数据、以及缓冲位置,通过这些基本要素就可以轻易生成我们想要的地形;

    5.        osgEarth只能使用16或32位的高程数据源;

    6.        如果直接使用原始的影像、高程以及矢量数据,可以用GDAL驱动器,在这种情况下需要注意几个性能的问题。第一,将数据源预先进行坐标变换,变换为目标地形坐标,否则osgEarth会对源数据进行坐标投影变换,这将降低数据的加载及处理速度。如果预先已经将数据源进行正确的坐标变换,osgEarth就可以省略这个步骤,从而提高其实时处理速度;第二,预先对影像数据进行瓦片处理,比如tiff格式的影像数据,它是逐行扫描存储的,而osgEarth是每次读取一个瓦片数据,如果预先对影像数据进行瓦片处理,在动态过程中osgEarth就不需要每次读取整个大块影像数据然后提取其需要的瓦片数据,而可以直接读取相应的瓦片数据即可,这样就大大提高了瓦片数据的读取速度。可以通过gdal_translate工具对影像数据进行瓦片处理;第三,创建金字塔数据集可以使osgEarth读取数据更加高效,可以用gdaladdo工具创建金字塔数据集;总之,要想提高osgEarth的处理效率,就要预先创建高效的数据瓦片结构,除了用gdal、vpb等工具外,也可以通过osgEarth的数据缓冲机制创建预处理的瓦片数据集。比如我们可以创建一个如下的earth文件将数据缓冲到指定的目录:

    <mapname="bluemarble" type="geocentric"version="2">

     

        <!--Add a reference to the image -->

       <image name="bluemarble"driver="gdal">

           <url>c:/data/bluemarble.tif</url>

        </image>

     

        <options>

           <!--Tell osgEarth to cache the tilesin a TMS format-->

         <cache type="tms">

              <path>c:/osgearth_cache</path>

                <!--Tell osgEarth to cache the tilesto JPG to save disk space-->

              <format>jpg</format>

           </cache>

      </options>

    </map>

    这种缓冲方式只能缓冲在执行该文件时浏览过的地形数据,而不能自动缓冲所有的数据,要想自动缓冲所有的数据,就需要用到osgEarth自带的一个工具,osgearth_seed,通过osgearth_seed --max-level 7 bluemarble.earth将数据全部缓冲到指定位置,通过这种方式缓冲后,我们就拥有了一个完整的TMS数据源,我们可以直接通过文件目录的方式访问该数据源,也可以将该数据源拷贝到我们自己的本地web服务目录下。详情见http://osgearth.org/wiki/DataPreparation。除此之外还可以用MapTiler以及TileCache工具创建瓦片数据源,用它创建的瓦片数据源也可以直接在osgEarth下使用;

    7.        可以通过两种方式将osgEarth集成到我们自己的osg应用程序中,第一种就是直接通过earth文件的方式,直接将earth文件读入作为一个osg节点加入场景即可,另外一种方式就是通过osgEarth的API。通过API的方式大体需要以下几个步骤:创建map对象——创建影像数据层——创建高程数据层——将影像数据层以及高程数据层加入到map对象——根据前面创建的map对象创建mapNode节点——将mapNode节点加入到场景;示例见http://osgearth.org/wiki/DevelopersGuide。无论是通过earth文件创建的地形还是通过API创建的地形,我们都可以在运行时对其进行修改,如果是用earth文件创建的地形,需要先找到该earth文件对应的mapNode,通过以上两种方式创建的mapNode,我们可以对地形进行修改操作,如添加新的影像、高程数据,移除特定的影像、高程数据,重新制定影像、高程数据的顺序等;

    8.        如果我们的地形用的是地心坐标系,可以会碰到当相机距离地面非常近的时候地形被裁减掉的问题,要解决这个问题我们可以通过设置相机的远近裁剪比率或者创建AutoClipPlaneHandler来解决。AutoClipPlaneHandler可以动态监视相机,当相机距离地面很近时动态调整相机的近裁减面;

    9.        在地形上放置模型对象时可以使用ObjectPlacer类,通过该类可以直接通过经纬度坐标进行模型的放置操作;

    10.        osgEarth的目标是能够在osg中开发基于地理信息的应用,能够方便地浏览地理模型数据,能够与开放标准的地理数据兼容;osgEarth渲染地形的模式分为两种:实时在线模式(直接使用原始数据渲染生成)以及离线模式(数据预处理成瓦片数据或地形数据库);

    11.        osgEarth使用于以下几种情况的应用:快速方便地运行地形地图数据;使用开放标准的地形地图数据,如WMS、TMS、WCS等;通过Web服务的方式集成本地存储的地形地图数据;系统要求以瘦客户端的方式运行;经常处理随着时间改变的数据;集成商业数据;

    12.        在使用osgEarth自带的漫游器EarthManipulator时,如果给漫游器设置一个矩阵或者给漫游器设置一个TetherNode然后再解除,然后再移动相机位置,这时计算出的Center会有一个跳跃,然后才正常,造成这个问题的原因是给漫游器设置了参考节点(通过SetNode函数)造成的,设置了参考节点后漫游器要根据参考节点重新计算Center和相机姿态等参数,在以上两种情况发生时,在重新计算Center时出现了偏差,要想避免以上两种情况下造成的移动异常,可以不让相机结合参考节点重新计算Center,即将Pan函数中的recalculateCenter注释掉即可;

    13.        Map的类型分为geocentric和projected两种类型,即地心方式和投影方式,要建立圆形地球就用geocentric类型,用这种类型如果要制定profile,只有geodetic(WGS84投影)和mercator(墨卡托投影)两种模式;

    14.        Earth文件详解:

    <!—type 属性可以是geocentric和projected两种模式,分别对应地心坐标系和平面投影坐标系,默认是地心坐标模式。Version是osgEarth的主版本号,必须有版本号-->

    <map  name=”myMap” type=”geocentric”/”projected” version=”2”>

     

    <!—定义地图各图层的运行时显示属性-->

    <options>

     

    <!—定义数据缓冲机制,缓冲类型有三种,tms、sqlite3以及tile cache,默认是tms,如果将cache_only设为true,osgEarth将只加载缓冲的数据,不加载任何非缓冲的数据,默认是false-->

    <cachetype=”tms”/”sqlite3”/”tilecache” cache_only=”false”>

     

    <!—缓冲数据存放目标目录,适用于tms以及tilecache 两种类型,直接指定缓冲目录-->

    <path>C:/myCache</path>

     

    <!—缓冲数据存放目标文件,适用于sqlite3,指定数据库文件名-->

    <path>C:/myCache.db</path>

     

    <!—缓冲目标文件类型,适用于tms以及tilecache两种类型,如果没有指定类型,将默认用影像数据或高程数据的类型-->

    <format>jpg</format>

     

    <!—tms类型,仅适用于tms类型,注意如果该类型是google,索引就是反的-->

    <tms_type>google</tms_type>

     

    <!—缓冲文件最大值,单位是MB,不知道该属性是否只是适用于sqlite3,有待确定-->

    <max_size>300</max_size>

    </cache>

     

    <!—坐标投影属性,该属性相当于渲染数据的地理空间上下文,它决定了系统以哪种方式将世界坐标数据投影到屏幕像素。为了正确渲染影像数据以及高程数据,osgEarth需要知道数据源的profile以及渲染时的profile以进行必要的转换。-->

    <profilename=”myProfile”>

     

    <!—空间参考系统初始化字符串,该字符串的值可以参考PROJ4或WKT,下面是用PROJ4定义的WGS84投影 profile,srs以及作用范围的定义同样适用于平面投影模式-->

    <srs>prog=latlong+ellps=WGS84 +datum=WGS84</srs>

     

    <!—如果只想让该profile作用在某个区域,可以给其指定范围-->

    <xmin>-10.2</xmin>

    <xmax>-10</xmax>

    <ymin>20</ymin>

    <ymax>30</ymax>

     

    <!—由于WGS84比较著名,所以可以用下面的简化方式代替上面的定义-->

    <profile>global-geodetic</profile>

     

    <!—另外一个著名的球体投影就是墨卡托投影(yahoo、google、微软、openstreetmap都是用的这种投影方式),这种投影方式的优点是可以在任何纬度或者预留区域正确地显示文本信息,可以用下面的简化方式定义-->

    <profile>global-mercator</profile>

     

    <!—也可以不用简化方式,简化方式使用默认的椭球体,也可以通过定义srs自己定义椭球体-->

    <srs>+proj=latlong+a=6800000 +b=6800000</srs>

     

    <!—定义垂直空间参考系统,相当于垂直高程大地基准-->

    <vsrs>egm96-meters</vsrs>

    </profile>

     

    <!—定义地形引擎如何渲染影像数据和高程数据-->

    <terrain>

     

    <!—定义如何从上层高程数据采集当前层需要的高程数据,比如如果影像数据可以分割到17层,而高程数据到7层,那么8-17层的高程数据就需要从第7层去采集,下面的属性就指定了以何种方式去采集相应的高程值,一共有四种采集方式,分别是nearest(采集最近相邻点)、bilinear(双线插值)、average(平均值插值)、triangulate(根据相邻的四个点插值)-->

    <elevation_interpolation>nearest/bilinear/average/triangulate</elevation_interpolation>

     

    <!—定义是否开启地形表面的光照,默认是开启-->

    <lighting>true</lighting>

     

    <!—定义如何加载地形数据(数据加载策略),可以定义加载模式mode,分为standard(标准加载模式)、sequential(顺序加载模式)以及preemptive(优先级加载模式),默认是标准加载模式,preemptive加载模式不同于顺序加载模式,当需要加载最高级瓦片时需要从最低级开始逐层加载,而preemptive模式可以直接跳过中间级直接加载最高级,同时还可以设定不同数据的加载优先级,比如可以设定优先加载影像数据而后加载高程数据等,这样可以在视觉上得到优化处理。此外还可以指定加载数据时每个CPU创建的线程数量(loading_threads_per_core)或者加载数据使用的总的线程数量(loading_threads),以及编译地形数据即构建地形瓦片所使用的线程数量(compile_threads),注意,加载数据时每个CPU创建的线程数量和加载数据使用的总的线程数量不能同时指定,只能指定其中一种-->

    <loading_policymode=”preemptive” loading_threads_per_core=”3” compile_threads=”2”></loading_policy>

     

    <!—定义多个影像数据叠加时如何集成最终的影像数据,一共有四种方式,分别是auto(自动)、multitexture(多重纹理)、texture_array(纹理数组)、multipass(多通道),默认是auto方式,这种方式是系统自动选择一种纹理组合方法,它首先检测硬件所支持的各种方法然后选择第一种。Multitexture方式会为每个影像层指定它自己的影响纹理单元然后通过GPU进行组合,允许的最大纹理层的数量要受GPU的限制,texture_array是使用一个二维纹理数组通过GPU进行组合,multipass方式是通过创建多个渲染通道进行纹理的组合,这种方式没有纹理层数量的限制,但会影像系统的性能,因为它要给每个纹理层创建一个渲染通道-->

    <compositor>auto/multitexture/texture_array/multipass</compositor>

     

    <!—定义地形瓦片分割的最大层数-->

    <max_lod>10</max_lod>

     

    <!—定义瓦片范围系数,也就是瓦片Lod范围的最大值系数,系统默认是根据瓦片的宽度与该系数相乘作为范围最大值,该值默认是4,通过该系数可以对不同的地形图层的lod可见范围进行控制以提高效率,特别是对于带有文本的图层或者测绘标记图层,可以将该系数设小以大大提高系统的渲染性能-->

    <min_tile_range_factor>4.5</min_tile_range_factor>

     

    <!—定义瓦片数据的采样率,通过设定不同的采样率以得到不同精细程度的地形瓦片,默认是1.0,详情可参考osgTerrain-->

    <sample_ratio>1.2</sample_ratio>

     

    <!—定义地形瓦片边缘率,osgTerrain会在不同的瓦片之间绘制边缘以防止不同的瓦片之间出现缝隙,该值默认是0.02,如果该值太小,在不同瓦片之间就可能会出现缝隙,如果太大,可能会造成不必要的渲染而影响系统的渲染性能,对于高度变化比较大的地形或者是做了高程夸张的地形可以尽量将该值设的大一些,以免出现缝隙-->

    <skirt_ratio>0.05</skirt_ratio>

     

    <!—定义高程夸张系数,默认是1.0,也就是正常渲染高程的真实高度-->

    <vertical_scale>2.0</vertical_scale>

     

    <!—定义边缘缓冲率,就是地形瓦片的延展率,比如将地形做镶嵌或者重投影时为了能够准确覆盖到所有的瓦片数据需要将瓦片范围进行适当的放宽,如果设定0.2,放宽的倍数就是1.02-->

    <edge_buffer_ratio>0.02</edge_buffer_ratio>

    </terrain>

     

    <!—指定是否对整个map启用光照-->

    <lighting>true</lighting>

    </options>

     

    <!—指定影像数据,在同一个map中image的name必需是唯一的;在image下的子要素,有些是公共的,有些是针对特定的driver的。我们可以给影像数据指定driver(驱动器),不同的驱动器用于驱动不同的影像数据源;可以指定cacheid(影像数据缓冲标识),一个影像缓冲标示对应特定的缓冲目录或缓冲数据库文件,如果不指定,系统会根据驱动器创建默认的缓冲标识;可以指定影像数据细分的最小层数min_level以及最大层数max_level;可以指定可见范围min_range以及max_range,该值是影像数据块距离相机的距离(单位是米),当影像图层数据块不在该范围内时图层将不显示,等同于lod节点的可见范围;可以指定该影像数据的加载权重loading_weight,详情可见loading_policy,权重越大,加载的优先级越高;可以指定影像瓦片数据黑名单文件名blacklist_filename,当系统请求影像数据瓦片时,如果包含该瓦片的影响文件不存在,系统就会把该请求的数据瓦片放入到一个黑名单中,这样可以避免再次请求该无效数据,从而提高数据请求的效率。如果黑名单中没有任何记录,该黑名单就处于被禁用状态,也不会影像系统性能。-->

    <imagename=”myImage”>

     

    <!—指定该影像数据使用的profile,给该数据源指定profile后将覆盖map的全局profile,默认情况下,影像驱动器会自动判断数据源应该使用的profile,如果我们觉得驱动器无法自动判断得到数据源的profile时就要手动指定profile;-->

    <profile>global_geodetic</profile>

     

    <!—指定无数据页nodata_image,某些影像数据服务器,如果客户端请求的某些层上没有请求的相应影像数据,就会显示无数据提示,通过设定该属性可以让系统也显示无数据的状态提示图片信息-->

    <nodata_image>someURL</nodata_image>

     

    <!—指定无数据信息图片的透明背景色-->

    <transparent_color>00 255 200</transparent_color>

     

    <!—指定该图层是否启用数据缓冲,默认是启用的-->

    <cache_enabled>true</cache_enabled>

     

    <!—指定缓冲数据文件格式,为该数据源指定缓冲格式后将覆盖该map的全局缓冲格式,如果不指定,系统将默认使用源数据的文件格式-->

    <cache_format>png</cache_format>

     

    <!—指定影像数据的不透明度,默认是1.0,完全不透明,值越小越透明-->

    <opacity>0.5</opacity>

     

    <!—指定是否启用该图层,默认是启用-->

    <enabled>true</enabled>

     

    <!—指定该影像数据被分割时单个瓦片的大小(像素的宽、高)-->

    <tile_size>40</tile_size>

     

    <!—指定最大瓦片缓冲个数,指定该值是为了提高瓦片拼接的效率,默认值是16-->

    <l2_cache_size>20</l2_cache_size>

    </image>

     

    //特定驱动器属性设置,驱动器分为影像/高程驱动器、模型驱动器、特征驱动器、缓冲驱动器以及地形引擎驱动器5大类;

    //影像/高程驱动器

    <!—agglite驱动器,该驱动器将矢量数据栅格化为位图然后然后将其转换为地形瓦片纹理层-->

    <imagename=”myAggliteImage” driver=”agglite”>

     

    <!—定义矢量特征(features)数据,矢量数据的属性定义都要通过特征节点features来定义,矢量特征数据也要指定自己的驱动器,它不直接创建矢量数据几何体,只是用来读取矢量数据,目前矢量数据驱动器主要是ogr及GDAL,支持的矢量数据文件格式就是驱动器支持的所有文件格式 -->

    <featuresname=”myWorld” driver=”ogr”>

     

    <!—指定矢量数据源的位置-->

    <url>../data/world.shp</url>

     

    <!—指定读取数据源的某一层,只有数据源包含多个层时才可用-->

    <layer></layer>

     

    <!—指定预处理几何体缓冲,所有的矢量几何体都将作为面对象进行缓冲,相当于后台缓冲,通过预先在后台多处理一部分矢量数据,从而在显示区域发生变化时载入数据比较快,从而降低给视觉造成的数据显示延迟-->

    <bufferdistance=”0.02”/>

     

    <!—指定驱动器要驱动的文件类型-->

    <ogr_driver>ESRIShapefile</ogr_driver>

     

    </features>

     

    <!—指定数据绘制的风格,如颜色、透明度、纹理贴图等等,这种风格的设置一般是用于矢量数据的绘制,osgEarth可以通过两种方式定义风格,一种是CSS(重叠样式表),一种是SLD(通过xml指定样式,还在开发中),当给数据指定风格时,可以各整个数据层指定通过的风格,也可以将数据分解成多个类class,然后给每个类指定不同的风格(数据源需要能够分解成不同的类)-->

    <!—指定线的风格,颜色、宽度、透明度-->

    <styletype="text/css">

            element {

                stroke: #FF0000;

                stroke- 2.0;

                stroke-opacity: 0.5;

            }

        </style>

    <!—指定面的风格-->

    <styletype="text/css">

            element {

                fill: #FF0000;

                fill-opacity: 0.5;

            }

        </style><!—分解成不同的类分别设置不同的风格,下面是根据frence变量进行类的划分并设置不同的风格-->

    <featuresname="world" driver="ogr">

              <url>data/world.shp</url>

               <ogr_driver>ESRIShapefile</ogr_driver>

           </features>

     

           <class name="french-speaking">

               <query>

                   <expr>french="true" </expr>

               </query>

               <styletype="text/css">

                   world {

                       fill: #FFFF00;

                       fill-opacity: 0.5;

                   }

               </style>

          </class>

     

           <classname="non-french-speaking">

               <query>

                   <expr>french="false" </expr>

               </query>

               <styletype="text/css">

                   world {

                       fill: #FF0000;

                       fill-opacity: 0.5;

                   }

               </style>

           </class>

    <!—指定绘制的几何体类型,点、线、面-->

    <geometry_type>line</geometry_type>

     

    //ArcGIS驱动器,是从ESRI的服务器读取影像数据

     

    //复合驱动器,可以将多个影像数据源(可以使用各自不同的驱动器)复合成一个逻辑图层,其实是一个伪装的驱动器,不是真实的驱动器

    <imagename="grouped layer" driver="composite">

     

        <image name="component 1"driver="tms">

            ...

        </image>

     

        <image name="component 2"driver="wms">

            ...

        </image>

     

        ...

     

    </image>

    //GDAL驱动器,使用该驱动器,指定源数据url时可以指定文件也可以指定某个目录(不必将所有的文件都打包成一个文件),如果指定了目录,还可以指定要加载该目录下某些类型的文件(通过指定扩展名),此外,如果指定的是目录,系统递归遍历该目录下的所有文件将要加载的文件生成一个逻辑图层,需要注意的是,该目录下所有的数据必须是统一的坐标系统以及同样的波段和波段插值;基于性能的考虑,最好对源数据预先进行分块分级处理以及坐标重投影预处理,这样可以大大提高系统在运行时的性能。如果系统读取到的源数据与运行时要求的投影方式不匹配,系统就会在运行时对数据进行重投影,这样就会降低系统性能,如果想在这种情况下提高系统性能,可以让系统缓存重投影后的数据:

    <cachereproject_before_caching="true">

           <path>/files/my_cache_folder</path>

        </cache>

     

    <imagename="boston_inset" driver="gdal">

           <url>../data/boston-inset.tif</url>

            <tile_size>256</tile_size>

        </image>

     

    //通过指定目录的方式加载高程数据示例:

    <heightfieldname="terrain" driver = "gdal">

     

          <!--To load the files in a directory,just point the URL to a directory instead of a file-->

          <url>..data errain</url>

        

          <!--Tell the GDAL driver to just lookfor tifs.  Other files types will beignored.-->

          <extensions>tif</extensions> 

     

          <!—对于高程数据,最好将tile_size设置为32或者64,默认情况下tile_size的值是256-->

          <tile_size>32</tile_size>

     

        </heightfield>

     

    <!—指定数据分层的最大层数,如果不指定,系统将自动计算最大层数,这种方式特别适用于缓存自动计算的瓦片数据时-->

    <max_data_level>10</max_data_level>

     

    //osg驱动器,直接通过osg的文件读写插件读取相应类型的影响数据或高程数据

     

    //tilecache驱动器,读取tilecache磁盘缓存数据,通过tilecache工具可以从WMS服务器创建或缓存地图数据到磁盘,然后通过该驱动器进行离线读取。

    <imagename="world" driver="tilecache">

       <url>F:/data/tilecache/mapdata</url>

        <layer>world</layer>

        <format>jpeg</format>

      </image>

     

    //tileservice驱动器,从NASA服务器读取数据

     

    //tms驱动器,通过tms服务的方式读取数据

     

    //wms驱动器,通过wms服务的方式读取数据

     

    //VPB驱动器,从vpb生成的地形数据库读取相应的影像和高程数据,注意,osgEarth只能读取适用VPB使用—terrain选项创建的地形数据库。这样一来我们就可以同时使用vpb的地形数据库以及原始的影像、高程数据,可以在不改变现有vpb地形数据的基础上在已有的vpb地形上叠加另外的影像数据。

    <!—指定在用vpb生成地形数据库时(--splits选项)使用的主分割层-->

    <primary_split_level>5</primary_split_level>

     

    <!—指定在用vpb生成地形数据库时使用的次分割层-->

    <secondary_split_level>11</secondary_split_level>

     

    <!—指定vpb地形数据使用的profile-->

    <profile>global-geodetic</profile>

     

    <!—指定vpb地形数据库使用的目录结构,分为nested,task, 以及 flat三种类型. 默认是 flat类型 -->

     

    <!—指定使用vpb中影像数据层layer,默认是第0层-->

    <layer>0</layer>

     

    //模型驱动器

    //feature_geom驱动器,该驱动器就是将矢量数据创建成几何对象进行渲染

    <!—定义特征数据-->

    <features></features>

    <!—定义风格-->

    <style></style>

    <!—定义分类(为不同分类指定不同的风格)-->

    <class></class>

     

    <!—定义高度偏移,生成几何体前将数据相对海平面偏移特定高度主要是为了解决z-fighting的问题-->

    <height_offset>10000</height_offset>

     

    <!—指定生成的最大三角形的大小(三角形边的最大长度,单位是度,仅用于地心坐标地形上),通过控制三角形大小能够很好的将非凸多边形构成的三角形映射成椭球体,默认值是5.0-->

     

    //feature_overlay驱动器,该驱动器采用osgSim::OverlayNode将矢量数据作为投影纹理覆盖到地形上。这种覆盖节点的方式对于平面投影坐标模式是很适合的,但对于球体地心坐标来说有一定限制,通过覆盖节点的方式将矢量数据投影成纹理只能覆盖不到一半地球大小,而且在背面会显示穿透效果。

    <features></features>

    <!—定义风格-->

    <style></style>

    <!—定义分类(为不同分类指定不同的风格)-->

    <class></class>

     

    <!—指定纹理单元,默认是auto-->

    <texture_unit>1</texture_unit>

     

    <!—指定覆盖纹理的大小,默认是1024-->

    <texture_size>2048</texture_size>

     

    <!—指定覆盖节点的基准高度,默认是0-->

    <base_height>100</base_height>

     

    //feature_stencil驱动器,该驱动器采用模板缓冲技术将矢量数据覆盖到地形上

    <features></features>

    <!—定义风格-->

    <style></style>

    <!—定义分类(为不同分类指定不同的风格)-->

    <class></class>

     

    <!—指定挤压距离,即在模板体的各个方向对其进行挤压,这是为了防止对于那些覆盖范围比较大的几何体容易造成z-fighting问题而做的处理,如果存在单个特征数据几何体覆盖的区域范围特别大,就要增加该值,默认值是300000-->

    <extrusion_distance>400000</extrusion_distance>

     

    <!—定义高程数据,高程数据的定义属性以及子要素基本与影像数据相同,特别需要注意的是,在定义瓦片大小时,默认值是256,这个值对于影像数据是合适的,但对于高程数据来说太大,应该将其设为比较小的值,比如32,否则会降低系统性能-->

    <elevationname="srtm" driver="wms">

       <url>http://localhost/cgi-bin/mapserv.exe?map=srtm30_plus.map</url>

    <layers>srtm30plus</layers>

    <format>tiff</format>

    <tile_size>32</tile_size>

    </elevation>

     

    <!—定义模型数据,属性包括名称、驱动器driver、最小可视范围值min_range(层次节点LOD范围)、最大可视范围值max_range、是否以覆盖方式覆盖到地形上overlay,对于指定的可视范围值,如果指定了gridding,该范围将作用于被分割的一个个的网格而不是模型几何体本身-->

    <modelname="roads" driver="feature_stencil">

    <featuresname="roads" driver="ogr">

    <url>../data/roads-utm.shp</url>

    </features>

     

    <!—指定网格划分,模型数据源允许我们将非地形数据图层添加到地形地形图上,某些驱动器可以将矢量数据或者特征数据转换为几何体或者覆盖层,对于海量特征数据或者覆盖区域范围特别大的数据如果不对其进行优化处理,将严重影响系统性能,其中方式之一就是对其进行网格划分,对于不同的驱动器,网格划分实现的方式也不一样,自带的模型特征数据驱动器,比如feature_stencil和feature_geom驱动器就可以将几何体数据划分为一个个的小网格-->

    <!—指定一个单元格的最大值cell_size,包括宽和高;指定裁切技术,即如何决定某些数据属于哪个单元格,共有两种方式:crop切割方式以及centroid形心方式,crop切割方式是将几何体根据格网进行切割,不同的部分分别属于不同的网格即可,centroid形心方式是判断几何体的形心,形心落在哪个网格,就认为该几何体属于哪个网格-->

    <griddingcell_size="1000" culling_technique="crop"/>

    <styletype="text/css">

    roads {

            stroke: #ffff00;

            stroke- 10;

         }

    </style>

     

    <!—指定几何体类型-->

    <geometry_type>line</geometry_type>

    </model>

     

    <!—指定overlay覆盖数据层,该层就是model的一个别名,等同于将model的overlay属性设为true-->

     

     

    <!—指定地形数据的边缘标准化,指定该属性是为了让不同高程的瓦片数据之间的高程能够准确的融合,默认是启用的-->

    <normalize_edges>true</normalize_edges>

     

    <!—指定代理服务器地址和端口,如果想让osgEarth通过代理服务器访问某数据服务器,可以设定相应的代理服务器地址以及端口-->

    <proxy_host>80.80.12.123</proxy_host>

    <proxy_port>80</proxy_port>

     

    </map>

     

    Earth文件的完整示例见earthFile-template.earth文件

    15.        注意,earth文件名不能有”-”横线

     

     

     

     

    OSGearth,贴近球面时鼠标无法准确的控制视点位置 (2010-11-09 21:58:15)转载 分类: OSG 

    http://bbs.osgchina.org/viewthread.php?tid=2793&highlight=�ӵ�+��

     

    osg::ArgumentParserarguments(&argc,argv);

    osgViewer::Viewerviewer(arguments);

    viewer.setUpViewOnSingleScreen(0);     

    viewer.setCameraManipulator(newosgGA::TrackballManipulator());

    std::stringmodelPath =

      "F:\google.earth";

     

    {

      osg::ref_ptr<osg::Node> node =osgDB::readNodeFile(modelPath);

      viewer.setSceneData(node.get());

    }

     

    //render a frame

    viewer.realize();

    while(!viewer.done())

    {

      viewer.frame();

    }

     

    使用的googleearth的图层信息,拉近了发现鼠标操作的高度似乎要低于实际图层所高度,低视角转动地球时无法准确控制找到自己所需的位置。

    哪位大侠帮忙告诉一下,在哪里设置鼠标控制点跟球面视角高度保持一致啊?

     

     

     

    Trackball不太适合用来浏览地球,可以考虑用TerrainManipulator或者osgEarth自带的EarthManipulator

     

     

     

    用EarthManipulator解决了鼠标和滚轮的问题!

    是这样解决的:

            std::string modelPath =

             "F:\word_wind.earth";

            {

             // create an osgEarth node. Add it tothe scene graph and let the ref pointer go out of scope.

             osg::ref_ptr<osg::Node> node =osgDB::readNodeFile(modelPath);

             viewer.setSceneData(node.get());

            }

     

       manip->getSettings()->bindMouseDoubleClick(

            osgEarthUtil::EarthManipulator::ACTION_GOTO,

            osgGA::GUIEventAdapter:EFT_MOUSE_BUTTON);

     

        // add our fly-to handler

        viewer.addEventHandler(newFlyToViewpointHandler( manip ));

     

        // add some stock OSG handlers:

        viewer.addEventHandler(newosgViewer::StatsHandler());

        viewer.addEventHandler(newosgViewer::WindowSizeHandler());

        viewer.addEventHandler(newosgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));

     

    原文链接:OSGEARTH三维地形开源项目

    一休大师的CSDN博客:OSGEARTH三维地形开源项目

  • 相关阅读:
    Spark dataframe【KV格式】模拟实现Map操作
    Spark之谓词下推
    Spark之YARN提交模式
    Anaconda安装sasl,thrift,thrift-sasl,PyHive连接Hive
    Hive之FAILED: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient异常
    Hive分区
    HBase架构设计
    HDFS快速入门
    电力系统【第2章:电力系统各元件的参数和数学模型】
    HBase最佳实践之Scan
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/5575797.html
Copyright © 2020-2023  润新知