Skip to content
import Map from "@arcgis/core/Map.js";
Inheritance:
MapAccessor
Subclasses:
WebDocument2D, WebScene
Since
ArcGIS Maps SDK for JavaScript 4.0

The Map class contains properties and methods for storing, managing, and overlaying layers common to both 2D and 3D viewing. Layers can be added and removed from the map, but are rendered via a MapView (for viewing data in 2D) or a SceneView (for viewing data in 3D). Thus a map instance is a simple container that holds the layers, while the View is the means of displaying and interacting with a map's layers and basemap.

A single map may be referenced by multiple views. This sample for example, contains a single Map that is visible in two separate views - one in 2D and the other in 3D. Because one map may be accessed by multiple views in the same application, all user interaction with a map's layers is handled on the View, not the Map.

An instance of Map is an essential component of the MapView and SceneView. A Map object should be created prior to a view so it can be passed into the map property of that view (e.g. MapView.map, SceneView.map).

// Load the Map and MapView modules
const [Map, MapView] = await $arcgis.import(["@arcgis/core/Map.js", "@arcgis/core/views/MapView.js"]);
// Create a Map instance
const myMap = new Map({
basemap: "streets-vector"
});
// Create a MapView instance (for 2D viewing) and reference the map instance
const view = new MapView({
map: myMap
});
See also

Constructors

Constructor

Constructor
Parameters
ParameterTypeDescriptionRequired
properties
See the properties table for a list of all the properties that may be passed into the constructor.
Example
// Typical usage
const map = new Map({
basemap: "topo-vector"
});

Properties

Any properties can be set, retrieved or listened to. See the Watch for changes topic.

allLayers

readonly Property
Type
ReadonlyCollection<Layer>

A flattened collection of all layers in the map. This collection contains basemap layers, operational layers and ground layers. Group Layers and their children layers are also part of this collection. Reference layers in the basemap will always be included at the end of the collection.

Layers should not be added directly to this collection. They must only be added via the layers, basemap or ground properties.

To access a flattened collection of tables, use the allTables property instead.

Example
// Find a layer with title "US Counties"
const foundLayer = map.allLayers.find(function(layer) {
return layer.title === "US Counties";
});
// Create a filtered collection of the non-group layers
const nonGroupLayers = map.allLayers.filter(function(layer) {
return !foundLayer.layers;
});
// Listen for any layer being added or removed in the Map
map.allLayers.on("change", function(event) {
console.log("Layer added: ", event.added);
console.log("Layer removed: ", event.removed);
console.log("Layer moved: ", event.moved);
});
// Watching for changes to the visible layers in the Map
reactiveUtils.watch(
() => view.map.allLayers.filter((layer) => layer.visible),
(newVisibleLayers, oldVisibleLayers) => {
const added = newVisibleLayers.filter(
(layer) => !oldVisibleLayers.includes(layer)
);
const removed = oldVisibleLayers.filter(
(layer) => !newVisibleLayers.includes(layer)
);
added.forEach((layer) => console.log(layer.title, "is visible"));
removed.forEach((layer) => console.log(layer.title, "is not visible"));
}
);

allTables

readonly Property
Type
ReadonlyCollection<Layer>
Since
ArcGIS Maps SDK for JavaScript 4.17

A flattened collection of tables anywhere in the map's hierarchy. This will contain individual tables within the map's tables, in addition to any group layer tables. In order for the table(s) to be recognized as such, the FeatureLayer.isTable property must return true.

Currently, only feature layer tables are recognized. To access spatial layers, use the allLayers property instead.

Example
// A feature layer where isTable = true.
const foundTable = map.allTables.find(function(table) {
// Find a table with title "US Counties"
return table.title === "US Counties";
});

basemap

autocast Property
Type
Basemap | null | undefined

Specifies a basemap for the map. The basemap is a set of layers that give geographic context to the MapView or SceneView and the other operational layers in the map.

The basemap can be created in a variety of ways:

  1. From the basemap styles service (v2)
  2. From an instance of the Basemap class
  3. From a basemap id

Use of these basemaps requires either an ArcGIS Location Platform account, ArcGIS Online organizational subscription, or an ArcGIS Enterprise license.

To authenticate basemap requests, you may need an access token. You can use an API key or OAuth 2.0. When using an API key, the key must have privileges to access the appropriate location service.

Basemap Id

3D

Since version 4.28

