Skip To ContentArcGIS for DevelopersSign In Dashboard

Performance enhancements

Every release we dedicate considerable time to performance improvements. This release we focused mostly on layers.

FeatureLayer

Faster loading and preprocessing for FeatureLayers with many features. This involved a refactoring that impacts the parsing, processing, and display of layers. Future releases will continue to improve upon the performance work started in this release. The below GIF shows apps using 4.16 (left) and 4.17 (right) loading a very large FeatureLayer.

featurelayer-performance

StreamLayer

The StreamLayer can now handle faster websocket streams. When a client encounters a stream that is emitting events faster than it can handle, the API will down-throttle service updates accordingly. This along with other changes under the hood should improve overall stability, and allow clients to work with much faster stream services than they could in the past. We also added an update-rate event on the StreamLayerView, which can be used to check the websocket and client update rates. You can also can take advantage of maxReconnectionAttempts and maxReconnectionInterval properties on the StreamLayer. These properties can be used to specify how many times, and how long, to wait between attempts when the StreamLayer tries to reconnect to the server in case of lost connections.

Client-side layers

CSVLayer, GeoJSONLayer and FeatureLayer created from client-side graphics are now taking advantage of a worker to store the data. This means you can perform more queries on your client-side layers in a background thread without interfering with the user interface. See the first bullet in the Breaking Changes for more information about updates to how we handle memory issues.

The below GIF shows apps using 4.16 (left) and 4.17 (right) to continuously pan the map. In 4.16 the client-side layer features are in the main thread, so when the layerView makes queries, they are running in the main thread, which might block the rendering. In 4.17, the layer features are in a worker, so the queries made by the layerView to the layer don't block the rendering.

client-layer

VectorTileLayer updates

The VectorTileLayer has an improved experience when loading and interacting with the map. As you zoom in and out and navigate the map, symbols fade in and out, providing a smooth transition between visibility changes. Also, optimizations to algorithms for label deconfliction along tile boundaries and during map rotation resolved issues in previous releases with overlapping or cut-off labels that crossed tile boundaries. The below image illustrates the results of the updated label deconfliction algorithm, with version 4.16 (left) and 4.17 (right).

vectortilelayer-compare

3D updates

Polygon fill patterns

Use the new polygon fill patterns to highlight areas on terrain or integrated mesh layers. A new class StylePattern3D provides different styles compatible with existing capabilities across the ArcGIS platform. Use the same pattern for all polygons in a scene or classify them based on attributes.

Check out this sample using polygon fill patterns to visualize urban development areas.

3d-polygon-patterns

SceneLayer performance

Point SceneLayers now load and display up to twice as fast by supporting the latest I3S specification version 1.7, allowing you to render scenes with vast amount of point symbols more efficiently. Similar to IntegratedMeshLayer and 3D object SceneLayers, you can update your existing SLPKs using the I3S converter tool to benefit from these performance improvements. Read the Working with scene layers guide for more details.

3d-point-scene-layer-performance

Client-side BuildingSceneLayer queries

The new BuildingComponentSublayerView class allows you to query features of a BuildingSceneLayer directly in the client. With the support for associated feature layers, you can now perform attribute-based queries using the fields of individual features and spatial queries on its geometry.

Consuming custom stream services

The StreamLayer can now consume custom stream services that are pushed via websocket. To do this, set the webSocketUrl property of the StreamLayer to point to your custom service. Check out Reference a custom stream service for more information.

Constrain the visible map extent

In addition to rotation, scale, and zoom constraints on the view, you can now constrain navigation to a polygon or extent. This is handy for focusing viewers on the relevant locations, and minimizing distractions from other areas of the map.

LayerView transitions

We enhanced the LayerView in 2D MapViews by adding a fade-in and out transition to the LayerView when we turn the layer's visibility on and off.

transition_gif

Time support for WMSLayers

WMSLayer now supports layers that are time enabled. You can use the TimeSlider widget to animate your layers over a period of time, or you can set a timeExtent on the layer to only request data that falls within the given time extent. The timeInfo property is set at WMSLayer initialization if the layer has one or more time dimensions.

wms-time-gif

Raster updates

