2020.1

2020.1.06

ImprovementLuciadRIA

RIA-3458
You can control now whether or not text should be draped on top of the terrain using TextStyle.draped API.

ImprovementLuciadRIA

RIA-3454
TextStyle.occlusionMode now allows to paint text in 3D in front of other 3D data even if the drawn text would be normally obscured.

ImprovementLuciadRIA

RIA-3399, RIA-1252, RIA-992
The Polyline and Polygon shapes are refactored to improve the performance for data loading and visualization. Decoding GeoJSON, KML and GML formats is now faster by at least 20%
ShapeFactory allows now to create Polyline and Polygon shapes without creating an array of individual Point geometries. The example below shows a new preferred way to create a polyline or polygon.

      const polyline = createPolyline(reference, [[0,0], [5,2]]);
      const polygon = createPolygon(reference, [[0,0,1000], [5,2,1000], [0,4,1000]]);
    

ImprovementLuciadRIA

RIA-3350
ReferenceProvider now has support for WKT and EPSG references that use the Krovak projection. The following EPSG codes that use this projection are now supported:
  • EPSG:2065
  • EPSG:5221
  • EPSG:5513
  • EPSG:5514
  • EPSG:8352
  • EPSG:8353

ImprovementDefense Standards

RIA-2053
Tactical graphics with a crossing in their axis of advance now have their crossover point between the first two points of the symbol, as specified by the standard. This affects the following symbols:
  • MIL-STD-2525b: G*G*OLAV--****X - Friendly Aviation
  • MIL-STD-2525b: G*G*OLAA--****X - Friendly Airborne
  • MIL-STD-2525c: G*G*OLAV--****X - Aviation
  • MIL-STD-2525c: G*G*OLAA--****X - Airborne
  • MIL-STD-2525d: 10002500001514010000 - Friendly Airborne/Aviation
  • APP-6A: G*C*MOLAF-***** - Friendly Aviation
  • APP-6A: G*C*MOLAA-***** - Friendly Airborne
  • APP-6B: G*C*MOLAF-***** - Friendly Aviation
  • APP-6B: G*C*MOLAA-***** - Friendly Airborne
  • APP-6C: 10002500001513000000 - Airborne/Aviation Axis Of Advance
  • APP-6D: 10002500001514010000 - Friendly Airborne/Aviation

ImprovementDefense Standards

RIA-2447
Changed the editing behaviour of the 'Rectangular Target' symbol to more closely match the symbol definition in the military standards: the symbol is now defined by a center point and the "length", "width", and "attitude" text modifiers. Creating such a symbol programmatically with two or more points will revert back to the legacy visualization and editing behaviour, where the points define the start and end point of the buffer axis. The following symbols are affected by this change:
  • MIL-STD 2525b: 2.X.4.3.1.1 - Rectangular Target
  • MIL-STD 2525c: 2.X.4.3.1.1 - Rectangular Target
  • APP-6C: 10002500002306000000 - Rectangular Target

ImprovementDefense Standards

RIA-2110
Improved creation and editing of Weapon/Sensor Range Fan symbols to better match the symbol definition in the military standards. Creation now follows the next steps:
  1. Indicate the origin point A
  2. Indicate a point B on the minor radius of the first sector
  3. Indicate a point C on the left side of the first sector
  4. Indicate a point D on the right side of the first sector Note: the major radius is defined by the point (C or D) that is furthest away from B.
  5. Repeat steps 2, 3 and 4 for the subsequent sectors.

ImprovementDefense Standards

RIA-2797
Support was added for rounding of the corners of tactical graphics. The default behaviour will still be to apply no rounding. To activate rounding, you'll need to adjust your MilitarySymbologyPainter and add a style-property cornerSmoothness with a value between 0 (no rounding) and 1 (very smooth rounding).

ImprovementDefense Standards

RIA-2588
Support was added for the following symbologies:
  1. MIL-STD-2525d
  2. APP-6D
In SymbologyNode, the method createTemplate was deprecated in favor of createTemplates because it's possible that multiple geometries are supported for a symbol.

Bug fixLuciadRIA

RIA-3457
Fixed a circular dependency between RIA's internal Quaternion and Vector3 modules.

Bug fixLuciadRIA

RIA-3455
Fixed a problem with drawing rasterized text (GeoCanvas.drawText()) on a hardware-accelerated map, where the same text is drawn in place of requested ones. This situation can happen when there are many draw text requests for a single geometry.

