OGR读取S57海图并显示在osgearth中的代码
时间: 2024-03-02 14:47:53 浏览: 151
解析S57海图数据实例代码
3星 · 编辑精心推荐
以下是使用 OGR 和 osgEarth 读取 S-57 海图并显示的示例代码:
```cpp
#include <osgEarth/MapNode>
#include <osgEarthAnnotation/FeatureNode>
#include <osgDB/ReadFile>
#include <ogr_api.h>
#include <ogr_s57.h>
int main(int argc, char** argv)
{
OGRRegisterAll();
// 打开 S-57 文件
OGRDataSource* ds = OGRSFDriverRegistrar::Open(argv[1], FALSE);
if (ds == NULL)
{
printf("无法打开 S-57 文件 %s\n", argv[1]);
return 1;
}
// 获取第一个图层
OGRLayer* layer = ds->GetLayer(0);
// 创建 osgEarth 的 Map 对象
osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map();
// 创建一个 S57FeatureSource 对象,用于读取 S-57 数据
osg::ref_ptr<osgEarth::S57FeatureSource> s57 = new osgEarth::S57FeatureSource();
s57->setLayer(layer);
// 将 S57FeatureSource 添加到 Map 中
map->addImageLayer(s57.get());
// 加载地图文件
osg::ref_ptr<osgEarth::MapNode> mapNode = osgEarth::MapNode::create(map.get());
// 创建一个场景图结点,用于显示 S-57 数据
osg::ref_ptr<osg::Group> root = new osg::Group();
root->addChild(mapNode);
// 创建 AnnotationLayer,用于添加标注
osg::ref_ptr<osgEarth::Annotation::AnnotationLayer> annoLayer = new osgEarth::Annotation::AnnotationLayer();
mapNode->addChild(annoLayer);
// 创建 FeatureNode,用于显示要素
osg::ref_ptr<osgEarth::Annotation::FeatureNode> featureNode = new osgEarth::Annotation::FeatureNode(map.get(), s57.get());
annoLayer->addChild(featureNode);
// 运行 osgViewer
osgViewer::Viewer viewer;
viewer.setSceneData(root);
return viewer.run();
}
```
在上述代码中,首先打开 S-57 文件,然后创建一个 S57FeatureSource 对象,用于读取 S-57 数据。接着,将 S57FeatureSource 添加到 osgEarth 的 Map 对象中,并加载地图文件。最后,创建一个场景图结点,并将 FeatureNode 添加到 AnnotationLayer 中,用于显示要素。
阅读全文