Я играю с osgEarth, и хотя добавлять файлы в файл .earth очень просто, я пытаюсь сделать это во время выполнения с помощью API. Я хочу позволить пользователю рисовать полигоны на карте / глобусе, поэтому мне нужно иметь возможность динамически определять геометрию и стили на основе пользовательского ввода.
Прямо сейчас я просто собираюсь для статической реализации, чтобы выяснить, что мне нужно делать, но для жизни я не могу ничего показать. Вот мой пример кода. Я уже загрузил файл .earth, который определяет MapNode, который я использую здесь.
// 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);
это должен Нарисуйте зеленый треугольник в середине карты, но я ничего не вижу. Я ошибаюсь, предполагая, что мои точки многоугольника являются географическими координатами (долгота, широта)? Это неправильно, просто создавать мой стиль и геометрию на лету, как это? Что я делаю неправильно?
ОбновитьПохоже, что это хорошо работает на 3D (геоцентрической) карте, но не на 2D (проецируемой) карте, которая мне нужна.
Пройдя немного, я наткнулся на osgearth_features пример, который идет с SDK, который включает примеры создания функций программно. Я следовал за образцом из образца и придумал что-то, что работает.
// 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 использует некоторые параметры модели, которые ссылаются на мой стиль и геометрию через параметры объектов.
Я не знаю, является ли это Лучший способ сделать это или насколько это масштабируемо (могу ли я делать это снова и снова тысячи раз?), но это, по крайней мере, заставило меня начать,
Других решений пока нет …