Bug fixLuciadRIA

RIA-3443
Fixed a problem with the creation of OGC FilterFactory.sub filter with a negative FilterFactory.literal value.

Bug fixDefense Standards

RIA-3369
Icon caching in the Military Symbology Painter now also discriminates on affiliation colors. Military symbols in a single layer are now rendered correctly when different features use different affiliation color schemes and when affiliation color schemes are adjusted at runtime.

Bug fixPanoramics

RIA-3439
Fixed an issue where FusionPanoramaModel did not properly pass the credentials and requestHeaders constructor options to the base PanoramaModel.

2020.1.05

Bug fixLuciadRIA

RIA-3403
Fixed an issue when an Uncaught ReferenceError is thrown when rendering axis on a vertical view map. This problem can occur when an application is built in the production mode with specific configuration.

Bug fixLuciadRIA

RIA-787, RIA-3405
The WebSocketNotifier no longer uses emit() on the delegate Store to signal changes, but updates the delegate Store instead. The emit() method was an internal method and was removed. This broke the Tracks and the COP sample.

2020.1.04

Bug fixLuciadRIA

RIA-3370
Fixed an issue where point count constraints, set by CreateController.setPointCount were ignored when creating a military symbology feature.

Bug fixLuciadRIA

RIA-3385
Fixed an issue in WebGL maps with a cartesian reference when using geoCanvas.drawIcon3D would cause an error and the 3D icon was not visualized.

Bug fixLuciadRIA

RIA-3364
Fixed an issue that could cause warnings to be logged when using TileSet3DLayer's styling expressions capabilities.

Bug fixLuciadRIA

RIA-3374
Fixed an issue when switching a line from draped to non-draped. The line would disappear.

Bug fixLuciadRIA

RIA-3398
Fixed an issue where an error is thrown when attempting to insert null to MemoryStore. This situation can happen when a layer uses LoadSpatially strategy with different scale levels on a 3D map.

Bug fixLuciadRIA

RIA-3394
Fixed an issue where a NotImplementedError was thrown when right-clicking on a shape that is being edited.

2020.1.03

ImprovementLuciadRIA

RIA-3355
Improved behavior for launching query requests on model changes (FeatureModel emits ModelChanged events). Now the LoadingStrategy does not trigger query requests when model changes and the layer does not use ClusteringTransformer.

ImprovementLuciadRIA

RIA-3357
Some HSPC datasets could present misaligned attributes per WebGL standards, preventing their visualization. In such cases, data is now realigned to offer a reliable visualization of the data.

ImprovementLuciadRIA

RIA-997
MemoryStore can now be created with spatial index allowing to run spatial queries on stored features. For more information please consult MemoryStoreConstructorOptions.spatialIndex API.

Bug fixLuciadRIA

RIA-3365
Fixed an issue when using a 3D mesh icon for two features, where one feature has elevation 0 and the other does not. This caused internal state errors resulting in errors on the browser console.

Bug fixLuciadRIA

RIA-3363
Improved throughput of feature updates in cases where the features are distributed over many layers. This improvement is most noticeable on Windows+Chrome.

Bug fixLuciadRIA

RIA-3358
WMS Capabilities parsing will no longer fail if Exception formats are missing in the GetCapabilities response. Although the XML Exception tag is mandatory, some servers may omit it. WMSCapabilities.exceptionFormats() will return an empty array in that case.

Bug fixLuciadRIA

RIA-3352
If the GetFeatureInfo operation is missing from GetCapabilities response, the WMSCapabilities.operations array no longer contains an invalid null entry.

2020.1.02

ImprovementLuciadRIA

RIA-3351
The default scrollwheel zoom implementation is now more performant on 3D maps.

Bug fixLuciadRIA

RIA-3315
Fixed an issue with CreateController when creating shapes with a limited point count (as is the case for some tactical graphics). The controller would deactivate before it handled a SINGLE_CLICK_CONFIRMED event. This event would 'leak' into the default map event handling, triggering a selection on the newly created shape.

Bug fixLuciadRIA

RIA-3202
Fixed an issue where errors were thrown when a 3D map has a width or height of 0 pixels.

2020.1.01

ImprovementLuciadRIA

