Chevron DownCommand-Line Reference
Chevron DownAPI Reference

What's New

MVTLoader + MVTLayer (v2.1)

TerrainLoader + TerrainLayer (v2.1)

I3SLoader + Tile3DLayer + I3S (v2.1)

v3.1 (Planning/prototyping stage)

Target Release Date: Q4 2021.

Aspirational goals:

  • EcmaScript module support
  • Unbundled loaders.
  • More comprehensive support for options.shape to control output format of loaders.
  • Replace Schema class with arrow schema if arrowjs tree-shaking improvements are satisfactory.
  • New loaders: GeoTIFFLoader, ZarrLoader, ParquetLoader, AVROLoader
  • ffmpeg WASM integration for


Release Date: July 13, 2021. v3.0 is a major release, that adds a range of new loaders and features and continues the transition of the code base to typescript. Some deprecated APIs have been removed, check the upgrade guide for breaking changes.

General improvements

  • New loader option: options.<loader>.shape to control format of data. Will gradually be supported by all loaders.
  • TypeScript: improved types for many APIs.
  • TypeScript: many loaders now export a LoaderOptions type that can be used to typecheck loader options, e.g import type {CSVLoaderOptions} from

  • New loader option: options.mimeType to override loader selection.
  • New loader option: options.fallbackMimeType to control fallback loader selection.
  • New loader option: options.limit to limit number of rows returned during batched parsing.
  • New processOnWorker() function allows applications to run certain non-loader tasks (such as compression and decompression) on workers.

  • New compressions: brotli, snappy, LZO (limited).
  • New CompressionWorker exports enable compression and decompression on worker threads using the new processOnWorker() function.
  • Improved API (see upgrade guide)

  • New CryptoWorker export enables CRC32, CRC32c and MD5 hashing on worker threads using the new processOnWorker() function.

  • options.csv.type can be explicitly set to
    • 'object-row-table' (default) transforms rows to JS objects with the header row as keys.
    • 'array-row-table' in which the row will be returned as an array of values.
  • Duplicate column names will have a counter suffix added to ensure that they are unique.

  • Added getSingleFeature() function for extracting a single GeoJSON feature from a BinaryGeometry

  • Updated to draco3d@1.4.1
  • Supports binary array fields in draco metadata.
  • Significant performance improvements for loading and decoding.

  • KMLLoader - updated loader, now works under Node.js.
  • GPXLoader, TCXLoader - new loaders to parse common formats for recorded GPS tracks.

  • Upgrades apache-arrow version to 4.0.0 (NEW)

  • New table category loader for Excel spreadsheets in both binary .xls, .xlsb and XML-based .xlsx formats.

  • Thanks to a major contribution from Esri, the I3SLoader now offers full I3S 1.7 support including:
    • page nodes
    • compressed geometry
    • compressed textures
    • attributes (object picking)

  • Binary output is now 2-3X faster for large datasets thanks to parsing directly from PBF to binary, rather than going through GeoJSON as an intermediate representation. Speed comparison on some example data sets (MVT tiles parsed per second):
Via GeoJSONDirectSpeed increase
Block groups2.86/s5.57/s1.94X
Census layer6.09/s11.9/s1.95X
Counties Layer72.5/s141/s1.94X
Usa Zip Code Layer8.45/s20.3/s2.4X

Benchmarks ran using scripts on a 2012 MacBook Pro, 2.3 GHz Intel Core i7, 8 GB, measuring parsing time of MVTLoader only (network time and rendering is not included)

  • When using the MVTLoader with binary: true the triangulation of polygons is performed in a worker, speeding up loading of polygon geometries and easing the work on the main thread.

  • New options.terrain.tesselator option in TerrainLoader for selecting desired method of mesh generation. Use 'martini' for a faster method that works in most cases or 'delatin', which is slower but supports non-square images. (NEW)

  • textures website example shows which compressed texture formats work on the current device.
  • CompressedTextureLoader now supports KTX2, DDS and PVR containers.
  • BasisLoader with latest binaries.
  • CrunchLoader
  • CompressedTextureWriter is available (for Node.js only)
  • Texture loading API for multi-image-based textures loadImageTexture, loadImageTextureArray, loadImageTextureCube
  • A new NPYLoader to parse N-dimensional arrays generated by the NumPy Python library for high bit depth data and image textures. (NEW)

  • Thanks to a major contribution from Esri, the new tile-converter module implements conversion between the OGC 3D tiles and the OGC I3S tileset formats, through:
    • A tile-converter CLI tool for automated batch conversion of multi-terabyte tilesets.
    • A docker image to facilitate easy installs of the converter.
    • A Node.js converter class API is also available for programmatic use.


