Release notes for 4.24

June 2022

Pie chart rendering

The PieChartRenderer allows you to visualize multiple attribute values of a feature in a point or polygon layer in a 2D MapView. The value of each pie slice can be determined by a field value or Arcade expression. Use the PieChartRenderer with visualVariables to vary the size of the pie chart based on an Arcade expression, such as the sum of its fields.

pie chart renderer


MediaLayer (released in beta) is used to add static image and video elements on the map the specified geographic location. Coordinates of the image and video elements are projected to the view's spatial reference.

To see the MediaLayer in action, check out the new MediaLayer with images and MediaLayer with video samples.


Client-side binning

Binning (released in beta) is a new feature reduction method added as an alternative to clustering and heatmaps in 2D MapViews. Binning visualizations aggregate point data client-side by geohash cell based on a provided level of detail. You can define how you want to aggregate the numerical fields within each bin, and use them in the configuration of the bin's labels, popups, and rendering.

Server-side binning, which will allow you to display aggregates of very large datasets, will be added at a future release.

All pointsPoints aggregated to bins
all points binned points

To learn more about binning, be sure to check out the following new samples: Intro to binning, Binning with aggregate fields, Binning - Filter by category, and Summarize binned data using Arcade

Improved HeatmapRenderer

HeatmapRenderer now renders with WebGL, which means it can now take advantage of the following benefits:

  • More data can be rendered.
  • Interacting with heatmaps is a faster, smoother experience for the end user.
  • Underlying points in a heatmap display popups and can be returned in a hitTest operation.
  • In MapView, data can now be labeled, and filtered using FeatureFilter and FeatureEffect.

Static heatmaps

HeatmapRenderer added a referenceScale property, which allows you to lock the heatmap visualization at a specific scale so it will appear consistent when zooming in and out.

See the images below to compare the differences between static and dynamic (default) heatmaps at various scales above and below the reference scale, or check out the Create a static heatmap sample to see it in action.

Zoom offset from reference scaleStatic (reference scale)Dynamic (no reference scale)
+1 LOD static-in1 dynamic-in1
reference scale static-out1 dynamic-out1
-1 LOD static-out1 dynamic-out1

API updates

The HeatmapRenderer's underlying algorithm for calculating density was updated to use kernel density instead of Gaussian blur. This will improve consistency between heatmaps created in web apps when loaded in future versions of ArcGIS Pro. This update required the following updates to the HeatmapRenderer's properties:

3D updates

Weather effects

Make your scenes more immersive by adding weather effects for rain and snowfall. Besides changing the cloud coverage, you can adjust the amount of precipitation or cover your 3D content in snow. Weather settings are now persisted in web scenes and slides, making it easier to author and share different scenarios.

A new weather sample uses effects to visualize extreme weather scenarios in Utrecht.

Weather effects

OpenStreetMap buildings and trees

Enhance your 3D visualizations with globally available 3D buildings and trees using new OpenStreetMap (OSM) layers from the ArcGIS Living Atlas. Explore the data using preformatted popup information and detailed 3D building models where available. Use the new layers as context in your scenes and apply spatial filters for areas where you want to place your own data.

Visit your favorite places in the new OSM buildings and trees scene:

OSM buildings and trees

Voxel layer variables

Change the appearance of your voxel data using previously published variables. Toggle between visualizing the variables as surfaces or using the full volume of the layer. In addition, a new class VoxelVolumeStyle allows you to exaggerate and offset the rendered voxels to better understand its spatial characteristics.

Try out these new rendering capabilities in a new voxel layer sample:

Voxel layer

Improved editing

New tooltips and labels provide useful information when creating or updating existing features with the Sketch or Editor widgets. Labels indicate the length of Polygon and Polyline segments while tooltips show information about the overall geometry and tool in use. This can be total length for lines or area for polygons, as well as rotation, scale, and distance. Additionally, elevation is shown when editing absolute heights.

Try out these new capabilities using the Sketch in 3D sample:

Improved editing

Blend modes

Create new and aesthetically pleasing visualizations of the ground using blend modes in 3D. You can use the same blend modes already available in 2D to combine multiple tiled layers in your scene.

Check out a new sample that blends a hillshade layer over an OSM basemap to provide more contrast and spatial awareness.

OSM buildings and trees

Daylight widget

Explore your scenes by changing the lighting type directly in the Daylight widget. Instead of using a realistic sun position, minimize shadows and evenly light your scene by positioning the light source relative to the camera. Virtual light settings are now also persisted in web scenes and slides.

