Release notes for 4.23
This release provides many updates for FlowRenderer (formerly known as AnimatedFlowRenderer) that bring this renderer out of beta.
FlowRenderer supports color, size, and opacity visual variables, which can be used on the layer's
Magnitude field. You can also change the direction of the flow using the new
FlowRenderer can now be used with the TimeSlider widget, and the flow visualization will update at each time slice. Lastly, we added support for smart mapping and webmap persistence.
The following sample uses the FlowRenderer with visual variables to visualize wind speeds during Hurricane Ida.
Basemaps with different spatial references
At version 4.23, you can switch the spatial reference of the MapView by changing the spatialReference property or by changing the basemap using the BasemapGallery or BasemapToggle widgets. The following changes were made as part of this work:
- BasemapGallery and BasemapToggle
widgets can be set up with basemaps of different spatial references. You can switch between those basemaps in your application, and the view's spatial reference will automatically update.
To opt out of this, set the MapView.spatialReferenceLocked
true- this will disable any basemaps with a spatial reference that does not match the MapView.
- The spatial reference of MapView.extent, MapView.center, and MapView.viewpoint.targetGeometry no longer needs to match MapView.spatialReference.
- MapView.goTo() accepts geometries with spatialReferences that differ from
Check out Client-side projection and Basemaps with different projections samples to see this in action.
Emphasize high density areas in your scene thanks to the added support for HeatmapRenderer in SceneView. Visualize point features that are clustered by location or using a layer’s attribute values. The resulting raster can be draped on the ground or on top of integrated mesh layers, while supporting the same color ramps as MapView to render intensity. A new property referenceScale allows you to adjust the blur radius independent of the current viewing scale.
Try out the new heatmap sample to explore traffic accidents in Munich.
Change the weather in your scene using the new weather widget. Each of the available weather types is represented through built-in Calcite icons, while a slider allows you to interactively adjust the cloud cover or fog density.
Discover the widget in the updated weather sample.
Line style markers
Add markers to your line features to emphasize their starting and ending points, or arrows to indicate a direction. The new LineStyleMarker3D class provides a variety of styles aligned with the existing 2D capabilities. The markers can be driven by attribute values and support using visual variables.
Explore the first expedition to Antarctica with the help of new line markers and label placement in this sample.
Label alignment and styles
Improve the appearance of labels and text in your scenes by using the new styling options on TextSymbol3DLayer. Updates include decorations (such as underlines and strikethrough), settings for better text layout (i.e. line spacing and alignment), as well as loading custom fonts. Emphasize specific labels or enhance readability by adding a background to the label symbol.
Light up your 3D visualizations around the globe, especially in polar areas. A new VirtualLighting positions the light source relative to the camera, minimizing the amount of visible shadows. Assign it to SceneView.environment.lighting as an alternative to the existing lighting, mimicking realistic sun light.
See how the new virtual lighting helps explore exaggerated terrain around the globe in this sample.
Programmatically place client-side measurements, slices and line of sight analysis in your scene. With this release we are introducing new analysis types DirectLineMeasurementAnalysis, AreaMeasurementAnalysis, SliceAnalysis and LineOfSightAnalysis that can be added to SceneView.analyses for visualization and evaluation. You can also pass the analyses to the constructor of their respective widgets and view models for further user interaction.
A new sample shows how to create analysis from geometries.
New and improved Editor widget
This release introduces significant changes to the Editor widget, including an updated UI that contains SnappingControls and a selection tool. The updated UI streamlines the process for creating and updating features which includes support for batch (continuous) feature creation. It is now possible to create multiple features of the same type at once. When doing so, a form displays for each newly-created feature and attributes can be updated as needed.
These updates are just a few of improvements on the Editor roadmap. Expect to see more updates as future versions are released.
|4.22 (Two dialogs for one workflow)||4.23 (all-in-one)|
Notice how the snapping UI is automatically integrated into the Editor. After choosing the type of feature to create, it is possible to continuously create new features. The attributes provided are saved within each feature and can be updated as needed.
Support for Contingent Attribute values
The FeatureForm widget added support for contingent attribute values. Contingent values are a data design feature (introduced in ArcGIS Pro 2.4) that restricts the valid field inputs in one field based off the field value chosen in another field. This helps enforce data integrity in editing workflows.
The FeatureForm will automatically detect if a feature service was published with contingent values. The form will provide a “Recommended” list of field input values for the values that would be considered valid in a contingency. The rest of the field inputs that are available, but not considered valid will be available under the “Other” list of field inputs. Fields with domains are required when creating contingent values.
The FeatureForm widget added additional support for reading calculated Arcade expressions on field elements. In addition to visibilityExpression and requiredExpression properties, two additional properties were added that make use of calculated expressions. The valueExpression property allows a reference to an Arcade expression. Once this expression is evaluated, the results can be passed as a value to the field. The editableExpression property allows a field to be set as not editable based on whether the expression returns
true for allowed editing or
false disabled editing.
FormTemplate.expressionInfos returns three additional returnTypes. In addition to
boolean, it now also returns
MapView.hitTest() now returns all features that intersect the specified screen coordinates from FeatureLayer, CSVLayer, GeoJSONLayer, GraphicsLayer, StreamLayer, OGCFeatureLayer, WFSLayer, GeoRSSLayer, MapNotesLayer, and KMLLayer. Previously, it only returned the topmost feature from a layer.
Use reactiveUtils to watch properties
This release introduces reactiveUtils to provide new utilities and convenience functions for watching properties inherited from Accessor. It offers significant enhancements over watchUtils. Some of these enhancements include: improved developer usability and type safety, (i.e. using optional chaining of object properties), as well as the ability to work directly with Collections and multiple properties.
reactive can watch the state on a variety of different data types and structures, and it allows for combining values from multiple sources, this reduces or eliminates the need to create multiple watchers.
The following code snippets compare watching the
view.updating property with both
reactive. Take note of the different syntax.
// WatchUtils: watch for changes in the view's "updating" property, ie. true/false watchUtils.watch(view, "updating", (updating) => console.log(updating)); // ReactiveUtils: Does the same as above with slightly different syntax reactiveUtils.watch(() => view.updating, (updating) => console.log(updating));
Checkout the Property Changes with ReactiveUtils sample for a demonstration of these new capabilities.
Aggregate spatial statistics
Version 4.23 added support for aggregate spatial statistics. A statistics query can now return an aggregate extent, center or convex-hull geometries encompassing features when the statistics are grouped by fields. The aggregate geometries will return with result features and can be accessed via the aggregateGeometries property. Check out the Aggregate spatial statistics sample to see it in action.
RouteLayer is a new layer that provides routing analytics and route visualization in 2D MapViews. A RouteLayer consists of two or more stops, and optionally, barriers. Solved routes can be saved individually as an ArcGIS Online or Portal item, or as part of a webmap. See RouteParameters for more information on input parameters for solving a route request. Results include overall travel time, distance, and turn-by-turn directions.
Note that in some instances you may want to use the route.solve() method.
For example, the RouteLayer always requests output of type
feature, whereas you may prefer the historic route result type.
Additionally, RouteLayer always requests all inputs to be returned in the solved route. In more complex scenarios this may not be optimal.
At a future release, the RouteLayer will be integrated with the Directions widget. This will allow new RouteLayers to be created and saved from the Directions widget, as well as allowing the Directions widget to open and even update existing RouteLayers.
Checkout the Intro to RouteLayer sample to see it in action.
Improved graphic highlighting
Sketch graphic highlighting was improved for CIMSymbol, PictureMarkerSymbol, and TextSymbol graphics. The highlight better encompasses the graphic symbol.
Sketch graphic highlighting can now be overridden with MapView.highlightOptions.
Configure snapping UI with visible elements
Visible elements are supported on many widgets to control what UI elements are displayed in the widget. In this release, we added VisibleElements.snappingControlsElements to the Sketch widget to show or hide snapping UI elements.
The FeatureTable widget had some significant updates this release:
- Sort multiple fields by setting FeatureTable.multiSortEnabled to
true. Setting the direction and new initialSortPriority properties provides control over what column gets prioritized over others when the table initially displays. If these combined properties are not set, the priority defaults to the most recently sorted column. The image below shows the second column, "Enrollment", having a higher sort priority than the "School Name".
- When rows are selected in the table, two new menu items will be displayed:
Show selected recordsand
Zoom to selection. These can also be called programmatically using filterBySelection() or zoomToSelection().
- The FeatureTable will automatically refresh when its associated layer has been updated. This behavior can be turned off by setting FeatureTable.autoRefreshEnabled to
- Hide or show menu items for columns with the
Popups will display attachments as thumbnail images instead of listed links by default when working with a webmap that is using a default template or when calling the createPopupTemplate method on a layer.
In addition, some updates were made for controlling the behavior of popups. The new
chart ability has been added to the
FeatureViewModel to control the animation of charts residing in media content elements
within Popup and Feature widgets.
should option for the Popup
open method has been added as an accessibility enhancement to provide a way to set focus to the popup automatically as it opens.
Update the color and opacity of the trace result with the defaultGraphicColor property in the UtilityNetworkTrace widget.
Additionally, you can override the label and description headings and sub-headings of both the "Starting points" and "Barriers" sections of the widget using the inputSettings property.
Both the starting and barrier point graphic symbols can also be overridden with the
input. Only SimpleMarkerSymbols and PictureMarkerSymbols are currently supported.
You can restrict users to only move the slider thumbs inside a subset of the
max using the new effectiveMax and effectiveMin properties on Slider widget.
This can be useful for representing ranges of values in a dataset that should not be selected or filtered with the slider. For example, you may want to use a slider to represent the full range of data, but prevent the user from including outliers in a selection of features.
// slider.max = 100 slider.effectiveMax = 60; // slider.min = 0 slider.effectiveMin = 10; // now the user cannot slide thumbs beyond the bounds of 10-60. The inactive part of // the slider track may be used to communicate what data exist even if it can't be filtered
You can easily update the sprite source for your VectorTileLayer style by calling setSpriteSource method and passing the URL of your new sprite source. This eliminates the need of having to update the sprite source in the style json file.
ImageryLayer can be highlighted now as we added ImageryLayerView.highlight() method.
We've improved the performance when working with large image services with multiple bands by switching to Web Assembly for the LERC decoder for ImageryLayers.
In previous releases, VectorFieldRenderer.symbolTileSize value was capped at 30 for performance reasons. At 4.23, you can set the
symbol to a number less than 30 and the renderer will perform well.
Enhanced labeling support for MapImageLayer
Previously, MapImageLayer could only be labeled using SQL and
the labelExpression property. Now, if
working with a MapImageLayer that supports Arcade, you can also label using Arcade and the
labelExpressionInfo property instead.
To determine if a layer supports this, check the supportsArcadeExpressionForLabeling
true, then labelExpression or labelExpressionInfo can be used. If
false, then only labelExpression can be used.
Printed legend support for tiled layers
Tiled layers are now supported in the printed legend using the Print widget
and rest/print. Tile layers must still have
legend equal to
to display in the Legend widget and the printed legend.
CIMSymbol - improved support
Each release, we continue to improve support and fix bugs for CIMSymbol. In this release, we added support for overriding effects, which allows you to use a PrimitiveOverride to override a property defined in a CIMGeometricEffect.
We have also updated the CIMSymbol documentation so that you no longer need to view the CIM specification in order to create your CIM symbols. All supported properties from the CIM spec are included in the API Reference, along with images and code snippets.
We added Collection.at(), which allows you to return an item at the specified index. Unlike Collection.getItemAt(), the
at() method allows you to return items from the end of the collection using negative integers.
// get the layer at the first position // (i.e. the layer rendered below all others, // but on top of the basemap) let firstLayer = map.layers.at(0); // get the layer at the last position // (i.e. the layer rendered on top of all others) let lastLayer = map.layers.at(-1);
Updates to OAuth Authentication
OAuth authentication now defaults to automatically use short-lived access tokens generated via two-step with Proof Key for Code Exchange (PKCE) flow. This will be the default behavior for applications using the default page redirection for OAuth sign-in. This update follows the recommendations suggested in the OAuth 2.0 Security Best Current Practices specifications.
Prior to this version, the default was to use the one-step flow. Once authenticated, an access token would append as a URL hash to the client in a single step. This could potentially cause problems if the token was leaked or stolen since any resource accessible using this token would also be compromised.
Applications utilizing two-step authentication with user sign in via a popup window should opt in by setting
flow. In addition, any existing callback page should be updated to support it. To aid in this, the default oauth-callback.html has been updated to allow for the two-step approach, although it will still work if using the one-step flow.
This update should be transparent with no changes needed by the developer if popups are not used for signing in and the application accesses ArcGIS Online or a version of ArcGIS Enterprise that supports PKCE.
Added classes, properties, methods, events
Deprecated classes, properties, methods, events
Animated, which was released in beta at version 4.22, was renamed as FlowRenderer in this release.
- Popups using a default template will now display attachments as thumbnail images instead of listed links.
- Directions.lastRoute and DirectionsViewModel.lastRoute now return a value of type RouteLayerSolveResult.
- Directions.getDirections() and DirectionsViewModel.getDirections() now return a promise which resolves to RouteLayerSolveResult.
- Stops added to DirectionsViewModel.stops using add() or addMany() must be of type Stop instead of type Graphic.
- SliceViewModel.clear() now only clears the SliceViewModel.shape of the slice, without affecting SliceViewModel.excludedLayers and SliceViewModel.excludeGroundSurface. These properties should be cleared manually if desired.
- In a SceneView, the default vertical alignment of a TextSymbol or TextSymbol3DLayer used outside of a label has changed from
baseline. To revert to the alignment behavior of previous releases, set the
verticalof the text symbol to
The following classes, methods, properties and events have been deprecated for at least 2 releases and have now been removed from the API:
|Class/Property/Method/Event||Alternate option||Version deprecated|
Please refer to the Breaking changes guide topic for a complete list of breaking changes across all releases of the 4.x API.
Bug fixes and enhancements
- BUG-000111371: MapView now accepts center, extent or viewpoint.targetGeometry with projections that do not match view spatialReference.
- BUG-000120919: Fixed an issue where a popup was displaying different number results depending on where features where clicked.
- BUG-000138677: Fixed an issue with WMSLayer sending a lowercase value for the
transparentparameter instead of an uppercase value.
- BUG-000139261: The FeatureTable now supports zooming to selected features within the table.
- BUG-000139569: Fixed an issue with Sketch where it was difficult to determine whether a graphic with certain symbology was selected.
- BUG-000140688: Fixed an issue with popups not loading an image when a URL is specified with a linkURL in the ImageMediaInfoValue.
- BUG-000142065: Fixed an issue with a WMSLayer with a spatial reference of EPSG: 3045, 3046, 3835, or 3836 failing to load due to bounding box values not being in the correct order.
- BUG-000144839: Fixed an issue with Sketch where an error is thrown when overriding the popupTemplate on the graphic returned from a create event.
- BUG-000145335: Fixed an issue with the IdentifyParameters.layerIds property not being properly handled in an identify request.
- BUG-000145914: Fixed an issue with the documentation explaining which units are available in the measurement widgets.
- BUG-000145975: Fixed an issue with FeatureEffect and labeling, where the labels would not be shown if FeatureEffect was set to
- BUG-000146147: Fixed an issue where StreamLayerView.filter stops getting updated when toggled a few times if the StreamLayer has labels.
- BUG-000146233: Fixed an issue where StreamLayer.definitionExpression always uses the previously defined definitionExpression.
- BUG-000146346: Fixed an issue where resizing a CIMSymbol when FeatureReductionCluster was set on the layer only applied to one symbol layer. Now all symbol layer sizes properly scale for clusters.
- BUG-000147011: Fixed an issue where
maxparameter not being sent in query requests when the service does not quantization.
- BUG-000147540: Fixed an issue in SceneView with StreamLayer.customParameters that were not appended to all the requests.
- Esri Community - 1130415: Fixed an issue where some widget buttons were missing a
type=buttonproperty. This only affects button elements when wrapped in a form.
- Esri Community - 1131736: Fixed an issue where some TravelMode parameters were not being properly set for some routing services.
- GitHub - 150: Fixed an issue where BasemapGallery widget selects basemaps with same URL but different layers.
- GitHub - 379: Fixed an issue where client-side FeatureLayer fields with parenthesis fail to be created.
- Fixed an issue where CIMSymbols with rotated CIMPictureMarker symbol layers were getting cut off at tile boundaries.
- Fixed an issue where CIMSymbols with primitive overrides were not getting updated when a graphic's attribute changed.
- Fixed an issue where features from FeatureLayer were disappearing along tile boundaries.
- Fixed an issue where GroupLayers in a MapView consume too much GPU memory.
- Fixed an issue where TimeSlider widget did not automatically switch from
widelayout when the app window resizes.
- Fixed an issue where the Legend for relationship renderer displayed text in the wrong order for right-to-left languages.
- Fixed an issue with LineOfSightViewModel.start() now always clears the LineOfSightViewModel.observer and LineOfSightViewModel.targets properties, and starts the creation of a new line of sight. To resume the creation of a line of sight without clearing any properties use LineOfSightViewModel.continue().
- Fixed an issue with SliceViewModel.start() which now always clears the SliceViewModel#shape, and starts the creation of a new slice plane.
- Fixed an issue where the FloorFilter did not honor definition expressions for the Sites, Facilities, and Levels layers in a web map.
- ENH-000120395: Added support for contingent attribute values in the FeatureForm widget.
- ENH-000131683: Tile layers can now be included in the printed legend if they have
- ENH-000133571: Updated the documented return type for route.solve() and RouteTask.solve() methods to be more accurate.
- ENH-000135083: The FeatureTable widget now supports displaying only selected rows.
- ENH-000143099: Added support for the symbolUtils.getDisplayedSymbol() method to evaluate the overrides for CIM text symbols when using DictionaryRenderer symbols.
- ENH-000143951: Symbols now display for individual Sublayers in the LayerList widget when a Legend is added to LayerList panels.
- Esri Community - 1132750: Enhanced the CoordinateConversion widget with a storageType property so that either
localcan be used to store widget state.
- Esri Community - 1137614: Enhanced the Search widget so that the
Search indropdown arrow can open or close the list of available locators.
- Calling GroupLayer.loadAll() will now return layers in addition to tables. Prior to this release, it only returned layers.
cimby adding a parameter that allows you to specify where the color should be applied - to the fill, the outline, or both.
Symbol Utils.apply CIMSymbol Color()
- VoxelLayer is out of beta with better support for integrated GPUs.
- DirectionsViewModel.stops now supports a Collection or array of Stops or Graphics. The assigned value will be automatically autocast to a Collection of Stops.
- Version 4.25 - November 2022
- Version 4.24 - June 2022
- Version 4.23 - March 2022
- Version 4.22 - December 2021
- Version 4.21 - September 2021
- Version 4.20 - June 2021
- Version 4.19 - April 2021
- Version 4.18 - December 2020
- Version 4.17 - October 2020
- Version 4.16 - July 2020
- Version 4.15 - April 2020
- Version 4.14 - December 2019
- Version 4.13 - October 2019
- Version 4.12 - June 2019
- Version 4.11 - March 2019
- Version 4.10 - December 2018
- Version 4.9 - September 2018
- Version 4.8 - July 2018
- Version 4.7 - April 2018
- Version 4.6 - December 2017
- Version 4.5 - September 2017
- Version 4.4 - July 2017
- Version 4.3 - March 2017
- Version 4.2 - December 2016
- Version 4.1 - September 2016
- Version 4.0 - May 2016