Release Date: October 12, 2020

This release brings a new Shapefile loader, compression codecs (Zlib, LZ4, Zstandard), support for binary output from geospatial loaders, and a range of improvements supporting integration with, a major geospatial application. (NEW)

  • A new loader for the ESRI Shapefile format has been added. It loads .SHP and (if available) .DBF, .CPG and .PRJ files and returns a geojson like geometry. (NEW)

  • A new module with compression/decompression transforms for compression codecs (Zlib, LZ4, Zstandard). As always, these work reliably in both browsers and Node.js. (NEW)

  • A new module for calculating cryptographic hashes (MD5, SHA256 etc). Provided transforms enables hashes to be calculated incrementally, e.g. on incoming binary chunks while streaming data into parseInBatches.

  • Draco3D libraries are upgraded to version 1.3.6.
  • Draco metadata can now be encoded and decoded.
  • Custom Draco attributes are now decoded.

  • GLBLoader can now read older GLB v1 files in addition to GLB v2.
  • GLTFLoader now offers optional, partial support for reading older glTF v1 files and automatically converting them to glTF v2 format (via options.glt.normalize).

  • Binary output is now available for the GeoJsonLoader, via options.gis.format: 'binary'.

  • Binary output is now available for the KMLLoader, via options.gis.format: 'binary'.

  • Uses a newer version of the laz-perf parser (1.4.4).

  • Binary output is now available for the Mapbox Vector Tiles MVTLoader, via options.gis.format: 'binary'.

  • parseInBatches() now allows the caller to specify "transforms" that shoud be applied on the input data before parsing, via options.transforms. See the new crypto and compression modules for available transforms to calculate cryptographic hashes on / decompress "streaming" data.
  • parseInBatches() can now be called on all loaders. Non-batched loaders will just return a single batch.
  • options.fetch (load, parse etc.) can now be used to supply a either a fetch options object or a custom fetch function.
  • (BREAKING) selectLoader() is now async and returns a Promise that resolves to a loader.
  • selectLoader() can now select loaders through content sniffing of Blob and File objects.
  • selectLoaderSync() has been added for situations when calling an async function is not practial.

  • fetch polyfill: Files with .gz extension are automatically decompressed with gzip. The extension reported in the fetch response has the .gz extension removed.
  • fetch polyfill: Improved robustness and error handling in Node.js when opening unreadable or non-existent files. Underlying errors (ENOEXIST, EISDIR etc) are now caught and reported in Response.statusText.
  • Blob and File, new experimental polyfills.


Framework and loader improvements based on usage in applications.

Release Date: June 18, 2020

Typescript Type Definitions

Typescript type definitions (d.ts files) are now provided for some modules that export APIs (functions and classes).

Loader Improvements

  • parseInBatches a new options.metadata option adds an initial batch with metadata about what data format is being loaded.
  • selectLoader (and parse etc) now recognizes unique unregistered MIME types (e.g application/x.ply) for every loader. This enable applications that can set content-type headers to have precise control over loader selection.

The ImageLoader now loads images as Imagebitmap by default on browsers that support ImageBitmap (Chrome and Firefox). The performance improvements are dramatic, which can be verified in the new benchmark example.

Addresses a number of compatibility issues with different I3S tilesets that have been reported by users.

A new QuantizedMeshLoader has been added to the terrain module to decode the Quantized Mesh format. (new loader module)

An experimental new module with video loading and GIF generation support.

A new WKBLoader has been added to the wkt module to decode the Well-Known Binary format.

Worker support for the WKTLoader, designed to support future binary data improvements.

  • parseInBatches now accepts options.json.jsonpaths to specify which array should be streamed using limited JSONPath syntax (e.g. '$.features' for GeoJSON).
  • parseInBatches returned batches now contain a batch.bytesUsed field to enable progress bars.
  • parseInBatches partial and final result batches are now generated when setting the metadata: true options.
  • .geojson files can now alternatively be parsed by a new experimental GeoJSONLoader (exported with an underscore as _GeoJSONLoader), introduced to support future binary data improvements.

  • parseInBatches now returns a batch.bytesUsed field to enable progress bars.
  • Header auto-detection available via options.csv.header: 'auto'.

Updated to use apache-arrow version 0.17.0.

The Tile3DLoader now installs the DracoLoader. The application no longer needs to import and register the DracoWorkerLoader.