RIA-3303
HSPCTilesModelDescriptor now exposes the data type of a property when available. Using this information, it is possible to estimate what is the effective range of a property and style accordingly.

ImprovementLuciadRIA

RIA-3335
It is now possible to change how a quality factor given to a TileSet3DLayer behaves in the distance. Using the newly introduced attribute TileSet3DLayer.qualityFactorDistanceFalloff, a multiplier over the quality factor can be applied at specified distances. This can help in finding the balance between performances and visual quality, for instance by having a higher factor in the foreground than in the background.

ImprovementDefense Standards

RIA-3299
The following symbols are now supported:
  • MIL-STD-2525b: Wind Plot - WAS-WP----P----
  • MIL-STD-2525c: Wind Plot - WAS-WP----P----
  • APP-6A: Wind Barb - W*A*W-----*****
  • APP-6B: Wind Barb - W*A*W-----*****
  • APP-6C: Wind Barb - 10004500001126000000

Bug fixLuciadRIA

RIA-3320
Fixed an issue where a ProgrammingError not defined error occurs when the WMS service doesn't have the specified layer. Now an error indicating that the layer doesn't exist in the service will be thrown.

Bug fixLuciadRIA

RIA-2825
Fixed an issue with fitting (MapNavigator.fit) on near-worldwide bounds. The map would fit on a location near lon-lat [0,0], zoomed in too much. Now, it correctly shows the entire globe.

Bug fixLuciadRIA

RIA-3334
Fixed an issue in which data attributes were not correctly parsed from HSPC datasets prior to version 8. This caused issues when trying to use expressions with such data, leading to attributes that could not be found while effectively there.

Bug fixLuciadRIA

RIA-3296
Fixed an issue in the Rich Client API where GetCapabilities documents could not be parsed if the service URL contained a question mark.

2020.1

New featurePanoramics

You can now visualize panoramas in LuciadRIA. To do this, you call GeoCanvas.drawPanorama in FeaturePainter.paintBody after assigning a PanoramaModel to FeatureLayer.panoramaModel. If you want to visualize panorama data processed by LuciadFusion, you should use FusionPanoramaModel. LuciadRIA can visualize panoramas in a cubemap image format, or in equirectangular format. The panoramic imagery can be multileveled as well (in both formats). Please refer to the API documentation for details. The "Panorama" sample also demonstrates how you can use the RIA panorama API. Note that you'll need a license for the LuciadRIA "Panoramics" optional module for this API to work.

ImprovementLuciadRIA

RIA-1669
The default styling of editing handles was changed to a non-draped circle icon. If you prefer the old EditController handle icons, you can still set that style using:

      const editController = new EditController(layer, feature, {
        handleIconStyle: {
          image: IconFactory.rectangle({ // from samples/common (@luciad/ria-sample-common/IconFactory)
            stroke: "rgb(0,0,0)",
            strokeWidth: 1,
            fill: "rgb(255,255,255)",
            width: 10,
            height: 10
          }),
          width: "10px",
          height: "10px",
          zOrder: 10
        }
      });
    

ImprovementLuciadRIA

You can now schedule the automatic data reloads in a FeatureLayer using LoadingStrategy API. The new LoadingStrategy.refresh property accepts the following values:
  • number - the loading strategy refreshes every n milliseconds.
  • Date object - the loading strategy will refresh at that time.
  • null - the loading strategy never refreshes.
This API can be used to implement a KML layer, created based on KMLNetworkLinkFeature, that reloads data according to KMLLink object.

ImprovementLuciadRIA

HSPCTilesModelDescriptor now exposes more information about its metadata properties. Properties now have a role that describes their type. It is now possible to detect if a model exposes colors or intensity for instance. This can be useful for styling and filtering.

ImprovementLuciadRIA

RIA-2545
It is now possible to decode KMZ files with LuciadRIA. Both KMLModel and KMLCodec accept KMZ files.

ImprovementLuciadRIA

RIA-1337
KMLCodec is introduced which can be used with existing Store implementations. For example, you can now connect to a WFS service that returns KML using the KMLCodec in combination with the WFSFeatureStore.

ImprovementLuciadRIA

LuciadRIA can now parse version 2.3 KML files with the following:
  • Placemark items
  • Network links
  • Container elements
  • Ground overlays
  • KMZ data can now be parsed.
