本文由南水之源翻譯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舉幾個例子。
