🔒 Authentication

Secure, enterprise-grade authentication for all ArcGIS platforms

OAuth2 / PKCE

Modern OAuth2 with PKCE flow for user-facing applications. Supports both ArcGIS Online and Enterprise portals.

  • Secure browser-based authentication
  • Automatic token refresh
  • Popup or redirect flows
  • Portal URL configuration

API Key

Static API keys for ArcGIS Location Platform and Developer accounts. Simple setup for server-side or public applications.

  • ArcGIS Location Platform
  • Developer accounts
  • No user interaction required
  • Scoped permissions

generateToken

Username/password token generation for ArcGIS Server and older Enterprise deployments.

  • Legacy Enterprise support
  • Server-to-server scenarios
  • Configurable token expiry
  • IWA fallback

App Credentials

Server-to-server OAuth2 client credentials flow for backend applications.

  • No user context
  • Automated workflows
  • Service account support
  • Enterprise integration

Authentication Flow

sequenceDiagram
    participant App as Application
    participant AM as ArcGISAuthManager
    participant Portal as ArcGIS Portal
    participant User as User Browser
    
    alt OAuth2/PKCE
        App->>AM: Initialize with OAuth2 config
        AM->>Portal: Request authorization code
        Portal->>User: Show login page
        User->>Portal: Enter credentials
        Portal->>AM: Return authorization code
        AM->>Portal: Exchange code for token (PKCE)
        Portal->>AM: Return access token
        AM->>App: Token ready event
    else API Key
        App->>AM: Initialize with API key
        AM->>App: Ready immediately
    else generateToken
        App->>AM: Initialize with username/password
        AM->>Portal: generateToken request
        Portal->>AM: Return token
        AM->>App: Token ready event
    end
    
    Note over AM: Auto-refresh 60s before expiry
        

🌎 ESRI Layer Types

Complete support for all major ArcGIS service types

graph LR
    subgraph Services["ArcGIS Services"]
        FS[Feature Service]
        DMS[Dynamic Map Service]
        TMS[Tiled Map Service]
        VTS[Vector Tile Service]
        IS[Image Service]
    end
    
    subgraph Controls["MapLibre Controls"]
        FSControl[EsriFeatureServiceControl]
        DMSControl[EsriDynamicMapServiceControl]
        TMSControl[EsriTiledMapServiceControl]
        VTSControl[EsriVectorTileServiceControl]
        ISControl[EsriImageServiceControl]
    end
    
    subgraph Features["Features"]
        TiledVect[Tiled Vector]
        RasterTiles[Raster Tiles]
        CachedTiles[Cached Tiles]
        StyledVect[Styled Vector]
        RenderRules[Rendering Rules]
    end
    
    FS --> FSControl --> TiledVect
    DMS --> DMSControl --> RasterTiles
    TMS --> TMSControl --> CachedTiles
    VTS --> VTSControl --> StyledVect
    IS --> ISControl --> RenderRules
        
Control Service Type Key Features
EsriFeatureServiceControl FeatureServer / MapServer Tiled vector loading, where clauses, outFields, simplification, click-to-query
EsriDynamicMapServiceControl MapServer (dynamic) Layer definitions, time parameters, identify-on-click, legend
EsriTiledMapServiceControl MapServer (tiled) Cached tiles, legend auto-fetch, tile matrix support
EsriVectorTileServiceControl VectorTileServer Style-from-service, custom sprites, font glyphs
EsriImageServiceControl ImageServer Identify, time, rendering rules, mosaic rules

🗑 WebMap & WebScene Loading

Load portal items and automatically apply their configurations

