Как добавить функции osgEarth во время выполнения? - PullRequest
0 голосов
/ 17 ноября 2018

Я играю с 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 (проецируемой) карте, которая мне нужна.

1 Ответ

0 голосов
/ 17 ноября 2018

Немного покопавшись, я наткнулся на пример 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 использует некоторые параметры модели, которые ссылаются на мой стиль и геометрию через параметры объектов.

Я не знаю, является ли это лучшим способом сделать это или насколько это масштабируемо (могу ли я делать это снова и снова тысячи раз?), Хотя, по крайней мере, это заставило меня двигаться вперед,

...