For more information on these new features have a look at the documentation on KMLCodec and KMLModel. A KML sample was also added to demonstrate how the new API can be used to create a tree view UI component.
See also the how-to article on visualization of KML data.

ImprovementLuciadRIA

RIA-3265
Draco compressed pnts datasets are now detected, with a proper warning logged to notify they are not supported yet.

ImprovementLuciadRIA

RIA-3099
It is now possible to obtain the bounds of a tile in a RasterTileSetModel. This may come in handy if you have to pass the tile bounds in tile requests.

ImprovementLuciadRIA

FeaturePainter implements the Evented interface and exposes the "Invalidate", "InvalidateById" and "InvalidateAll" events that are emitted when corresponding invalidation methods are called.

ImprovementLuciadRIA

You can now have transparent objects in a TileSet3DLayer, for example based on an OGC 3D Tiles mesh dataset. The transparency can originate from transparent pixels in an rgba texture, transparent colors in a vertex attribute, or transparent colors from a color expression.

Since painting with transparency can have a performance impact, it is disabled by default. You can enable it with the new flag transparency on TileSet3DLayer. When disabled, any transparent surfaces will just be opaque.

ImprovementLuciadRIA

RIA-1370
Use the LoadingStrategy.shouldUpdate API to decide if an existing feature should be replaced by a feature that comes from a processed query cursor. You can implement a custom shouldUpdate predicate to control how changes to features should be handled by LuciadRIA. This API is extended now to include the LoadEverything strategy too. Please note that LoadSpatially already exposes this API since releases 2018.1.

ImprovementLuciadRIA

It is now possible to displace terrain geometry by setting a RasterStyle.displacementExpression on the RasterTileSetLayer.rasterStyle of an elevation layer. This can for example be used to flatten the terrain in an area where you want to place a 3D mesh of a building.

ImprovementLuciadRIA

It is now possible to add an outline to a TileSet3DLayer by using TileSet3DLayer.outlineStyle. Additionally it is now also possible to make your TileSet3DLayer visible when it is obscured by another layer, for example underground pipes beneath another mesh. To enable this you need to set an OcclusionStyle via TileSet3DLayer.occlusionStyle. With OcclusionStyle.bodyColorExpression you can control the color of the occluded part of the layer. An outline can also be configured for the occluded part of the layer using OcclusionStyle.outlineStyle.
Building in a 3D tiles layer with an outline and occlusion style.
Building in a 3D tiles layer with an outline and occlusion style.

ImprovementLuciadRIA

RIA-3209
Improved TypeScript definition for Decoration.alignment property. The property accepts now only expected string literals: "left", "center" or "right".

ImprovementLuciadRIA

The Icon3DStyle now accepts both glTF version 1.0 and 2.0. Additionally it's now possible to use binary glTF as well.

ImprovementLuciadRIA

Labels drawn on borders of a Cartesian map are positioned by default as follows:
  • PointLabelPosition.SOUTH for labels drawn on the bottom border
  • PointLabelPosition.WEST for labels drawn on the left border

ImprovementLuciadRIA

Cartesian references which can be created with ReferenceProvider.createCartesianReference can now be used as the world reference on a WebGLMap. This allows you to visualize non-georeferenced data on a WebGLMap, e.g. timeline, image defined in CRS:1, etc.

The use of a WebGLMap with a Cartesian reference is demonstrated in the timeline, vertical view and image viewer sample.

A WebGLMap with a Cartesian reference has the following limitations:

  • For raster data the reference of the data and the map must be equal, e.g. both must use CRS:1.
  • World sized styling is not supported.
Timeline on a WebGLMap with a Cartesian reference
A WebGLMap with a Cartesian reference can be used to create this timeline for example.

ImprovementLuciadRIA

RIA-3114
The type of Feature.properties is FeatureProperties instead of object. Now it's no longer needed to cast Feature.properties to a specific type in order to prevent typing issues when accessing an arbitrary property.

ImprovementLuciadRIA

The atmosphere effect of GraphicsEffects was enhanced. The atmosphere can now more accurately visualize time of day. See LightScatteringAtmosphere for more details.

ImprovementLuciadRIA

RIA-3100
The model accessor of RasterTileSetLayer is now more precisely typed with RasterTileSetModel | null instead of Model | null.

ImprovementLuciadRIA

LuciadRIA now supports HSPC version 12.

Bug fixLuciadRIA

