2026.1

2026.1

New featureLuciadRIA

WFSFeatureStore now supports WFS-T, including feature insertion, updating, removal, and locking. See Edit WFS data with WFS-T for more information.

New featureLuciadRIA

The GMLCodec now supports encoding features. Use encode(cursor) to produce a gml:FeatureCollection document.

New featureLuciadRIA

LuciadRIA can now load and visualize Mapbox Vector Tiles (MVT), either from an MBTiles-style TileJSON descriptor or from a remote PMTiles archive (a single .pmtiles file read over HTTP range requests, with no tile server). See Visualize Mapbox Vector Tiles for more information.

New featureLuciadRIA

You can now limit the total number of points used by all point cloud layers on a map with the new RIAMap.performanceHints.maxPointCount property. LuciadRIA distributes this point budget automatically and continuously across the point cloud layers visible on the map. See Tuning performance and visual quality of point clouds.

New featureLuciadRIA

LuciadRIA can now decode and visualize Gaussian splats. Gaussian splatting is a novel scene-representation and 3D rendering technique that uses a large amount of tiny 3D Gaussian primitives ("splats") to create photorealistic views of real-world scenes.

A Gaussian splatting dataset of a restaurant
A Gaussian splatting dataset of a restaurant.

LuciadRIA can consume Gaussian splats as OGC 3D Tiles with glTF payloads that make use of the KHR_gaussian_splatting or KHR_gaussian_splatting_compression_spz_2 extension of the glTF specification.

You can visualize a Gaussian splatting dataset by constructing a TileSet3DLayer with an OGC3DTilesModel. Also see TileSet3DLayer.gaussianSplatsStyle, which allows you to customize the styling of the Gaussian splats, using expressions for example, and to tweak other performance-related settings.

LuciadRIA depends on the libraries tinyply and spz for parsing ply and spz files respectively.

See Visualize Gaussian splats for more information.

New featureDefense Symbology

RIA-5998
LuciadRIA added support for visualization of the engagementBar Modifier for all military symbology icons in which the engagementBar is applicable. The style for this engagementBar can be configured through 'MilSymStyle.engagementBar'. Setting this style property to 'null' will disable the visualization of the engagementBar.

New featureDefense Symbology

We have added full support for the military standard 'APP-6 NATO Joint Military Symbology, Edition E Version 2, October 2025'.

The symbols of the Cyberspace symbol set, which we added previous release have been upgraded from APP-6E E Version 1 to APP-6E Version 2.

You can visualize the APP-6E symbols using the Military Symbology samples, located in samples/symbology within the release directory.

APP-6E - Fictional Scenario
APP-6E - Fictional Scenario.

New featureDefense Symbology

LuciadRIA added support for NATO Vector Graphics (NVG). The support includes:
  • Decoding NVG XML content
  • Decoding NVG XML streaming content, of both full sync and partial updates
  • Visualization of NVG Features
  • Editing of NVG Features, of both shapes and properties
  • Creation of NVG Features
  • Encoding of NVG XML content
See NATO Vector Graphics (NVG) support in LuciadRIA for more information.

ImprovementLuciadRIA

RIA-6190
You can now combine an identifiers() filter with other conditions using and(), or() and not(). WFS 1.x does not support this.

ImprovementLuciadRIA

RIA-6046
Bounds.focusPoint is now documented as the center of the bounds. For geodetic bounds, its longitude is now normalized to the [-180, 180] range. Previously, bounds crossing the date line could return a longitude above 180.

ImprovementLuciadRIA

RIA-5869, RIA-6187
Polyline and Polygon are faster to build from coordinates and faster to prepare for painting, which improves both data loading and visualization.

ImprovementLuciadRIA

A balloon now keeps its size, and if it does not fit next to its anchor it moves sideways to stay inside the map, or flips below its anchor when it does not fit above it. Its arrow keeps pointing at the anchor.

ImprovementLuciadRIA

A new article in the documentation explains how to get the most out of agentic AI tools such as GitHub Copilot or Claude Code when developing applications against LuciadRIA. The article also contains an AI skill bundle that can help you to improve your agent's output.

ImprovementLuciadRIA

RIA-6036

