[原][译]从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.x3.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中有一个新的头等舱CompositeImageCompositeElevation类型。以下是一个例子:

<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举几个例子。

原文地址:https://www.cnblogs.com/lyggqm/p/14340552.html