flowchart TB
    subgraph Input["Input"]
        ITEM[Portal Item ID]
    end
    
    subgraph Loader["WebMapLoader"]
        FETCH[Fetch Item Data]
        PARSE[Parse WebMap JSON]
        DISPATCH[LayerTypeDispatcher]
    end
    
    subgraph Output["Map Components"]
        BASEMAP[Apply Basemap]
        LAYERS[Add Layers]
        EXTENT[Fit Extent]
    end
    
    subgraph LayerTypes["Supported Layers"]
        FL[FeatureLayer]
        MSL[MapServiceLayer]
        TMSL[TiledMapServiceLayer]
        ISL[ImageServiceLayer]
        VTL[VectorTileLayer]
        GEOJSON[GeoJSON]
    end
    
    ITEM --> FETCH --> PARSE --> DISPATCH
    DISPATCH --> BASEMAP
    DISPATCH --> LAYERS
    DISPATCH --> EXTENT
    DISPATCH --> LayerTypes
    
    FL --> EsriFeatureServiceControl
    MSL --> EsriDynamicMapServiceControl
    TMSL --> EsriTiledMapServiceControl
    ISL --> EsriImageServiceControl
    VTL --> EsriVectorTileServiceControl
        
💡 WebScene Support

WebScene items are also supported. 3D-only layers (SceneLayer, BuildingSceneLayer, IntegratedMeshLayer) are skipped with warnings, while 2D-compatible layers are extracted and rendered.

☁ Cloud-Optimised GeoTIFF (COG)

Stream rasters directly from S3 or public HTTPS with in-browser analytics

COG from S3

Stream Cloud-Optimised GeoTIFFs directly from AWS S3 buckets with automatic pre-signed URL generation.

  • Private bucket support
  • AWS SDK integration
  • Pre-signed URL generation
  • Region configuration

COG Analytics (Pyodide)

Run Python/numpy analytics on COGs directly in the browser. No server required.

  • NDVI, EVI, SAVI, NBR indices
  • Hillshade calculation
  • Custom Python formulas
  • Multiple colormaps

COG Analytics Pipeline

flowchart LR
    subgraph Sources["Data Sources"]
        S3[AWS S3]
        HTTPS[Public HTTPS]
    end
    
    subgraph Browser["Browser Processing"]
        COGLIB[geotiff.js]
        PYODIDE[Pyodide Runtime]
        NUMPY[NumPy Arrays]
    end
    
    subgraph Analytics["Analytics"]
        NDVI[NDVI]
        EVI[EVI]
        SAVI[SAVI]
        NBR[NBR]
        HILLSHADE[Hillshade]
        CUSTOM[Custom Python]
    end
    
    subgraph Output["Output"]
        COLORMAP[Apply Colormap]
        MAP[Render to Map]
    end
    
    Sources --> COGLIB --> NUMPY
    NUMPY --> PYODIDE --> Analytics
    Analytics --> COLORMAP --> MAP
        
Custom Python Formula Example
# Custom NDVI formula with numpy
import numpy as np
nir, red = bands[4], bands[3]
result = (nir - red) / (nir + red + 1e-10)
result_normalized = ((result.clip(-1, 1) + 1) / 2).astype(np.float32)
vmin_val = float(result.min())
vmax_val = float(result.max())

📈 COPC LiDAR Point Clouds

Visualize massive point cloud datasets in the browser

graph TB
    subgraph Sources["Point Cloud Sources"]
        COPC[COPC Files]
        LAZ[LAZ Files]
        EPT[EPT Format]
    end
    
    subgraph Storage["Storage"]
        S3[AWS S3]
        HTTPS[Public HTTPS]
    end
    
    subgraph Loader["Loading Pipeline"]
        LAZER[maplibre-gl-lidar]
        DECK[deck.gl Rendering]
    end
    
    subgraph Visualization["Visualization"]
        PTSIZE[Point Size Control]
        COLOR[Color Schemes]
        CLASS[Classification Legend]
        PICK[Point Picking]
    end
    
    Sources --> Storage --> Loader --> Visualization
        
🎨

Color Schemes

Elevation, intensity, classification, RGB, and return number coloring options.

🔍

Point Picking

Click on points to view attributes including elevation, intensity, and classification.

📈

Level of Detail

Automatic LOD management for smooth performance with massive datasets.

🦠 DuckDB WASM GIS Loader

Load and analyze GIS files entirely in the browser