OrientedBox.getCorners() and OrientedBox.getCornerPoints() now return a fixed-size tuple of eight corners, typed as OrientedBoxCorners<Vector3> and OrientedBoxCorners<Point>, instead of an Vector3[] and a Point[]. An oriented box always has exactly eight corners, so callers can now destructure or index all of them without checking for undefined.

Existing code keeps working: a tuple is still an array, so it can be iterated, mapped and passed wherever an array of corners was expected.

ImprovementLuciadRIA

Undoable.undo() and Undoable.redo() can now be asynchronous. An undoable often updates a model, and such an update can take a request to a server, for example on a WFS-T store. Returning a promise is optional: an Undoable that applies its change synchronously returns nothing, as before. Existing Undoable implementations keep working unchanged.

As a result, UndoManager.undo() and UndoManager.redo() now return Promise<void> instead of void. If every Undoable in your UndoManager is synchronous, that promise never rejects, and you can keep calling both methods and ignore what they return. As soon as one of them can be asynchronous, await it inside a try/catch block, so that you find out whether the operation was applied and can report a failed model update to your user.

See the Adding undo/redo support to your application guide for details.

ImprovementLuciadRIA

RIA-5971, RIA-5838
LuciadRIA samples and tutorials now use Vite instead of Webpack as their build tool and dev server. Vite offers a faster, unbundled dev server, and simpler configuration for common tasks such as HTTPS and loading assets as strings.

ImprovementLuciadRIA

WFSCapabilities.operations now also includes Transaction, LockFeature and GetFeatureWithLock when advertised by the WFS server. The operation names exposed through WFSCapabilities.operations are now also available as the public WFSOperationName enum.

ImprovementLuciadRIA

WFSFeatureStore now implements get(id), so you can retrieve a single feature from the WFS service by id.

ImprovementLuciadRIA

WFSCapabilities and WFSCapabilitiesOperation now expose ows:Constraint values through a new constraints property, at the service and operation level respectively.

ImprovementLuciadRIA

RIA-5959
You can now configure a getMapPostRoot, getFeatureInfoPostRoot and maxRequestURLSize on a WMSTileSetModel and WMSImageModel. If the request URL to perform a GetMap or GetFeatureInfo is larger than maxRequestURLSize and the POST roots for these requests are defined, LuciadRIA will use HTTP POST instead of HTTP GET requests to retrieve the data. In that case, all request parameters are application/x-www-form-urlencoded in the body of the request.

ImprovementLuciadRIA

RIA-5138
The LuciadRIA product documentation now includes the documentation of the LuciadRIA Toolbox components. The information in the component README files was moved and made available under the LuciadRIA Toolbox documentation section.

ImprovementLuciadRIA

RIA-5942
Improved responsiveness of the Load Spatially strategy by processing cursor contents incrementally.

ImprovementLuciadRIA

RIAMap.maxMemoryUsageHint (property and constructor option) has been deprecated in favor of RIAMap.performanceHints.maxMemoryUsage.

ImprovementDefense Symbology

RIA-6200

It is now possible to configure the APP-6A and APP-6B "Antitank Ditch" symbols to be painted using the "Under Construction" stroke pattern. To paint these symbols using the "Under Construction" stroke pattern, set the typeOfEquipment modifier to "U" or "Under Construction".

ImprovementDefense Symbology

RIA-6205
A displayName was added to HierarchicalSymbology, to get an easier human-readable name for use in labels of your UI components.

ImprovementDefense Symbology

RIA-6197
Fixed the offset calculation of military icons with an HQ echelon indicator. This offset was wrong in the presence of some other icon echelon decorations.

ImprovementDefense Symbology

RIA-6185
Fixed the placement of the headquarters and task force indicators for the MIL-STD-2525C and D and for the APP-6B, C and D "Unknown" Symbols (1.X) with defined affiliations. These indicators are now positioned against the symbol where they used to be positioned at an offset of the symbol.

ImprovementDefense Symbology

RIA-6176
Fixed the hierarchical icon for the MIL-STD-2525B "Surface to Surface Missile (SSM)" symbol (1.X.2.2.1.1.1). It now has a white filled text, instead of a black filled text.

