Skip to main content

React Map GL Components

Drop-in components for using Esri services with react-map-gl. Works with both MapLibre GL and Mapbox GL.

Components

All components share these common props:

PropTypeDescription
idstringRequired Unique layer ID
sourceIdstringCustom source ID (defaults to esri-<kind>-<id>, e.g. esri-dynamic-census)
beforeIdstringInsert layer before this layer ID
visiblebooleanLayer visibility
tokenstringArcGIS token (sent as the token request parameter)
apiKeystringArcGIS Location Platform API key (sent as the token parameter)
authenticationIAuthenticationManager | stringArcGIS REST JS auth manager (preferred for OAuth/user sign-in)
getAttributionFromServicebooleanWhether to fetch attribution from the service (default true)
requestParamsRecord<string, unknown>Extra params merged into every service request
proxystring | booleanDeprecated — no longer applied
fetchOptionsRequestInitDeprecated — no longer forwarded to requests

Requests run on ArcGIS REST JS; see the Authentication guide.

Authenticated services

Use token (or apiKey) on any layer component to access secured services:

<EsriDynamicLayer
id="secured"
url="https://your-server/arcgis/rest/services/Secure/MapServer"
token="YOUR_TOKEN"
/>

EsriVectorBasemapLayer needs a token or an apiKey (see below).

Every layer component also accepts an ArcGIS portal item id in place of its url — see the Portal Items guide.

EsriDynamicLayer

Renders an Esri Dynamic Map Service as a raster layer.

PropTypeDefaultDescription
urlstringRequired MapService URL
layersnumber[] | number | falseLayer IDs to show
layerDefsRecord<string, string> | falseSQL filters per layer
formatstringImage format
dpinumberOutput DPI
transparentbooleanTransparent background
import { EsriDynamicLayer } from 'esri-gl/react-map-gl';

<Map>
<EsriDynamicLayer
id="census"
url="https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer"
layers={[2, 3]}
layerDefs={{ 2: "STATE_NAME='California'" }}
/>
</Map>

EsriTiledLayer

Renders an Esri Tiled Map Service as a raster layer.

PropTypeDescription
urlstringRequired Tiled MapService URL
import { EsriTiledLayer } from 'esri-gl/react-map-gl';

<Map>
<EsriTiledLayer
id="topo"
url="https://services.arcgisonline.com/arcgis/rest/services/World_Topo_Map/MapServer"
/>
</Map>

EsriImageLayer

Renders an Esri Image Service as a raster layer.

PropTypeDescription
urlstringRequired ImageService URL
renderingRuleRecord<string, unknown> | falseServer-side rendering rule
mosaicRuleRecord<string, unknown> | falseMosaic rule for image selection
formatstringImage format
import { EsriImageLayer } from 'esri-gl/react-map-gl';

<Map>
<EsriImageLayer
id="landcover"
url="https://sampleserver6.arcgisonline.com/arcgis/rest/services/NLCDLandCover/ImageServer"
/>
</Map>

EsriFeatureLayer

Renders an Esri Feature Service as a GeoJSON vector layer.

PropTypeDefaultDescription
urlstringRequired Feature layer URL
wherestringSQL WHERE filter
outFieldsstring | string[]Fields to include
type'fill' | 'circle' | 'line' | 'symbol' | 'heatmap''fill'Layer type added for the source
paintRecord<string, unknown>MapLibre paint properties
layoutRecord<string, unknown>MapLibre layout properties
import { EsriFeatureLayer } from 'esri-gl/react-map-gl';

<Map>
<EsriFeatureLayer
id="states"
url="https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3"
where="POP2000 > 5000000"
outFields={['STATE_NAME', 'POP2000']}
paint={{ 'fill-color': '#0080ff', 'fill-opacity': 0.4 }}
/>
</Map>

EsriVectorTileLayer

Renders an Esri Vector Tile Service. The service handles layer creation internally.

