[原][译]从osgEarth2升级到osgEarth3的变化
本文由南水之源翻译OE官方文档
Upgrading from osgEarth 2.x to osgEarth 3.x
OsgEarth 3.x的目标是使SDK更容易用于开发人员
既是两种使用OE的人都更方便:
1.通过API开发者
2.通过使用earth files脚本编写地球模块的使用者
(注:之前OE更适合 创建 xxx.earth 文件脚本修改地球环境)
OE3.x的主要目标是:
- 将一切都视为一个“层”,这样Map就可以成为几乎所有数据的容器。
- 使所有图层类型更加明确,并减少对使用插件的依赖。
- 通过避免“选项”结构模式,来简化添加“层”的API。
- 简化创建新的或自定义层类型的方法。
地球文件更改
按照向下播放插件层类型的想法,地球文件中的层现在是显式的。对于2.x中的GDAL层,应该有这样的内容:
<image name="My Layer" driver="gdal"> <url>file.tif</url> </image>
在3.x中,层类型是显式的,如下所示:
<GDALImage name="My Layer"> <url>file.tif</url> </GDALImage>
图像和高程层类型仍然是分开的,并且使用显式类型是很好的。3.xGDAL海拔层如下所示:
<GDALElevation name="My DEM"> <url>dem.tif</url> </GDALElevation>
下面是将旧设置映射到新的3.x格式的部分表:
2.x | 3.x |
---|---|
<image driver="gdal"> |
<GDALImage> |
<elevation driver="gdal"> |
<GDALElevation> |
<image driver="tms"> |
<TMSImage> |
<elevation driver="tms"> |
<TMSElevation> |
<image driver="xyz"> |
<XYZImage> |
<elevation driver="xyz"> |
<XYZElevation> |
<image driver="wms"> |
<WMSImage> |
复合层
2.x中的复合层在图像或提升层中使用“复合”驱动程序。在3.x中有一个新的头等舱CompositeImage
和CompositeElevation
类型。以下是一个例子:
<Map> <CompositeImage name="combined"> <layers> <TMSImage> <url>http://readymap.org/readymap/tiles/1.0.0/7/</url> </TMSImage> <GDALImage> <url>locallInset.tif</url> </GDALImage> </layers> </CompositeImage> </Map>
特征源
特性层(包含特征数据的层)对于3.x并不是新的,但它们也是显式的,就像上面的可见层类型一样。例如,在osgEarth 2.x中,您可以定义一个简单的特性层,如下所示:
<feature_model name="states"> <features name="states" driver="ogr"> <url>../data/usa.shp</url> </features> <styles> <style type="text/css"> states { stroke: #ffff00; } </style> </styles> </feature_model>
在osgEarth 3.x中,定义(使用嵌入式特性源)如下所示:
<FeatureModel name="US States"> <OGRFeatures name="US-Data"> <url>../data/usa.shp</url> </OGRFeatures> <styles> <style type="text/css"> states { stroke:#ffff00; } </style> </styles> </FeatureModel>
或者,您可以将您的功能数据定义为一个单独的层并引用它。这样,多个可见层可以使用相同的特性源:
<OGRFeatures name="data:states"> <url>../data/usa.shp</url> </OGRFeatures> <FeatureModel name="US States" features="data:states"> <styles> <style type="text/css"> states { stroke: #ffff00; } </style> </styles> </FeatureModel>
现在,即使是样式表也可以是一个单独的层。您可以重写上面相同的内容:
<OGRFeatures name="data:states"> <url>../data/usa.shp</url> </OGRFeatures> <Styles name="data:styles"> <style type="text/css"> states { stroke: #ffff00; } </style> </Styles> <FeatureModel name="US States" features="data:states" styles="data:styles"> </FeatureModel>
API变化
在2.x中,通过创建“选项”结构并将其传递给新层的构造函数,创建了映射层(和其他各种东西)。在3.x中,您不再需要这样做;您只需创建一个新层并调用其setter函数即可。
下面是在osgEarth 2.x中创建WMS映像层的示例:
#include <osgEarthDrivers/wms/WMSOptions> ... WMSOptions wms; wms.url() = "http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi"; wms.format() = "png"; wms.layers() = "nexrad-n0r"; wms.srs() = "EPSG:4326"; wms.transparent() = true; ImageLayerOptions wmsLayerOptions("WMS NEXRAD", wms); wmsLayerOptions.cachePolicy() = CachePolicy::NO_CACHE; ImageLayer* layer = new ImageLayer(wmsLayerOptions); map->addLayer(layer);
在3.x中,API更直观,没有任何中间结构:
#include <osgEarth/WMS> ... WMSImageLayer* wms = new WMSImageLayer(); wms->setURL("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi"); wms->setFormat("png"); wms->setLayers("nexrad-n0r"); wms->setSRS("EPSG:4326"); wms->setTransparent(true); wms->options().cachePolicy() = CachePolicy::NO_CACHE; map->addLayer(wms);
对所有层类型遵循相同的模式。见osgearth_map.cpp
举几个例子。