ImprovementDefense Symbology

RIA-6195
Fixed the dimension icon for the MIL-STD-2525C "Signals Intelligence - Space Track" symbols (4.X.1). They now have a correct black filled top, instead of a thick bordered unfilled top.

ImprovementDefense Symbology

RIA-6192
Improved the frameWidth of all military icons to be automatically adjusted based on the icon size. This aligns the behavior of military icons in LuciadRIA with the behavior of military icons in other Luciad products.

ImprovementDefense Symbology

LCD-14839, LCD-14848
The APP-6E Network control measure symbols are now rendered with rounded corners. Additionally, the uniqueDesignation and additionalInformation modifier labels are now rendered with a surrounding text box.

ImprovementDefense Symbology

RIA-6116
The following input fields for the following APP-6E text modifier have been added to the military symbology sample:
  • Guarded Unit
  • Controlling Headquarters
  • Purpose
  • Special Headquarters
  • SIGINT Mobility Indicator
  • Target Designator
  • Target Number Extension
  • Unlisted Point Information

ImprovementDefense Symbology

RIA-6201

It is now possible to configure the APP-6A and APP-6B "Biological and Chemical Attack, Release Event" symbols to be painted using the "Chemical" icon. To paint these symbols using the "Chemical" icon, set the typeOfEquipment modifier to "C" or "Chemical".

ImprovementDefense Symbology

LCD-14827
The positioning of the hostile (ENY) modifier has been improved for the Direction of Movement symbols.

ImprovementPanoramic

RIA-6172
Improved the performance of visualizing panoramas. The improvement is most noticeable on mobile devices.

ImprovementPanoramic

Support for single-level, single-tile (video) panoramas on 2D geospatial maps has been added. Some limitations apply, see the panorama article for details.

Bug fixLuciadRIA

RIA-6204
Fixed an issue where TileSet3DLayer.transformation would not be applied correctly to tilesets containing Gaussian splats.

Bug fixLuciadRIA

RIA-6203
Fixed an issue where a WFSFeatureStore created from capabilities used only the first WGS 84 bounding box defined for the feature type. It now uses the union for all of them.

Bug fixLuciadRIA

Geodesy.distance with LineType.CONSTANT_BEARING now includes the north-south part of the distance for points whose latitudes differ by less than 1e-8 degree (about a millimeter).

Bug fixLuciadRIA

Geodesy.interpolate with LineType.SHORTEST_DISTANCE is now accurate for points on either side of the date line. Previously the result could be meters off the geodesic for points a kilometer apart, and centimeters off for points 100 kilometers apart. This also affected other computations on geodesic lines that cross the date line, such as their bounds.

Bug fixLuciadRIA

RIA-6182
Fixed an issue where shapes with a world-sized image fill would distort when tilting the camera in 3D.

Bug fixLuciadRIA

RIA-6102
Fixed an issue where the world-sized image fill of draped shapes would not actually be world-sized in 3D.

Bug fixLuciadRIA

RIA-6180
Rhumb line computations are now more accurate for rhumb lines that run nearly east-west.

Bug fixLuciadRIA

RIA-6056
The parsing of WMTS GetCapabilities responses now no longer throws an error when a Style element is encountered without an Identifier. If such a style is selected when you create a WMTSTileSetModel, which can happen if you don't explicitly configure a style, "default" will be used as the value of the STYLE request parameter.

Bug fixLuciadRIA

RIA-5444
Fixed a bug where adding, updating or removing a feature through FeatureLayer.workingSet before the layer was added to a map threw an error when the layer was added, leaving the layer without features. The operation is now applied once the layer is on the map.

Bug fixLuciadRIA

RIA-6113
Fixed an issue where some browser could warn about "non-uniform texture samples" and result in broken rendering.

Bug fixLuciadRIA

RIA-6110
Fixed several cases where CurveArcInterpretation.CONTINUITY could choose the wrong direction for an ArcByCenterPoint, including arcs between other arcs, single-arc curves, all-arc rings, degenerate or near-duplicate polyline points, and lon/lat data, which used planar instead of geodesic directions. This could cause an arc to take the long path around the circle instead of the intended continuous path.