PropTypeDescription
urlstringRequired Vector Tile Service URL
import { EsriVectorTileLayer } from 'esri-gl/react-map-gl';

<Map>
<EsriVectorTileLayer
id="basemap-vtiles"
url="https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer"
/>
</Map>

EsriVectorBasemapLayer

Applies an Esri Vector Basemap Style to the map by calling setStyle on it. Note: this replaces the entire map style rather than adding a layer, so any layers other components added are dropped when it mounts.

PropTypeDescription
basemapEnumstringRequired Basemap style (e.g., 'arcgis/streets', 'arcgis/navigation')
tokenstringOAuth / user token (v2 host). Provide token or apiKey.
apiKeystringArcGIS Location Platform API key (v1 host). Provide token or apiKey.
languagestringLocale for the basemap labels
worldviewstringWorldview to render disputed boundaries for
import { EsriVectorBasemapLayer } from 'esri-gl/react-map-gl';

<Map>
<EsriVectorBasemapLayer
id="basemap"
basemapEnum="arcgis/navigation"
token="YOUR_TOKEN"
/>
</Map>

EsriPortalLayer

Deprecated

When you know the service type, pass the item id as the url of the matching layer component (e.g. <EsriDynamicLayer url={itemId} />). Use EsriPortalLayer only when the type must be auto-detected from the item.

Resolves an ArcGIS portal item id to the matching service and adds a renderer-appropriate layer for it — raster for Dynamic/Tiled/Image services, the service's default style for Feature and Vector Tile services.

PropTypeDescription
itemIdstringRequired ArcGIS portal item id to resolve
layerIdnumberFor multi-layer Feature Services, which sublayer to load (default 0)
portalstringPortal sharing REST URL (defaults to ArcGIS Online)
onResolve(result: PortalServiceResult) => voidCalled once the item resolves, with the service/kind/url/title
token / apiKey / authenticationStandard auth options
import { EsriPortalLayer } from 'esri-gl/react-map-gl';

<Map>
<EsriPortalLayer
id="portal-item"
itemId="a1b2c3d4e5f6"
token="YOUR_TOKEN"
onResolve={({ kind, title }) => console.log(`Loaded ${kind}: ${title}`)}
/>
</Map>

See the Portal Items guide for how item types map to services.

Integration Hooks

These hooks provide access to the underlying map instance and pre-configured service hooks for react-map-gl applications.

useEsriMaplibreLayer

Hook for using Esri services with MapLibre GL via react-map-gl.

Returns:

PropertyTypeDescription
mapMap | undefinedThe MapLibre GL map instance (undefined until the map ref is set)
useDynamicMapServicefunctionPre-configured hook
useTiledMapServicefunctionPre-configured hook
useImageServicefunctionPre-configured hook
useVectorTileServicefunctionPre-configured hook
useFeatureServicefunctionPre-configured hook
import { useEsriMaplibreLayer } from 'esri-gl/react-map-gl';

function MyLayer() {
const { map, useDynamicMapService } = useEsriMaplibreLayer();
const { service } = useDynamicMapService({
sourceId: 'census',
map,
options: { url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer' },
});
return null;
}

useEsriMapboxLayer

Hook for using Esri services with Mapbox GL via react-map-gl. Same API as useEsriMaplibreLayer but uses the Mapbox provider.

Returns:

PropertyTypeDescription
mapMap | undefinedThe Mapbox GL map instance (undefined until the map ref is set)
useDynamicMapServicefunctionPre-configured hook
useTiledMapServicefunctionPre-configured hook
useImageServicefunctionPre-configured hook
useVectorTileServicefunctionPre-configured hook
useFeatureServicefunctionPre-configured hook
import { useEsriMapboxLayer } from 'esri-gl/react-map-gl';

function MyLayer() {
const { map, useDynamicMapService } = useEsriMapboxLayer();
const { service } = useDynamicMapService({
sourceId: 'census',
map,
options: { url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer' },
});
return null;
}