We are introducing VectorFieldRenderer class that can used for visualizing flow direction and magnitude information in meteorology and oceanography raster data.

vector-field-renderer

WCSLayer (beta) is also new at this release and presents raster data from a OGC Web Coverage Service. See the Intro to WCSLayer sample to learn more.

Better support for working with tables

It is now possible to create and load non-spatial feature layers stored as tables in a Map, WebMap or WebScene.

First, a new tables property was added to: Map, WebMap, WebScene, and GroupLayer. This property stores a Collection of Layers. The API checks the FeatureLayer.isTable property, and if its value is true, it can then be added to this collection. Additionally, the allTables property was added to: Map, WebMap, and WebScene. Similar to how both the Map.allLayers property works, allTables returns a flattened collection of all the tables within the map's hierarchy. This includes any tables stored within GroupLayers as well.

The Layer.fromArcGISServerUrl() and Layer.fromPortalItem() methods have been updated to support non-spatial feature layers stored as tables. You could also set the FeatureLayer.portalItem property, and then load the table. Lastly, non-spatial, in-memory (feature collection) tables can also be created client-side and added to a Map's, WebMap's, or WebScene's tables collection. Regardless of the approach used, tables can only be created using a FeatureLayer. The table has to be recognized as a non-spatial layer. In order to confirm this, we suggest that if you are accessing a table via Layer.fromPortalItem or Layer.fromArcGISServerUrl, to always check whether the FeatureLayer.isTable is true after loading.

table.load().then(function() {
  if (table.isTable) {
    map.tables.add(table);
  }
});

Web map updates

The WebMap now has the ability to persist tables. Prior to this release, WebMap tables could only be read as an array of Objects. With this release, WebMap tables read/write a Collection of Layers. Currently, it only supports a FeatureLayer that returns true for FeatureLayer.isTable. It is not yet possible to persist in-memory, client-side (feature collection) tables within a WebMap.

Widget updates

Bookmarks

The Bookmarks widget now allows users to update a bookmark's extent and add a thumbnail. To enable editing on the Bookmarks widget, set the Bookmarks.editingEnabled property to true.

bookmark-thumbnails

Adding and editing thumbnails: To add or edit a bookmark thumbnail, use the ... button on the thumbnail to access the thumbnail menu. From here, you will have the option to refresh the thumbnail (take a screenshot of the current extent), add a thumbnail from a URL (HTTPS protocol required), or to delete the thumbnail.

Editing a bookmark's viewpoint: When editing a bookmark, the view will update to show the viewpoint of the bookmark. The user can then pan, zoom, or rotate the view, and when they hit Save, the viewpoint of the bookmark will be updated to match the current scale, rotation, and extent of the view.

FeatureTable

The FeatureTable now supports editing date fields. A UI was added to make this workflow easier to manage.

featuretable-date-editing

In addition to editing date fields, work was done to enhance accessibility within the widget. Some of these improvements include:

  • Open menu via the Enter/Return key. Once it's opened, the first item is automatically focused.
  • If the menu item is focused, the Enter/Return selects the menu item (similar to if it was clicked).
  • If the menu has children items (sub-menu), the Enter/Return key will open the sub-menu and then focus the container of the sub-menu children.
  • Using the Tab key will focus the first child item in the sub-menu.
  • Arrow keys provide scrolling through menus with a fixed height.
  • The Esc key at any time will close the menu.
  • Specific to editing, using the Enter/Return/Spacebar keys while a cell is focused will enable the editing workflow and associated input will automatically be focused.

Print

The Print widget was enhanced to make working with it easier. First, we added a new exportedLinks property that allows you to access the collection of links exported from a print request. The specifications of the collection are described in the FileLink type definition. We also added two events, complete and submit, to give developers an easier way to manage printing results and behavior.

FeatureForm

Date and time editing can now be configured in the FeatureForm by configuring the DateTimePickerInput. You can now limit min/max ranges for date input as well as whether or not to input for time. More work is still to come on making date/time editing easier to manage in the form of a UI. This will be scheduled in a future version.

includeTime = true with min/max validationincludeTime = false with min/max validation
includeTime-trueincludeTime-false

TableList