Bug fixLuciadRIA

RIA-6088
Fixed an issue where a FeatureLayer could throw an unexpected error when a query was interrupted, or a new query was triggered, while the results of a previous query were still being processed.

Bug fixLuciadRIA

Fixed a bug where a balloon that overlaps the right edge of the map was squeezed, making its content wrap and the balloon much taller.

Bug fixLuciadRIA

Fixed an issue where a layer painting panoramas (GeoCanvas.drawPanorama) was clipped incorrectly while layer clipping was active (through a SwipeController, for example) and the map's displayScale was not 1. The panorama ignored the clip and kept painting across the whole map.

Bug fixLuciadRIA

RIA-6073
Fixed an issue where picking (selection, hovering, Map.pickAt and Map.pickClosestObject) ignored the swipe sides of a SwipeController when the map's displayScale was not 1. Layers on one side of the swipe line stayed pickable across the whole map, while layers on the other side could not be picked at all.

Bug fixLuciadRIA

Fixed a bug where creating a Bounds shape by tapping twice on a touch device left the shape empty. The second tap now marks the corner opposite to the first one. Creating a Bounds by dragging, or by clicking twice with a mouse, was not affected.

Bug fixLuciadRIA

RIA-6071
Fixed a precision issue that could result in 3D icons having pixel-sized holes in their surfaces.

Bug fixLuciadRIA

RIA-6069
Fixed a crash that occurred when a layer was draped onto an OGC 3D Tile set that also had Physically Based Rendering enabled.

Bug fixLuciadRIA

RIA-6048
Fixed an issue on macOS where asynchronous picking on a TileSet3DLayer could report no or another object.

Bug fixLuciadRIA

RIA-6058
Fixed an issue on macOS where picking on a point cloud could return incorrect results.

Bug fixLuciadRIA

RIA-2913
Fixed a bug where a raster layer's night side of the Earth wasn't desaturated in 2D when lighting is enabled some time after the layer has been added to the map.

Bug fixLuciadRIA

Fixed a bug where reflections could be misaligned after setting the reflection map at one location and then moving to another location on a 3D map.

Bug fixLuciadRIA

Fixed an issue where raster layers were not clipped to the outline of a conic map reference. With a Lambert Conformal or Albers Equal Area projection, the projected world is fan shaped with a wedge shaped gap (the "V") at the far side of the map, which should be left empty. Raster data was instead drawn across that gap as stretched imagery. Raster tiles are now clipped to the conic projection's valid area, so the gap renders correctly. Vector data was already clipped correctly.

Bug fixLuciadRIA

RIA-5278
Fixed an issue where clustered layers could become ready too early (whenReady()) after model updates, before pending clustering work had completed.

Bug fixLuciadRIA

RIA-5408
On a 2D map with non-uniform scales (different scales along the x-axis and y-axis), pixel-sized complex strokes now keep their intended size regardless of the per-axis scale, rather than being stretched or compressed. This could be reproduced easily on the BorderedMap from the LuciadRIA toolbox.
Comparison of 2D complex strokes before and after 2026.1.

Bug fixLuciadRIA

On a 3D map, non-draped, pixel-sized complex strokes are now evaluated in screen space. As a result, patterns (for example the dashes of a dashed line) keep a constant on-screen size regardless of the camera position. Previously, the pattern was perspective-deformed with distance.
Comparison of 3D dashed lines before and after 2026.1.

Bug fixDefense Symbology

RIA-6209

Fixed incorrect rendering of a number of APP-6A and APP-6B icons.

APP-6A:

  • Hostile or Insurgent Infantry (2.X.3.1.15): now uses the Infantry icon, where it used to have the Motorised Infantry icon.

APP-6A and APP-6B:

  • Hail (3.X.7.3): now uses the correct icon.
  • Ice Pellets (3.X.7.4): now use the correct color.
  • Ice Crystals (3.X.7.5): now use the correct color.
  • Freezing Fog (3.X.9.2.1): now use the correct color.

APP-6B:

  • Multi-Functional Earth Mover (1.X.3.2.2.3.2.1): now has a circular frame instead of a rectangular one when in the Friendly affiliation.

Bug fixDefense Symbology