flowchart TB
    subgraph Input["Input Formats"]
        GEOJSON[GeoJSON]
        SHP[Shapefile.zip]
        KML[KML/KMZ]
        GPX[GPX]
        CSV[CSV/TSV]
        PARQUET[GeoParquet]
        FGB[FlatGeoBuf]
        GPKG[GeoPackage]
    end
    
    subgraph DuckDB["DuckDB WASM"]
        SPATIAL[Spatial Extension]
        SQL[SQL Engine]
        VIEW[Virtual Tables]
    end
    
    subgraph Output["MapLibre Output"]
        FILL[Fill Layers]
        LINE[Line Layers]
        CIRCLE[Circle Layers]
        SYMBOL[Symbol Layers]
    end
    
    Input --> DuckDB --> SPATIAL --> SQL --> VIEW
    VIEW --> Output
        

DuckDBLayerControl

Interactive drag-and-drop control for loading GIS files.

  • Drag & drop file upload
  • URL loading
  • Automatic geometry detection
  • Layer style configuration

DuckDBGeoprocessor

In-browser geoprocessing tools powered by DuckDB spatial SQL.

  • Buffer, Clip, Erase
  • Intersect, Spatial Join
  • Dissolve, Centroid
  • Area/Length calculations

DuckDBAttributeTableControl

Paginated attribute table with filtering and queries.

  • Bbox / KNN filtering
  • Query builder UI
  • Pivot table support
  • Export options
⚠ CORS Requirements

DuckDB WASM requires specific CORS headers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp. Use maplibre-arcgis serve for local development, or configure your web server appropriately.

📷 Oriented Imagery

360 panoramas and oblique imagery with spatial synchronization

graph TB
    subgraph Input["Imagery Sources"]
        FS[Feature Service]
        IMG[Image Files]
    end
    
    subgraph Control["OrientedImageryControl"]
        LOADER[Image Loader]
        VIEWER[Image Viewer]
        FRUSTUM[Footprint Renderer]
    end
    
    subgraph Types["Image Types"]
        PAN360[360 Panorama]
        OBLIQUE[Oblique]
        NADIR[Nadir]
        INSPECT[Inspection]
    end
    
    subgraph Features["Features"]
        SYNC[Spatial Sync]
        ENHANCE[Image Enhancements]
        GALLERY[Image Gallery]
        LOCATE[Location Tool]
    end
    
    Input --> Control
    Control --> Types
    Control --> Features
    
    SYNC --> CLICK[Click Map = View Image]
    SYNC --> LOCATEIMG[Click Image = See Location]
        
🌏

360 Panoramas

Interactive spherical image viewing with mouse pan/rotate controls.

🗺

Viewing Frustums

Visualize camera positions and field-of-view on the map.

🔎

Spatial Sync

Click map to view imagery, click image to see ground location.

🎨

Image Enhancements

Brightness, contrast, and sharpness adjustments.

⚙ No-Code YAML Configuration

Define maps in YAML and deploy as static HTML

flowchart LR
    subgraph Config["Configuration"]
        YAML[map.yaml]
        SCHEMA[Pydantic Schema]
    end
    
    subgraph CLI["Python CLI"]
        INIT[maplibre-arcgis init]
        VALIDATE[maplibre-arcgis validate]
        BUILD[maplibre-arcgis build]
        SERVE[maplibre-arcgis serve]
        CONVERT[maplibre-arcgis convert]
    end
    
    subgraph Output["Output"]
        HTML[Static HTML]
        CDN[CDN Assets]
    end
    
    Config --> CLI
    CLI --> Output
    
    HTML --> DEPLOY[Deploy Anywhere]
        
Command Description
maplibre-arcgis init Create a starter map.yaml with commented examples
maplibre-arcgis validate map.yaml Validate config against schema, optionally ping service URLs
maplibre-arcgis build map.yaml Generate self-contained HTML deployable anywhere
maplibre-arcgis serve map.yaml Local dev server with hot-reload and proper CORS headers
maplibre-arcgis convert webmap ID Convert existing WebMap to YAML configuration

Explore the Documentation

Learn how to integrate these features into your applications.