The GLTFLoader now installs the DracoLoader. The application no longer needs to import and register the DracoWorkerLoader.

  • The fetch and Response polyfills for Node.js have been significantly improved, supporting more types of input and parameters with higher fidelity
  • The fetch polyfill now automatically add the accept-encoding header and automatically decompresses gzip, brotli and deflate compressed responses.


Release Date: Mar 16, 2020

This release adds a number of new geospatial format loaders

New Geospatial Loaders

The new loaders empowers rendering frameworks to visualize various geospatial datasets. (new loader module)

  • A new loader module for I3S tiles is added to the 3D Tiles family. Checkout the San Francisco Buildings example. This is a collaboration with ESRI and Tamrat Belayneh @Tamrat-B (new loader module) (new loader module)

  • A new loader module for reconstructing mesh surfaces from height map images. Check out the example with's TerrainLayer. (new loader module)

  • A new loader module for the Well-Known Text geometry format.

Other Improvements

  • The load and parse functions can now read data directly from Stream objects both in node and browser.

  • The ArrowJS dependency has been upgraded to v0.16.
  • The ArrowJS API documentation in the website has been improved.

  • Images can now be loaded as data: Using the ImageLoader with options.image.type: 'data' parameter will return an image data object with width, height and a typed array containing the image data (instead of an opaque Image or ImageBitmap instance).
  • ImageBitmap loading now works reliably, use ImageLoader with options.image.type: 'imagebitmap'.

  • The streaming JSON loader now has an experimental option _rootObjectBatches that returns the top-level JSON object containing the JSON array being streamed, as additional first (partial) and last (complete) batches.

Mesh Category


Release Date: Dec 20, 2019

The 2.0 release brings potentially dramatic bundle size savings through dynamic loading of loaders and workers, significant overhauls to several loaders including , image loading improvements and the glTF loader, and a powerful loader composition system.

  • Loader-Specific Options Each loader now defines its own sub object in the options object. This makes it possible to cleanly specify options for multiple loaders at the same time. This is helpful when auto-selects a pre-registered loader or when passing options to a sub-loader when using a composite loader.

  • Smaller Loaders Big loaders such as DracoLoader and BasisLoader that use large libraries (e.g. WASM/WebAssembly or emscripten/C++ transpiled to JavaScript) now load those libraries dynamically from CDN resulting in dramatic bundle size savings. E.g the bundle size impact of the DracoLoader was reduced from > 1MB to just over 10KB.

  • Worker Loaders

    • Ease-of-use: Worker loading is provided by the main loader objects. It is not necessary to import the ...WorkerLoader objects to enable worker loading (but see below about bundle size)
    • Performance: Loading on worker threads is now the default: All worker enabled loaders now run on worker threads by default (set options.worker: false to disable worker-thread loading and run the loader on the main thread).
    • Debugging: Development builds of workers are now available on CDN, eabling debugging of worker loaders.
    • Bundle size: Workers are no longer bundled, but loaded from from the CDN.
    • Bundle size: Note that the old ...WorkerLoader classes are still available. Using these can save even more bundle space since during tree-shaking since they do not depend on the non-worker parser.
  • Composite Loaders

    • The new composite loader architecture enables complex loaders like Tiles3DLoader and GLTFLoader to be composed from more primitive loaders without losing the ability to run some parts on worker, pass arguments to sub-loaders etc.

New Loader Modules

  • (Experimental) A new module for the basis format that enables. This module also provides a CompressedImageLoader for more traditional compressed images.
  • (Experimental) A new streaming JSONLoader that supports batched (i.e. streaming) parsing from standard JSON files, e.g. geojson. No need to reformat your files as line delimited JSON.

Update Loader Modules

  • the GLTFLoader is now a "composite loader". The perhaps most important change is that load(url, GLTFLoader) also loads all sub-assets, including images, Draco compressed meshes, etc making the loaded data easier for applications to use.
  • see below for a list of changes Updates

  • New ImageLoader options options: {image: {}} contain common options that apply across the category

    • options.image.type, Ability to control loaded image type enabling faster ImageBitmap instances to be loaded via type: 'imagebitmap. Default auto setting returns traditional HTML image objects.
  • Image Decoding. options.image.decodeHTML: true - ImageLoader now ensures HTML images are completely decoded and ready to be used when the image is returned (by calling Image.decode()).

  • Parsed Image API Since the type of images returned by the ImageLoader depends on the {image: {type: ...}} option, a set of functions are provided to work portably with loaded images: isImage(), getImageType(), getImageData(), ...

  • Binary Image API Separate API to work with unparsed images in binary data form: isBinaryImage(), getBinaryImageType(), getBinaryImageSize(), ...

  • "Texture" Loading API New methods loadImages and loadImageCube can signficantly simplify loading of arrays of arrays of (mipmapped) images that are often used in 3D applications. These methods allow an entire complex of images (e.g. 6 cube faces with 10 mip images each) to be loaded using a single async call.

  • Improved Node.js support More image test cases are now run in both browser and Node.js and a couple of important Node.js issues were uncovered and fixed.