The 3D Basemaps can be accessed using the basemap id in the table below. They are designed to be used as basemaps in SceneView.

ValueSource
topo-3dTopographic
navigation-3dNavigation
navigation-dark-3dNavigation (Dark)
osm-3dOpenStreetMap
gray-3dLight Gray Canvas
dark-gray-3dDark Gray Canvas
streets-3dStreets
streets-dark-3dStreets (Dark)

Known Limitations

3D Basemaps can only be used in SceneView.

2D (legacy)

Since version 4.0

The legacy basemaps can be accessed using the basemap id in the table below. These are references to enhanced basemap endpoints.

Read More
ValueSource
satelliteWorld Imagery
hybridHybrid Reference Layer and World Imagery
oceansWorld Ocean Reference and World Ocean Base
osmOpenStreetMapLayer
terrainWorld Reference Overlay and World Hillshade
dark-gray / dark-gray-vectorDark Gray Canvas
gray / gray-vectorLight Gray Canvas
streets / streets-vectorWorld Street Map
streets-night-vectorWorld Street Map (Night)
streets-navigation-vectorWorld Navigation Map
topo / topo-vectorWorld Hillshade and World Topographic Map
streets-relief-vectorWorld Hillshade and World Street Map (with Relief)
Examples
// create the basemap from a string id representing the basemap style
const map = new Map({
basemap: "arcgis/topographic"
});
// create the basemap from a BasemapStyle object
const map = new Map({
basemap: {
style: {
id: "arcgis/outdoor",
language: "es" // place labels will be displayed in spanish
}
}
});
// Set the basemap from a string ID in the constructor
const map = new Map({
basemap: "dark-gray-3d"
});
// Set the basemap after the map instance is created
map.basemap = "topo-3d";
// Create a VectorTileLayer from a style URL
const mapBaseLayer = new VectorTileLayer({
url: "https://arcgis.com/sharing/rest/content/items/b5676525747f499687f12746441101ef/resources/styles/root.json"
});
// Create a Basemap with the VectorTileLayer
const customBasemap = new Basemap({
baseLayers: [mapBaseLayer],
title: "Terrain"
});
// Set the basemap to the customBasemap
const map = new Map({
basemap: customBasemap
});

declaredClass

readonlyinherited Property
Type
string
Inherited from: Accessor
Since
ArcGIS Maps SDK for JavaScript 4.7

The name of the class. The declared class name is formatted as esri.folder.className.

editableLayers

readonly Property
Type
ReadonlyCollection<EditableLayerUnion>
Since
ArcGIS Maps SDK for JavaScript 4.20

A collection of editable layers. Layers are considered editable if they have editing capabilities, and if the authenticated user has the necessary privileges needed to edit the layers.

See also

focusAreas

autocast Property
Type
FocusAreas

A container of all focus areas present in the map.

Known Limitations

Focus areas are only supported in SceneView.

See also

ground

autocast Property
Type
Ground

Specifies the surface properties for the map. In MapView, this property is used by the ElevationProfileAnalysis when the profile contains an ElevationProfileLineGround. In 3D SceneView, it renders the terrain or topographical variations in the real world on the map's surface with a collection of ElevationLayers.

This value can be an instance of Ground, or one of the following strings:

  • world-elevation for a default instance of ground using the Terrain3D Service.
  • world-topobathymetry for an instance of ground that combines surface elevation and bathymetry using the TopoBathy3D Service.

The ground may not be set to null or undefined, it is guaranteed to always contain an instance of type Ground. The elevation can be removed from the ground by setting the ground property to a new empty Ground instance or by removing all the ground layers.

See also
Examples
// Use the world elevation service
const map = new Map({
basemap: "topo-vector",
ground: "world-elevation"
});
// Create a map with the world elevation layer overlaid by a custom elevation layer
const worldElevation = new ElevationLayer({
url: "//elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"
});
const customElevation = new ElevationLayer({
url: "https://my.server.com/arcgis/rest/service/MyElevationService/ImageServer"
});
const map = new Map({
basemap: "topo-vector",
ground: new Ground({
layers: [ worldElevation, customElevation ]
})
});

layers

autocast inherited Property
Type
Collection<Layer>
Inherited from: LayersMixin

A collection of operational layers. This property contains the operational layers, such as FeatureLayers, WebTileLayers and GraphicsLayers that may be queried, assigned different renderers, analyzed, etc. It does not include basemaps.

