gpt4 book ai didi

c++ - 如何在运行时添加osgEarth功能?

转载 作者:行者123 更新时间:2023-12-02 10:24:09 25 4
gpt4 key购买 nike

我正在玩osgEarth,虽然在.earth文件中添加功能非常容易,但是我正在努力通过API在运行时做到这一点。我想让用户在 map /地球上绘制多边形,因此我需要能够根据用户输入动态定义几何和样式。

现在,我只是想通过一个静态实现来弄清楚我需要做什么,但是对于我自己的一生,我什么都没露面。这是我的示例代码。我已经加载了一个定义MapNode的.earth文件,这就是我在这里使用的文件。

// Style
osgEarth::Symbology::Style shapeStyle;
shapeStyle.getOrCreate<osgEarth::Symbology::PolygonSymbol>()->fill()->color() = osgEarth::Symbology::Color::Green;

// Geometry
osgEarth::Symbology::Polygon* polygon = new osgEarth::Symbology::Polygon();
polygon->push_back(0, 0);
polygon->push_back(0, 10);
polygon->push_back(10, 10);

// Feature
osgEarth::Features::Feature* feature = new osgEarth::Features::Feature(polygon, mapNode->getMapSRS(), shapeStyle);

// Node
osgEarth::Annotation::FeatureNode* featureNode = new osgEarth::Annotation::FeatureNode(mapNode, feature);
featureNode->setStyle(shapeStyle);
featureNode->init();

mapNode->addChild(featureNode);

这应该在 map 中央附近绘制一个绿色三角形,但我什么也看不到。假设我的多边形点是地理坐标(lon,lat),我错了吗?像这样即时创建我的样式和几何形状是错误的吗?我究竟做错了什么?

更新:这在3D(地心) map 上似乎可以正常工作,但在我所追求的2D(投影) map 上却不行。

最佳答案

经过一番摸索之后,我偶然发现了SDK附带的 osgearth_features 示例,其中包括以编程方式创建功能的示例。我遵循了样本中的模式,并提出了一些可行的方法。

// Style
osgEarth::Symbology::Style shapeStyle;
osgEarth::Symbology::PolygonSymbol* fillStyle = shapeStyle.getOrCreate<osgEarth::Symbology::PolygonSymbol>();
fillStyle->fill()->color() = osgEarth::Symbology::Color::Green;
osgEarth::Symbology::LineSymbol* lineStyle = shapeStyle.getOrCreate<osgEarth::Symbology::LineSymbol>();
lineStyle->stroke()->color() = osgEarth::Symbology::Color::Black;
lineStyle->stroke()->width() = 2.0f;

// Geometry
osgEarth::Symbology::Polygon* polygon = new osgEarth::Symbology::Polygon();
polygon->push_back(0, 0, 10000);
polygon->push_back(0, 10, 10000);
polygon->push_back(10, 10, 10000);

// Feature Options (references the geometry)
osgEarth::Drivers::OGRFeatureOptions featureOptions;
featureOptions.geometry() = polygon;

// Model Options (references the feature options and style)
osgEarth::Drivers::FeatureGeomModelOptions geomOptions;
geomOptions.featureOptions() = featureOptions;
geomOptions.styles() = new osgEarth::StyleSheet();
geomOptions.styles()->addStyle( shapeStyle );
geomOptions.enableLighting() = false;

// Model Layer Options (created using the model options)
osgEarth::ModelLayerOptions layerOptions("test polygon", geomOptions);
mapNode->getMap()->addModelLayer(new osgEarth::ModelLayer(layerOptions));

定义样式和几何形状与我之前所做的大致相同(这次我添加了线符号),但是在这种情况下,我要向Map添加一个ModelLayer。该ModelLayer使用一些模型选项,这些选项通过功能选项引用了我的样式和几何形状。

我不知道这是做这件事的最好方法,还是可扩展性(我可以一遍又一遍吗?),至少它使我前进了,

关于c++ - 如何在运行时添加osgEarth功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53351947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com