RIA-6208
Fixed the calculation of the military icon offsets when used to correctly position the icon selection rectangle or the icon label. Before this fix, they were always shortly positioned with an temporary offset of (0, 0), while waiting for the actual icon promise to resolve.

Bug fixDefense Symbology

RIA-5443
Fixed an issue where military icons sometimes had off-center halos. This was the case for all icons with a certain offset (like the icons with headquarter indicators). In the meantime the quality of the halos has also been improved, to better respect the transparency of the halo color and to better match the actual halo width.

Bug fixDefense Symbology

LCD-14886

The APP-6E Cyberspace symbols now display the headquarters staff, feint/dummy and task force indicators when their hqTaskForceDummy modifier is set. Previously these indicators were missing.

In addition, the hqTaskForceDummy modifier now only offers the indicators that the APP-6E standard allows for the following symbol sets:

  • Land Equipment (15): the headquarters and task force indicators are disabled.
  • Land Installation (20): the task force indicator is disabled.
  • Dismounted Individual (27): the headquarters and task force indicators are disabled.
  • Activities (40): the feint/dummy and task force indicators are disabled.
  • Cyberspace - Non Unit (64): the feint/dummy indicator is now enabled. Previously none of the indicators were available for this symbol set.

Bug fixDefense Symbology

RIA-6174
Fixed a bug where an application that uses military symbology requested the fallback license URLs <root>/license/luciadria_development.txt and <root>/license/luciadria_deployment.txt, even though it configures its license through setLicenseText or loadLicenseFromUrl.

Bug fixDefense Symbology

LCD-14828
The hostile (ENY) modifier label is now shown for Axis of Advance symbols in APP-6E.

Bug fixDefense Symbology

LCD-14826

The APP-6E mined area symbols now display the feint/dummy indicator when their hqTaskForceDummy modifier is set to one of the Feint/Dummy values. Previously the indicator was missing, so a decoy area was indistinguishable from a real one.

The change affects the following APP-6E symbols:

  • Minefield - Dynamic Depiction
  • Mined Area
  • Mined Area, Fenced

Upgrade considerationLuciadRIA

RIA-6052

WFSQueryOptions.filter now only accepts an OGCCondition, such as the id filter returned by identifiers(). Passing property() or literal() to WFSFeatureStore.query(), spatialQuery() or queryWithLock() now results in a compile-time error.

Upgrade considerationLuciadRIA

RIA-6051

OGCCondition, a predicate that evaluates to true or false, and OGCExpression, which evaluates to a value such as a string or number, are now distinct types. The FilterFactory functions type their arguments and results accordingly, so passing an expression where a condition is expected, or the other way around, is now a compile-time error. For example, and(property("a"), ...) no longer compiles. These calls already failed at runtime.

func() returns OGCCondition & OGCExpression, so you can use a function both as a condition and as an operand. OGCFilterEncoder.encode() now only accepts an OGCCondition.

Upgrade considerationLuciadRIA

Store is now an abstract class instead of an interface, and its spatialQuery, get, add, put and remove operations are no longer optional: Store and FeatureModel always declare them, so checks such as typeof store.add === "function" no longer work. Use the new isOperationSupported(operation) method instead to find out which operations can actually be called; calling an unsupported one throws a ProgrammingError. query is always supported.

Adapt a custom store by extending Store and implementing query. Override the operations the store supports (spatialQuery, get, add, put and remove) and report them from isOperationSupported.

Store now provides the event system itself: it always has an on method and a store reports its changes with the new emitStoreChangedEvent method. on only accepts "StoreChanged", and its callback receives "add", "update" or "remove" instead of any string. Another event throws a ProgrammingError. Due to these changes, a custom store has to extend Store instead of implementing it, and a store that overrides on must narrow its callback.

Upgrade considerationLuciadRIA

Several map effect properties were renamed or re-expressed. The old names are deprecated but keep working (they are mapped onto the new ones), so existing code keeps rendering the same result.