A Layer is a collection of one or more features, or graphics, that represent real-world phenomena. Each feature contains a Symbol and geographic data that allows it to be rendered on the map as a graphic with spatial context. Features within the layer may also contain data attributes that provide additional information that may be viewed in popup windows and used for rendering the layer.

Layers may be added in the constructor, with the add() or addMany() methods, or directly to the layers collection using Collection.add() or Collection.addMany().

In 3D, for layers that are rendered on the terrain, the order of the layers also depends on the type of layer. Tiled layers (BaseTileLayer, ImageryTileLayer, OpenStreetMapLayer, TileLayer, VectorTileLayer, WCSLayer, WebTileLayer and WMTSLayer) are always drawn first in the same order as specified in the layer collection. Dynamic layers (MapImageLayer, ImageryLayer, WMSLayer, and feature based layers with elevation mode on-the-ground) are rendered on top using the order from the layer collection.

A Layer may only be added to one parent. Adding the same layer to multiple Maps or GroupLayers is not possible. If you attempt to do so, the layer will automatically be removed from its current parent and placed in the new parent.

let layer = new GraphicsLayer();
// The layer belongs to map1
map1.layers.add(layer);
// The layer now belongs to map2
// and implicitly does: map1.layers.remove(layer)
map2.layers.add(layer);

To access tables from feature layers, use the tables property in either Map.tables or WebMap.tables classes.

Example
// Add layers in the constructor of Map using an array
let fl = new FeatureLayer(url);
let gl = new GraphicsLayer();
let map = new Map({
layers: [fl, gl]
});
// Add layers using add()
map.addMany([fl, gl]);
// Add layers using layers collection
map.layers.addMany([fl, gl]);
// Add layers using layers collection's push method
map.layers.push(fl, gl);

tables

autocast inherited Property
Type
Collection<Layer>
Inherited from: TablesMixin

A collection of Layer instances that are tables saved in a Map and/or a WebMap. In order for the table(s) to be recognized as such, the FeatureLayer's FeatureLayer.isTable property must return true. A table can be created via one of the options below:

  • Referencing the URL to a table in a feature service.
  • Create a feature layer using the Layer.fromArcGISServerUrl() method and confirm that it is a table using feature layer's FeatureLayer.isTable property. This can be either a feature service or feature collection.
  • Create a feature layer using the Layer.fromPortalItem() method and confirm that it is a table using feature layer's FeatureLayer.isTable property. This can be either a feature service or feature collection.
  • Create an in-memory, non-spatial, client-side feature layer.

Beginning with 4.17, it is possible to persist non-spatial, tables in a feature service to a WebMap, although in-memory (feature collection) tables are not yet supported.

Persisting tables within a GroupLayer.tables is not yet supported. If this is needed, add them to the Map.tables and/or WebMap.tables.

Currently, only feature service feature layers are recognized. To access spatial layers, use the layers property in either Map.layers or WebMap.layers classes

See also
Examples
// This snippet shows how to add a table to a map's table collection.
// FeatureLayer.isTable = false
const featureLayer = new FeatureLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/SF311/FeatureServer/0"
});
// Add featureLayer to the map
map.add(featureLayer);
// FeatureLayer.isTable = true
const table = new FeatureLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/SF311/FeatureServer/1"
});
// In order for the table to be stored within
// the map's table collection, load it and confirm it is the right type.
table.load().then(() => {
// Add the table to the collection
map.tables.add(table);
console.log("Table is added to map's table collection");
});
// This snippet shows how to persist a table to an existing web map
// FeatureLayer.isTable = true
const table = new FeatureLayer({
url: "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Crash_details_table/FeatureServer/0"
});
// Create Webmap instance
const webmap = new WebMap({
portalItem: {
id: webmapId
}
});
// When web map is ready, load the table and add it to the web map
webmap.when(() => {
table.load().then(() => {
console.log("Adding table");
// Add table to the webmap's table collection
webmap.tables.add(table);
});
});
// Call updateFrom on webmap and pass in the existing view
webmap.updateFrom(view).then(() => {
// Call saveAs (or save) on the web map
webmap.saveAs({
// autocasts as new PortalItem()
title: "New WebMap"
});
});
// This snippet shows how to add an in-memory table to a map
// Create the array of objects containing field info
const fields = [{
name: "ObjectID",
alias: "ObjectID",
type: "oid"
},
{
name: "tree_type",
alias: "Tree type",
type: "string"
},
{
name: "species",
alias: "Species",
type: "string"
}];
// Create the array of graphics holding attribute info
const graphics = [{
attributes: {
"tree_type": "deciduous",
"species": "maple",
"ObjectID": 2
}
}, {
attributes: {
"tree_type": "coniferous",
"species": "pine",
"ObjectID": 3
}
}];
// Create the feature layer (feature collection) table
const table = new FeatureLayer({
fields: fields,
objectIdField: "ObjectID",
source: graphics
});
// Check when map is ready and load the table
map.when(() => {
table.load().then(() => {
console.log("Adding table");
map.tables.add(table);
});
});

