Visualizing Military Symbology data on a map requires two steps:

// Create the coordinate reference in which the model will be defined.
auto crs = TestCrs::epsg4326();

// Create an APP-6 symbol "unmanned aerial vehicle unit" and set a value for its text modifier "Unique Designation".
auto symbol = MilitarySymbol::create(MilitarySymbology::Standard::App6d, "10060100001103000000");
symbol->putValue(MilitarySymbol::Modifier::UniqueDesignation, "Regular");

// Copy the symbol to a Feature instance and a point geometry.
Feature emptyFeature = Feature::newBuilder().dataType(MilitaryDataModel::getSymbolType()).build();
auto featureGeometry = GeometryFactory::createPoint(crs, 0, 27, 46);
auto feature = symbol->copyToFeature(emptyFeature, featureGeometry);

// Declare the model metadata.
auto modelMetadata = ModelMetadata::newBuilder().title("My Symbology Model").build();
auto featureModelMetadata = FeatureModelMetadata::newBuilder().dataModel(MilitaryDataModel::get()).reference(crs).build();
auto modelBounds = GeometryFactory::createBounds(crs, featureGeometry->getLocation(), 0, 0, 0);

// Build an IFeatureModel containing only the feature we just created.
auto militarySymbologyModel = FeatureModelBuilder::newBuilder()
                                  .modelMetadata(modelMetadata)
                                  .featureModelMetadata(featureModelMetadata)
                                  .bounds(modelBounds)
                                  .features({feature})
                                  .build();
// Finally, put the model in a layer, and add it to the map.
// A default IFeaturePainter is automatically deduced from the model's data model.
auto layer = FeatureLayer::newBuilder().model(militarySymbologyModel).build();
map->getLayerList()->add(layer);
// Create the coordinate reference in which the model will be defined.
var crs = CoordinateReferenceProvider.Create("EPSG:4326");

// Create an APP-6 symbol "unmanned aerial vehicle unit" and set a value for its text modifier "Unique Designation".
var symbol = MilitarySymbol.Create(MilitarySymbology.Standard.App6d, "10060100001103000000");
symbol.PutValue(MilitarySymbol.Modifier.UniqueDesignation, "Regular");

// Copy the symbol to a Feature instance and a point geometry.T
Feature emptyFeature = Feature.NewBuilder().DataType(MilitaryDataModel.SymbolType).Build();
var featureGeometry = GeometryFactory.CreatePoint(crs, 0, 27, 46);
var feature = symbol.CopyToFeature(emptyFeature, featureGeometry);

// Declare the model metadata.
var modelMetadata = ModelMetadata.NewBuilder().Title("My Symbology Model").Build();
var featureModelMetadata = FeatureModelMetadata.NewBuilder().DataModel(MilitaryDataModel.Get()).Reference(crs).Build();
var modelBounds = GeometryFactory.CreateBounds(crs, featureGeometry.Location, 0, 0, 0);

// Build an IFeatureModel containing only the feature we just created.
var militarySymbologyModel = FeatureModelBuilder.NewBuilder()
    .ModelMetadata(modelMetadata)
    .FeatureModelMetadata(featureModelMetadata)
    .Bounds(modelBounds)
    .Features(new List<Feature> { feature })
    .Build();

// Finally, put the model in a layer, and add it to the map.
// A default IFeaturePainter is automatically deduced from the model's data model.
var layer = FeatureLayer.NewBuilder().Model(militarySymbologyModel).Build();
map.LayerList.Add(layer);
// Create the coordinate reference in which the model will be defined.
CoordinateReference crs = CoordinateReferenceProvider.create("EPSG:4326");

// Create an APP-6 symbol "unmanned aerial vehicle unit" and set a value for its text modifier "Unique Designation".
MilitarySymbol symbol = MilitarySymbol.create(MilitarySymbology.Standard.App6d, "10060100001103000000");
symbol.putValue(MilitarySymbol.Modifier.UniqueDesignation, "Regular");

// Copy the symbol to a Feature instance and a point geometry.
Feature emptyFeature = Feature.newBuilder().dataType(MilitaryDataModel.getSymbolType()).build();
Point featureGeometry = GeometryFactory.createPoint(crs, 0, 27, 46);
Feature feature = symbol.copyToFeature(emptyFeature, featureGeometry);

// Declare the model metadata.
ModelMetadata modelMetadata = ModelMetadata.newBuilder().title("My Symbology Model").build();
FeatureModelMetadata featureModelMetadata = FeatureModelMetadata.newBuilder().dataModel(MilitaryDataModel.get()).reference(crs).build();
Bounds modelBounds = GeometryFactory.createBounds(crs, featureGeometry.getLocation(), 0, 0, 0);

// Build an IFeatureModel containing only the feature we just created.
IFeatureModel militarySymbologyModel = FeatureModelBuilder.newBuilder()
                                                          .modelMetadata(modelMetadata)
                                                          .featureModelMetadata(featureModelMetadata)
                                                          .bounds(modelBounds)
                                                          .features(Collections.singletonList(feature))
                                                          .build();

// Finally, put the model in a layer, and add it to the map.
// A default IFeaturePainter is automatically deduced from the model's data model.
FeatureLayer layer = FeatureLayer.newBuilder().model(militarySymbologyModel).build();
map.getLayerList().add(layer);

See this article if you want to customize the styling of your military symbols.

movement arrows
Figure 1. Movement direction arrows for ground units (right) and other units (left)

The following symbol modifiers affect the arrows:

  • movementDirection: a number indicating the heading of the object. Must be an azimuth: degrees, clock-wise, 0 is north.

  • speedLabel: a string expressing the movement speed, for example 17 km/h or 11 kn. Affects the length of the arrow. Only relevant for APP-6C, APP-6D, MIL-STD-2525C and MIL-STD-2525D.

The length of the arrow is determined by the existing symbol style property iconSize in combination with the speedLabel modifier if available. The line-width of the arrow is determined by the existing style property strokeScaleFactor. In 3D, ground units have no stem.