Release Date: Sep 13, 2019

The 1.3 release is focused on production quality 3D tiles support, maturing the v2 glTF parser, and provides some improvements to the core API.


  • Tile3DLayer moved to

    • The Tile3DLayer can now be imported from, and no longer needs to be copied from the 3d-tiles example
  • Batched 3D Model Tile Support

    • b3dm tiles can now be loaded and displayed by the Tile3DLayer (in addition to pnts tiles).
  • Performance Tracking

    • Tileset3D now contain a stats object which tracks the loading process to help profile big tilesets.
    • Easily displayed in your UI via the module (see 3d-tiles example).
  • Request Scheduling

    • The Tileset3D class now cancels loads for not-yet loaded tiles that are no longer in view).
    • Scheduling dramatically improves loading performance when panning/zooming through large tilesets.

  • Version 2 Improvements
    • Select the new glTF parser by passing options.gltf.parserVersion: 2 to the GLTFLoader.
    • Many improvements to the v2 glTF parser.

  • Loader Selection Improvements

    • The loader selection mechanism is now exposed to apps through the new selectLoader API.
    • Loaders can now examine the first bytes of a file
    • This complements the existing URL extension based auto detection mechanisms.
  • Worker Thread Pool

    • Now reuses worker threads. Performance gains by avoiding worker startup overhead.
    • Worker threads are named, easy to track in debugger
    • Worker based loaders can now call parse recursively to delegate parsing of embedded data (e.g. glTF, Draco) to other loaders


The 1.2 release is a smaller release that resolves various issues encountered while using 1.1.

Release Date: Aug 8, 2019

  • File Type Auto Detection now supports binary files
  • Fixed TextEncoder warnings
  • Improved Node 8 support
  • Image file extensions now added to loader object
  • Generate default sampler parameters if none provided in gltf file (EXPERIMENTAL)

  • Support for dynamic traversal of 3D tilesets (automatically loads and unloads tiles based on viewer position and view frustum).
  • Support for loading tilesets from Cesium ION servers.
  • Asynchronous tileset loading
  • Auto centering of view based on tileset bounding volumes
  • Tile3DLayer class provided in examples.


The 1.1 release addresses a number of gaps in original release, introduces the GLTFLoader, and initiates work on 3DTiles support.

Release Date: May 30, 2019


  • fetchFile function - Can now read browser File objects (from drag and drop or file selection dialogs).
  • isImage(arrayBuffer [, mimeType]) function - can now accept a MIME type as second argument.

  • getImageMIMEType(arrayBuffer) function ( EW) - returns the MIME type of the image in the supplied ArrayBuffer.
  • isImage(arrayBuffer [, mimeType]) function - can now accept a MIME type as second argument.

  • The glTF module has been refactored with the aim of simplifying the loaded data and orthogonalizing the API.

  • "Embedded' GLB data (GLBs inside other binary formats) can now be parsed (e.g. the glTF parser can now extract embedded glTF inside 3D tile files).

  • New classes/functions:

    • GLTFScenegraph class (NEW) - A helper class that provides methods for structured access to and modification/creation of glTF data.
    • postProcessGLTF function ( EW) - Function that performs a set of transformations on loaded glTF data that simplify application processing.
    • GLBLoader/GLBWriter - loader/writer pair that enables loading/saving custom (non-glTF) data in the binary GLB format.
    • GLTFLoader, letting application separately handle post-processing. (NEW MODULE)

  • Support for the 3D tiles format is being developed in the new module.
  • Loading of individual point cloud tiles, including support for Draco compression and compact color formats such as RGB565 is supported. (NEW MODULE)

Node support now requires importing before use. This reduces the number of dependencies, bundle size and potential build complications when using other modules when not using Node.js support. (NEW MODULE)

Helper functions for loaders have been broken out from Individual loaders no longer depend but only on


Release Date: April 2019

First Official Release