Methods

MethodSignatureClass
add
inherited
add(layer: Layer | PromiseLike<Layer>, index?: number): void
addMany
inherited
addMany(layers: Layer[], index?: number): void
destroy(): void
emit
inherited
emit<Type extends EventNames<this>>(type: Type, event?: this["@eventTypes"][Type]): boolean
findLayerById
inherited
findLayerById(layerId: string): Layer | null | undefined
findTableById
inherited
findTableById(tableId: string): Layer | null | undefined
hasEventListener
inherited
hasEventListener<Type extends EventNames<this>>(type: Type): boolean
on
inherited
on<Type extends EventNames<this>>(type: Type, listener: EventedCallback<this["@eventTypes"][Type]>): ResourceHandle
remove
inherited
remove(layer: Layer): Layer | null | undefined
removeAll
inherited
removeAll(): Layer[]
removeMany
inherited
removeMany(layers: Layer[]): Layer[]
reorder
inherited
reorder(layer: Layer, index?: number): Layer | null | undefined

add

inherited Method
Signature
add (layer: Layer | PromiseLike<Layer>, index?: number): void
Inherited from: LayersMixin
Parameters
ParameterTypeDescriptionRequired
layer
Layer | PromiseLike<Layer>

Layer or a promise that resolves to a layer to add to the layers collection.

index

A layer can be added at a specified index in the layers collection. If no index is specified or the index specified is greater than the current number of layers, the layer is automatically appended to the list of layers in the layers collection and the index is normalized.

Returns
void
Example
// add() and push methods can be used
// to add a layer to layers collection
// add a layer to layers collection using add
map.add(layer);
// add a layer at the end of layers collection
map.layers.push(layer);

addMany

inherited Method
Signature
addMany (layers: Layer[], index?: number): void
Inherited from: LayersMixin

Adds a layer or an array of layers to the layers collection. The Collection.@before-changes, Collection.@before-add, Collection.@after-add, Collection.@after-changes and Collection.@change events will be emitted when this method is called.

The Collection.push() method on the layers collection also can be used to add a layer or layers.

See also
Parameters
ParameterTypeDescriptionRequired
layers
Layer[]

Layer(s) to be added to the layers collection.

index

A layer can be added at a specified index in the layers collection. If no index is specified or the index specified is greater than the current number of layers, the layer is automatically appended to the list of layers in the layers collection and the index is normalized.

Returns
void
Example
// addMany and push methods can be used
// to add layers to layers collection
// add an array of layers to layers collection using addMany
map.addMany([layer, layer2]);
// add layers to layers collection using push method
map.layers.push(layer, layer2);

destroy

Method
Signature
destroy (): void
Since
ArcGIS Maps SDK for JavaScript 4.17

Destroys the map, and any associated resources, including its layers, basemap, tables, and ground. These can no longer be used once the map has been destroyed. To prevent these objects from being destroyed, remove them from the map before calling destroy().

// prevent the layers from being destroyed by removing them from the map
const layers = map.layers.removeAll();
// prevent the tables from being destroyed by removing them from the map
const tables = map.tables.removeAll();
// unset basemap from the map so that it is not destroyed
const basemap = map.basemap;
map.basemap = null;
// remove ground layers from the map so that they aren't destroyed
const groundLayers = map.ground.removeAll();
// destroy the map and any remaining associated resources
map.destroy();
See also
Returns
void

emit

inherited Method
Signature
emit <Type extends EventNames<this>>(type: Type, event?: this["@eventTypes"][Type]): boolean
Type parameters
<Type extends EventNames<this>>
Inherited from: EventedMixin
Since
ArcGIS Maps SDK for JavaScript 4.5

