我正在使用osgEarth,虽然在.earth文件中添加功能非常容易,但是我正在努力通过API在运行时做到这一点。我想让用户在地图/地球上绘制多边形,因此我需要能够根据用户输入动态定义几何和样式。
现在,我只是想通过静态实现来弄清楚我需要做的事情,但是对于我的一生,我什么都没露面。这是我的示例代码。我已经加载了一个定义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);
此应该在地图中央附近绘制一个绿色三角形,但我什么也看不到。假设多边形点是地理坐标(lon,lat),我错了吗?像这样即时创建我的样式和几何形状是错误的吗?我在做什么错了?
更新:这似乎在3D(地心)地图上很好用,但在我所追求的2D(投影)地图上却没有。
答案 0 :(得分:0)
经过一番摸索,我偶然发现了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));
定义样式和几何形状与我之前所做的大致相同(这次我添加了线形符号),但是在这种情况下,我向模型添加了ModelLayer。该ModelLayer使用一些模型选项,这些选项通过功能选项引用了我的样式和几何。
我不知道这是最好的方式还是可扩展性(我可以一遍又一遍吗?),至少它使我前进了,