c++实现,osgearth点线面绘制、选中后显示节点,并可以编辑
时间: 2024-03-30 10:37:30 浏览: 216
好的,下面是一个简单的 C++ 示例,演示如何使用 osgEarth 实现点、线、面的绘制和编辑,并在选中时显示节点:
```cpp
#include <osgEarth/MapNode>
#include <osgEarthAnnotation/AnnotationNode>
#include <osgEarthAnnotation/FeatureEditing>
#include <osgEarthUtil/EarthManipulator>
#include <osgViewer/Viewer>
int main(int argc, char** argv)
{
// 初始化 osgEarth 地图节点
osg::ref_ptr<osgEarth::MapNode> mapNode = osgEarth::MapNode::create(osgEarth::Map::create());
// 创建注释节点
osg::ref_ptr<osgEarth::Annotation::AnnotationNode> annoNode = new osgEarth::Annotation::AnnotationNode(mapNode);
// 创建点集
osgEarth::Annotation::Feature* feature = new osgEarth::Annotation::Feature(new osgEarth::Symbology::PointSet(), mapNode->getMapSRS(), "MyPoints");
// 添加点到点集
feature->getGeometry()->push_back(osg::Vec3d(-73.9798, 40.7615, 0.0));
feature->getGeometry()->push_back(osg::Vec3d(-73.9846, 40.7484, 0.0));
feature->getGeometry()->push_back(osg::Vec3d(-73.9914, 40.7515, 0.0));
// 添加点集到注释节点
annoNode->addFeature(feature);
// 创建线段
osgEarth::Annotation::Feature* lineFeature = new osgEarth::Annotation::Feature(new osgEarth::Symbology::LineString(), mapNode->getMapSRS(), "MyLine");
// 添加点到线段
lineFeature->getGeometry()->push_back(osg::Vec3d(-73.9798, 40.7615, 0.0));
lineFeature->getGeometry()->push_back(osg::Vec3d(-73.9846, 40.7484, 0.0));
lineFeature->getGeometry()->push_back(osg::Vec3d(-73.9914, 40.7515, 0.0));
// 添加线段到注释节点
annoNode->addFeature(lineFeature);
// 创建面
osgEarth::Annotation::Feature* polyFeature = new osgEarth::Annotation::Feature(new osgEarth::Symbology::Polygon(), mapNode->getMapSRS(), "MyPoly");
// 添加点到面
polyFeature->getGeometry()->push_back(osg::Vec3d(-73.9798, 40.7615, 0.0));
polyFeature->getGeometry()->push_back(osg::Vec3d(-73.9846, 40.7484, 0.0));
polyFeature->getGeometry()->push_back(osg::Vec3d(-73.9914, 40.7515, 0.0));
// 添加面到注释节点
annoNode->addFeature(polyFeature);
// 创建编辑器
osg::ref_ptr<osgEarth::Annotation::FeatureEditing> editing = new osgEarth::Annotation::FeatureEditing(annoNode);
// 设置编辑器模式
editing->setMode(osgEarth::Annotation::FeatureEditing::MODE_EDIT);
// 创建观察器
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
// 设置场景数据
viewer->setSceneData(mapNode.get());
// 设置默认摄像机控制器
viewer->setCameraManipulator(new osgEarth::Util::EarthManipulator);
// 将注释节点添加到场景中
viewer->getSceneData()->asGroup()->addChild(annoNode);
// 运行观察器
return viewer->run();
}
```
这个示例创建了一个地图节点,然后创建了一个注释节点,并在其中添加了点、线和面。接着,它创建了一个编辑器,并将其与注释节点关联。最后,它将注释节点添加到场景中,并运行观察器。在观察器运行时,您可以使用鼠标左键选中节点,并在选中时显示节点。您还可以使用编辑器来编辑节点,包括添加、删除和移动节点。
阅读全文