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

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.

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-6113
Fixed an issue where some browser could warn about "non-uniform texture samples" and result in broken rendering.

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.

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