Fixed the type definition of BasicFeaturePainter.setStyle and BasicFeaturePainter.getStyle. It no longer takes a complete PaintState object, but rather just an object literal with a selected property (no need to specify a level, which isn't used by BasicFeaturePainter).

Bug fixLuciadRIA

RIA-3115
Fixed the ordering of multiple icons at the exact same 3D location. The painting now follows the regular ordering based on layer and z-order.

Bug fixLuciadRIA

RIA-2968
Improved the performance of feature updates through model changes on a WebGLMap. This is particularly noticeable when regularly updating thousands of track positions. Such scenarios had regressed compared to LuciadRIA 2019 and LuciadRIA 2018. Now its performance has improved by up to 50% compared to previous releases.

Bug fixLuciadRIA

RIA-3121
The ContextMenuManager in the samples now only consumes click events on the document.body node when the context menu is being displayed. This makes the ContextMenuManager compatible with UI frameworks like React. Before this change, React components would not respond to click events.

Bug fixDefense Standards

RIA-3230
The caching for symbols retrieved from the SymbologyServer is now optimised to make sure that for each symbol only a single request is sent to the server.

Upgrade considerationLuciadRIA

HSPCTilesModelDescriptor now exposes the properties as an object. Before 2020.1, they were exposed as an array of strings encoding their names. The format is now aligned on the one given in the OGC3DTilesModelDescriptor. If you were reading the property array, you will need to change the logic to loop on the members of this new object.

Upgrade considerationLuciadRIA

The KMLLayer.painter now respects the visibility flag when drawing KML features. Prior to 2020.1 release, KML features were always visible disregarding the visibility. The previous behavior can be restored by forcing the visibility value to "true".
      layer.workingSet.on("QueryFinished", () => {
        layer.workingSet.get().forEach(kmlFeature => kmlFeature.properties.visibility = true);
        layer.painter.invalidateAll();
      });
    
An alternative solution is to create a user interface to control visibility of KML features. The "KML" sample demonstrates how to create such a UI component.

Upgrade considerationLuciadRIA

Codec.decode can now also return a Promise<Cursor>. If you are using this you will need to do a type check first.

Upgrade considerationLuciadRIA

The RasterStyle interface was moved to its own module. Since this is a type only import, only TypeScript projects are affected by this change. In your TypeScript code you will need to update the import to import {RasterStyle} from "@luciad/ria/view/style/RasterStyle"

Upgrade considerationLuciadRIA

The ES modules version of LuciadRIA no longer has out-of-the-box support for Internet Explorer 11. This makes the LuciadRIA modules smaller in size and it results in more performance on modern browsers. If you do still need Internet Explorer 11 support, you can use the AMD version of LuciadRIA. Alternatively, you can transpile LuciadRIA's ES modules down to ES5 with IE11 support, using a transpiler like Babel. The "Supporting Internet Explorer 11" how-to article explains how you can do this. Note that LuciadRIA samples will no longer run on Internet Explorer 11 out-of-the-box.

Upgrade considerationLuciadRIA

Functions that had Promise<number> | Promise<string> in their return type, now return Promise<number | string>. As a result you might need to change some casting in your TypeScript code. This change affects functions on WorkingSet and FeatureModel.

Upgrade considerationLuciadRIA

The way inheritance is implemented in the constructor of ES5 classes, has changed. If you subclassed a RIA class in ES5, like this:
      function SubClass() {
        SuperClass.call(this, arg1, arg2);
        this._field = arg1;
      }

      SubClass.prototype = Object.create(SuperClass.prototype);
      SubClass.prototype.constructor = SubClass;
    

You'll have to change the implementation of the constructor, like this:

    function SubClass() {
      var _this = Reflect.construct(SuperClass, [arg1, arg2], this.constructor);
      _this._field = arg1;
      return _this;
    }

    SubClass.prototype = Object.create(SuperClass.prototype);
    SubClass.prototype.constructor = SubClass;
    

Note that Reflect.construct is not available on Internet Explorer. If you're targeting Internet Explorer, you will have to make sure that a polyfill for Reflect.construct is available.

If you're using ES6 classes, no changes are necessary.

Upgrade considerationLuciadRIA

LayerTreeVisitor has been converted to an interface, thus you can no longer extend from it. The default implementation had no functional use, thus removing the inheritance from your code does not change any functionality.