Try out the different lighting options in the updated Daylight widget sample:

Virtual Light in Daylight widget

Persist line of sight layer

Line of sight analyses can be persisted as a LineOfSightLayer in web scenes to share and present your analyses. LineOfSightLayer can be used as any other layer. For example, it can be visible or invisible per slide in a web scene. With a new interactive property on LineOfSightAnalysisView3D you can enable interacting with the analysis without creating a widget or view model.

Persist scene layer filters (beta)

Persist spatial- and object id based filters for SceneLayer, either through the web scene or layer item directly. Two different types of spatial relationships allow you to mask a selected area ("disjoint") or display only a selected area ("contains"), for example to evaluate different scenarios in urban planning.


The Directions widget is now integrated with the RouteLayer, which means that it should now be instantiated with a new or existing RouteLayer. New functionality includes the ability to save routes and modify the visibleElements in the Directions widget UI. The Directions widget can also open and edit existing route portal items. RouteLayer can use custom symbology with the defaultSymbols property, and now works in both 2D MapViews and 3D SceneViews.

Directions widget

The old workflow of creating a Directions widget without a RouteLayer is deprecated and will be a breaking change at a future release. Additionally, some properties on Directions have been deprecated in favor of using the RouteLayer properties, such as routeServiceUrl, routeSymbol, and stopSymbols. To customize symbology with the Directions widget, we recommend using the RouteLayer defaultSymbols property.

Execute Arcade expressions

Arcade is an expression language that allows you to calculate values and create custom content in various profiles, such as popups, renderers, labels, and forms. Most of the time, the Arcade profiles that are part of the API are adequate for application requirements. However, sometimes developers need the ability to execute Arcade expressions in their own custom profiles. Starting at version 4.24, app developers now have the ability to compile and execute Arcade expressions in their own custom profiles. That means you can use Arcade where you want, how you want. In your custom profile, you get to define the valid data inputs, functions, and return types in addition to the context where expressions can execute.

This has been a highly requested feature since Arcade was first released. With the Arcade executor API, you will be able to do the following:

  • Execute expressions already written for existing ArcGIS profiles in another context. For example, an end user may have written an expression for a renderer, popup, or label in a Web Map and the data produced by the expression should be displayed outside the Web Map in a custom component, table, or summarized in a chart.
  • Define custom Arcade profiles and provide a configurable experience within an app for users to write their own expressions.
  • Simplify the experience of filtering and querying data with the chainable FeatureSet functions Arcade provides.

The following sample demonstrates how to execute an expression from a webmap and summarize the results in a chart.


Saving feature layers

FeatureLayers can be saved to ArcGIS Online and ArcGIS Enterprise with the save() and saveAs() methods. This allows you to define a renderer with 2D symbology, popupTemplate, featureReduction, etc. on your feature layer and then save it to a PortalItem.

