osgearth2.10用gdal读取S57地图并显示在地球上的代码
时间: 2024-02-27 17:51:49 浏览: 173
osgearth编译配置
以下是使用GDAL库和OSGEarth库读取S57地图并显示在地球上的代码示例:
```c++
#include <osgEarth/MapNode>
#include <osgEarth/Registry>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/LogarithmicDepthBuffer>
#include <gdal_priv.h>
#include <ogrsf_frmts.h>
int main(int argc, char** argv) {
// 初始化OSGEarth库
osgEarth::initialize();
// 创建地球模型
osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map();
osgEarth::MapNodeOptions options;
options.setMap(map.get());
osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(options);
// 添加地球模型到场景图中
osg::ref_ptr<osg::Group> root = new osg::Group();
root->addChild(mapNode.get());
// 添加地球控制器
osg::ref_ptr<osgEarth::Util::EarthManipulator> manipulator = new osgEarth::Util::EarthManipulator();
mapNode->setManipulator(manipulator.get());
// 开启对数深度缓冲
osg::ref_ptr<osg::StateSet> stateSet = root->getOrCreateStateSet();
osgEarth::Util::LogarithmicDepthBuffer depthBuffer;
depthBuffer.install(stateSet.get());
// 打开S57文件
GDALAllRegister();
const char* filePath = "path/to/s57/file";
GDALDataset* dataset = (GDALDataset*)GDALOpenEx(filePath, GDAL_OF_READONLY | GDAL_OF_VECTOR, NULL, NULL, NULL);
if (dataset == NULL) {
osg::notify(osg::FATAL) << "Failed to open S57 file." << std::endl;
return 1;
}
// 获取第一个图层
OGRLayer* layer = dataset->GetLayer(0);
if (layer == NULL) {
osg::notify(osg::FATAL) << "Failed to get layer." << std::endl;
return 1;
}
// 创建图层地物图元
osg::ref_ptr<osgEarth::Features::FeatureSource> featureSource = new osgEarth::Features::OGRFeatureSource(layer);
// 创建图层节点
osg::ref_ptr<osgEarth::Annotation::FeatureNode> featureNode = new osgEarth::Annotation::FeatureNode(mapNode.get(), featureSource.get());
// 添加图层节点到场景图中
root->addChild(featureNode.get());
// 运行OSG程序
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
viewer.run();
// 关闭S57文件
GDALClose(dataset);
// 关闭OSGEarth库
osgEarth::uninitialize();
return 0;
}
```
该代码主要在前面的基础上,添加了创建图层地物图元和图层节点的代码,以及添加图层节点到场景图中的代码。最后运行OSG程序并关闭S57文件和OSGEarth库。
阅读全文