Emits an event on the instance. This method should only be used when creating subclasses of this class.

Parameters
ParameterTypeDescriptionRequired
type
Type

The name of the event.

event
this["@eventTypes"][Type]

The event payload.

Returns
boolean

true if a listener was notified

findLayerById

inherited Method
Signature
findLayerById (layerId: string): Layer | null | undefined
Inherited from: LayersMixin

Returns a layer based on the given layer ID.

Parameters
ParameterTypeDescriptionRequired
layerId

The ID assigned to the layer.

Returns
Layer | null | undefined

Returns the requested layer object.

findTableById

inherited Method
Signature
findTableById (tableId: string): Layer | null | undefined
Inherited from: TablesMixin
Since
ArcGIS Maps SDK for JavaScript 4.18

Returns a table based on the given table ID.

Parameters
ParameterTypeDescriptionRequired
tableId

The ID assigned to the table.

Returns
Layer | null | undefined

Returns the requested table object.

hasEventListener

inherited Method
Signature
hasEventListener <Type extends EventNames<this>>(type: Type): boolean
Type parameters
<Type extends EventNames<this>>
Inherited from: EventedMixin

Indicates whether there is an event listener on the instance that matches the provided event name.

Parameters
ParameterTypeDescriptionRequired
type
Type

The name of the event.

Returns
boolean

Returns true if the class supports the input event.

on

inherited Method
Signature
on <Type extends EventNames<this>>(type: Type, listener: EventedCallback<this["@eventTypes"][Type]>): ResourceHandle
Type parameters
<Type extends EventNames<this>>
Inherited from: EventedMixin

Registers an event handler on the instance. Call this method to hook an event with a listener.

Parameters
ParameterTypeDescriptionRequired
type
Type

An event or an array of events to listen for.

listener
EventedCallback<this["@eventTypes"][Type]>

The function to call when the event fires.

Returns
ResourceHandle

Returns an event handler with a remove() method that should be called to stop listening for the event(s).

PropertyTypeDescription
removeFunctionWhen called, removes the listener from the event.
Example
view.on("click", function(event){
// event is the event handle returned after the event fires.
console.log(event.mapPoint);
});

remove

inherited Method
Signature
remove (layer: Layer): Layer | null | undefined
Inherited from: LayersMixin

Removes the specified layer from the layers collection. The Collection.@before-changes, Collection.@before-remove, Collection.@after-remove, Collection.@after-changes and Collection.@change events will be emitted when this method is called.

Parameters
ParameterTypeDescriptionRequired
layer

Layer to remove from the layers collection.

Returns
Layer | null | undefined

Returns the layer removed from the layers collection.

removeAll

inherited Method
Signature
removeAll (): Layer[]
Inherited from: LayersMixin

Removes all layers. The Collection.@before-changes, Collection.@before-remove, Collection.@after-remove, Collection.@after-changes and Collection.@change events will be emitted when this method is called.

Returns
Layer[]

Returns the layers removed from the layers collection.

removeMany

inherited Method
Signature
removeMany (layers: Layer[]): Layer[]
Inherited from: LayersMixin

Removes the specified layers. The Collection.@before-changes, Collection.@before-remove, Collection.@after-remove, Collection.@after-changes and Collection.@change events will be emitted when this method is called.

Parameters
ParameterTypeDescriptionRequired
layers
Layer[]

Array of layers to remove from the layers collection.

Returns
Layer[]

Returns the layers removed from the layers collection.

reorder

inherited Method
Signature
reorder (layer: Layer, index?: number): Layer | null | undefined
Inherited from: LayersMixin

Changes the layer order. The first layer added is always the base layer, even if its order is changed. The Collection.@change event will be emitted when this method is called.

In 3D, for layers that are rendered on the terrain, the order of the layers also depends on the type of layer. Tiled layers (BaseTileLayer, ImageryTileLayer, OpenStreetMapLayer, TileLayer, VectorTileLayer, WCSLayer, WebTileLayer and WMTSLayer) are always drawn first in the same order as specified in the layer collection. Dynamic layers (MapImageLayer, ImageryLayer, WMSLayer, and feature based layers with elevation mode on-the-ground) are rendered on top using the order from the layer collection.

Parameters
ParameterTypeDescriptionRequired
layer

The layer to be moved.

index

The index location for placing the layer. The bottom-most layer has an index of 0.

Returns
Layer | null | undefined

Returns the layer that was moved.