The FogEffect now expresses fog in metric units instead of the previous unitless values:

  • density is deprecated in favor of visibility: the distance in meters at which the fog fully obscures the scene near the ground. Note that visibility works inversely to density, a higher visibility means thinner fog.
  • heightFalloff is deprecated in favor of halvingHeight: the altitude in meters over which the fog thins by half. Uniform fog, previously heightFalloff: 0, is now expressed as halvingHeight: null.

If you are unsure which values to use, start from the defaults (a visibility of 80000 m and a halvingHeight of 4000 m) and adjust from there. See the fog effect documentation for more guidance on choosing metric values.

Other effect properties were renamed only, without a change in meaning:

  • DepthOfFieldEffect: scale becomes blurStrength, focalDepth becomes focusDistance, focusRange becomes blurStartDistance, and noFocusRange becomes fullBlurDistance.
  • LightScatteringAtmosphere: affectsTerrain becomes aerialPerspective.

LightScatteringAtmosphere also gained a new mieAnisotropy property, controlling how tightly the Mie haze clusters around the sun.

Upgrade considerationLuciadRIA

RIA-6019
Store.get() and FeatureModel.get() no longer require asynchronous implementations to reject their promises when no feature with the given id exists. Custom asynchronous Store implementations should instead resolve with undefined and reserve rejection for actual failures, such as network or parsing errors. Callers that relied on a rejected promise to detect a missing feature must now handle a promise resolving with undefined instead.

Upgrade considerationLuciadRIA

RIA-5994
The handleAs option of UrlStore is deprecated. If needed, set handleAs on the underlying Codec implementation instead. All RIA stores automatically use this value.

Upgrade considerationLuciadRIA

RIA-4563

Touch and mouse input on labels no longer prevents the map from panning, zooming, or picking. The HTML label layer is now transparent to input by default, so a click or touch on label text falls through to the map. Previously, a finger resting on a label blocked the map from receiving touch events.

Interactive label content keeps working: native elements (<a href>, <button>, <input>, <select>, <textarea>, <label> and contenteditable elements) receive input automatically. To make custom content interactive, add the lcd-label-interactive CSS class to it. If you previously attached a handler to the whole label element rather than to an inner control, add that class to the element that should be clickable. See How to add interactive content to labels.

Upgrade considerationLuciadRIA

RIA-5919
The unused FeatureLayerConstructorOptions.incrementalRendering constructor option was removed. The option is no longer wired to any rendering behavior in GPU maps, so setting it had no effect. Existing applications can safely remove this property from FeatureLayer construction options.

Upgrade considerationDefense Symbology

The hostile text modifier now accepts only two values: ENY (the default) and null.

You can use the modifier to disable the ENY indicator: setting it to null removes the annotation from both the icon label and the stroke decoration of tactical graphics. Previously, symbols with a hostile affiliation were always annotated with ENY, regardless of the modifier value.

The change affects all supported military symbology standards.

Upgrade considerationDefense Symbology

MilitarySymbologyCreateController and NVGCreateController previously selected a feature automatically after creating it. This automatic selection has been removed. To enable it again, see NVG creation.

Upgrade considerationDefense Symbology

A number of control measure Line symbols in APP-6D and MIL-STD 2525D no longer display the generic PL ("phase line") label. Previously these symbols were labeled twice: once with PL followed by the first uniqueDesignation modifier, and once with the abbreviation specific to the symbol followed by the second uniqueDesignation modifier. They are now labeled only with their own abbreviation, followed by the first uniqueDesignation modifier.

The change affects the following symbols. All of them belong to symbol set 25 (Control Measure); the symbol code is given for each symbol.

  • APP-6D
    • Light Line: 110200
    • Final Coordination Line: 140700
    • Limit Of Advance: 140900
    • Line Of Departure: 141100
    • Line Of Contact: 140200
    • Probable Line Of Deployment: 141200
    • Bridgehead Line (BL): 141400
    • Holding Line: 141500
    • Release Line: 141600
  • MIL-STD-2525D
    • Light Line: 110200
    • Final Coordination Line: 140700
    • Limit Of Advance: 140900
    • Line Of Departure / Line Of Contact: 141100
    • Line Of Contact: 140200
    • Probable Line Of Deployment: 141200
    • Bridgehead Line (BL): 141400
    • Holding Line (HL): 141500
    • Release Line: 141600