osgearth3 调用OGR2OGR转换S57海图为SHP
时间: 2023-10-27 14:07:05 浏览: 290
osgEarth3 可以调用 OGR2OGR 工具将 S57 海图转换为 SHP 格式。以下是一个示例代码:
```cpp
#include <osgEarth/MapNode>
#include <osgEarth/Registry>
#include <osgEarthUtil/OGR>
#include <osgViewer/Viewer>
int main(int argc, char** argv)
{
// 初始化 osgEarth 应用程序
osg::ArgumentParser arguments(&argc, argv);
osg::ref_ptr<osgEarth::MapNode> mapNode = osgEarth::Util::MapNodeHelper().load(arguments, &osg::notify);
// 加载 S57 海图文件
std::string s57_file = "path/to/s57/file";
osg::ref_ptr<osgEarth::Util::OGR> ogr = osgEarth::Util::OGR::create();
if (!ogr->open(s57_file))
{
osg::notify(osg::FATAL) << "Failed to open S57 file: " << s57_file << std::endl;
return 1;
}
// 将 S57 数据转换为 shp 格式
std::string shp_file = "path/to/shp/file";
std::string cmd = "ogr2ogr -f \"ESRI Shapefile\" " + shp_file + " " + s57_file;
int ret = system(cmd.c_str());
if (ret != 0)
{
osg::notify(osg::FATAL) << "Failed to convert S57 to SHP" << std::endl;
return 1;
}
// 创建 shp 数据源,加载并显示
osg::ref_ptr<osgEarth::Features::FeatureSource> featureSource =
new osgEarth::Drivers::OGRFeatureOptions(shp_file, "SHP").create(mapNode->getMap());
osg::ref_ptr<osgEarth::Features::FeatureModelLayer> layer = new osgEarth::Features::FeatureModelLayer(
featureSource, osgEarth::Features::Filter(), osgEarth::Style::Style(), mapNode->getTerrainEngine());
mapNode->addChild(layer);
// 运行 osgViewer 应用程序
osgViewer::Viewer viewer(arguments);
viewer.setSceneData(mapNode);
return viewer.run();
}
```
需要注意的是,上述代码中使用了系统调用 `system` 来执行 OGR2OGR 命令,这可能会受到系统环境和权限的限制。如果需要更加可靠和安全的方式,可以考虑使用第三方库来执行 shell 命令,例如 boost::process 或 Poco::Process。
阅读全文