这 是个人在学习osgEarth时根据体会或从别的地方看到的做的一个简单整理,有些东东就是官方文档翻译过来的,都是根据自己的需要感觉需要记录下来什么 东西就随便记录下来了,也没有个条理,都是用到哪记到哪,别见怪。对个人在初期使用osgEarth时有很多帮助,所以特发上来,希望对大家也有帮助
osgEarth学习笔记
1. 通过earth文件创建图层时,可以指定多个影像数据源和多个高程数据源,数据源的顺序决定渲染顺序,在earth文件中处于最前的在渲染时处于最底层渲染;所以如果有高低精度不同的影响数据或者高程数据,在创建earth文件时要将粗精度的数据放在上方xml节点,高精度的放在其下面的节点;
2. osgEarth自带多种驱动器,不同的驱动器驱动不同的数据源,自己也可以扩展驱动器读取相应的数据;
3. 可以通过profile属性指定数据的投影方式或者数据分页方式以及地理空间延展;osgEarth通过profile创建数据四叉树,每个四叉树节点数据瓦片通过TileKey类来标示;一个地形数据能否正常工作要看创建它的驱动器是否能够创建和对应profile兼容的数据瓦片;比如,如果要生成地球数据,就需要指定global-geodetic 或者global-mercator profile,相应的数据源要能够在这种profile下生成相应的地形数据;
4. 通过earth文件,最基本的也是最主要的功能是我们可以指定生成地形的坐标属性(地理坐标或投影坐标)影像数据、高程数据、矢量数据、模型数据、以及缓冲位置,通过这些基本要素就可以轻易生成我们想要的地形;
5. osgEarth只能使用16或32位的高程数据源;
6. 如果直接使用原始的影像、高程以及矢量数据,可以用GDAL驱动器,在这种情况下需要注意几个性能的问题。第一,将数据源预先进行坐标变换,变换为目标地 形坐标,否则osgEarth会对源数据进行坐标投影变换,这将降低数据的加载及处理速度。如果预先已经将数据源进行正确的坐标变换,osgEarth就 可以省略这个步骤,从而提高其实时处理速度;第二,预先对影像数据进行瓦片处理,比如tiff格式的影像数据,它是逐行扫描存储的,而osgEarth是 每次读取一个瓦片数据,如果预先对影像数据进行瓦片处理,在动态过程中osgEarth就不需要每次读取整个大块影像数据然后提取其需要的瓦片数据,而可 以直接读取相应的瓦片数据即可,这样就大大提高了瓦片数据的读取速度。可以通过gdal_translate工具对影像数据进行瓦片处理;第三,创建金字 塔数据集可以使osgEarth读取数据更加高效,可以用gdaladdo工具创建金字塔数据集;总之,要想提高osgEarth的处理效率,就要预先创 建高效的数据瓦片结构,除了用gdal、vpb等工具外,也可以通过osgEarth的数据缓冲机制创建预处理的瓦片数据集。比如我们可以创建一个如下的earth文件将数据缓冲到指定的目录:
<map name="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 tiles in a TMS format-->
<cache type="tms">
<path>c:/osgearth_cache</path>
<!--Tell osgEarth to cache the tiles to 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,我们可以对地形进行修改操作,如添加新的影像、高程数据,移除特定的影像、 高程数据,重新制定影像、高程数据的顺序等;
9. 在地形上放置模型对象时可以使用ObjectPlacer类,通过该类可以直接通过经纬度坐标进行模型的放置操作;
<!—type 属性可以是geocentric和projected两种模式,分别对应地心坐标系和平面投影坐标系,默认是地心坐标模式。Version是osgEarth的主版本号,必须有版本号-->
<map name="myMap" type="geocentric"/"projected" version="2">
<cache type="tms"/"sqlite3"/"tilecache" cache_only="false">
<!—缓冲数据存放目标目录,适用于tms以及tilecache 两种类型,直接指定缓冲目录-->
<!—缓冲数据存放目标文件,适用于sqlite3,指定数据库文件名-->
<!—缓冲目标文件类型,适用于tms以及tilecache两种类型,如果没有指定类型,将默认用影像数据或高程数据的类型-->
<!—tms类型,仅适用于tms类型,注意如果该类型是google,索引就是反的-->
<!—缓冲文件最大值,单位是MB,不知道该属性是否只是适用于sqlite3,有待确定-->
<!—空间参考系统初始化字符串,该字符串的值可以参考PROJ4或WKT,下面是用PROJ4定义的WGS84投影 profile,srs以及作用范围的定义同样适用于平面投影模式-->
<srs>prog=latlong +ellps=WGS84 +datum=WGS84</srs>
<!—如果只想让该profile作用在某个区域,可以给其指定范围-->
<!—由于WGS84比较著名,所以可以用下面的简化方式代替上面的定义-->
<profile>global-geodetic</profile>
<profile>global-mercator</profile>
<!—也可以不用简化方式,简化方式使用默认的椭球体,也可以通过定义srs自己定义椭球体-->
<srs>+proj=latlong +a=6800000 +b=6800000</srs>
<elevation_interpolation>nearest/bilinear/average/triangulate</elevation_interpolation>
<compositor>auto/multitexture/texture_array/multipass</compositor>
<min_tile_range_factor>4.5</min_tile_range_factor>
<!—定义瓦片数据的采样率,通过设定不同的采样率以得到不同精细程度的地形瓦片,默认是1.0,详情可参考osgTerrain-->
<sample_ratio>1.2</sample_ratio>
<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>
<profile>global_geodetic</profile>
<!—指定无数据页nodata_image,某些影像数据服务器,如果客户端请求的某些层上没有请求的相应影像数据,就会显示无数据提示,通过设定该属性可以让系统也显示无数据的状态提示图片信息-->
<nodata_image>someURL</nodata_image>
<transparent_color>0 0 255 200</transparent_color>
<cache_enabled>true</cache_enabled>
<!—指定缓冲数据文件格式,为该数据源指定缓冲格式后将覆盖该map的全局缓冲格式,如果不指定,系统将默认使用源数据的文件格式-->
<cache_format>png</cache_format>
<!—指定影像数据的不透明度,默认是1.0,完全不透明,值越小越透明-->
<!—指定该影像数据被分割时单个瓦片的大小(像素的宽、高)-->
<!—指定最大瓦片缓冲个数,指定该值是为了提高瓦片拼接的效率,默认值是16-->
<l2_cache_size>20</l2_cache_size>
//特定驱动器属性设置,驱动器分为影像/高程驱动器、模型驱动器、特征驱动器、缓冲驱动器以及地形引擎驱动器5大类;
<!—agglite驱动器,该驱动器将矢量数据栅格化为位图然后然后将其转换为地形瓦片纹理层-->
<image name="myAggliteImage" driver="agglite">
<features name="myWorld" driver="ogr">
<!—指定读取数据源的某一层,只有数据源包含多个层时才可用-->
<!—指定预处理几何体缓冲,所有的矢量几何体都将作为面对象进行缓冲,相当于后台缓冲,通过预先在后台多处理一部分矢量数据,从而在显示区域发生变化时载入数据比较快,从而降低给视觉造成的数据显示延迟-->
<ogr_driver>ESRI Shapefile</ogr_driver>
</style><!—分解成不同的类分别设置不同的风格,下面是根据frence变量进行类的划分并设置不同的风格-->
<features name="world" driver="ogr">
<ogr_driver>ESRI Shapefile</ogr_driver>
<class name="french-speaking">
<class name="non-french-speaking">
<geometry_type>line</geometry_type>
//复合驱动器,可以将多个影像数据源(可以使用各自不同的驱动器)复合成一个逻辑图层,其实是一个伪装的驱动器,不是真实的驱动器
<image name="grouped layer" driver="composite">
<image name="component 1" driver="tms">
<image name="component 2" driver="wms">
<cache reproject_before_caching="true">
<path>/files/my_cache_folder</path>
<image name="boston_inset" driver="gdal">
<url>../data/boston-inset.tif</url>
<heightfield name="terrain" driver = "gdal">
<!--To load the files in a directory, just point the URL to a directory instead of a file-->
<!--Tell the GDAL driver to just look for tifs. Other files types will be ignored.-->
<!—对于高程数据,最好将tile_size设置为32或者64,默认情况下tile_size的值是256-->
<!—指定数据分层的最大层数,如果不指定,系统将自动计算最大层数,这种方式特别适用于缓存自动计算的瓦片数据时-->
<max_data_level>10</max_data_level>
//osg驱动器,直接通过osg的文件读写插件读取相应类型的影响数据或高程数据
//tilecache驱动器,读取tilecache磁盘缓存数据,通过tilecache工具可以从WMS服务器创建或缓存地图数据到磁盘,然后通过该驱动器进行离线读取。
<image name="world" driver="tilecache">
<url>F:/data/tilecache/mapdata</url>
<!—指定在用vpb生成地形数据库时(--splits选项)使用的主分割层-->
<primary_split_level>5</primary_split_level>
<secondary_split_level>11</secondary_split_level>
<profile>global-geodetic</profile>
<!—指定vpb地形数据库使用的目录结构,分为nested, task, 以及 flat三种类型. 默认是 flat类型 -->
<!—指定使用vpb中影像数据层layer,默认是第0层-->
// feature_geom驱动器,该驱动器就是将矢量数据创建成几何对象进行渲染
<!—定义高度偏移,生成几何体前将数据相对海平面偏移特定高度主要是为了解决z-fighting的问题-->
<height_offset>10000</height_offset>
<!—指定生成的最大三角形的大小(三角形边的最大长度,单位是度,仅用于地心坐标地形上),通过控制三角形大小能够很好的将非凸多边形构成的三角形映射成椭球体,默认值是5.0-->
<texture_unit>1</texture_unit>
<texture_size>2048</texture_size>
<base_height>100</base_height>
//feature_stencil驱动器,该驱动器采用模板缓冲技术将矢量数据覆盖到地形上
<extrusion_distance>400000</extrusion_distance>
<elevation name="srtm" driver="wms">
<url>http://localhost/cgi-bin/mapserv.exe?map=srtm30_plus.map</url>
<model name="roads" driver="feature_stencil">
<features name="roads" driver="ogr">
<url>../data/roads-utm.shp</url>
<gridding cell_size="1000" culling_technique="crop"/>
<geometry_type>line</geometry_type>
<!—指定overlay覆盖数据层,该层就是model的一个别名,等同于将model的overlay属性设为true-->
<!—指定地形数据的边缘标准化,指定该属性是为了让不同高程的瓦片数据之间的高程能够准确的融合,默认是启用的-->
<normalize_edges>true</normalize_edges>
<!—指定代理服务器地址和端口,如果想让osgEarth通过代理服务器访问某数据服务器,可以设定相应的代理服务器地址以及端口-->
<proxy_host>80.80.12.123</proxy_host>
Earth文件的完整示例见earthFile-template.earth文件
源文档 <http://blog.youkuaiyun.com/gelu1231/article/details/6655669>