The new TableList widget provides a way to display a list of tables within a Map and/or WebMap. It is meant to be used with FeatureLayer tables. If uncertain if the layer is a table, check the FeatureLayer.isTable property. It also supports adding your own custom actions, similar to the actions that can be added to the LayerList and Popup widgets. Currently, this widget does not support tables stored within a WebScene.

tablelist-widget

WebTileLayer updates

We updated the urlTemplate property of WebTileLayer to accept {z}/{x}/{y} patterns. The main benefit is that this offers another template that we can follow, and allows you to easily copy and paste URLs from third parties that may use a different pattern.

Last release with IE11/Edge Legacy support

Support for Internet Explorer 11 and Edge Legacy for use with the ArcGIS API for JavaScript was deprecated as of version 4.16. Version 4.17 will be the last release with support for Internet Explorer 11 and Edge Legacy browsers. This means that apps built with 4.18 (and beyond) will not function in IE11/Edge Legacy. Users are strongly encouraged to move to a modern browser such as Mozilla Firefox, Google Chrome, Apple Safari, or Microsoft Edge.

See our updated System Requirements page and the Why is Esri ending support for Internet Explorer 11? blog to learn more.

Breaking changes

  • For better memory management, view.destroy() now destroys all attached resources, including the map. To prevent the map from being destroyed, you can unset the map before calling destroy().
// destroy the view and all attached resources
view.destroy();

// unset map from the view so that it is not destroyed
// then destroy the view and all attached resources
const map = view.map;
view.map = null;
view.destroy();
  • The ActionButton and ActionToggle classes now correctly implement their types as either button or toggle. Prior to this, it was set as string.
  • The goToMedia() method in the Feature widget and its corresponding viewModel has been renamed to setActiveMedia.
  • The tables property for WebMap now takes a collection of Layers instead of an array of Objects.
  • The TimeSlider.loop property now has a default value of false instead of true.
  • Service metadata for all layers and tables are now collectively fetched from FeatureServer/layers/REST endpoint as opposed to each layer fetching its metadata from its dedicated endpoint, e.g. (FeatureServer/<layerID>).
  • StreamLayer.maximumTrackPoints was deprecated at version 4.15 and is now removed. Use StreamLayer.purgeOptions.maxObservations instead.
  • Using applyEdits to add geometries with z-values to a FeatureLayer with hasZ: false no longer silently drops the z-value and now throws an error.
  • The x and y properties in the read-only class, ChartMediaInfoValueSeries have been deprecated. Instead use value and tooltip respectively.

Please refer to the Breaking changes guide topic for a complete list of breaking changes across all releases of the 4x API.