Use dark colors for code blocksCopy
const portalItem = new PortalItem({
  title: "My feature layer"

MapView and SceneView hitTest updates

MapView.hitTest and SceneView.hitTest hit test results now return GraphicHit, MediaHit, and RouteHit results. The existing apps that use hitTest() method should be updated to check for the result type.

CIMSymbol enhancements

At this release, we made the following enhancements to CIMSymbol:

  • Support for random marker placement inside polygons. CIMMarkerPlacementInsidePolygon now supports gridType: "Random" in addition to Fixed. Use the randomness property to control the amount of randomness. random marker placement

  • Improved animation support. We enhanced our animation support in CIMPictureMarker symbol layers, by adding support for animatedSymbolProperties, which allow you to customize the animation of GIF and APNG symbols, through properties such as duration, randomizeStartTime, and repeatType.

FlowRenderer - support for round caps

We added support for a trailCap property on FlowRenderer that allows you to change the starting cap of the streamlines. Round caps will only be applied to the renderer if the trailWidth is greater than 3 pts.

trailCap: "butt"trailCap: "round"
butt cap style round cap style

Widget updates

Renderer colors reflected in Popup charts

Charts within a popup's MediaContent now respect the renderer colors of the configured fields in the chart when visualizing data with predominance, dot density, or the new pie chart renderer. Fields represented by Arcade expressions are not supported at this time and are planned for a future release.

popups - chart media content colors

Feature menu

When hovering over items within the popup feature menu, the corresponding feature will automatically be highlighted in the map.

popups - featureMenu highlight


The FeatureTable widget has been updated to provide more extensibility for table and column configuration. New classes were added to allow this via template configurations. Similar to how popup and FeatureForm widgets use templates, the FeatureTable's template follows the same premise and provides the ability to configure individual columns, and starting at 4.24, grouped columns via their respective templates.

FeatureTable widget with grouped columns

The Print widget now has an option to Include north arrow in the Advanced options. Note that the print service must have a north arrow configured on a per-layout basis for this option to be available.

Include north arrow

Note that print also has a north arrow option when using the PrintTemplate.layoutOptions.elementOverrides property.


The ScaleRangeSlider widget now provides a UI when working with layers that are not available at all scales. When used with a layer with lods that differ from the map, the ScaleRangeSlider will display the unavailable ranges with a dashed line. The minScaleLimit and maxScaleLimit properties can be used to determine the beginning and end of the available range.

scaleRangeSlider - scaleLimit on tiled layer

We also added a new property to ScaleRangeSlider.visibleElements, scaleMenus, that allows you to hide the scale dropdown menus from the widget's UI.


If a WebMap is configured with a default site (without a default facility or level), then the FloorFilter widget will display the list of facilities for that site instead of the list of sites.

Layer updates


If MapServer layers do not support the query operation, popups can now be opened using the identify operation if the layers support it. This can be checked with the MapImageLayer.capabilities.operations.supportsIdentify property.


WCSLayer has improved third party server compatibility, and is now out of beta.

WebGL2 update

Starting at version 4.24, the API uses WebGL2 where possible, otherwise falls back to WebGL1. WebGL2 support is integrated into modern browsers and provides improved support for the capabilities of modern GPUs.

If you are building custom WebGL layers, to take advantage of version-specific features or extensions your code will need to be updated to detect the context version, and to use the correct extension or native WebGL feature. Here is an example code snippet using the WebGL1-only extension WEBGL_color_buffer_float:

Use dark colors for code blocksCopy
// Only needed for custom WebGL layers
const gl = this.context;
if (gl.getParameter(gl.VERSION).startsWith("WebGL 1.0")) {
  const floatBufExt = gl.getExtension("WEBGL_color_buffer_float");
  gl.renderbufferStorage(gl.RENDERBUFFER, floatBufExt.RGBA32F_EXT, 256, 256);
} else {
  // Float render targets use different extension
  const floatBufExt2 = gl.getExtension("EXT_color_buffer_float");
  gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA32F, 256, 256);

Added classes, properties, methods, events

Deprecated classes, properties, methods, events

Breaking changes

  • Tasks have been deprecated since 4.20. They were removed at 4.24. The replacements are the classes and modules in the esri/rest folder. This will make it easier to incorporate your code into a more modular app design, and also reduce unnecessary dependencies (you only import what you want). The new rest modules are functions, which do not require constructors, so you can use their methods immediately.
  • The UI location of default widgets in a MapView or SceneView no longer changes if the app is right-to-left.
  • The API now uses WebGL2 by default, and it will fallback to WebGL1 depending on the browser. Custom WebGL layers using WebGL1-only extensions will need to be updated to detect which context is present and use the correct extension/native WebGL2 feature.
  • The properties date and displayUTCOffset have been removed from the VirtualLighting since this lighting type does not depend on the date and time. But this means that the property does not always have a date or displayUTCOffset property. For some applications that assume that this property always exists this can be a breaking change.

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/EventAlternate optionVersion deprecated
FieldConfig.editorTypeSet the editor type via TextAreaInput or TextBoxInput classes set within the field element of a FeatureForm's template.4.16
widget.renderableAll properties are automatically tracked now and don't need to be decorated with this decorator.4.19

The following tasks have been deprecated for at least 3 releases and have now been removed from the API (expand to read more):

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-000114474: Fixed an issue where the Directions widget failed to save a RouteLayer when the route service is based on a network dataset without a time based cost attribute.
  • BUG-000119268: Fixed an issue in SceneView where hitTest now returns multiple results for non-draped icons and shows multiple results in popups.
  • BUG-000127344: Fixed an issue where the shape of the HeatmapRenderer was changed to a square instead of a circle as the layer was zoomed out to a smaller scale.
  • BUG-000130727: Fixed an issue in MapView where layers rendered with HeatmapRenderer would not display labels.
  • BUG-000143843: Fixed an issue where points were getting clipped along tile boundaries if rotation visual variables were used.
  • BUG-000147101: Fixed an issue where the Search widget's search result symbology would not display in Firefox.
  • BUG-000147468: Fixed an issue with an error being thrown when calling MapView.destroy() while a Popup is displayed.
  • BUG-000147907: Fixed an issue where LayerList.listItemCreatedFunction was called multiple times causing performance degradation. However, the fix introduces a breaking change; if you need to know something about the ListItem's title or layer (e.g. layer.type) then you must watch the listItem for updating to be false before checking these properties.
  • BUG-000148118: Fixed an issue with the query.executeForIds description to include that the number of records returned is not limited by the max record count.
  • BUG-000148286: Fixed an issue where ImageryTileLayer pixel value lookup was missing when a field in raster attribute table is used for ClassBreaksRenderer.
  • BUG-000148406: Fixed a regression where Smart mapping functions didn't generate unique value infos when date fields were used in an Arcade expression.
  • BUG-000149168: Fixed an issue where multiline labels added to polyline GeoJSONLayer disappear when zooming out or rotating the map.
  • BUG-000149276: Hidden layers are no longer queried when loading the Editor widget.
  • Esri Community - 1132663: Fixed an issue where FeatureLayer was throwing 100151 libtess.js:13 error.
  • Esri Community - 1137736: When hovering over an item in a popup feature menu, the corresponding feature will be highlighted in the map.
  • Esri Community - 1161336: Fixed an issue with the BasemapGallery when changing the activeBasemap programmatically to a named basemap id.
  • Esri Community - 1165988: Fixed an issue where MapView.zoom was returning -1 when constraints.lods are set in the view's constructor.
  • Esri Community - 1166552: Fixed an issue with TextSymbol and displaying right-to-left (RTL) languages.
  • Esri Community - 1175789: Fixed an issue where ImageryLayer with RasterStretchRenderer throws an error when it is removed then added back to a map.
  • Fixed an incorrect spelling of euclidean in AreaMeasurementAnalysisView3D.result.mode
  • Fixed an issue in the UtilityNetworkTrace widget where the “Starting point missing” notice is still displayed after a starting point is added.
  • Fixed an issue in the UtilityNetworkTrace widget where the coded values were displayed for attributes with domains in the features list.
  • Fixed an issue in the UtilityNetworkTrace widget where the EPOCH time was displayed for date attributes in the features list.
  • Fixed an issue in the UtilityNetworkTrace widget where the loading indicator persisted if the trace was not valid. The error returned from the server is now displayed in a notice instead.
  • Fixed an issue in the UtilityNetworkTrace widget where the widget remained disabled if the logged in user did not have the ArcGIS Utility Network user type extension. A notice is now displayed instead.
  • Fixed an issue where layers rendered with HeatmapRenderer would not display popups.
  • Fixed an issue with FeatureLayers with a dynamicDataSource so that they can no longer be persisted, as they are not compliant with our persistence specifications.
  • Fixed an issue with the Attribution widget so that it no longer mirrors for right-to-left (RTL).
  • Fixed several issues in the Daylight widget's and enhanced its layout, especially for locales using RTL or 12-hour clock.
  • ENH-000128354: Added documentation on when adding/updating/deleting attachments of a feature, the globalId specification in the attachment property of an AttachmentEdit must be an ArcGIS generated global ID.
  • ENH-000146868: In locales using 24-hour time notation, the Daylight widget's slider now ends with 24:00 instead of 00:00.
  • Enhanced CoordinateConversion widget to allow format renaming by using the label property.
  • Enhanced FeatureFilter/FeatureEffect to work in MapView for layers with HeatmapRenderer.
  • Enhanced Layer.fromPortalItem() to handle existing KML items uploaded by file instead of by URL.
  • Enhanced MapImageLayer to use the Identify operation with popups when the Query operation is not available on a MapServer.
  • Enhanced the Attribution Widget to not be clickable when all the attribution text fits and is not expandable.
  • Layers with a HeatmapRenderer in 3D support smart mapping and can now be persisted in WebScenes.
  • The terrain in 3D now renders as a continuous surface, eliminating discontinuities and holes between different levels of detail. This also removes artifacts along the clippingArea border in local mode.

Additional packages

Version 4.24 of the ArcGIS Maps SDK for JavaScript uses ArcGIS Arcade 1.17 (since 4.23).

Version 4.24 of the ArcGIS Maps SDK for JavaScript uses Calcite Design System (Beta), version 1.0.0-beta.82.

How to access the SDK

  • The API library is available on both CDN and npm, Read more at Get started.
  • For supported versions, you can also download both the documentation and the API library. These downloads are typically available 3-4 weeks after release.

Previous releases

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.