Bug fixes and enhancements

  • BUG-000124122: The labels for a VectorTileLayer now correctly overlap when needed.
  • BUG-000126549: Fixed an issue where setting NULL field values in the Editor widget would not work as expected.
  • BUG-000127825: Fixed an issue where Query.parameterValues were getting dropped from query requests.
  • BUG-000128004: Fixed an issue where labels did not print for client-side feature layers.
  • BUG-000128051: Fixed an issue where KML files added using the From your computer option to ArcGIS Online did not display in ArcGIS StoryMaps.
  • BUG-000128560: Fixed an issue where a 3D GLTF model loaded as ObjectSymbol3DLayer would disappear at certain camera angles.
  • BUG-000129741: Popup and ListItem actions no longer fire the trigger-action event when disabled.
  • BUG-000129959: Fixed an issue with WMSLayer where some sublayers were not able to be turned off from the LayerList widget.
  • BUG-000131005: Fixed an issue where the symbology of the features changes in the Legend when clicking on the map.
  • BUG-000131053: Fixed an issue where individual point features did not highlight on selection when clustering is enabled.
  • BUG-000131400: It is not possible to create client-side feature layers with a period in the field name.
  • BUG-000132100: Fixed a printing issue where Sublayer.title was not honored in the legend.
  • BUG-000132263: Fixed the behavior of the CoordinateConversion widget by always displaying a png for the graphic used in capture mode (previously was png or svg depending on the browser).
  • BUG-000132335: Clarified documentation for Slider, HistogramRangeSlider, and TimeSlider to indicate the containers for these widgets need a width specified in CSS to render properly in the Expand widget.
  • BUG-000132907: Fixed an issue where the PointDrawAction event properties missing z-values.
  • BUG-000132933: Added ageReceived option to StreamLayer's purgeOptions to indicate age when features arrive in the application.
  • BUG-000133076: Fixed an issue where the PointDrawAction event properties missing evt.coordinates (instead used evt.vertices).
  • BUG-000133131: Fixed an issue where the TimeSlider would not handle features with infinite start of end times (e.g. startDate: 1/1/2020, endDate: null).
  • BUG-000133234: Fixed an issue where the Legend symbols and widget panel size change after clicking on the map when MapImageLayer has sublayers configured with pop-ups.
  • BUG-000133521: Fixed an issue where the LayerList widget would not remove layers from a collection.
  • GEONET-257043: Fixed an issue where the Bookmarks widget would not allow new bookmarks to be added if view.map was not a WebMap.
  • GEONET-257326: Fixed an issue where the ScaleBar widget labels would display on top of other widgets.
  • GEONET-260368: Fixed an issue with the CoordinateConversionViewModel.updateConversions() method that had the parameters ordered incorrectly, and thus affected the typings.
  • GEONET-947024: Fixed an issue where some widget buttons were missing a type=button property. This only affects button elements when wrapped in a form.
  • Fixed an issue where maximumNumberOfFeatures wouldn't be correctly applied in a SceneView.
  • Fixed an issue where the ClosestFacilitySolveResult.directions had the incorrect property type. The property is now an array of DirectionsFeatureSet instances.
  • Fixed an issue where the WMSLayer was not parsed correctly when the service contained only a root layer, but no nested layers.
  • Fixed an issue where we could not display a private KML file if added to a Portal from file.
  • Fixed an issue with KMLSublayer.networkLink where some KML data could not be displayed.
  • Fixed an issue with popup alignment and docking positions.
  • Fixed an issue with the Search widget where the focus remained on the search field instead of the resulting popup after selecting a location.
  • ENH-000117307: The ability to load all of the sublayers to a feature service can now be achieved by using the Layer.fromArcGISServerUrl function and pass in the URL to the feature service.
  • ENH-000123446: Much work has been done to help speed up general processing and improving symbology update speeds.
  • ENH-000123854: The TimeSlider now works with WMSLayers that have time dimensions.
  • ENH-000125859: Implemented spatial client-side queries for BuildingSceneLayer.
  • ENH-000131480: Update the documentation regarding spatial reference while using the Mapview.goTo() method
  • Enhanced the CIMSymbolReference typings by adding CIMSymbol.data to help users write correct CIM.
  • Enhanced the IntegratedMeshLayer so that modifications are applied without reloading the layer; allowing for smoother transitions between different versions and scenarios.
  • Enhanced the ObjectSymbol3DLayer so that the evaluation of visibility is based on the entire shape of the symbol and not just the point (Frustum Culling).
  • Enhanced the behavior of how StreamLayers work when resumed from a suspended browser tab. When a tab is refocused, the StreamLayer resumes and is updated.
  • Enhanced the behavior of the Print widget so that if the end-user modifies the dpi value in the MAP_ONLY layout, then the height and width are automatically adjusted. See exportOptions to learn more.
  • Enhanced the behavior of the SliceViewModel.tiltEnabled, so that it doesn't automatically start the widget when set.
  • Enhanced the printing logic to send GeoJSONLayer as a feature collections instead of a screenshot to the print service.
  • Added 4 new fonts for labeling 2D layers (except MapImageLayer): Belltopo Sans Regular, Belltopo Sans Bold, Belltopo Sans Bold Italic, and Belltopo Sans Italic. See Labeling guide for the full list of available fonts.

Added classes, properties, methods, events

Complete list of added Classes, Properties, Methods, Events.

Deprecated Classes, Properties, Methods, Events

Complete list of deprecated Classes, Properties, Methods, Events.

The following are deprecated and will be removed in a future release:

Additional packages

Version 4.17 of the ArcGIS API for JavaScript uses ArcGIS Arcade 1.11 (since 4.16), From Dojo 5 we use @dojo/framework version 5.0.4 (since 4.12).

Previous releases

Content