]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD/mapillary-js/mapillary.js.flow
Update to iD v2.21.0
[rails.git] / vendor / assets / iD / iD / mapillary-js / mapillary.js.flow
diff --git a/vendor/assets/iD/iD/mapillary-js/mapillary.js.flow b/vendor/assets/iD/iD/mapillary-js/mapillary.js.flow
new file mode 100644 (file)
index 0000000..227d3b0
--- /dev/null
@@ -0,0 +1,8098 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+/**
+ * Convert coordinates from geodetic (WGS84) reference to local topocentric
+ * (ENU) reference.
+ * @param {number} lng Longitude in degrees.
+ * @param {number} lat Latitude in degrees.
+ * @param {number} alt Altitude in meters.
+ * @param {number} refLng Reference longitude in degrees.
+ * @param {number} refLat Reference latitude in degrees.
+ * @param {number} refAlt Reference altitude in meters.
+ * @returns {Array<number>} The x, y, z local topocentric ENU coordinates.
+ */
+declare function geodeticToEnu(
+  lng: number,
+  lat: number,
+  alt: number,
+  refLng: number,
+  refLat: number,
+  refAlt: number
+): number[];
+
+/**
+ * Convert coordinates from local topocentric (ENU) reference to
+ * geodetic (WGS84) reference.
+ * @param {number} x Topocentric ENU coordinate in East direction.
+ * @param {number} y Topocentric ENU coordinate in North direction.
+ * @param {number} z Topocentric ENU coordinate in Up direction.
+ * @param {number} refLng Reference longitude in degrees.
+ * @param {number} refLat Reference latitude in degrees.
+ * @param {number} refAlt Reference altitude in meters.
+ * @returns {Array<number>} The longitude, latitude in degrees
+ * and altitude in meters.
+ */
+declare function enuToGeodetic(
+  x: number,
+  y: number,
+  z: number,
+  refLng: number,
+  refLat: number,
+  refAlt: number
+): number[];
+
+/**
+ * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference
+ * to local topocentric (ENU) reference.
+ * @param {number} X ECEF X-value.
+ * @param {number} Y ECEF Y-value.
+ * @param {number} Z ECEF Z-value.
+ * @param {number} refLng Reference longitude in degrees.
+ * @param {number} refLat Reference latitude in degrees.
+ * @param {number} refAlt Reference altitude in meters.
+ * @returns {Array<number>} The x, y, z topocentric ENU coordinates in East, North
+ * and Up directions respectively.
+ */
+declare function ecefToEnu(
+  X: number,
+  Y: number,
+  Z: number,
+  refLng: number,
+  refLat: number,
+  refAlt: number
+): number[];
+
+/**
+ * Convert coordinates from local topocentric (ENU) reference
+ * to Earth-Centered, Earth-Fixed (ECEF) reference.
+ * @param {number} x Topocentric ENU coordinate in East direction.
+ * @param {number} y Topocentric ENU coordinate in North direction.
+ * @param {number} z Topocentric ENU coordinate in Up direction.
+ * @param {number} refLng Reference longitude in degrees.
+ * @param {number} refLat Reference latitude in degrees.
+ * @param {number} refAlt Reference altitude in meters.
+ * @returns {Array<number>} The X, Y, Z ECEF coordinates.
+ */
+declare function enuToEcef(
+  x: number,
+  y: number,
+  z: number,
+  refLng: number,
+  refLat: number,
+  refAlt: number
+): number[];
+
+/**
+ * Convert coordinates from geodetic reference (WGS84) to Earth-Centered,
+ * Earth-Fixed (ECEF) reference.
+ * @param {number} lng Longitude in degrees.
+ * @param {number} lat Latitude in degrees.
+ * @param {number} alt Altitude in meters.
+ * @returns {Array<number>} The X, Y, Z ECEF coordinates.
+ */
+declare function geodeticToEcef(
+  lng: number,
+  lat: number,
+  alt: number
+): number[];
+
+/**
+ * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference
+ * to geodetic reference (WGS84).
+ * @param {number} X ECEF X-value.
+ * @param {number} Y ECEF Y-value.
+ * @param {number} Z ECEF Z-value.
+ * @returns {Array<number>} The longitude, latitude in degrees
+ * and altitude in meters.
+ */
+declare function ecefToGeodetic(X: number, Y: number, Z: number): number[];
+
+/**
+ * Contract describing triangulated meshes.
+ */
+export interface MeshContract {
+  /**
+   * Flattened array of faces for the mesh. Each face consist
+   * three vertex indices.
+   */
+  faces: number[];
+
+  /**
+   * Flattened array of vertices for the mesh. Each vertex
+   * consists of X, Y and Z coordinates in the camera
+   * reference frame.
+   */
+  vertices: number[];
+}
+/**
+ * Decompress and parse an array buffer containing zipped
+ * json data and return as a json object.
+ * @description Handles array buffers continaing zipped json
+ * data.
+ * @param {ArrayBuffer} buffer - Array buffer to decompress.
+ * @returns {Object} Parsed object.
+ */
+declare function decompress<T>(buffer: ArrayBuffer): T;
+
+/**
+ * Retrieves a resource as an array buffer and returns a promise
+ * to the buffer.
+ * @description Rejects the promise on request failure.
+ * @param {string} url - URL for resource to retrieve.
+ * @param {Promise} [abort] - Optional promise for aborting
+ * the request through rejection.
+ * @returns {Promise<ArrayBuffer>} Promise to the array buffer
+ * resource.
+ */
+declare function fetchArrayBuffer(
+  url: string,
+  abort?: Promise<void>
+): Promise<ArrayBuffer>;
+
+/**
+ * Read the fields of a protobuf array buffer into a mesh
+ * object.
+ * @param {ArrayBuffer} buffer - Protobuf array buffer
+ * to read from.
+ * @returns {MeshContract} Mesh object.
+ */
+declare function readMeshPbf(buffer: ArrayBuffer): MeshContract;
+
+/**
+ * Interface describing event emitter members.
+ *
+ * This is a specification for implementers to model: it is
+ * not an exported method or class.
+ */
+export interface IEventEmitter {
+  fire<T>(type: string, event: T): void;
+  off<T>(type: string, handler: (event: T) => void): void;
+  on<T>(type: string, handler: (event: T) => void): void;
+}
+
+declare class EventEmitter implements IEventEmitter {
+  constructor(): this;
+
+  /**
+   * Subscribe to an event by its name.
+   * @param {string} type - The name of the event
+   * to subscribe to.
+   * @param {(event: T) => void} handler - The
+   * handler called when the event occurs.
+   */
+  on<T>(type: string, handler: (event: T) => void): void;
+
+  /**
+   * Unsubscribe from an event by its name.
+   * @param {string} type - The name of the event
+   * to unsubscribe from.
+   * @param {(event: T) => void} handler - The
+   * handler to remove.
+   */
+  off<T>(type: string, handler: (event: T) => void): void;
+
+  /**
+   * @ignore
+   */
+  fire<T>(type: string, event: T): void;
+}
+/**
+ * Interface that represents a longitude, latitude coordinate,
+ * measured in degrees. Coordinates are defined in the WGS84 datum.
+ */
+export interface LngLat {
+  /**
+   * Latitude, measured in degrees.
+   */
+  lat: number;
+
+  /**
+   * Longitude, measured in degrees.
+   */
+  lng: number;
+}
+/**
+ * Interface that represents longitude-latitude-altitude
+ * coordinates. Longitude and latitude are measured in degrees
+ * and altitude in meters. Coordinates are defined in the WGS84 datum.
+ * @interface
+ */
+export interface LngLatAlt extends LngLat {
+  /**
+   * Altitude, measured in meters.
+   */
+  alt: number;
+}
+
+/**
+ * Contract describing a reconstruction point.
+ */
+export interface PointContract {
+  /**
+   * RGB color vector of the point, normalized to floats
+   * on the interval [0, 1];
+   */
+  color: number[];
+
+  /**
+   * Coordinates in metric scale in topocentric ENU
+   * reference frame with respect to a geo reference.
+   */
+  coordinates: number[];
+}
+/**
+ * Contract describing cluster reconstruction data.
+ */
+export interface ClusterContract {
+  /**
+   * The unique id of the cluster.
+   */
+  id: string;
+
+  /**
+   * The points of the reconstruction.
+   */
+  points: {
+    [pointId: string]: PointContract,
+    ...
+  };
+
+  /**
+   * The reference longitude, latitude, altitude of
+   * the reconstruction. Determines the
+   * position of the reconstruction in world reference
+   * frame.
+   */
+  reference: LngLatAlt;
+}
+/**
+ * Ent representing an entity with a unique ID.
+ * @interface IDEnt
+ */
+export interface IDEnt {
+  /**
+   * Unique ID.
+   */
+  id: string;
+}
+/**
+ * Ent representing core image properties.
+ */
+export type CoreImageEnt = {
+  /**
+   * SfM computed longitude, latitude in WGS84 datum, measured in degrees.
+   * @description Optional - no 3D interaction available
+   * if unset.
+   */
+  computed_geometry?: LngLat,
+
+  /**
+   * Original EXIF longitude, latitude in WGS84 datum, measured in degrees.
+   */
+  geometry: LngLat,
+
+  /**
+   * Sequence that the image is part of.
+   */
+  sequence: IDEnt,
+  ...
+} & IDEnt;
+
+/**
+ * Contract describing core image results.
+ */
+export interface CoreImagesContract {
+  /**
+   * Geometry cell ID.
+   */
+  cell_id: string;
+
+  /**
+   * Array of core image ents.
+   */
+  images: CoreImageEnt[];
+}
+/**
+ * Ent representing camera properties.
+ */
+export interface CameraEnt {
+  /**
+   * Camera type dependent camera parameters.
+   *
+   * For perspective and fisheye camera types,
+   * the camera parameters array should be
+   * constructed according to
+   *
+   * `[focal, k1, k2]`
+   *
+   * where focal is the camera focal length,
+   * and k1, k2 are radial distortion parameters.
+   *
+   * For spherical camera type the camera
+   * parameters should be an emtpy array.
+   */
+  camera_parameters: number[];
+
+  /**
+   * Projection type of the camera.
+   * @description Supported camera types are:
+   *
+   * ```js
+   * 'spherical'
+   * 'fisheye'
+   * 'perspective'
+   * ```
+   *
+   * Other camera types will be treated as
+   * perspective images.
+   */
+  camera_type: string;
+}
+/**
+ * Ent representing URL properties.
+ */
+export type URLEnt = {
+  /**
+   * URL for fetching ent data.
+   */
+  url: string,
+  ...
+} & IDEnt;
+
+/**
+ * Ent representing image creator properties.
+ */
+export type CreatorEnt = {
+  /**
+   * The username of the creator.
+   */
+  username: string,
+  ...
+} & IDEnt;
+
+/**
+ * Ent representing spatial image properties.
+ */
+export type SpatialImageEnt = {
+  /**
+   * Original EXIF altitude above sea level, in meters.
+   */
+  altitude: number,
+
+  /**
+   * Scale of atomic reconstruction.
+   * @description Optional - no 3D interaction available
+   * if unset.
+   */
+  atomic_scale?: number,
+
+  /**
+   * Timestamp representing the capture date and time.
+   * @description Unix epoch timestamp in milliseconds.
+   */
+  captured_at: number,
+
+  /**
+   * Original EXIF compass angle, measured in degrees.
+   */
+  compass_angle: number,
+
+  /**
+   * Computed altitude, in meters.
+   * @description Optional - no 3D interaction available
+   * if unset.
+   */
+  computed_altitude?: number,
+
+  /**
+   * SfM computed compass angle, measured in degrees.
+   * @description Optional - no 3D interaction available
+   * if unset.
+   */
+  computed_compass_angle?: number,
+
+  /**
+   * Rotation vector in angle axis representation.
+   * @description Optional - no 3D interaction available
+   * if unset.
+   */
+  computed_rotation?: number[],
+
+  /**
+   * Cluster reconstruction to which the image belongs.
+   */
+  cluster: URLEnt,
+
+  /**
+   * Image creator.
+   */
+  creator: CreatorEnt,
+
+  /**
+   * EXIF orientation of original image.
+   */
+  exif_orientation: number,
+
+  /**
+   * Height of original image, not adjusted for orientation.
+   */
+  height: number,
+
+  /**
+   * SfM connected component id to which the image belongs.
+   * @description Optional - no 3D interaction available
+   * if unset.
+   */
+  merge_id?: string,
+
+  /**
+   * 3D mesh resource.
+   */
+  mesh: URLEnt,
+
+  /**
+   * Owner to which the image belongs.
+   */
+  owner: IDEnt,
+
+  /**
+   * Value specifying if image is accessible to organization members only
+   * or to everyone.
+   */
+  private?: boolean,
+
+  /**
+   * Image quality score on the interval [0, 1].
+   */
+  quality_score?: number,
+
+  /**
+   * Image thumbnail resource.
+   */
+  thumb: URLEnt,
+
+  /**
+   * Width of original image, not adjusted for orientation.
+   */
+  width: number,
+  ...
+} & CameraEnt &
+  IDEnt;
+
+/**
+ * Contract describing ent results.
+ */
+export interface EntContract<T> {
+  /**
+   * Ent node.
+   */
+  node: T;
+
+  /**
+   * Ent node id.
+   */
+  node_id: string;
+}
+/**
+ * Contract describing spatial image results.
+ */
+export type SpatialImagesContract = EntContract<SpatialImageEnt>[];
+/**
+ * Ent representing image properties.
+ */
+export type ImageEnt = { ... } & CoreImageEnt & SpatialImageEnt;
+
+/**
+ * Contract describing image results.
+ */
+export type ImagesContract = EntContract<ImageEnt>[];
+/**
+ * Ent representing sequence properties.
+ * @interface SequenceEnt
+ */
+export type SequenceEnt = {
+  /**
+   * The image IDs of the sequence sorted in
+   * acsending order based on capture time.
+   */
+  image_ids: string[],
+  ...
+} & IDEnt;
+
+/**
+ * Contract describing sequence results.
+ */
+export type SequenceContract = SequenceEnt;
+/**
+ * Ent representing image tile properties.
+ */
+export interface ImageTileEnt {
+  /**
+   * URL for fetching image tile pixel data.
+   */
+  url: string;
+
+  /**
+   * X tile coordinate.
+   */
+  x: number;
+
+  /**
+   * Y tile coordinate.
+   */
+  y: number;
+
+  /**
+   * Tile level.
+   */
+  z: number;
+}
+/**
+ * Contract describing image tile results.
+ */
+export type ImageTilesContract = EntContract<ImageTileEnt[]>;
+/**
+ * Contract describing image tile requests.
+ */
+export interface ImageTilesRequestContract {
+  /**
+   * ID of the tile's image.
+   */
+  imageId: string;
+
+  /**
+   * Tile level.
+   */
+  z: number;
+}
+/**
+ * @event
+ */
+export type ProviderEventType = "datacreate";
+/**
+ * @interface IGeometryProvider
+ *
+ * Interface describing geometry provider members.
+ *
+ * This is a specification for implementers to model: it
+ * is not an exported method or class.
+ */
+export interface IGeometryProvider {
+  /**
+   * Convert a geodetic bounding box to the the minimum set
+   * of cell ids containing the bounding box.
+   * @description The bounding box needs
+   * to be sufficiently small to be contained in an area with the size
+   * of maximally four tiles. Up to nine adjacent tiles may be returned.
+   * @param {LngLat} sw - South west corner of bounding box.
+   * @param {LngLat} ne - North east corner of bounding box.
+   * @returns {Array<string>} Array of cell ids.
+   */
+  bboxToCellIds(sw: LngLat, ne: LngLat): string[];
+
+  /**
+   * Get the cell ids of all adjacent cells.
+   * @description In the case of approximately rectangular cells
+   * this is typically the eight orthogonally and diagonally adjacent
+   * cells.
+   * @param {string} cellId - Id of cell.
+   * @returns {Array<string>} Array of cell ids. No specific
+   * order is guaranteed.
+   */
+  getAdjacent(cellId: string): string[];
+
+  /**
+   * Get the vertices of a cell.
+   * @description The vertices form an unclosed
+   * clockwise polygon in the 2D longitude, latitude
+   * space. No assumption on the position of the first
+   * vertex relative to the others can be made.
+   * @param {string} cellId - Id of cell.
+   * @returns {Array<LngLat>} Unclosed clockwise polygon.
+   */
+  getVertices(cellId: string): LngLat[];
+
+  /**
+   * Convert geodetic coordinates to a cell id.
+   * @param {LngLat} lngLat - Longitude, latitude to convert.
+   * @returns {string} Cell id for the longitude, latitude.
+   */
+  lngLatToCellId(lngLat: LngLat): string;
+}
+/**
+ * Interface describing data provider members.
+ *
+ * This is a specification for implementers to model: it is
+ * not an exported method or class.
+ * @fires datacreate
+ */
+export interface IDataProvider extends IEventEmitter {
+  /**
+   * Get geometry property.
+   * @returns {IGeometryProvider} Geometry provider instance.
+   */
+  geometry: IGeometryProvider;
+
+  /**
+   * Get core images in a geometry cell.
+   * @param {string} cellId - The id of the geometry cell.
+   * @returns {Promise<CoreImagesContract>} Promise to
+   * the core images of the requested geometry cell id.
+   * @throws Rejects the promise on errors.
+   */
+  getCoreImages(cellId: string): Promise<CoreImagesContract>;
+
+  /**
+   * Get a cluster reconstruction.
+   * @param {string} url - URL for the cluster reconstruction
+   * to retrieve.
+   * @param {Promise} [abort] - Optional promise for aborting
+   * the request through rejection.
+   * @returns {Promise<ClusterContract>} Promise to the
+   * cluster reconstruction.
+   * @throws Rejects the promise on errors.
+   */
+  getCluster(url: string, abort?: Promise<void>): Promise<ClusterContract>;
+
+  /**
+   * Get spatial images.
+   * @param {Array<string>} imageIds - The ids for the
+   * images to retrieve.
+   * @returns {Promise<SpatialImagesContract>} Promise to
+   * the spatial images of the requested image ids.
+   * @throws Rejects the promise on errors.
+   */
+  getSpatialImages(imageIds: string[]): Promise<SpatialImagesContract>;
+
+  /**
+   * Get complete images.
+   * @param {Array<string>} imageIds - The ids for the
+   * images to retrieve.
+   * @returns {Promise<ImagesContract>} Promise to the images of the
+   * requested image ids.
+   * @throws Rejects the promise on errors.
+   */
+  getImages(imageIds: string[]): Promise<ImagesContract>;
+
+  /**
+   * Get an image as an array buffer.
+   * @param {string} url - URL for image to retrieve.
+   * @param {Promise<void>} [abort] - Optional promise for aborting
+   * the request through rejection.
+   * @returns {Promise<ArrayBuffer>} Promise to the array
+   * buffer containing the image.
+   * @throws Rejects the promise on errors.
+   */
+  getImageBuffer(url: string, abort?: Promise<void>): Promise<ArrayBuffer>;
+
+  /**
+   * Get image tiles urls for a tile level.
+   * @param {ImageTilesRequestContract} tiles - Tiles to request
+   * @returns {Promise<ImageTilesContract>} Promise to the
+   * image tiles response contract
+   * @throws Rejects the promise on errors.
+   * @example ```js
+   * var tileRequest = { imageId: 'image-id', z: 12 };
+   * provider.getImageTiles(tileRequest)
+   *   .then((response) => console.log(response));
+   * ```
+   */
+  getImageTiles(tiles: ImageTilesRequestContract): Promise<ImageTilesContract>;
+
+  /**
+   * Get a mesh.
+   * @param {string} url - URL for mesh to retrieve.
+   * @param {Promise<void>} [abort] - Optional promise for aborting
+   * the request through rejection.
+   * @returns {Promise<MeshContract>} Promise to the mesh.
+   * @throws Rejects the promise on errors.
+   */
+  getMesh(url: string, abort?: Promise<void>): Promise<MeshContract>;
+
+  /**
+   * Get sequence.
+   * @param {Array<string>} sequenceId - The id for the
+   * sequence to retrieve.
+   * @returns {Promise} Promise to the sequences of the
+   * requested image ids.
+   * @throws Rejects the promise on errors.
+   */
+  getSequence(sequenceId: string): Promise<SequenceContract>;
+
+  /**
+   * Set an access token for authenticated API requests of
+   * protected resources.
+   * @param {string} [accessToken] accessToken - User access
+   * token or client access token.
+   */
+  setAccessToken(accessToken?: string): void;
+}
+
+/**
+ * Interface for general provider events.
+ */
+export interface ProviderEvent {
+  /**
+   * Data provider target that emitted the event.
+   */
+  target: IDataProvider;
+
+  /**
+   * Provider event type.
+   */
+  type: ProviderEventType;
+}
+/**
+ *
+ * Interface for data provider cell events.
+ */
+export type ProviderCellEvent = {
+  /**
+   * Cell ids for cells where data have been created.
+   */
+  cellIds: string[],
+
+  /**
+   * Provider event type.
+   */
+  type: "datacreate",
+  ...
+} & ProviderEvent;
+
+/**
+ * @class DataProviderBase
+ * @classdesc Base class to extend if implementing a data provider
+ * class.
+ * @fires datacreate
+ * @example ```js
+ * class MyDataProvider extends DataProviderBase {
+ *   constructor() {
+ *     super(new S2GeometryProvider());
+ *   }
+ *   ...
+ * }
+ * ```
+ */
+declare class DataProviderBase implements IDataProvider, IEventEmitter {
+  _geometry: IGeometryProvider;
+
+  /**
+   * Create a new data provider base instance.
+   * @param {IGeometryProvider} geometry - Geometry
+   * provider instance.
+   */
+  constructor(_geometry: IGeometryProvider): this;
+
+  /**
+   * Get geometry property.
+   * @returns {IGeometryProvider} Geometry provider instance.
+   */
+  geometry: IGeometryProvider;
+
+  fire<T>(type: string, event: T): void;
+
+  /**
+   * Get core images in a geometry cell.
+   * @param {string} cellId - The id of the geometry cell.
+   * @returns {Promise<CoreImagesContract>} Promise to
+   * the core images of the requested geometry cell id.
+   * @throws Rejects the promise on errors.
+   */
+  getCoreImages(cellId: string): Promise<CoreImagesContract>;
+
+  /**
+   * Get a cluster reconstruction.
+   * @param {string} url - URL for the cluster reconstruction
+   * to retrieve.
+   * @param {Promise} [abort] - Optional promise for aborting
+   * the request through rejection.
+   * @returns {Promise<ClusterContract>} Promise to the
+   * cluster reconstruction.
+   * @throws Rejects the promise on errors.
+   */
+  getCluster(url: string, abort?: Promise<void>): Promise<ClusterContract>;
+
+  /**
+   * Get spatial images.
+   * @param {Array<string>} imageIds - The ids for the
+   * images to retrieve.
+   * @returns {Promise<SpatialImagesContract>} Promise to
+   * the spatial images of the requested image ids.
+   * @throws Rejects the promise on errors.
+   */
+  getSpatialImages(imageIds: string[]): Promise<SpatialImagesContract>;
+
+  /**
+   * Get complete images.
+   * @param {Array<string>} imageIds - The ids for the
+   * images to retrieve.
+   * @returns {Promise<ImagesContract>} Promise to the images of the
+   * requested image ids.
+   * @throws Rejects the promise on errors.
+   */
+  getImages(imageIds: string[]): Promise<ImagesContract>;
+
+  /**
+   * Get an image as an array buffer.
+   * @param {string} url - URL for image to retrieve.
+   * @param {Promise<void>} [abort] - Optional promise for aborting
+   * the request through rejection.
+   * @returns {Promise<ArrayBuffer>} Promise to the array
+   * buffer containing the image.
+   * @throws Rejects the promise on errors.
+   */
+  getImageBuffer(url: string, abort?: Promise<void>): Promise<ArrayBuffer>;
+
+  /**
+   * Get image tiles urls for a tile level.
+   * @param {ImageTilesRequestContract} tiles - Tiles to request
+   * @returns {Promise<ImageTilesContract>} Promise to the
+   * image tiles response contract
+   * @throws Rejects the promise on errors.
+   * @example ```js
+   * var tileRequest = { imageId: 'image-id', z: 12 };
+   * provider.getImageTiles(tileRequest)
+   *   .then((response) => console.log(response));
+   * ```
+   */
+  getImageTiles(tiles: ImageTilesRequestContract): Promise<ImageTilesContract>;
+
+  /**
+   * Get a mesh.
+   * @param {string} url - URL for mesh to retrieve.
+   * @param {Promise<void>} [abort] - Optional promise for aborting
+   * the request through rejection.
+   * @returns {Promise<MeshContract>} Promise to the mesh.
+   * @throws Rejects the promise on errors.
+   */
+  getMesh(url: string, abort?: Promise<void>): Promise<MeshContract>;
+
+  /**
+   * Get sequence.
+   * @param {Array<string>} sequenceId - The id for the
+   * sequence to retrieve.
+   * @returns {Promise} Promise to the sequences of the
+   * requested image ids.
+   * @throws Rejects the promise on errors.
+   */
+  getSequence(sequenceId: string): Promise<SequenceContract>;
+
+  off<T>(type: string, handler: (event: T) => void): void;
+
+  on<T>(type: string, handler: (event: T) => void): void;
+
+  /**
+   * Set an access token for authenticated API requests of
+   * protected resources.
+   * @param {string} [accessToken] accessToken - User access
+   * token or client access token.
+   */
+  setAccessToken(accessToken?: string): void;
+}
+/**
+ * @class GeometryProviderBase
+ * @classdesc Base class to extend if implementing a geometry
+ * provider class.
+ * @example ```js
+ * class MyGeometryProvider extends GeometryProviderBase {
+ *      ...
+ * }
+ * ```
+ */
+declare class GeometryProviderBase implements IGeometryProvider {
+  /**
+   * Create a new geometry provider base instance.
+   */
+  constructor(): this;
+
+  /**
+   * Convert a geodetic bounding box to the the minimum set
+   * of cell ids containing the bounding box.
+   * @description The bounding box needs
+   * to be sufficiently small to be contained in an area with the size
+   * of maximally four tiles. Up to nine adjacent tiles may be returned.
+   * @param {LngLat} sw - South west corner of bounding box.
+   * @param {LngLat} ne - North east corner of bounding box.
+   * @returns {Array<string>} Array of cell ids.
+   */
+  bboxToCellIds(sw: LngLat, ne: LngLat): string[];
+
+  /**
+   * Get the cell ids of all adjacent cells.
+   * @description In the case of approximately rectangular cells
+   * this is typically the eight orthogonally and diagonally adjacent
+   * cells.
+   * @param {string} cellId - Id of cell.
+   * @returns {Array<string>} Array of cell ids. No specific
+   * order is guaranteed.
+   */
+  getAdjacent(cellId: string): string[];
+
+  /**
+   * Get the vertices of a cell.
+   * @description The vertices form an unclosed
+   * clockwise polygon in the 2D longitude, latitude
+   * space. No assumption on the position of the first
+   * vertex relative to the others can be made.
+   * @param {string} cellId - Id of cell.
+   * @returns {Array<LngLat>} Unclosed clockwise polygon.
+   */
+  getVertices(cellId: string): LngLat[];
+
+  /**
+   * Convert geodetic coordinates to a cell id.
+   * @param {LngLat} lngLat - Longitude, latitude to convert.
+   * @returns {string} Cell id for the longitude, latitude.
+   */
+  lngLatToCellId(lngLat: LngLat): string;
+
+  /**
+   * @ignore
+   */
+  _approxBboxToCellIds(sw: LngLat, ne: LngLat): string[];
+}
+declare interface GraphCameraContract {
+  focal: number;
+  k1: number;
+  k2: number;
+  projection_type: string;
+}
+declare interface GraphCameraShotContract {
+  camera: string;
+  rotation: number[];
+  translation: number[];
+}
+declare interface GraphReferenceContract {
+  altitude: number;
+  latitude: number;
+  longitude: number;
+}
+declare interface GraphPointContract {
+  color: number[];
+  coordinates: number[];
+}
+declare interface GraphClusterContract {
+  cameras: {
+    [cameraId: string]: GraphCameraContract,
+    ...
+  };
+  points: {
+    [pointId: string]: GraphPointContract,
+    ...
+  };
+  reference_lla: GraphReferenceContract;
+  shots: {
+    [imageKey: string]: GraphCameraShotContract,
+    ...
+  };
+}
+declare interface GraphGeometry {
+  coordinates: [number, number];
+}
+declare type GraphCoreImageEnt = {
+  computed_geometry: GraphGeometry,
+  geometry: GraphGeometry,
+  sequence: string,
+  ...
+} & IDEnt;
+declare type GraphSpatialImageEnt = {
+  merge_cc: number,
+  sfm_cluster: URLEnt,
+  thumb_1024_url: string,
+  thumb_2048_url: string,
+  ...
+} & SpatialImageEnt;
+declare class GraphConverter {
+  clusterReconstruction(source: GraphClusterContract): ClusterContract;
+  coreImage(source: GraphCoreImageEnt): CoreImageEnt;
+  spatialImage(source: GraphSpatialImageEnt): SpatialImageEnt;
+}
+declare interface GraphDataProviderOptions {
+  endpoint?: string;
+  accessToken?: string;
+}
+declare class GraphQueryCreator {
+  +imagesPath: string;
+  +sequencePath: string;
+  +coreFields: string[];
+  +idFields: string[];
+  +spatialFields: string[];
+  +imageTileFields: string[];
+  constructor(): this;
+  images(imageIds: string[], fields: string[]): string;
+  imagesS2(cellId: string, fields: string[]): string;
+  imageTiles(z: number, fields: string[]): string;
+  imageTilesPath(imageId: string): string;
+  sequence(sequenceId: string): string;
+}
+declare class GraphDataProvider extends DataProviderBase {
+  constructor(
+    options?: GraphDataProviderOptions,
+    geometry?: IGeometryProvider,
+    converter?: GraphConverter,
+    queryCreator?: GraphQueryCreator
+  ): this;
+  getCluster(url: string, abort?: Promise<void>): Promise<ClusterContract>;
+  getCoreImages(cellId: string): Promise<CoreImagesContract>;
+  getImageBuffer(url: string, abort?: Promise<void>): Promise<ArrayBuffer>;
+  getImages(imageIds: string[]): Promise<ImagesContract>;
+  getImageTiles(
+    request: ImageTilesRequestContract
+  ): Promise<ImageTilesContract>;
+  getMesh(url: string, abort?: Promise<void>): Promise<MeshContract>;
+  getSequence(sequenceId: string): Promise<SequenceContract>;
+  getSpatialImages(imageIds: string[]): Promise<SpatialImagesContract>;
+  setAccessToken(accessToken?: string): void;
+}
+/**
+ * @class S2GeometryProvider
+ * @classdesc Geometry provider based on S2 cells.
+ * @example ```js
+ * class MyDataProvider extends DataProviderBase {
+ *      ...
+ * }
+ *
+ * const geometryProvider = new S2GeometryProvider();
+ * const dataProvider = new MyDataProvider(geometryProvider);
+ * ```
+ */
+declare class S2GeometryProvider extends GeometryProviderBase {
+  /**
+   * Create a new S2 geometry provider instance.
+   */
+  constructor(_level?: number): this;
+
+  /**
+   * @inheritdoc
+   */
+  bboxToCellIds(sw: LngLat, ne: LngLat): string[];
+
+  /**
+   * @inheritdoc
+   */
+  getAdjacent(cellId: string): string[];
+
+  /**
+   * @inheritdoc
+   */
+  getVertices(cellId: string): LngLat[];
+
+  /**
+   * @inheritdoc
+   */
+  lngLatToCellId(lngLat: LngLat): string;
+}
+export interface ComponentConfiguration {
+  [key: string]: mixed;
+}
+/**
+ * Enumeration for render mode
+ * @enum {number} *
+ * @readonly
+ * @description Modes for specifying how rendering is done
+ * in the viewer. All modes preserves the original aspect
+ * ratio of the images.
+ */
+
+declare var RenderMode: {|
+  +Letterbox: 0, // 0
+  +Fill: 1, // 1
+|};
+declare interface ViewportSize {
+  height: number;
+  width: number;
+}
+declare type CameraType = "spherical" | "fisheye" | "perspective";
+/**
+ * @class Transform
+ * @classdesc Class used for calculating coordinate transformations
+ * and projections.
+ */
+declare class Transform {
+  /**
+   * Create a new transform instance.
+   * @param {number} orientation - Image orientation.
+   * @param {number} width - Image height.
+   * @param {number} height - Image width.
+   * @param {number} focal - Focal length.
+   * @param {number} scale - Atomic scale.
+   * @param {Array<number>} rotation - Rotation vector in three dimensions.
+   * @param {Array<number>} translation - Translation vector in three dimensions.
+   * @param {HTMLImageElement} image - Image for fallback size calculations.
+   */
+  constructor(
+    orientation: number,
+    width: number,
+    height: number,
+    scale: number,
+    rotation: number[],
+    translation: number[],
+    image: HTMLImageElement,
+    textureScale?: number[],
+    cameraParameters?: number[],
+    cameraType?: CameraType
+  ): this;
+  ck1: number;
+  ck2: number;
+  cameraType: CameraType;
+
+  /**
+   * Get basic aspect.
+   * @returns {number} The orientation adjusted aspect ratio.
+   */
+  basicAspect: number;
+
+  /**
+   * Get basic height.
+   * @description Does not fall back to image image height but
+   * uses original value from API so can be faulty.
+   * @returns {number} The height of the basic version image
+   * (adjusted for orientation).
+   */
+  basicHeight: number;
+
+  /**
+   * Get basic width.
+   * @description Does not fall back to image image width but
+   * uses original value from API so can be faulty.
+   * @returns {number} The width of the basic version image
+   * (adjusted for orientation).
+   */
+  basicWidth: number;
+
+  /**
+   * Get focal.
+   * @returns {number} The image focal length.
+   */
+  focal: number;
+
+  /**
+   * Get height.
+   * @description Falls back to the image image height if
+   * the API data is faulty.
+   * @returns {number} The orientation adjusted image height.
+   */
+  height: number;
+
+  /**
+   * Get orientation.
+   * @returns {number} The image orientation.
+   */
+  orientation: number;
+
+  /**
+   * Get scale.
+   * @returns {number} The image atomic reconstruction scale.
+   */
+  scale: number;
+
+  /**
+   * Get has valid scale.
+   * @returns {boolean} Value indicating if the scale of the transform is valid.
+   */
+  hasValidScale: boolean;
+
+  /**
+   * Get radial peak.
+   * @returns {number} Value indicating the radius where the radial
+   * undistortion function peaks.
+   */
+  radialPeak: number;
+
+  /**
+   * Get width.
+   * @description Falls back to the image image width if
+   * the API data is faulty.
+   * @returns {number} The orientation adjusted image width.
+   */
+  width: number;
+
+  /**
+   * Project 3D world coordinates to basic coordinates.
+   * @param {Array<number>} point3d - 3D world coordinates.
+   * @return {Array<number>} 2D basic coordinates.
+   */
+  projectBasic(point3d: number[]): number[];
+
+  /**
+   * Unproject basic coordinates to 3D world coordinates.
+   * @param {Array<number>} basic - 2D basic coordinates.
+   * @param {Array<number>} distance - Distance to unproject from camera center.
+   * @param {boolean} [depth] - Treat the distance value as depth from camera center.
+   *    Only applicable for perspective images. Will be
+   *    ignored for spherical.
+   * @returns {Array<number>} Unprojected 3D world coordinates.
+   */
+  unprojectBasic(basic: number[], distance: number, depth?: boolean): number[];
+
+  /**
+   * Project 3D world coordinates to SfM coordinates.
+   * @param {Array<number>} point3d - 3D world coordinates.
+   * @return {Array<number>} 2D SfM coordinates.
+   */
+  projectSfM(point3d: number[]): number[];
+
+  /**
+   * Unproject SfM coordinates to a 3D world coordinates.
+   * @param {Array<number>} sfm - 2D SfM coordinates.
+   * @param {Array<number>} distance - Distance to unproject
+   * from camera center.
+   * @param {boolean} [depth] - Treat the distance value as
+   * depth from camera center. Only applicable for perspective
+   * images. Will be ignored for spherical.
+   * @returns {Array<number>} Unprojected 3D world coordinates.
+   */
+  unprojectSfM(sfm: number[], distance: number, depth?: boolean): number[];
+}
+/**
+ * @class Camera
+ * @classdesc Holds information about a camera.
+ */
+declare class Camera {
+  /**
+   * Create a new camera instance.
+   * @param {Transform} [transform] - Optional transform instance.
+   */
+  constructor(transform?: Transform): this;
+
+  /**
+   * Get focal.
+   * @returns {number} The focal length.
+   */
+  focal: number;
+
+  /**
+   * Set focal.
+   */
+  -focal: number;
+
+  /**
+   * Update this camera to the linearly interpolated value of two other cameras.
+   * @param {Camera} a - First camera.
+   * @param {Camera} b - Second camera.
+   * @param {number} alpha - Interpolation value on the interval [0, 1].
+   */
+  lerpCameras(a: Camera, b: Camera, alpha: number): void;
+
+  /**
+   * Copy the properties of another camera to this camera.
+   * @param {Camera} other - Another camera.
+   */
+  copy(other: Camera): void;
+
+  /**
+   * Clone this camera.
+   * @returns {Camera} A camera with cloned properties equal to this camera.
+   */
+  clone(): Camera;
+
+  /**
+   * Determine the distance between this camera and another camera.
+   * @param {Camera} other - Another camera.
+   * @returns {number} The distance between the cameras.
+   */
+  diff(other: Camera): number;
+}
+declare var State: {|
+  +Custom: 0, // 0
+  +Earth: 1, // 1
+  +Traversing: 2, // 2
+  +Waiting: 3, // 3
+  +WaitingInteractively: 4, // 4
+|};
+
+/**
+ * Enumeration for edge directions
+ * @enum {number} *
+ * @readonly
+ * @description Directions for edges in image graph describing
+ * sequence, spatial and image type relations between nodes.
+ */
+
+declare var NavigationDirection: {|
+  +Next: 0, // 0
+  +Prev: 1, // 1
+  +StepLeft: 2, // 2
+  +StepRight: 3, // 3
+  +StepForward: 4, // 4
+  +StepBackward: 5, // 5
+  +TurnLeft: 6, // 6
+  +TurnRight: 7, // 7
+  +TurnU: 8, // 8
+  +Spherical: 9, // 9
+  +Similar: 10, // 10
+|};
+
+/**
+ * Interface that describes additional properties of an edge.
+ * @interface NavigationEdgeData
+ */
+export interface NavigationEdgeData {
+  /**
+   * The edge direction.
+   */
+  direction: $Values<typeof NavigationDirection>;
+
+  /**
+   * The counter clockwise horizontal rotation angle from
+   * the X-axis in a spherical coordiante system of the
+   * motion from the source image to the destination node.
+   */
+  worldMotionAzimuth: number;
+}
+/**
+ * Interface that describes the properties for a
+ * navigation edge from a source image to a
+ * target image.
+ * @interface NavigationEdge
+ */
+export interface NavigationEdge {
+  /**
+   * The id of the source image.
+   */
+  source: string;
+
+  /**
+   * The id of the target image.
+   */
+  target: string;
+
+  /**
+   * Additional data describing properties of the edge.
+   */
+  data: NavigationEdgeData;
+}
+/**
+ * Interface that indicates edge status.
+ * @interface NavigationEdgeStatus
+ */
+export interface NavigationEdgeStatus {
+  /**
+   * Value indicating whether the edges have been cached.
+   */
+  cached: boolean;
+
+  /**
+   * The edges.
+   * @description If the cached property is false the edges
+   * property will always be an empty array. If the cached
+   * property is true, there will exist edges in the the
+   * array if the image has edges.
+   */
+  edges: NavigationEdge[];
+}
+/**
+ * @class ImageCache
+ * @classdesc Represents the cached properties of a image.
+ */
+declare class ImageCache {
+  /**
+   * Create a new image cache instance.
+   */
+  constructor(provider: IDataProvider): this;
+
+  /**
+   * Get image.
+   * @description Will not be set when assets have not been cached
+   * or when the object has been disposed.
+   * @returns {HTMLImageElement} Cached image element of the image.
+   */
+  image: HTMLImageElement;
+
+  /**
+   * Get mesh.
+   * @description Will not be set when assets have not been cached
+   * or when the object has been disposed.
+   * @returns {MeshContract} SfM triangulated mesh of reconstructed
+   * atomic 3D points.
+   */
+  mesh: MeshContract;
+
+  /**
+   * Get sequenceEdges.
+   * @returns {NavigationEdgeStatus} Value describing the status of the
+   * sequence edges.
+   */
+  sequenceEdges: NavigationEdgeStatus;
+
+  /**
+   * Get spatialEdges.
+   * @returns {NavigationEdgeStatus} Value describing the status of the
+   * spatial edges.
+   */
+  spatialEdges: NavigationEdgeStatus;
+
+  /**
+   * Cache the sequence edges.
+   * @param {Array<NavigationEdge>} edges - Sequence edges to cache.
+   */
+  cacheSequenceEdges(edges: NavigationEdge[]): void;
+
+  /**
+   * Cache the spatial edges.
+   * @param {Array<NavigationEdge>} edges - Spatial edges to cache.
+   */
+  cacheSpatialEdges(edges: NavigationEdge[]): void;
+
+  /**
+   * Dispose the image cache.
+   * @description Disposes all cached assets and unsubscribes to
+   * all streams.
+   */
+  dispose(): void;
+
+  /**
+   * Reset the sequence edges.
+   */
+  resetSequenceEdges(): void;
+
+  /**
+   * Reset the spatial edges.
+   */
+  resetSpatialEdges(): void;
+}
+/**
+ * @class Image
+ * @classdesc [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
+ */
+declare class Image {
+  /**
+   * Create a new image instance.
+   * @description Images are always created internally by the library.
+   * Images can not be added to the library through any API method.
+   * @param {CoreImageEnt} core- Raw core image data.
+   * @ignore
+   */
+  constructor(core: CoreImageEnt): this;
+
+  /**
+   * Get assets cached.
+   * @description The assets that need to be cached for this property
+   * to report true are the following: fill properties, image and mesh.
+   * The library ensures that the current image will always have the
+   * assets cached.
+   * @returns {boolean} Value indicating whether all assets have been
+   * cached.
+   * @ignore
+   */
+  assetsCached: boolean;
+
+  /**
+   * Get cameraParameters.
+   * @description Will be undefined if SfM has
+   * not been run.
+   *
+   * Camera type dependent parameters.
+   *
+   * For perspective and fisheye camera types,
+   * the camera parameters array should be
+   * constructed according to
+   *
+   * `[focal, k1, k2]`
+   *
+   * where focal is the camera focal length,
+   * and k1, k2 are radial distortion parameters.
+   *
+   * For spherical camera type the camera
+   * parameters are unset or emtpy array.
+   * @returns {Array<number>} The parameters
+   * related to the camera type.
+   */
+  cameraParameters: number[];
+
+  /**
+   * Get cameraType.
+   * @description Will be undefined if SfM has not been run.
+   * @returns {string} The camera type that captured the image.
+   */
+  cameraType: string;
+
+  /**
+   * Get capturedAt.
+   * @description Timestamp of the image capture date
+   * and time represented as a Unix epoch timestamp in milliseconds.
+   * @returns {number} Timestamp when the image was captured.
+   */
+  capturedAt: number;
+
+  /**
+   * Get clusterId.
+   * @returns {string} Globally unique id of the SfM cluster to which
+   * the image belongs.
+   */
+  clusterId: string;
+
+  /**
+   * Get clusterUrl.
+   * @returns {string} Url to the cluster reconstruction file.
+   * @ignore
+   */
+  clusterUrl: string;
+
+  /**
+   * Get compassAngle.
+   * @description If the SfM computed compass angle exists it will
+   * be returned, otherwise the original EXIF compass angle.
+   * @returns {number} Compass angle, measured in degrees
+   * clockwise with respect to north.
+   */
+  compassAngle: number;
+
+  /**
+   * Get complete.
+   * @description The library ensures that the current image will
+   * always be full.
+   * @returns {boolean} Value indicating whether the image has all
+   * properties filled.
+   * @ignore
+   */
+  complete: boolean;
+
+  /**
+   * Get computedAltitude.
+   * @description If SfM has not been run the computed altitude is
+   * set to a default value of two meters.
+   * @returns {number} Altitude, in meters.
+   */
+  computedAltitude: number;
+
+  /**
+   * Get computedCompassAngle.
+   * @description Will not be set if SfM has not been run.
+   * @returns {number} SfM computed compass angle, measured
+   * in degrees clockwise with respect to north.
+   */
+  computedCompassAngle: number;
+
+  /**
+   * Get computedLngLat.
+   * @description Will not be set if SfM has not been run.
+   * @returns {LngLat} SfM computed longitude, latitude in WGS84 datum,
+   * measured in degrees.
+   */
+  computedLngLat: LngLat;
+
+  /**
+   * Get creatorId.
+   * @description Note that the creator ID will not be set when using
+   * the Mapillary API.
+   * @returns {string} Globally unique id of the user who uploaded
+   * the image.
+   */
+  creatorId: string;
+
+  /**
+   * Get creatorUsername.
+   * @description Note that the creator username will not be set when
+   * using the Mapillary API.
+   * @returns {string} Username of the creator who uploaded
+   * the image.
+   */
+  creatorUsername: string;
+
+  /**
+   * Get exifOrientation.
+   * @returns {number} EXIF orientation of original image.
+   */
+  exifOrientation: number;
+
+  /**
+   * Get height.
+   * @returns {number} Height of original image, not adjusted
+   * for orientation.
+   */
+  height: number;
+
+  /**
+   * Get image.
+   * @description The image will always be set on the current image.
+   * @returns {HTMLImageElement} Cached image element of the image.
+   */
+  image: HTMLImageElement;
+
+  /**
+   * Get id.
+   * @returns {string} Globally unique id of the image.
+   */
+  id: string;
+
+  /**
+   * Get lngLat.
+   * @description If the SfM computed longitude, latitude exist
+   * it will be returned, otherwise the original EXIF latitude
+   * longitude.
+   * @returns {LngLat} Longitude, latitude in WGS84 datum,
+   * measured in degrees.
+   */
+  lngLat: LngLat;
+
+  /**
+   * Get merged.
+   * @returns {boolean} Value indicating whether SfM has been
+   * run on the image and the image has been merged into a
+   * connected component.
+   */
+  merged: boolean;
+
+  /**
+   * Get mergeId.
+   * @description Will not be set if SfM has not yet been run on
+   * image.
+   * @returns {stirng} Id of connected component to which image
+   * belongs after the aligning merge.
+   */
+  mergeId: string;
+
+  /**
+   * Get mesh.
+   * @description The mesh will always be set on the current image.
+   * @returns {MeshContract} SfM triangulated mesh of reconstructed
+   * atomic 3D points.
+   */
+  mesh: MeshContract;
+
+  /**
+   * Get originalAltitude.
+   * @returns {number} EXIF altitude, in meters, if available.
+   */
+  originalAltitude: number;
+
+  /**
+   * Get originalCompassAngle.
+   * @returns {number} Original EXIF compass angle, measured in
+   * degrees.
+   */
+  originalCompassAngle: number;
+
+  /**
+   * Get originalLngLat.
+   * @returns {LngLat} Original EXIF longitude, latitude in
+   * WGS84 datum, measured in degrees.
+   */
+  originalLngLat: LngLat;
+
+  /**
+   * Get ownerId.
+   * @returns {string} Globally unique id of the owner to which
+   * the image belongs. If the image does not belong to an
+   * owner the owner id will be undefined.
+   */
+  ownerId: string;
+
+  /**
+   * Get private.
+   * @returns {boolean} Value specifying if image is accessible to
+   * organization members only or to everyone.
+   */
+  private: boolean;
+
+  /**
+   * Get qualityScore.
+   * @returns {number} A number between zero and one
+   * determining the quality of the image. Blurriness
+   * (motion blur / out-of-focus), occlusion (camera
+   * mount, ego vehicle, water-drops), windshield
+   * reflections, bad illumination (exposure, glare),
+   * and bad weather condition (fog, rain, snow)
+   * affect the quality score.
+   * @description Value should be on the interval [0, 1].
+   */
+  qualityScore: number;
+
+  /**
+   * Get rotation.
+   * @description Will not be set if SfM has not been run.
+   * @returns {Array<number>} Rotation vector in angle axis representation.
+   */
+  rotation: number[];
+
+  /**
+   * Get scale.
+   * @description Will not be set if SfM has not been run.
+   * @returns {number} Scale of reconstruction the image
+   * belongs to.
+   */
+  scale: number;
+
+  /**
+   * Get sequenceId.
+   * @returns {string} Globally unique id of the sequence
+   * to which the image belongs.
+   */
+  sequenceId: string;
+
+  /**
+   * Get sequenceEdges.
+   * @returns {NavigationEdgeStatus} Value describing the status of the
+   * sequence edges.
+   * @ignore
+   */
+  sequenceEdges: NavigationEdgeStatus;
+
+  /**
+   * Get spatialEdges.
+   * @returns {NavigationEdgeStatus} Value describing the status of the
+   * spatial edges.
+   * @ignore
+   */
+  spatialEdges: NavigationEdgeStatus;
+
+  /**
+   * Get width.
+   * @returns {number} Width of original image, not
+   * adjusted for orientation.
+   */
+  width: number;
+
+  /**
+   * Cache the sequence edges.
+   * @description The sequence edges are cached asynchronously
+   * internally by the library.
+   * @param {Array<NavigationEdge>} edges - Sequence edges to cache.
+   * @ignore
+   */
+  cacheSequenceEdges(edges: NavigationEdge[]): void;
+
+  /**
+   * Cache the spatial edges.
+   * @description The spatial edges are cached asynchronously
+   * internally by the library.
+   * @param {Array<NavigationEdge>} edges - Spatial edges to cache.
+   * @ignore
+   */
+  cacheSpatialEdges(edges: NavigationEdge[]): void;
+
+  /**
+   * Dispose the image.
+   * @description Disposes all cached assets.
+   * @ignore
+   */
+  dispose(): void;
+
+  /**
+   * Initialize the image cache.
+   * @description The image cache is initialized internally by
+   * the library.
+   * @param {ImageCache} cache - The image cache to set as cache.
+   * @ignore
+   */
+  initializeCache(cache: ImageCache): void;
+
+  /**
+   * Complete an image with spatial properties.
+   * @description The image is completed internally by
+   * the library.
+   * @param {SpatialImageEnt} fill - The spatial image struct.
+   * @ignore
+   */
+  makeComplete(fill: SpatialImageEnt): void;
+
+  /**
+   * Reset the sequence edges.
+   * @ignore
+   */
+  resetSequenceEdges(): void;
+
+  /**
+   * Reset the spatial edges.
+   * @ignore
+   */
+  resetSpatialEdges(): void;
+
+  /**
+   * Clears the image and mesh assets, aborts
+   * any outstanding requests and resets edges.
+   * @ignore
+   */
+  uncache(): void;
+}
+declare interface IAnimationState {
+  reference: LngLatAlt;
+  alpha: number;
+  camera: Camera;
+  zoom: number;
+  currentImage: Image;
+  currentCamera: Camera;
+  previousImage: Image;
+  trajectory: Image[];
+  currentIndex: number;
+  lastImage: Image;
+  imagesAhead: number;
+  currentTransform: Transform;
+  previousTransform: Transform;
+  motionless: boolean;
+  state: $Values<typeof State>;
+}
+declare interface AnimationFrame {
+  id: number;
+  fps: number;
+  state: IAnimationState;
+}
+declare interface EulerRotation {
+  phi: number;
+  theta: number;
+}
+declare class RenderCamera {
+  constructor(
+    elementWidth: number,
+    elementHeight: number,
+    renderMode: $Values<typeof RenderMode>
+  ): this;
+  alpha: number;
+  camera: Camera;
+  changed: boolean;
+  frameId: number;
+  renderMode: $Values<typeof RenderMode>;
+  rotation: EulerRotation;
+  zoom: number;
+  size: ViewportSize;
+  getTilt(): number;
+  fovToZoom(fov: number): number;
+  setFrame(frame: AnimationFrame): void;
+  setProjectionMatrix(matrix: number[]): void;
+  setRenderMode(renderMode: $Values<typeof RenderMode>): void;
+  setSize(size: ViewportSize): void;
+}
+declare class RenderService {
+  constructor(
+    element: HTMLElement,
+    currentFrame$: mixed,
+    renderMode: $Values<typeof RenderMode>,
+    renderCamera?: RenderCamera
+  ): this;
+  element: HTMLElement;
+  dispose(): void;
+}
+declare interface VirtualNodeHash {
+  name: string;
+}
+declare class DOMRenderer {
+  constructor(element: HTMLElement, renderService: RenderService): this;
+  clear(name: string): void;
+  remove(): void;
+}
+declare type GLRenderFunction = {
+  (): void,
+};
+
+declare var RenderPass$1: {|
+  +Background: 0, // 0
+  +Opaque: 1, // 1
+|};
+declare interface GLFrameRenderer {
+  frameId: number;
+  needsRender: boolean;
+  render: GLRenderFunction;
+  pass: $Values<typeof RenderPass$1>;
+}
+declare interface GLRenderHash {
+  name: string;
+  renderer: GLFrameRenderer;
+}
+declare class GLRenderer {
+  constructor(
+    canvas: HTMLCanvasElement,
+    canvasContainer: HTMLElement,
+    renderService: RenderService
+  ): this;
+  clear(name: string): void;
+  remove(): void;
+  triggerRerender(): void;
+}
+/**
+ * Enumeration for transition mode
+ * @enum {number} *
+ * @readonly
+ * @description Modes for specifying how transitions
+ * between images are performed.
+ */
+
+declare var TransitionMode: {|
+  +Default: 0, // 0
+  +Instantaneous: 1, // 1
+|};
+declare class StateService {
+  constructor(
+    initialState: $Values<typeof State>,
+    transitionMode?: $Values<typeof TransitionMode>
+  ): this;
+  dispose(): void;
+  custom(): void;
+  earth(): void;
+  traverse(): void;
+  wait(): void;
+  waitInteractively(): void;
+  appendImagess(images: Image[]): void;
+  prependImages(images: Image[]): void;
+  removeImages(n: number): void;
+  clearImages(): void;
+  clearPriorImages(): void;
+  cutImages(): void;
+  setImages(images: Image[]): void;
+  setViewMatrix(matrix: number[]): void;
+  rotate(delta: EulerRotation): void;
+  rotateUnbounded(delta: EulerRotation): void;
+  rotateWithoutInertia(delta: EulerRotation): void;
+  rotateBasic(basicRotation: number[]): void;
+  rotateBasicUnbounded(basicRotation: number[]): void;
+  rotateBasicWithoutInertia(basicRotation: number[]): void;
+  rotateToBasic(basic: number[]): void;
+  move(delta: number): void;
+  moveTo(position: number): void;
+  dolly(delta: number): void;
+  orbit(rotation: EulerRotation): void;
+  truck(direction: number[]): void;
+
+  /**
+   * Change zoom level while keeping the reference point position approximately static.
+   * @parameter {number} delta - Change in zoom level.
+   * @parameter {Array<number>} reference - Reference point in basic coordinates.
+   */
+  zoomIn(delta: number, reference: number[]): void;
+  setCenter(center: number[]): void;
+  setSpeed(speed: number): void;
+  setTransitionMode(mode: $Values<typeof TransitionMode>): void;
+  setZoom(zoom: number): void;
+  start(): void;
+  stop(): void;
+}
+declare class DOM {
+  constructor(doc?: Node): this;
+}
+/**
+ * Enumeration for component size.
+ * @enum {number} *
+ * @readonly
+ * @description May be used by a component to allow for resizing
+ * of the UI elements rendered by the component.
+ */
+
+declare var ComponentSize: {|
+  +Automatic: 0, // 0
+  +Large: 1, // 1
+  +Small: 2, // 2
+|};
+export type BearingConfiguration = {
+  /**
+   * The size of the ui elements.
+   * @default ComponentSize.Automatic
+   */
+  size?: $Values<typeof ComponentSize>,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for configuration of cache depth.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         cache: {
+ *             depth: {
+ *                 spherical: 2,
+ *                 sequence: 3,
+ *             }
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export interface CacheDepthConfiguration {
+  /**
+   * Cache depth in the sequence directions.
+   * @description Max value is 4. Value will be clamped
+   * to the interval [0, 4].
+   * @default 2
+   */
+  sequence: number;
+
+  /**
+   * Cache depth in the spherical direction.
+   * @description Max value is 2. Value will be clamped
+   * to the interval [0, 2].
+   * @default 1
+   */
+  spherical: number;
+
+  /**
+   * Cache depth in the step directions.
+   * @description Max value is 3. Value will be clamped
+   * to the interval [0, 3].
+   * @default 1
+   */
+  step: number;
+
+  /**
+   * Cache depth in the turn directions.
+   * @description Max value is 1. Value will be clamped
+   * to the interval [0, 1].
+   * @default 0
+   */
+  turn: number;
+}
+/**
+ * Interface for configuration of cache component.
+ * @interface
+ */
+export type CacheConfiguration = {
+  /**
+   * Cache depth struct.
+   */
+  depth?: CacheDepthConfiguration,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for configuration of direction component.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         direction: {
+ *             minWidth: 140,
+ *             maxWidth: 340,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type DirectionConfiguration = {
+  /**
+   * Determines if the sequence arrow appearance should be different from
+   * the non sequence arrows.
+   * @description Needs to be set to true for the sequence suffixed classes
+   * to be applied to the navigation elements. Additional calculations will be
+   * performed resulting in a performance cost.
+   * @default false
+   */
+  distinguishSequence?: boolean,
+
+  /**
+   * The image id representing the direction arrow to be highlighted.
+   * @description The arrow pointing towards the image corresponding to the
+   * highlight id will be highlighted.
+   * @default undefined
+   */
+  highlightId?: string,
+
+  /**
+   * The min width of the non transformed container element holding
+   * the navigation arrows.
+   * @description Set min width of the non transformed
+   * container element holding the navigation arrows.
+   * If the min width is larger than the max width the
+   * min width value will be used.
+   *
+   * The container element is automatically resized when the resize
+   * method on the Viewer class is called.
+   * @default 260
+   */
+  minWidth?: number,
+
+  /**
+   * The max width of the non transformed container element holding
+   * the navigation arrows.
+   * @description Set max width of the non transformed
+   * container element holding the navigation arrows.
+   * If the min width is larger than the max width the
+   * min width value will be used.
+   *
+   * The container element is automatically resized when the resize
+   * method on the Viewer class is called.
+   * @default 460
+   */
+  maxWidth?: number,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for configuration of keyboard component.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         keyboard: {
+ *             keyZoom: false,
+ *             keySequenceNavigation: false,
+ *             keySpatialNavigation: false,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type KeyboardConfiguration = {
+  /**
+   * Enable or disable the `KeyPlayHandler`.
+   * @default true
+   */
+  keyPlay?: boolean,
+
+  /**
+   * Enable or disable the `KeySequenceNavigationHandler`.
+   * @default true
+   */
+  keySequenceNavigation?: boolean,
+
+  /**
+   * Enable or disable the `KeySpatialNavigationHandler`.
+   * @default true
+   */
+  keySpatialNavigation?: boolean,
+
+  /**
+   * Enable or disable the `KeyZoomHandler`.
+   * @default true
+   */
+  keyZoom?: boolean,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for configuration of marker component.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         marker: {
+ *             visibleBBoxSize: 80,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type MarkerConfiguration = {
+  /**
+   * The size of the bounding box for which markers will be visible.
+   * @description Provided values will be clamped to the [1, 200]
+   * interval.
+   * @default 100
+   */
+  visibleBBoxSize?: number,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for configuration of mouse component.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         pointer: {
+ *             dragPan: false,
+ *             scrollZoom: false,
+ *             touchZoom: false,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type PointerConfiguration = {
+  /**
+   * Activate or deactivate the `DragPanHandler`.
+   * @default true
+   */
+  dragPan?: boolean,
+
+  /**
+   * Activate or deactivate the `EarthControlHandler`.
+   * @default true
+   */
+  earthControl?: boolean,
+
+  /**
+   * Activate or deactivate the `ScrollZoomHandler`.
+   * @default true
+   */
+  scrollZoom?: boolean,
+
+  /**
+   * Activate or deactivate the `TouchZoomHandler`.
+   * @default true
+   */
+  touchZoom?: boolean,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for configuration of sequence component.
+ * @interface
+ * @example ```js
+ * const viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         sequence: {
+ *             minWidth: 40,
+ *             maxWidth: 80,
+ *             visible: false,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type SequenceConfiguration = {
+  /**
+   * Set the direction to follow when playing.
+   * @default EdgeDirection.Next
+   */
+  direction?: $Values<typeof NavigationDirection>,
+
+  /**
+   * The node id representing the direction arrow to be highlighted.
+   * @description When set to null no direction will be highlighted.
+   * The arrow pointing towards the node corresponding to the
+   * highlight id will be highlighted.
+   * @default undefined
+   * @ignore
+   */
+  highlightId?: string,
+
+  /**
+   * The max width of the sequence container.
+   * @description Set max width of the container element holding
+   * the sequence navigation elements. If the min width is larger than the
+   * max width the min width value will be used.
+   *
+   * The container element is automatically resized when the resize
+   * method on the Viewer class is called.
+   * @default 117
+   */
+  maxWidth?: number,
+
+  /**
+   * The min width of the sequence container.
+   * @description Set min width of the container element holding
+   * the sequence navigation elements. If the min width is larger than the
+   * max width the min width value will be used.
+   *
+   * The container element is automatically resized when the resize
+   * method on the Viewer class is called.
+   * @default 70
+   */
+  minWidth?: number,
+
+  /**
+   * Indicating whether the component is playing.
+   * @default false
+   */
+  playing?: boolean,
+
+  /**
+   * Determine whether the sequence UI elements
+   * should be visible.
+   * @default true
+   */
+  visible?: boolean,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Enumeration for slider mode.
+ * @enum {number} *
+ * @readonly
+ * @description Modes for specifying how transitions
+ * between images are performed in slider mode. Only
+ * applicable when the slider component determines
+ * that transitions with motion is possilble. When it
+ * is not, the stationary mode will be applied.
+ */
+
+declare var SliderConfigurationMode: {|
+  +Motion: 0, // 0
+  +Stationary: 1, // 1
+|};
+
+/**
+ * Interface for configuration of slider ids.
+ * @interface
+ */
+export interface SliderConfigurationIds {
+  /**
+   * Id for the image plane in the background.
+   */
+  background: string;
+
+  /**
+   * Id for the image plane in the foreground.
+   */
+  foreground: string;
+}
+/**
+ * Interface for configuration of slider component.
+ * @interface ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         slider: {
+ *             initialPosition: 0.5,
+ *             ids: {
+ *                 background: '<background-id>',
+ *                 foreground: '<foreground-id>',
+ *             },
+ *             sliderVisible: true,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type SliderConfiguration = {
+  /**
+   * Initial position of the slider on the interval [0, 1].
+   * @description Configures the initial position of the slider.
+   * The inital position value will be used when the component
+   * is activated.
+   * @default 1
+   */
+  initialPosition?: number,
+
+  /**
+   * Slider image ids.
+   * @description Configures the component to show the image
+   * planes for the supplied image ids  in the foreground
+   * and the background.
+   */
+  ids?: SliderConfigurationIds,
+
+  /**
+   * Value indicating whether the slider should be visible.
+   * @description Set the value controlling if the
+   * slider is visible.
+   * @default true
+   */
+  sliderVisible?: boolean,
+
+  /**
+   * Mode used for image pair transitions.
+   * @description Configures the mode for transitions between
+   * image pairs.
+   */
+  mode?: $Values<typeof SliderConfigurationMode>,
+  ...
+} & ComponentConfiguration;
+
+declare var CameraVisualizationMode: {|
+  +Hidden: 0, // 0
+  +Homogeneous: 1, // 1
+  +Cluster: 2, // 2
+  +ConnectedComponent: 3, // 3
+  +Sequence: 4, // 4
+|};
+
+declare var OriginalPositionMode: {|
+  +Hidden: 0, // 0
+  +Altitude: 1, // 1
+  +Flat: 2, // 2
+|};
+
+declare var PointVisualizationMode: {|
+  +Hidden: 0, // 0
+  +Original: 1, // 1
+  +Cluster: 2, // 2
+|};
+
+/**
+ * Interface for configuration of spatial component.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         spatial: {
+ *             cameraSize: 0.5,
+ *             cameraVisualizationMode: CameraVisualizationMode.Cluster,
+ *             cellsVisible: true,
+ *             originalPositionMode: OriginalPositionMode.Altitude,
+ *             pointSize: 0.5,
+ *             pointVisualizationMode: PointVisualizationMode.Hidden,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type SpatialConfiguration = {
+  /**
+   * The camera size on the interval [0.01, 1].
+   * @default 0.1
+   */
+  cameraSize?: number,
+
+  /**
+   * Specify the camera visualization mode.
+   * @default CameraVisualizationMode.Homogeneous
+   */
+  cameraVisualizationMode?: $Values<typeof CameraVisualizationMode>,
+
+  /**
+   * Specify if the currently rendered cells should be visualize on
+   * an approximated ground plane.
+   * @default false
+   */
+  cellsVisible?: boolean,
+
+  /**
+   * Cell grid depth from the cell of the currently
+   * selected camera.
+   * @description Max value is 3. Value will be clamped
+   * to the interval [1, 3].
+   * @default 1
+   */
+  cellGridDepth?: number,
+
+  /**
+   * Specify the original position visualization mode.
+   * @description The original positions are hidden
+   * by default.
+   * @default OriginalPositionMode.Hidden
+   */
+  originalPositionMode?: $Values<typeof OriginalPositionMode>,
+
+  /**
+   * The point size on the interval [0.01, 1].
+   * @default 0.1
+   */
+  pointSize?: number,
+
+  /**
+   * Specify if the points should be visible or not.
+   * @deprecated `pointsVisible` will be removed in
+   * v5.x. Use {@link pointVisualizationMode} instead.
+   * @default true
+   */
+  pointsVisible?: boolean,
+
+  /**
+   * Specify how point clouds should be visualized.
+   * @default PointVisualizationMode.Original
+   */
+  pointVisualizationMode?: $Values<typeof PointVisualizationMode>,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Enumeration for tag modes
+ * @enum {number} *
+ * @readonly
+ * @description Modes for the interaction in the tag component.
+ */
+
+declare var TagMode: {|
+  +Default: 0, // 0
+  +CreatePoint: 1, // 1
+  +CreatePoints: 2, // 2
+  +CreatePolygon: 3, // 3
+  +CreateRect: 4, // 4
+  +CreateRectDrag: 5, // 5
+|};
+
+/**
+ * Interface for configuration of tag component.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         tag: {
+ *             createColor: 0xFF0000,
+ *             mode: TagMode.CreateRect,
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type TagConfiguration = {
+  /**
+   * The color of vertices and edges for tags that
+   * are being created.
+   * @default 0xFFFFFF
+   */
+  createColor?: number,
+
+  /**
+   * Show an indicator at the centroid of the points geometry
+   * that creates the geometry when clicked.
+   * @default true
+   */
+  indicatePointsCompleter?: boolean,
+
+  /**
+   * The interaction mode of the tag component.
+   * @default TagMode.Default
+   */
+  mode?: $Values<typeof TagMode>,
+  ...
+} & ComponentConfiguration;
+export type ZoomConfiguration = {
+  /**
+   * The size of the ui elements.
+   * @default ComponentSize.Automatic
+   */
+  size?: $Values<typeof ComponentSize>,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for configuration of navigation component.
+ * @interface
+ * @example ```js
+ * var viewer = new Viewer({
+ *     ...
+ *     component: {
+ *         fallback: {
+ *             navigation: {
+ *                 spatial: false,
+ *             },
+ *         },
+ *     },
+ *     ...
+ * });
+ * ```
+ */
+export type NavigationFallbackConfiguration = {
+  /**
+   * Enable or disable the sequence arrows.
+   * @default true
+   */
+  sequence?: boolean,
+
+  /**
+   * Enable or disable the spatial arrows.
+   * @default true
+   */
+  spatial?: boolean,
+  ...
+} & ComponentConfiguration;
+
+/**
+ * Interface for the fallback component options that can be
+ * provided to the viewer when the browser does not have
+ * WebGL support.
+ * @interface
+ */
+export interface FallbackOptions {
+  /**
+   * Show static images without pan, zoom, or transitions.
+   * @description Fallback for `image` when WebGL is not supported.
+   * @default false
+   */
+  image?: boolean;
+
+  /**
+   * Show static navigation arrows in the corners.
+   * @description Fallback for `direction` and `sequence` when WebGL is not supported.
+   * @default false
+   */
+  navigation?: boolean | NavigationFallbackConfiguration;
+}
+/**
+ * Interface for the component options that can be provided to the viewer.
+ * @interface
+ */
+export interface ComponentOptions {
+  /**
+   * Show attribution.
+   * @default true
+   */
+  attribution?: boolean;
+
+  /**
+   * Show indicator for bearing and field of view.
+   * @default true
+   */
+  bearing?: boolean | BearingConfiguration;
+
+  /**
+   * Cache images around the current one.
+   * @default true
+   */
+  cache?: boolean | CacheConfiguration;
+
+  /**
+   * Use a cover to avoid loading data until viewer interaction.
+   * @default true
+   */
+  cover?: boolean;
+
+  /**
+   * Show spatial direction arrows for navigation.
+   * @description Default spatial navigation when there is WebGL support.
+   * Requires WebGL support.
+   * @default true
+   */
+  direction?: boolean | DirectionConfiguration;
+
+  /**
+   * Enable fallback component options
+   * when the browser does not have WebGL support.
+   * @default undefined
+   */
+  fallback?: FallbackOptions;
+
+  /**
+   * Show image planes in 3D.
+   * @description Requires WebGL support.
+   * @default true
+   */
+  image?: boolean;
+
+  /**
+   * Enable use of keyboard commands.
+   * @description Requires WebGL support.
+   * @default true
+   */
+  keyboard?: boolean | KeyboardConfiguration;
+
+  /**
+   * Enable an interface for showing 3D markers in the viewer.
+   * @description Requires WebGL support.
+   * @default false
+   */
+  marker?: boolean | MarkerConfiguration;
+
+  /**
+   * Enable mouse, pen, and touch interaction for zoom and pan.
+   * @description Requires WebGL support.
+   * @default true
+   */
+  pointer?: boolean | PointerConfiguration;
+
+  /**
+   * Show HTML popups over images.
+   * @description Requires WebGL support.
+   * @default false
+   */
+  popup?: boolean;
+
+  /**
+   * Show sequence related navigation.
+   * @description Default sequence navigation when there is WebGL support.
+   * @default true
+   */
+  sequence?: boolean | SequenceConfiguration;
+
+  /**
+   * Show a slider for transitioning between image planes.
+   * @description Requires WebGL support.
+   * @default false
+   */
+  slider?: boolean | SliderConfiguration;
+
+  /**
+   * Enable an interface for showing spatial data in the viewer.
+   * @description Requires WebGL support.
+   * @default false
+   */
+  spatial?: boolean | SpatialConfiguration;
+
+  /**
+   * Enable an interface for drawing 2D geometries on top of images.
+   * @description Requires WebGL support.
+   * @default false
+   */
+  tag?: boolean | TagConfiguration;
+
+  /**
+   * Show buttons for zooming in and out.
+   * @description Requires WebGL support.
+   * @default true
+   */
+  zoom?: boolean | ZoomConfiguration;
+}
+/**
+ * Interface for the URL options that can be provided to the viewer.
+ * @interface
+ */
+export interface UrlOptions {
+  /**
+   * Explore host.
+   * @description Host used for links to the full
+   * mapillary website.
+   * @default {"www.mapillary.com"}
+   */
+  exploreHost?: string;
+
+  /**
+   * Scheme.
+   * @description Used for all hosts.
+   * @default {"https"}
+   */
+  scheme?: string;
+}
+/**
+ * Enumeration for camera controls.
+ * @description Specifies different modes for how the
+ * camera is controlled through pointer, keyboard or
+ * other modes of input.
+ * @enum {number} *
+ * @readonly
+ */
+
+declare var CameraControls: {|
+  +Custom: 0, // 0
+  +Earth: 1, // 1
+  +Street: 2, // 2
+|};
+
+/**
+ * [object Object],[object Object],[object Object]
+ */
+export interface ViewerOptions {
+  /**
+   * Optional access token for API requests of
+   * resources.
+   * @description [object Object],[object Object],[object Object]
+   */
+  accessToken?: string;
+
+  /**
+   * Value specifying the initial camera controls of
+   * the viewer.
+   * @default [object Object],[object Object]
+   */
+  cameraControls?: $Values<typeof CameraControls>;
+
+  /**
+   * Value specifying if combined panning should be activated.
+   * @default true
+   */
+  combinedPanning?: boolean;
+
+  /**
+   * Component options.
+   */
+  component?: ComponentOptions;
+
+  /**
+   * The HTML element in which MapillaryJS will render the
+   * viewer, or the element's string `id`. The
+   * specified element must have no children.
+   */
+  container: string | HTMLElement;
+
+  /**
+   * Optional data provider class instance for API and static
+   * resource requests.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
+   */
+  dataProvider?: IDataProvider;
+
+  /**
+   * Optional `image-id` to start from. The id
+   * can be any Mapillary image. If a id is provided the viewer is
+   * bound to that id until it has been fully loaded. If null is provided
+   * no image is loaded at viewer initialization and the viewer is not
+   * bound to any particular id. Any image can then be navigated to
+   * with e.g. `viewer.moveTo("<my-image-id>")`.
+   */
+  imageId?: string;
+
+  /**
+   * Value indicating if the viewer should fetch high resolution
+   * image tiles.
+   * @description Can be used when extending MapillaryJS with
+   * a custom data provider. If no image tiling server exists
+   * the image tiling can be inactivated to avoid error
+   * messages about non-existing tiles in the console.
+   * @default true
+   */
+  imageTiling?: boolean;
+
+  /**
+   * The render mode in the viewer.
+   * @default [object Object],[object Object]
+   */
+  renderMode?: $Values<typeof RenderMode>;
+
+  /**
+   * A base URL for retrieving a PNG sprite image and json metadata file.
+   * File name extensions will be automatically appended.
+   */
+  sprite?: string;
+
+  /**
+   * If `true`, the viewer will automatically resize when the
+   * browser window resizes.
+   * @default true
+   */
+  trackResize?: boolean;
+
+  /**
+   * The transtion mode in the viewer.
+   * @default [object Object],[object Object]
+   */
+  transitionMode?: $Values<typeof TransitionMode>;
+
+  /**
+   * The URL options.
+   */
+  url?: UrlOptions;
+}
+declare class KeyboardService {
+  constructor(canvasContainer: HTMLElement): this;
+}
+declare class MouseService {
+  constructor(
+    container: EventTarget,
+    canvasContainer: EventTarget,
+    domContainer: EventTarget,
+    doc: EventTarget
+  ): this;
+  dispose(): void;
+  claimMouse(name: string, zindex: number): void;
+  unclaimMouse(name: string): void;
+  deferPixels(name: string, deferPixels: number): void;
+  undeferPixels(name: string): void;
+  claimWheel(name: string, zindex: number): void;
+  unclaimWheel(name: string): void;
+}
+/**
+ * Enumeration for alignments
+ * @enum {number} *
+ * @readonly
+ */
+
+declare var Alignment: {|
+  +Bottom: 0, // 0
+  +BottomLeft: 1, // 1
+  +BottomRight: 2, // 2
+  +Center: 3, // 3
+  +Left: 4, // 4
+  +Right: 5, // 5
+  +Top: 6, // 6
+  +TopLeft: 7, // 7
+  +TopRight: 8, // 8
+|};
+declare interface ISpriteAtlas {
+  loaded: boolean;
+}
+declare class SpriteAtlas implements ISpriteAtlas {
+  -json: mixed;
+  -image: mixed;
+  loaded: boolean;
+}
+declare interface Sprite {
+  width: number;
+  height: number;
+  x: number;
+  y: number;
+  pixelRatio: number;
+}
+declare interface Sprites {
+  [key: string]: Sprite;
+}
+declare class SpriteService {
+  constructor(sprite?: string): this;
+  dispose(): void;
+}
+declare interface TouchPinch {
+  /**
+   * X client coordinate for center of pinch.
+   */
+  clientX: number;
+
+  /**
+   * Y client coordinate for center of pinch.
+   */
+  clientY: number;
+
+  /**
+   * X page coordinate for center of pinch.
+   */
+  pageX: number;
+
+  /**
+   * Y page coordinate for center of pinch.
+   */
+  pageY: number;
+
+  /**
+   * X screen coordinate for center of pinch.
+   */
+  screenX: number;
+
+  /**
+   * Y screen coordinate for center of pinch.
+   */
+  screenY: number;
+
+  /**
+   * Distance change in X direction between touches
+   * compared to previous event.
+   */
+  changeX: number;
+
+  /**
+   * Distance change in Y direction between touches
+   * compared to previous event.
+   */
+  changeY: number;
+
+  /**
+   * Pixel distance between touches.
+   */
+  distance: number;
+
+  /**
+   * Change in pixel distance between touches compared
+   * to previous event.
+   */
+  distanceChange: number;
+
+  /**
+   * Distance in X direction between touches.
+   */
+  distanceX: number;
+
+  /**
+   * Distance in Y direction between touches.
+   */
+  distanceY: number;
+
+  /**
+   * Original touch event.
+   */
+  originalEvent: TouchEvent;
+
+  /**
+   * First touch.
+   */
+  touch1: Touch;
+
+  /**
+   * Second touch.
+   */
+  touch2: Touch;
+}
+declare class TouchService {
+  constructor(canvasContainer: HTMLElement, domContainer: HTMLElement): this;
+  dispose(): void;
+}
+/**
+ * Test whether the current browser supports the full
+ * functionality of MapillaryJS.
+ * @description The full functionality includes WebGL rendering.
+ * @return {boolean}
+ * @example `var supported = isSupported();`
+ */
+declare function isSupported(): boolean;
+
+/**
+ * Test whether the current browser supports the fallback
+ * functionality of MapillaryJS.
+ * @description The fallback functionality does not include WebGL
+ * rendering, only 2D canvas rendering.
+ * @return {boolean}
+ * @example `var fallbackSupported = isFallbackSupported();`
+ */
+declare function isFallbackSupported(): boolean;
+export type ComparisonFilterOperator = "==" | "!=" | ">" | ">=" | "<" | "<=";
+export type SetMembershipFilterOperator = "in" | "!in";
+export type CombiningFilterOperator = "all";
+export type FilterOperator =
+  | CombiningFilterOperator
+  | ComparisonFilterOperator
+  | SetMembershipFilterOperator;
+declare type FilterKey =
+  | "cameraType"
+  | "capturedAt"
+  | "clusterId"
+  | "creatorId"
+  | "creatorUsername"
+  | "exifOrientation"
+  | "height"
+  | "id"
+  | "mergeId"
+  | "merged"
+  | "ownerId"
+  | "private"
+  | "qualityScore"
+  | "sequenceId"
+  | "width";
+export type FilterValue = boolean | number | string;
+export type ComparisonFilterExpression = [
+  ComparisonFilterOperator,
+  FilterKey,
+  FilterValue
+];
+export type SetMembershipFilterExpression = (
+  | SetMembershipFilterOperator
+  | FilterKey
+  | FilterValue
+)[];
+export type CombiningFilterExpression = (
+  | CombiningFilterOperator
+  | ComparisonFilterExpression
+  | SetMembershipFilterExpression
+)[];
+export type FilterExpression =
+  | ComparisonFilterExpression
+  | SetMembershipFilterExpression
+  | CombiningFilterExpression;
+/**
+ * @event
+ */
+export type ViewerEventType =
+  | "bearing"
+  | "click"
+  | "contextmenu"
+  | "dblclick"
+  | "fov"
+  | "dataloading"
+  | "load"
+  | "mousedown"
+  | "mousemove"
+  | "mouseout"
+  | "mouseover"
+  | "mouseup"
+  | "moveend"
+  | "movestart"
+  | "navigable"
+  | "image"
+  | "position"
+  | "pov"
+  | "reference"
+  | "remove"
+  | "sequenceedges"
+  | "spatialedges";
+
+declare var RenderPass: {|
+  +Opaque: 0, // 0
+|};
+
+/**
+ * @interface
+ * @description [object Object],[object Object],[object Object],[object Object],[object Object]
+ */
+export interface ICustomRenderer {
+  /**
+   * A unique renderer id.
+   */
+  id: string;
+
+  /**
+   * The custom renderer's render pass.
+   * @description [object Object],[object Object],[object Object]
+   */
+  renderPass: $Values<typeof RenderPass>;
+
+  /**
+   * Method called when the renderer has been added to the
+   * viewer. This gives the
+   * renderer a chance to initialize gl resources and
+   * register event listeners.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object]
+   * @param {IViewer} viewer - The viewer this custom renderer
+   * was just added to.
+   * @param {LngLatAlt} reference - The viewer's current
+   * reference position.
+   * @param {WebGLRenderingContext | WebGL2RenderingContext} context -
+   * The viewer's gl context.
+   */
+  onAdd(
+    viewer: IViewer,
+    reference: LngLatAlt,
+    context: WebGLRenderingContext
+  ): void;
+
+  /**
+   * Method called when the viewer's reference position has changed.
+   * This gives the renderer a chance to reposition its scene objects.
+   * @description [object Object],[object Object],[object Object]
+   * @param {IViewer} viewer - The viewer this custom renderer
+   * is added to.
+   * @param {LngLatAlt} reference - The viewer's current
+   * reference position.
+   */
+  onReference(viewer: IViewer, reference: LngLatAlt): void;
+
+  /**
+   * Method called when the renderer has been removed from the
+   * viewer. This gives the
+   * renderer a chance to clean up gl resources and event
+   * listeners.
+   * @description [object Object],[object Object],[object Object]
+   * @param {IViewer} viewer - The viewer this custom renderer
+   * was just removed from.
+   * @param {WebGLRenderingContext | WebGL2RenderingContext} context -
+   * The viewer's gl context.
+   */
+  onRemove(viewer: IViewer, context: WebGLRenderingContext): void;
+
+  /**
+   * Called during an animation frame allowing the renderer to draw
+   * into the GL context. The layer cannot make assumptions
+   * about the current GL state.
+   * @description Take a look at the
+   * [WebGL model view projection article](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_model_view_projection)
+   * on MDN for an introduction to the view and projection matrices.
+   * @param {WebGLRenderingContext | WebGL2RenderingContext} context The
+   * viewer's WebGL context.
+   * @param {Array<number>} viewMatrix The viewer's view matrix.
+   * @param {Array<number>} projectionMatrix The viewers's projection
+   * matrix.
+   */
+  render(
+    context: WebGLRenderingContext,
+    viewMatrix: number[],
+    projectionMatrix: number[]
+  ): void;
+}
+/**
+ * @interface PointOfView
+ *
+ * Interface that represents the point of view of the viewer.
+ */
+export interface PointOfView {
+  /**
+   * Value indicating the current bearing of the viewer
+   * measured in degrees clockwise with respect to north.
+   * Ranges from 0° to 360°.
+   */
+  bearing: number;
+
+  /**
+   * The camera tilt in degrees, relative to a horizontal plane.
+   * Ranges from 90° (directly upwards) to -90° (directly downwards).
+   */
+  tilt: number;
+}
+export interface IViewer {
+  +dataProvider: IDataProvider;
+  +isNavigable: boolean;
+  activateCombinedPanning(): void;
+  activateComponent(name: string): void;
+  activateCover(): void;
+  addCustomRenderer(renderer: ICustomRenderer): void;
+  attachCustomCameraControls(controls: ICustomCameraControls): void;
+  deactivateCombinedPanning(): void;
+  deactivateComponent(name: string): void;
+  deactivateCover(): void;
+  detachCustomCameraControls(): Promise<ICustomCameraControls>;
+  fire<T>(type: ViewerEventType, event: T): void;
+  getBearing(): Promise<number>;
+  getCameraControls(): Promise<$Values<typeof CameraControls>>;
+  getCanvas(): HTMLCanvasElement;
+  getCanvasContainer(): HTMLDivElement;
+  getCenter(): Promise<number[]>;
+  getComponent<TComponent: Component<ComponentConfiguration>>(
+    name: string
+  ): TComponent;
+  getContainer(): HTMLElement;
+  getFieldOfView(): Promise<number>;
+  getImage(): Promise<Image>;
+  getPointOfView(): Promise<PointOfView>;
+  getPosition(): Promise<LngLat>;
+  getReference(): Promise<LngLatAlt>;
+  getZoom(): Promise<number>;
+  hasCustomCameraControls(controls: ICustomCameraControls): boolean;
+  hasCustomRenderer(rendererId: string): boolean;
+  moveDir(direction: $Values<typeof NavigationDirection>): Promise<Image>;
+  moveTo(imageId: string): Promise<Image>;
+  off<T>(type: ViewerEventType, handler: (event: T) => void): void;
+  on<T>(type: ViewerEventType, handler: (event: T) => void): void;
+  project(lngLat: LngLat): Promise<number[]>;
+  projectFromBasic(basicPoint: number[]): Promise<number[]>;
+  remove(): void;
+  removeCustomRenderer(rendererId: string): void;
+  resize(): void;
+  setCameraControls(controls: $Values<typeof CameraControls>): void;
+  setCenter(center: number[]): void;
+  setFieldOfView(fov: number): void;
+  setFilter(filter?: FilterExpression): Promise<void>;
+  setRenderMode(renderMode: $Values<typeof RenderMode>): void;
+  setTransitionMode(transitionMode: $Values<typeof TransitionMode>): void;
+  setAccessToken(accessToken?: string): Promise<void>;
+  setZoom(zoom: number): void;
+  triggerRerender(): void;
+  unproject(pixelPoint: number[]): Promise<LngLat>;
+  unprojectToBasic(pixelPoint: number[]): Promise<number[]>;
+}
+/**
+ * @interface
+ * @description [object Object],[object Object],[object Object]
+ */
+export interface ICustomCameraControls {
+  /**
+   * Method called when the camera controls have been
+   * activated and is responsible for moving the
+   * viewer's camera and defining its projection. This
+   * method gives the camera controls a chance to initialize
+   * resources, perform any transitions, and determine
+   * initial state.
+   * @description [object Object],[object Object],[object Object]
+   * @param {IViewer} viewer - The viewer this custom
+   * camera controls instance was just added to.
+   * @param {Array<number>} viewMatrix - The viewer's view matrix.
+   * @param {Array<number>} projectionMatrix - The viewers's
+   * projection matrix.
+   * @param {LngLatAlt} reference - The viewer's reference.
+   */
+  onActivate(
+    viewer: IViewer,
+    viewMatrix: number[],
+    projectionMatrix: number[],
+    reference: LngLatAlt
+  ): void;
+
+  /**
+   * Method called for each animation frame.
+   * @desdcription Custom camera controls can choose to
+   * make updates on each animation frame or only based on
+   * user input. Invoking updates on each animation frame is
+   * more resource intensive.
+   * @param {IViewer} viewer - The viewer this custom
+   * camera controls instance is attached to.
+   * @param {number} frameId - The request animation frame's id.
+   */
+  onAnimationFrame(viewer: IViewer, frameId: number): void;
+
+  /**
+   * Method called when the camera controls have been
+   * attached to the viewer.
+   * This gives the camera controls a chance to initialize
+   * resources.
+   * @description [object Object],[object Object],[object Object]
+   * @param {IViewer} viewer - The viewer this custom
+   * camera controls instance was just added to.
+   */
+  onAttach(
+    viewer: IViewer,
+    viewMatrixCallback: (viewMatrix: number[]) => void,
+    projectionMatrixCallback: (projectionMatrix: number[]) => void
+  ): void;
+
+  /**
+   * Method called when the camera controls have been deactivated.
+   * This gives the camera controls a chance to clean up resources
+   * and event listeners.
+   * @param {IViewer} viewer - The viewer this custom camera controls
+   * instance is attached to.
+   */
+  onDeactivate(viewer: IViewer): void;
+
+  /**
+   * Method called when the camera controls have been detached from
+   * the viewer. This gives the camera controls a chance to clean
+   * up resources and event listeners.
+   * @description [object Object],[object Object],[object Object]
+   * @param {IViewer} viewer - The viewer this custom camera
+   * controls instance was just detached from.
+   */
+  onDetach(viewer: IViewer): void;
+
+  /**
+   * Method called when the viewer's reference position has changed.
+   * This gives the custom camera controls a chance to reposition
+   * the camera.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object]
+   * @param {IViewer} viewer - The viewer this custom renderer
+   * is added to.
+   * @param {LngLatAlt} reference - The viewer's current
+   * reference position.
+   */
+  onReference(viewer: IViewer, reference: LngLatAlt): void;
+
+  /**
+   * Method called when the viewer has been resized.
+   * @description Use this method to modify the projection.
+   */
+  onResize(viewer: IViewer): void;
+}
+/**
+ * Interface for general viewer events.
+ */
+export interface ViewerEvent {
+  /**
+   * The viewer object that fired the event.
+   */
+  target: IViewer;
+
+  /**
+   * The event type.
+   */
+  type: ViewerEventType;
+}
+/**
+ * Interface for bearing viewer events.
+ */
+export type ViewerBearingEvent = {
+  /**
+   * Bearing is measured in degrees
+   * clockwise with respect to north.
+   * @description [object Object],[object Object],[object Object]
+   */
+  bearing: number,
+  type: "bearing",
+  ...
+} & ViewerEvent;
+
+/**
+ * Interface for viewer data loading events.
+ * @description Fired when any viewer data (image, mesh, metadata, etc)
+ * begins loading or changing asyncronously as a result of viewer
+ * navigation.
+ *
+ * Also fired when the data has finished loading and the viewer
+ * is able to perform the navigation.
+ */
+export type ViewerDataLoadingEvent = {
+  /**
+   * Indicates if the viewer navigation is awaiting data load.
+   */
+  loading: boolean,
+  type: "dataloading",
+  ...
+} & ViewerEvent;
+
+/**
+ * Interface for mouse-related viewer events.
+ * @example ```js
+ * // The `click` event is an example of a `ViewerMouseEvent`.
+ * // Set up an event listener on the viewer.
+ * viewer.on('click', function(e) {
+ *   // The event object contains information like the
+ *   // coordinates of the point in the viewer that was clicked.
+ *   console.log('A click event has occurred at ' + e.lngLat);
+ * });
+ * ```
+ */
+export type ViewerMouseEvent = {
+  /**
+   * The basic coordinates in the current image of the mouse
+   * event target.
+   * @description [object Object],[object Object],[object Object]
+   */
+  basicPoint: number[],
+
+  /**
+   * The geographic location in the viewer of the mouse event target.
+   * @description In some situations the viewer can not determine a valid
+   * geographic location for the mouse event target. In that case the
+   * geographic coordinates will be `null`.
+   */
+  lngLat: LngLat,
+
+  /**
+   * The pixel coordinates of the mouse event target, relative to
+   * the viewer and measured from the top left corner.
+   */
+  pixelPoint: number[],
+
+  /**
+   * The original event that triggered the viewer event.
+   */
+  originalEvent: MouseEvent,
+
+  /**
+   * The event type.
+   */
+  type:
+    | "click"
+    | "contextmenu"
+    | "dblclick"
+    | "mousedown"
+    | "mousemove"
+    | "mouseout"
+    | "mouseover"
+    | "mouseup",
+  ...
+} & ViewerEvent;
+
+/**
+ * Interface for navigable viewer events.
+ */
+export type ViewerNavigableEvent = {
+  /**
+   * The navigable state indicates if the viewer supports
+   * moving, i.e. calling the `moveTo` and `moveDir`
+   * methods. The viewer will not be in a navigable state if the cover
+   * is activated and the viewer has been supplied a id. When the cover
+   * is deactivated or activated without being supplied a id it will
+   * be navigable.
+   */
+  navigable: boolean,
+  type: "navigable",
+  ...
+} & ViewerEvent;
+
+/**
+ * Interface for navigation edge viewer events.
+ */
+export type ViewerNavigationEdgeEvent = {
+  /**
+   * The viewer's current navigation edge status.
+   */
+  status: NavigationEdgeStatus,
+  type: "sequenceedges" | "spatialedges",
+  ...
+} & ViewerEvent;
+
+/**
+ * Interface for viewer image events.
+ */
+export type ViewerImageEvent = {
+  /**
+   * The viewer's current image.
+   */
+  image: Image,
+  type: "image",
+  ...
+} & ViewerEvent;
+
+/**
+ * Interface for viewer state events.
+ * @example ```js
+ * // The `fov` event is an example of a `ViewerStateEvent`.
+ * // Set up an event listener on the viewer.
+ * viewer.on('fov', function(e) {
+ *   console.log('A fov event has occured');
+ * });
+ * ```
+ */
+export type ViewerStateEvent = {
+  /**
+   * The event type.
+   */
+  type: "fov" | "moveend" | "movestart" | "position" | "pov" | "remove",
+  ...
+} & ViewerEvent;
+export type ComponentName =
+  | "attribution"
+  | "bearing"
+  | "cache"
+  | "cover"
+  | "direction"
+  | "image"
+  | "keyboard"
+  | "marker"
+  | "pointer"
+  | "popup"
+  | "sequence"
+  | "slider"
+  | "spatial"
+  | "tag"
+  | "zoom";
+export type FallbackComponentName = "imagefallback" | "navigationfallback";
+/**
+ * Interface for viewer load events.
+ * @description Fired immediately after all necessary resources
+ * have been downloaded and the first visually complete
+ * rendering of the viewer has occurred.
+ *
+ * The visually complete rendering does not include custom
+ * renderers.
+ *
+ * This event is only fired for viewer configurations where
+ * the WebGL context is created, i.e. not when using the
+ * fallback functionality only.
+ * @example ```js
+ * // Set up an event listener on the viewer.
+ * viewer.on('load', function(e) {
+ *   console.log('A load event has occured');
+ * });
+ * ```
+ */
+export type ViewerLoadEvent = {
+  type: "load",
+  ...
+} & ViewerEvent;
+
+/**
+ * Interface for viewer reference events.
+ */
+export type ViewerReferenceEvent = {
+  /**
+   * The viewer's current reference.
+   */
+  reference: LngLatAlt,
+  type: "reference",
+  ...
+} & ViewerEvent;
+
+/**
+ * @class Viewer
+ * @classdesc The Viewer object represents the navigable image viewer.
+ * Create a Viewer by specifying a container, client ID, image ID and
+ * other options. The viewer exposes methods and events for programmatic
+ * interaction.
+ *
+ * In the case of asynchronous methods, MapillaryJS returns promises to
+ * the results. Notifications are always emitted through JavaScript events.
+ */
+declare class Viewer implements IEventEmitter, IViewer {
+  /**
+   * Create a new viewer instance.
+   * @description The `Viewer` object represents the street imagery
+   * viewer on your web page. It exposes methods and properties that
+   * you can use to programatically change the view, and fires
+   * events as users interact with it.
+   *
+   * It is possible to initialize the viewer with or
+   * without a ID.
+   *
+   * When you want to show a specific image in the viewer from
+   * the start you should initialize it with a ID.
+   *
+   * When you do not know the first image ID at implementation
+   * time, e.g. in a map-viewer application you should initialize
+   * the viewer without a ID and call `moveTo` instead.
+   *
+   * When initializing with an ID the viewer is bound to that ID
+   * until the image for that ID has been successfully loaded.
+   * Also, a cover with the image of the ID will be shown.
+   * If the data for that ID can not be loaded because the ID is
+   * faulty or other errors occur it is not possible to navigate
+   * to another ID because the viewer is not navigable. The viewer
+   * becomes navigable when the data for the ID has been loaded and
+   * the image is shown in the viewer. This way of initializing
+   * the viewer is mostly for embedding in blog posts and similar
+   * where one wants to show a specific image initially.
+   *
+   * If the viewer is initialized without a ID (with null or
+   * undefined) it is not bound to any particular ID and it is
+   * possible to move to any ID with `viewer.moveTo("<my-image-id>")`.
+   * If the first move to a ID fails it is possible to move to another
+   * ID. The viewer will show a black background until a move
+   * succeeds. This way of intitializing is suited for a map-viewer
+   * application when the initial ID is not known at implementation
+   * time.
+   * @param {ViewerOptions} options - Optional configuration object
+   * specifying Viewer's and the components' initial setup.
+   * @example ```js
+   * var viewer = new Viewer({
+   *     accessToken: "<my-access-token>",
+   *     container: "<my-container-id>",
+   * });
+   * ```
+   */
+  constructor(options: ViewerOptions): this;
+
+  /**
+   * Returns the data provider used by the viewer to fetch
+   * all contracts, ents, and buffers.
+   * @description [object Object],[object Object],[object Object]
+   * @returns {IDataProvider} The viewer's data provider.
+   */
+  dataProvider: IDataProvider;
+
+  /**
+   * Return a boolean indicating if the viewer is in a navigable state.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
+   * @returns {boolean} Boolean indicating whether the viewer is navigable.
+   */
+  isNavigable: boolean;
+
+  /**
+   * Activate the combined panning functionality.
+   * @description The combined panning functionality is active by default.
+   */
+  activateCombinedPanning(): void;
+
+  /**
+   * Activate a component.
+   * @param {string} name - Name of
+   * the component which will become active.
+   * @example ```js
+   * viewer.activateComponent("marker");
+   * ```
+   */
+  activateComponent(name: string): void;
+
+  /**
+   * Activate the cover (deactivates all other components).
+   */
+  activateCover(): void;
+
+  /**
+   * Add a custom renderer to the viewer's rendering pipeline.
+   * @description During a render pass, custom renderers
+   * are called in the order they were added.
+   * @param renderer - The custom renderer implementation.
+   */
+  addCustomRenderer(renderer: ICustomRenderer): void;
+
+  /**
+   * Attach custom camera controls to control the viewer's
+   * camera pose and projection.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
+   * @param controls - The custom camera controls implementation.
+   * @throws {MapillaryError} When camera controls attached
+   * are already attached to the viewer.
+   */
+  attachCustomCameraControls(controls: ICustomCameraControls): void;
+
+  /**
+   * Deactivate the combined panning functionality.
+   * @description Deactivating the combined panning functionality
+   * could be needed in scenarios involving sequence only navigation.
+   */
+  deactivateCombinedPanning(): void;
+
+  /**
+   * Deactivate a component.
+   * @param {string} name - Name
+   * of component which become inactive.
+   * @example ```js
+   * viewer.deactivateComponent("pointer");
+   * ```
+   */
+  deactivateComponent(name: string): void;
+
+  /**
+   * Deactivate the cover (activates all components marked as active).
+   */
+  deactivateCover(): void;
+
+  /**
+   * Detach a previously attached custom camera control
+   * instance from the viewer.
+   * @description If no custom camera control instance
+   * has previously been attached, calling this method
+   * has no effect.
+   *
+   * Already attached custom camera controls need to
+   * be detached before attaching another custom camera
+   * control instance.
+   */
+  detachCustomCameraControls(): Promise<ICustomCameraControls>;
+
+  /**
+   * Get the bearing of the current viewer camera.
+   * @description The bearing depends on how the camera
+   * is currently rotated and does not correspond
+   * to the compass angle of the current image if the view
+   * has been panned.
+   *
+   * Bearing is measured in degrees clockwise with respect to
+   * north.
+   * @returns {Promise<number>} Promise to the bearing
+   * of the current viewer camera.
+   * @example ```js
+   * viewer.getBearing().then(b => { console.log(b); });
+   * ```
+   */
+  getBearing(): Promise<number>;
+
+  /**
+ * Get the viewer's camera control mode.
+ * @description The camera control mode determines
+ * how the camera is controlled when the viewer
+ * receives pointer and keyboard input.
+ * @returns {$Values<
+                typeof
+                CameraControls>} controls - Camera control mode.
+ * @example ```js
+ * viewer.getCameraControls().then(c => { console.log(c); });
+ * ```
+ */
+  getCameraControls(): Promise<$Values<typeof CameraControls>>;
+
+  /**
+   * Returns the viewer's canvas element.
+   * @description This is the element onto which the viewer renders
+   * the WebGL content.
+   * @returns {HTMLCanvasElement} The viewer's canvas element, or
+   * null or not initialized.
+   */
+  getCanvas(): HTMLCanvasElement;
+
+  /**
+   * Returns the HTML element containing the viewer's canvas element.
+   * @description This is the element to which event bindings for viewer
+   * interactivity (such as panning and zooming) are attached.
+   * @returns {HTMLDivElement} The container for the viewer's
+   * canvas element.
+   */
+  getCanvasContainer(): HTMLDivElement;
+
+  /**
+   * Get the basic coordinates of the current image that is
+   * at the center of the viewport.
+   * @description Basic coordinates are 2D coordinates on the [0, 1] interval
+   * and have the origin point, (0, 0), at the top left corner and the
+   * maximum value, (1, 1), at the bottom right corner of the original
+   * image.
+   * @returns {Promise<number[]>} Promise to the basic coordinates
+   * of the current image at the center for the viewport.
+   * @example ```js
+   * viewer.getCenter().then(c => { console.log(c); });
+   * ```
+   */
+  getCenter(): Promise<number[]>;
+
+  /**
+   * Get a component.
+   * @param {string} name - Name of component.
+   * @returns {Component} The requested component.
+   * @example ```js
+   * var pointerComponent = viewer.getComponent("pointer");
+   * ```
+   */
+  getComponent<TComponent: Component<ComponentConfiguration>>(
+    name: string
+  ): TComponent;
+
+  /**
+   * Returns the viewer's containing HTML element.
+   * @returns {HTMLElement} The viewer's container.
+   */
+  getContainer(): HTMLElement;
+
+  /**
+   * Get the viewer's current vertical field of view.
+   * @description The vertical field of view rendered on the viewer canvas
+   * measured in degrees.
+   * @returns {Promise<number>} Promise to the current field of view
+   * of the viewer camera.
+   * @example ```js
+   * viewer.getFieldOfView().then(fov => { console.log(fov); });
+   * ```
+   */
+  getFieldOfView(): Promise<number>;
+
+  /**
+   * Get the viewer's current image.
+   * @returns {Promise<Image>} Promise to the current image.
+   * @example ```js
+   * viewer.getImage().then(image => { console.log(image.id); });
+   * ```
+   */
+  getImage(): Promise<Image>;
+
+  /**
+   * Get the viewer's current point of view.
+   * @returns {Promise<PointOfView>} Promise to the current point of view
+   * of the viewer camera.
+   * @example ```js
+   * viewer.getPointOfView().then(pov => { console.log(pov); });
+   * ```
+   */
+  getPointOfView(): Promise<PointOfView>;
+
+  /**
+   * Get the viewer's current position
+   * @returns {Promise<LngLat>} Promise to the viewers's current
+   * position.
+   * @example ```js
+   * viewer.getPosition().then(pos => { console.log(pos); });
+   * ```
+   */
+  getPosition(): Promise<LngLat>;
+
+  /**
+   * Get the viewer's current reference position.
+   * @description The reference position specifies the origin in
+   * the viewer's topocentric coordinate system.
+   * @returns {Promise<LngLatAlt>} Promise to the reference position.
+   * @example ```js
+   * viewer.getReference().then(reference => { console.log(reference); });
+   * ```
+   */
+  getReference(): Promise<LngLatAlt>;
+
+  /**
+   * Get the image's current zoom level.
+   * @returns {Promise<number>} Promise to the viewers's current
+   * zoom level.
+   * @example ```js
+   * viewer.getZoom().then(z => { console.log(z); });
+   * ```
+   */
+  getZoom(): Promise<number>;
+
+  /**
+   * Check if a controls instance is the camera controls that are
+   * currently attached to the viewer.
+   * @param {ICustomCameraControls} controls - Camera controls instance.
+   * @returns {boolean} Value indicating whether the controls instance
+   * is currently attached.
+   */
+  hasCustomCameraControls(controls: ICustomCameraControls): boolean;
+
+  /**
+   * Check if a custom renderer has been added to the viewer's
+   * rendering pipeline.
+   * @param {string} id - Unique ID of the custom renderer.
+   * @returns {boolean} Value indicating whether the customer
+   * renderer has been added.
+   */
+  hasCustomRenderer(rendererId: string): boolean;
+
+  /**
+ * Navigate in a given direction.
+ * @param {$Values<
+                typeof
+                NavigationDirection>} direction - Direction in which which to move.
+ * @returns {Promise<Image>} Promise to the image that was navigated to.
+ * @throws If the current image does not have the edge direction
+ * or the edges has not yet been cached.
+ * @throws Propagates any IO errors to the caller.
+ * @throws When viewer is not navigable.
+ * @throws [object Object],[object Object],[object Object]
+ * @example ```js
+ * viewer.moveDir(NavigationDirection.Next).then(
+ *     image => { console.log(image); },
+ *     error => { console.error(error); });
+ * ```
+ */
+  moveDir(direction: $Values<typeof NavigationDirection>): Promise<Image>;
+
+  /**
+   * Navigate to a given image ID.
+   * @param {string} imageId - Id of the image to move to.
+   * @returns {Promise<Image>} Promise to the image that was navigated to.
+   * @throws Propagates any IO errors to the caller.
+   * @throws When viewer is not navigable.
+   * @throws [object Object],[object Object],[object Object]
+   * @example ```js
+   * viewer.moveTo("<my-image-id>").then(
+   *     image => { console.log(image); },
+   *     error => { console.error(error); });
+   * ```
+   */
+  moveTo(imageId: string): Promise<Image>;
+
+  /**
+   * Project geodetic coordinates to canvas pixel coordinates.
+   * @description The geodetic coordinates may not always correspond to pixel
+   * coordinates, e.g. if the geodetic coordinates have a position behind the
+   * viewer camera. In the case of no correspondence the returned value will
+   * be `null`.
+   *
+   * If the distance from the viewer camera position to the provided
+   * longitude-latitude is more than 1000 meters `null` will be returned.
+   *
+   * The projection is performed from the ground plane, i.e.
+   * the altitude with respect to the ground plane for the geodetic
+   * point is zero.
+   *
+   * Note that whenever the camera moves, the result of the method will be
+   * different.
+   * @param {LngLat} lngLat - Geographical coordinates to project.
+   * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
+   * to the lngLat.
+   * @example ```js
+   * viewer.project({ lat: 0, lng: 0 })
+   *     .then(pixelPoint => {
+   *          if (!pixelPoint) {
+   *              console.log("no correspondence");
+   *          }
+   *
+   *          console.log(pixelPoint);
+   *     });
+   * ```
+   */
+  project(lngLat: LngLat): Promise<number[]>;
+
+  /**
+   * Project basic image coordinates for the current image to canvas pixel
+   * coordinates.
+   * @description The basic image coordinates may not always correspond to a
+   * pixel point that lies in the visible area of the viewer container. In the
+   * case of no correspondence the returned value can be `null`.
+   * @param {Array<number>} basicPoint - Basic images coordinates to project.
+   * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
+   * to the basic image point.
+   * @example ```js
+   * viewer.projectFromBasic([0.3, 0.7])
+   *     .then(pixelPoint => { console.log(pixelPoint); });
+   * ```
+   */
+  projectFromBasic(basicPoint: number[]): Promise<number[]>;
+
+  /**
+   * Clean up and release all internal resources associated with
+   * this viewer.
+   * @description This includes DOM elements, event bindings, and
+   * WebGL resources.
+   *
+   * Use this method when you are done using the viewer and wish to
+   * ensure that it no longer consumes browser resources. Afterwards,
+   * you must not call any other methods on the viewer.
+   * @fires remove
+   * @example ```js
+   * viewer.remove();
+   * ```
+   */
+  remove(): void;
+
+  /**
+   * Remove a custom renderer from the viewer's rendering pipeline.
+   * @param id - Unique ID of the custom renderer.
+   */
+  removeCustomRenderer(rendererId: string): void;
+
+  /**
+   * Detect the viewer's new width and height and resize it
+   * manually.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object]
+   * @example ```js
+   * viewer.resize();
+   * ```
+   */
+  resize(): void;
+
+  /**
+ * Set the viewer's camera control mode.
+ * @description The camera control mode determines
+ * how the camera is controlled when the viewer
+ * receives pointer and keyboard input.
+ *
+ * Changing the camera control mode is not possible
+ * when the slider component is active and attempts
+ * to do so will be ignored.
+ * @param {$Values<
+                typeof
+                CameraControls>} controls - Camera control mode.
+ * @example ```js
+ * viewer.setCameraControls(CameraControls.Street);
+ * ```
+ */
+  setCameraControls(controls: $Values<typeof CameraControls>): void;
+
+  /**
+   * Set the basic coordinates of the current image to be in the
+   * center of the viewport.
+   * @description Basic coordinates are 2D coordinates on the [0, 1] interval
+   * and has the origin point, (0, 0), at the top left corner and the
+   * maximum value, (1, 1), at the bottom right corner of the original
+   * image.
+   * @param {number[]} The basic coordinates of the current
+   * image to be at the center for the viewport.
+   * @example ```js
+   * viewer.setCenter([0.5, 0.5]);
+   * ```
+   */
+  setCenter(center: number[]): void;
+
+  /**
+   * Set the viewer's current vertical field of view.
+   * @description Sets the vertical field of view rendered
+   * on the viewer canvas measured in degrees. The value
+   * will be clamped to be able to set a valid zoom level
+   * based on the projection model of the current image and
+   * the viewer's current render mode.
+   * @param {number} fov - Vertical field of view in degrees.
+   * @example ```js
+   * viewer.setFieldOfView(45);
+   * ```
+   */
+  setFieldOfView(fov: number): void;
+
+  /**
+   * Set the filter selecting images to use when calculating
+   * the spatial edges.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
+   * @param {FilterExpression} [filter] - The filter expression.
+   * Applied filter is cleared if omitted.
+   * @returns {Promise<void>} Promise that resolves after filter is applied.
+   * @example ```js
+   * // Examples
+   * viewer.setFilter(["==", "cameraType", "spherical"]);
+   * viewer.setFilter([">=", "capturedAt", <my-time-stamp>]);
+   * viewer.setFilter(["in", "sequenceId", "<sequence-id-1>", "<sequence-id-2>"]);
+   * ```
+   */
+  setFilter(filter?: FilterExpression): Promise<void>;
+
+  /**
+ * Set the viewer's render mode.
+ * @param {$Values<
+                typeof
+                RenderMode>} renderMode - Render mode.
+ * @example ```js
+ * viewer.setRenderMode(RenderMode.Letterbox);
+ * ```
+ */
+  setRenderMode(renderMode: $Values<typeof RenderMode>): void;
+
+  /**
+ * Set the viewer's transition mode.
+ * @param {$Values<
+                typeof
+                TransitionMode>} transitionMode - Transition mode.
+ * @example ```js
+ * viewer.setTransitionMode(TransitionMode.Instantaneous);
+ * ```
+ */
+  setTransitionMode(transitionMode: $Values<typeof TransitionMode>): void;
+
+  /**
+   * Set an access token for authenticated API requests of protected
+   * resources.
+   *
+   * The token may be a user access token or a client access token.
+   * @description [object Object],[object Object],[object Object]
+   * @param {string} [accessToken] accessToken - Optional user
+   * access token or client access token.
+   * @returns {Promise<void>} Promise that resolves after token
+   * is set.
+   * @throws When viewer is not navigable.
+   * @example ```js
+   * viewer.setAccessToken("<my access token>")
+   *     .then(() => { console.log("user token set"); });
+   * ```
+   */
+  setAccessToken(accessToken?: string): Promise<void>;
+
+  /**
+   * Set the image's current zoom level.
+   * @description Possible zoom level values are on the [0, 3] interval.
+   * Zero means zooming out to fit the image to the view whereas three
+   * shows the highest level of detail.
+   * @param {number} The image's current zoom level.
+   * @example ```js
+   * viewer.setZoom(2);
+   * ```
+   */
+  setZoom(zoom: number): void;
+
+  /**
+   * Trigger the rendering of a single frame.
+   * @description Use this method with custom renderers to
+   * force the viewer to rerender when the custom content
+   * changes. Calling this multiple times before the next
+   * frame is rendered will still result in only a single
+   * frame being rendered.
+   */
+  triggerRerender(): void;
+
+  /**
+   * Unproject canvas pixel coordinates to geodetic
+   * coordinates.
+   * @description The pixel point may not always correspond to geodetic
+   * coordinates. In the case of no correspondence the returned value will
+   * be `null`.
+   *
+   * The unprojection to a lngLat will be performed towards the ground plane, i.e.
+   * the altitude with respect to the ground plane for the returned lngLat is zero.
+   * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
+   * @returns {Promise<LngLat>} Promise to the lngLat corresponding to the pixel point.
+   * @example ```js
+   * viewer.unproject([100, 100])
+   *     .then(lngLat => { console.log(lngLat); });
+   * ```
+   */
+  unproject(pixelPoint: number[]): Promise<LngLat>;
+
+  /**
+   * Unproject canvas pixel coordinates to basic image coordinates for the
+   * current image.
+   * @description The pixel point may not always correspond to basic image
+   * coordinates. In the case of no correspondence the returned value will
+   * be `null`.
+   * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
+   * @returns {Promise<LngLat>} Promise to the basic coordinates corresponding
+   * to the pixel point.
+   * @example ```js
+   * viewer.unprojectToBasic([100, 100])
+   *     .then(basicPoint => { console.log(basicPoint); });
+   * ```
+   */
+  unprojectToBasic(pixelPoint: number[]): Promise<number[]>;
+
+  fire<T>(type: string, event: T): void;
+  off<T>(type: string, handler: (event: T) => void): void;
+  on<T>(type: string, handler: (event: T) => void): void;
+}
+/**
+ * @class MapillaryError
+ * @classdesc Generic Mapillary error.
+ */
+declare class MapillaryError extends Error {
+  constructor(message?: string): this;
+}
+/**
+ * @class CancelMapillaryError
+ * @classdesc Error thrown when a move to request has been
+ * cancelled before completing because of a subsequent request.
+ */
+declare class CancelMapillaryError extends MapillaryError {
+  constructor(message?: string): this;
+}
+declare class ArgumentMapillaryError extends MapillaryError {
+  constructor(message?: string): this;
+}
+declare class GraphMapillaryError extends MapillaryError {
+  constructor(message: string): this;
+}
+declare class ConfigurationService {
+  constructor(options: ViewerOptions): this;
+}
+declare class Container {
+  id: string;
+  renderService: RenderService;
+  glRenderer: GLRenderer;
+  domRenderer: DOMRenderer;
+  keyboardService: KeyboardService;
+  mouseService: MouseService;
+  touchService: TouchService;
+  spriteService: SpriteService;
+  +configurationService: ConfigurationService;
+  constructor(
+    options: ViewerOptions,
+    stateService: StateService,
+    dom?: DOM
+  ): this;
+  canvas: HTMLCanvasElement;
+  canvasContainer: HTMLDivElement;
+  container: HTMLElement;
+  domContainer: HTMLDivElement;
+  remove(): void;
+}
+declare type Func<T, TResult> = (item: T) => TResult;
+declare type FilterFunction = Func<Image, boolean>;
+/**
+ * @class Filter
+ * @classdesc Represents a class for creating image filters. Implementation and
+ * definitions based on https://github.com/mapbox/feature-filter.
+ */
+declare class FilterCreator {
+  /**
+   * Create a filter from a filter expression.
+   * @description The following filters are supported:
+   *
+   * Comparison
+   * `==`
+   * `!=`
+   * `<`
+   * `<=`
+   * `>`
+   * `>=`
+   *
+   * Set membership
+   * `in`
+   * `!in`
+   *
+   * Combining
+   * `all`
+   * @param {FilterExpression} filter - Comparison, set membership or combinding filter
+   * expression.
+   * @returns {FilterFunction} Function taking a image and returning a boolean that
+   * indicates whether the image passed the test or not.
+   */
+  createFilter(filter: FilterExpression): FilterFunction;
+}
+/**
+ * @class GraphCalculator
+ * @classdesc Represents a calculator for graph entities.
+ */
+declare class GraphCalculator {
+  /**
+   * Get the bounding box corners for a circle with radius of a threshold
+   * with center in a geodetic position.
+   * @param {LngLat} lngLat - Longitude, latitude to encode.
+   * @param {number} threshold - Threshold distance from the position in meters.
+   * @returns {Array<LngLat>} The south west and north east corners of the
+   * bounding box.
+   */
+  boundingBoxCorners(lngLat: LngLat, threshold: number): [LngLat, LngLat];
+
+  /**
+   * Convert a compass angle to an angle axis rotation vector.
+   * @param {number} compassAngle - The compass angle in degrees.
+   * @param {number} orientation - The orientation of the original image.
+   * @returns {Array<number>} Angle axis rotation vector.
+   */
+  rotationFromCompass(compassAngle: number, orientation: number): number[];
+}
+/**
+ * @class Sequence
+ * @classdesc Represents a sequence of ordered images.
+ */
+declare class Sequence {
+  /**
+   * Create a new sequene instance.
+   * @param {SequenceEnt} sequence - Raw sequence data.
+   */
+  constructor(sequence: SequenceEnt): this;
+
+  /**
+   * Get id.
+   * @returns {string} Unique sequence id.
+   */
+  id: string;
+
+  /**
+   * Get ids.
+   * @returns {Array<string>} Array of ordered image ids in the sequence.
+   */
+  imageIds: string[];
+
+  /**
+   * Dispose the sequence.
+   * @description Disposes all cached assets.
+   */
+  dispose(): void;
+
+  /**
+   * Find the next image id in the sequence with respect to
+   * the provided image id.
+   * @param {string} id - Reference image id.
+   * @returns {string} Next id in sequence if it exists, null otherwise.
+   */
+  findNext(id: string): string;
+
+  /**
+   * Find the previous image id in the sequence with respect to
+   * the provided image id.
+   * @param {string} id - Reference image id.
+   * @returns {string} Previous id in sequence if it exists, null otherwise.
+   */
+  findPrev(id: string): string;
+}
+/**
+ * Interface for graph configuration.
+ * @interface GraphConfiguration
+ */
+export interface GraphConfiguration {
+  /**
+   * The maximum number of cached sequences left
+   * after uncache.
+   */
+  maxSequences: number;
+
+  /**
+   * The maximum number of unused cached images left
+   * after uncache.
+   */
+  maxUnusedImages: number;
+
+  /**
+   * The maximum number of unused pre-stored cached images left
+   * after uncache.
+   */
+  maxUnusedPreStoredImages: number;
+
+  /**
+   * The maximum number of unused cached tiles left
+   * after uncache.
+   */
+  maxUnusedTiles: number;
+}
+declare class EdgeCalculatorCoefficients {
+  sphericalPreferredDistance: number;
+  sphericalMotion: number;
+  sphericalSequencePenalty: number;
+  sphericalMergeCCPenalty: number;
+  stepPreferredDistance: number;
+  stepMotion: number;
+  stepRotation: number;
+  stepSequencePenalty: number;
+  stepMergeCCPenalty: number;
+  similarDistance: number;
+  similarRotation: number;
+  turnDistance: number;
+  turnMotion: number;
+  turnSequencePenalty: number;
+  turnMergeCCPenalty: number;
+  constructor(): this;
+}
+declare interface SphericalDirection {
+  direction: $Values<typeof NavigationDirection>;
+  prev: $Values<typeof NavigationDirection>;
+  next: $Values<typeof NavigationDirection>;
+  directionChange: number;
+}
+declare interface StepDirection {
+  direction: $Values<typeof NavigationDirection>;
+  motionChange: number;
+  useFallback: boolean;
+}
+declare interface TurnDirection {
+  direction: $Values<typeof NavigationDirection>;
+  directionChange: number;
+  motionChange?: number;
+}
+declare class EdgeCalculatorDirections {
+  steps: {
+    [direction: string]: StepDirection,
+    ...
+  };
+  turns: {
+    [direction: string]: TurnDirection,
+    ...
+  };
+  spherical: {
+    [direction: string]: SphericalDirection,
+    ...
+  };
+  constructor(): this;
+}
+declare class EdgeCalculatorSettings {
+  sphericalMinDistance: number;
+  sphericalMaxDistance: number;
+  sphericalPreferredDistance: number;
+  sphericalMaxItems: number;
+  sphericalMaxStepTurnChange: number;
+  rotationMaxDistance: number;
+  rotationMaxDirectionChange: number;
+  rotationMaxVerticalDirectionChange: number;
+  similarMaxDirectionChange: number;
+  similarMaxDistance: number;
+  similarMinTimeDifference: number;
+  stepMaxDistance: number;
+  stepMaxDirectionChange: number;
+  stepMaxDrift: number;
+  stepPreferredDistance: number;
+  turnMaxDistance: number;
+  turnMaxDirectionChange: number;
+  turnMaxRigDistance: number;
+  turnMinRigDirectionChange: number;
+  constructor(): this;
+  maxDistance: number;
+}
+/**
+ * Interface that describes the properties for a image that is the destination of a
+ * potential edge from an origin image.
+ * @interface PotentialEdge
+ */
+declare interface PotentialEdge {
+  /**
+   * Timestamp when the image was captured.
+   * @property {number} capturedAt
+   */
+  capturedAt: number;
+
+  /**
+   * Change in viewing direction with respect to the origin image.
+   * @property {number} directionChange
+   */
+  directionChange: number;
+
+  /**
+   * Distance to the origin image.
+   * @property {number} distance
+   */
+  distance: number;
+
+  /**
+   * Determines if the destination image is spherical.
+   * @property {boolean} spherical
+   */
+  spherical: boolean;
+
+  /**
+   * Unique image id.
+   * @property {string} id
+   */
+  id: string;
+
+  /**
+   * Change in motion with respect to the viewing direction
+   * of the origin image.
+   * @property {number} motionChange
+   */
+  motionChange: number;
+
+  /**
+   * General camera rotation with respect to the origin image.
+   * @property {number} rotation
+   */
+  rotation: number;
+
+  /**
+   * Determines if the origin and destination image are considered
+   * to be in the same merge connected component.
+   * @property {boolean} sameMergeCC
+   */
+  sameMergeCC: boolean;
+
+  /**
+   * Determines if the origin and destination image are in the
+   * same sequence.
+   * @property {boolean} sameSequence
+   */
+  sameSequence: boolean;
+
+  /**
+   * Determines if the origin and destination image have been captured
+   * by the same user.
+   * @property {boolean} sameUser
+   */
+  sameUser: boolean;
+
+  /**
+   * Determines which sequence the destination image of the potential edge
+   * belongs to.
+   * @property {string} sequenceId
+   */
+  sequenceId: string;
+
+  /**
+   * Change in viewing direction with respect to the XY-plane.
+   * @property {number} verticalDirectionChange
+   */
+  verticalDirectionChange: number;
+
+  /**
+   * The angle between motion vector and the XY-plane
+   * @property {number} verticalMotion
+   */
+  verticalMotion: number;
+
+  /**
+   * The counter clockwise horizontal rotation angle from
+   * the X-axis in a spherical coordiante system.
+   * @property {number} worldMotionAzimuth
+   */
+  worldMotionAzimuth: number;
+}
+/**
+ * @class EdgeCalculator
+ * @classdesc Represents a class for calculating node edges.
+ */
+declare class EdgeCalculator {
+  /**
+   * Create a new edge calculator instance.
+   * @param {EdgeCalculatorSettings} settings - Settings struct.
+   * @param {EdgeCalculatorDirections} directions - Directions struct.
+   * @param {EdgeCalculatorCoefficients} coefficients - Coefficients struct.
+   */
+  constructor(
+    settings?: EdgeCalculatorSettings,
+    directions?: EdgeCalculatorDirections,
+    coefficients?: EdgeCalculatorCoefficients
+  ): this;
+
+  /**
+   * Returns the potential edges to destination nodes for a set
+   * of nodes with respect to a source node.
+   * @param {Image} node - Source node.
+   * @param {Array<Image>} nodes - Potential destination nodes.
+   * @param {Array<string>} fallbackIds - Ids for destination nodes
+   * that should be returned even if they do not meet the
+   * criteria for a potential edge.
+   * @throws {ArgumentMapillaryError} If node is not full.
+   */
+  getPotentialEdges(
+    node: Image,
+    potentialImages: Image[],
+    fallbackIds: string[]
+  ): PotentialEdge[];
+
+  /**
+   * Computes the sequence edges for a node.
+   * @param {Image} node - Source node.
+   * @throws {ArgumentMapillaryError} If node is not full.
+   */
+  computeSequenceEdges(node: Image, sequence: Sequence): NavigationEdge[];
+
+  /**
+   * Computes the similar edges for a node.
+   * @description Similar edges for perspective images
+   * look roughly in the same direction and are positioned closed to the node.
+   * Similar edges for spherical only target other spherical.
+   * @param {Image} node - Source node.
+   * @param {Array<PotentialEdge>} potentialEdges - Potential edges.
+   * @throws {ArgumentMapillaryError} If node is not full.
+   */
+  computeSimilarEdges(
+    node: Image,
+    potentialEdges: PotentialEdge[]
+  ): NavigationEdge[];
+
+  /**
+   * Computes the step edges for a perspective node.
+   * @description Step edge targets can only be other perspective nodes.
+   * Returns an empty array for spherical.
+   * @param {Image} node - Source node.
+   * @param {Array<PotentialEdge>} potentialEdges - Potential edges.
+   * @param {string} prevId - Id of previous node in sequence.
+   * @param {string} nextId - Id of next node in sequence.
+   * @throws {ArgumentMapillaryError} If node is not full.
+   */
+  computeStepEdges(
+    node: Image,
+    potentialEdges: PotentialEdge[],
+    prevId: string,
+    nextId: string
+  ): NavigationEdge[];
+
+  /**
+   * Computes the turn edges for a perspective node.
+   * @description Turn edge targets can only be other perspective images.
+   * Returns an empty array for spherical.
+   * @param {Image} node - Source node.
+   * @param {Array<PotentialEdge>} potentialEdges - Potential edges.
+   * @throws {ArgumentMapillaryError} If node is not full.
+   */
+  computeTurnEdges(
+    node: Image,
+    potentialEdges: PotentialEdge[]
+  ): NavigationEdge[];
+
+  /**
+   * Computes the spherical edges for a perspective node.
+   * @description Perspective to spherical edge targets can only be
+   * spherical nodes. Returns an empty array for spherical.
+   * @param {Image} node - Source node.
+   * @param {Array<PotentialEdge>} potentialEdges - Potential edges.
+   * @throws {ArgumentMapillaryError} If node is not full.
+   */
+  computePerspectiveToSphericalEdges(
+    node: Image,
+    potentialEdges: PotentialEdge[]
+  ): NavigationEdge[];
+
+  /**
+   * Computes the spherical and step edges for a spherical node.
+   * @description Spherical to spherical edge targets can only be
+   * spherical nodes. spherical to step edge targets can only be perspective
+   * nodes.
+   * @param {Image} node - Source node.
+   * @param {Array<PotentialEdge>} potentialEdges - Potential edges.
+   * @throws {ArgumentMapillaryError} If node is not full.
+   */
+  computeSphericalEdges(
+    node: Image,
+    potentialEdges: PotentialEdge[]
+  ): NavigationEdge[];
+}
+/**
+ * @class API
+ * @classdesc Provides methods for access to the API.
+ */
+declare class APIWrapper {
+  constructor(_data: IDataProvider): this;
+  data: IDataProvider;
+  setAccessToken(accessToken?: string): void;
+}
+/**
+ * @class Graph
+ * @classdesc Represents a graph of nodes with edges.
+ */
+declare class Graph {
+  /**
+   * Create a new graph instance.
+   * @param {APIWrapper} [api] - API instance for retrieving data.
+   * @param {rbush.RBush<NodeIndexItem>} [nodeIndex] - Node index for fast spatial retreival.
+   * @param {GraphCalculator} [graphCalculator] - Instance for graph calculations.
+   * @param {EdgeCalculator} [edgeCalculator] - Instance for edge calculations.
+   * @param {FilterCreator} [filterCreator] - Instance for  filter creation.
+   * @param {GraphConfiguration} [configuration] - Configuration struct.
+   */
+  constructor(
+    api: APIWrapper,
+    nodeIndex?: mixed,
+    graphCalculator?: GraphCalculator,
+    edgeCalculator?: EdgeCalculator,
+    filterCreator?: FilterCreator,
+    configuration?: GraphConfiguration
+  ): this;
+  static register(spatialIndex: (...args: mixed[]) => mixed): void;
+
+  /**
+   * Get api.
+   * @returns {APIWrapper} The API instance used by
+   * the graph.
+   */
+  api: APIWrapper;
+
+  /**
+   * Cache sequence edges for a node.
+   * @param {string} key - Key of node.
+   * @throws {GraphMapillaryError} When the operation is not valid on the
+   * current graph.
+   */
+  cacheSequenceEdges(key: string): void;
+
+  /**
+   * Cache spatial edges for a node.
+   * @param {string} key - Key of node.
+   * @throws {GraphMapillaryError} When the operation is not valid on the
+   * current graph.
+   */
+  cacheSpatialEdges(key: string): void;
+
+  /**
+   * Initialize the cache for a node.
+   * @param {string} key - Key of node.
+   * @throws {GraphMapillaryError} When the operation is not valid on the
+   * current graph.
+   */
+  initializeCache(key: string): void;
+
+  /**
+   * Get a value indicating if the graph is fill caching a node.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if the node is being fill cached.
+   */
+  isCachingFill(key: string): boolean;
+
+  /**
+   * Get a value indicating if the graph is fully caching a node.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if the node is being fully cached.
+   */
+  isCachingFull(key: string): boolean;
+
+  /**
+   * Get a value indicating if the graph is caching a sequence of a node.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if the sequence of a node is
+   * being cached.
+   */
+  isCachingNodeSequence(key: string): boolean;
+
+  /**
+   * Get a value indicating if the graph is caching a sequence.
+   * @param {string} sequenceKey - Key of sequence.
+   * @returns {boolean} Value indicating if the sequence is
+   * being cached.
+   */
+  isCachingSequence(sequenceKey: string): boolean;
+
+  /**
+   * Get a value indicating if the graph is caching sequence nodes.
+   * @param {string} sequenceKey - Key of sequence.
+   * @returns {boolean} Value indicating if the sequence nodes are
+   * being cached.
+   */
+  isCachingSequenceNodes(sequenceKey: string): boolean;
+
+  /**
+   * Get a value indicating if the graph is caching the tiles
+   * required for calculating spatial edges of a node.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if the tiles of
+   * a node are being cached.
+   */
+  isCachingTiles(key: string): boolean;
+
+  /**
+   * Get a value indicating if the cache has been initialized
+   * for a node.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if the cache has been
+   * initialized for a node.
+   */
+  hasInitializedCache(key: string): boolean;
+
+  /**
+   * Get a value indicating if a node exist in the graph.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if a node exist in the graph.
+   */
+  hasNode(key: string): boolean;
+
+  /**
+   * Get a value indicating if a node sequence exist in the graph.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if a node sequence exist
+   * in the graph.
+   */
+  hasNodeSequence(key: string): boolean;
+
+  /**
+   * Get a value indicating if a sequence exist in the graph.
+   * @param {string} sequenceKey - Key of sequence.
+   * @returns {boolean} Value indicating if a sequence exist
+   * in the graph.
+   */
+  hasSequence(sequenceKey: string): boolean;
+
+  /**
+   * Get a value indicating if sequence nodes has been cached in the graph.
+   * @param {string} sequenceKey - Key of sequence.
+   * @returns {boolean} Value indicating if a sequence nodes has been
+   * cached in the graph.
+   */
+  hasSequenceNodes(sequenceKey: string): boolean;
+
+  /**
+   * Get a value indicating if the graph has fully cached
+   * all nodes in the spatial area of a node.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if the spatial area
+   * of a node has been cached.
+   */
+  hasSpatialArea(key: string): boolean;
+
+  /**
+   * Get a value indicating if the graph has a tiles required
+   * for a node.
+   * @param {string} key - Key of node.
+   * @returns {boolean} Value indicating if the the tiles required
+   * by a node has been cached.
+   */
+  hasTiles(key: string): boolean;
+
+  /**
+   * Get a node.
+   * @param {string} key - Key of node.
+   * @returns {Image} Retrieved node.
+   */
+  getNode(key: string): Image;
+
+  /**
+   * Get a sequence.
+   * @param {string} sequenceKey - Key of sequence.
+   * @returns {Image} Retrieved sequence.
+   */
+  getSequence(sequenceKey: string): Sequence;
+
+  /**
+   * Reset all spatial edges of the graph nodes.
+   */
+  resetSpatialEdges(): void;
+
+  /**
+   * Reset the complete graph but keep the nodes corresponding
+   * to the supplied keys. All other nodes will be disposed.
+   * @param {Array<string>} keepKeys - Keys for nodes to keep
+   * in graph after reset.
+   */
+  reset(keepKeys: string[]): void;
+
+  /**
+   * Set the spatial node filter.
+   * @emits [object Object],[object Object],[object Object]
+   * @param {FilterExpression} filter - Filter expression to be applied
+   * when calculating spatial edges.
+   */
+  setFilter(filter: FilterExpression): void;
+
+  /**
+   * Uncache the graph according to the graph configuration.
+   * @description Uncaches unused tiles, unused nodes and
+   * sequences according to the numbers specified in the
+   * graph configuration. Sequences does not have a direct
+   * reference to either tiles or nodes and may be uncached
+   * even if they are related to the nodes that should be kept.
+   * @param {Array<string>} keepIds - Ids of nodes to keep in
+   * graph unrelated to last access. Tiles related to those keys
+   * will also be kept in graph.
+   * @param {Array<string>} keepCellIds - Ids of cells to keep in
+   * graph unrelated to last access. The nodes of the cells may
+   * still be uncached if not specified in the keep ids param
+   * but are guaranteed to not be disposed.
+   * @param {string} keepSequenceId - Optional id of sequence
+   * for which the belonging nodes should not be disposed or
+   * removed from the graph. These nodes may still be uncached if
+   * not specified in keep ids param but are guaranteed to not
+   * be disposed.
+   */
+  uncache(
+    keepIds: string[],
+    keepCellIds: string[],
+    keepSequenceId?: string
+  ): void;
+
+  /**
+   * Unsubscribes all subscriptions.
+   * @description Afterwards, you must not call any other methods
+   * on the graph instance.
+   */
+  unsubscribe(): void;
+}
+/**
+ * Enumeration for graph modes.
+ * @enum {number} *
+ * @readonly
+ * @description Modes for the retrieval and caching performed
+ * by the graph service on the graph.
+ */
+
+declare var GraphMode: {|
+  +Sequence: 0, // 0
+  +Spatial: 1, // 1
+|};
+
+/**
+ * @class GraphService
+ * @classdesc Represents a service for graph operations.
+ */
+declare class GraphService {
+  /**
+   * Create a new graph service instance.
+   * @param {Graph} graph - Graph instance to be operated on.
+   */
+  constructor(graph: Graph): this;
+
+  /**
+   * Dispose the graph service and its children.
+   */
+  dispose(): void;
+
+  /**
+ * Set the graph mode.
+ * @description If graph mode is set to spatial, caching
+ * is performed with emphasis on spatial edges. If graph
+ * mode is set to sequence no tile data is requested and
+ * no spatial edges are computed.
+ *
+ * When setting graph mode to sequence all spatial
+ * subscriptions are aborted.
+ * @param {$Values<
+                typeof
+                GraphMode>} mode - Graph mode to set.
+ */
+  setGraphMode(mode: $Values<typeof GraphMode>): void;
+}
+
+declare interface CacheServiceConfiguration {
+  cellDepth: number;
+}
+declare class CacheService {
+  constructor(
+    _graphService: GraphService,
+    _stateService: StateService,
+    _api: APIWrapper
+  ): this;
+  started: boolean;
+  configure(configuration?: CacheServiceConfiguration): void;
+  start(): void;
+  stop(): void;
+}
+declare class LoadingService {
+  constructor(): this;
+  startLoading(task: string): void;
+  stopLoading(task: string): void;
+}
+/**
+ * @class Spatial
+ * @classdesc Provides methods for scalar, vector and matrix calculations.
+ */
+declare class Spatial {
+  /**
+   * Converts azimuthal phi rotation (counter-clockwise with origin on X-axis) to
+   * bearing (clockwise with origin at north or Y-axis).
+   * @param {number} phi - Azimuthal phi angle in radians.
+   * @returns {number} Bearing in radians.
+   */
+  azimuthalToBearing(phi: number): number;
+
+  /**
+   * Converts degrees to radians.
+   * @param {number} deg - Degrees.
+   * @returns {number} Radians.
+   */
+  degToRad(deg: number): number;
+
+  /**
+   * Converts radians to degrees.
+   * @param {number} rad - Radians.
+   * @returns {number} Degrees.
+   */
+  radToDeg(rad: number): number;
+
+  /**
+   * Wrap a number on the interval [min, max].
+   * @param {number} value - Value to wrap.
+   * @param {number} min - Lower endpoint of interval.
+   * @param {number} max - Upper endpoint of interval.
+   * @returns {number} The wrapped number.
+   */
+  wrap(value: number, min: number, max: number): number;
+
+  /**
+   * Wrap an angle on the interval [-Pi, Pi].
+   * @param {number} angle - Value to wrap.
+   * @returns {number} Wrapped angle.
+   */
+  wrapAngle(angle: number): number;
+
+  /**
+   * Limit the value to the interval [min, max] by changing the value to
+   * the nearest available one when it is outside the interval.
+   * @param {number} value - Value to clamp.
+   * @param {number} min - Minimum of the interval.
+   * @param {number} max - Maximum of the interval.
+   * @returns {number} Clamped value.
+   */
+  clamp(value: number, min: number, max: number): number;
+
+  /**
+   * Calculates the counter-clockwise angle from the first
+   * vector (x1, y1)^T to the second (x2, y2)^T.
+   * @param {number} x1 - X coordinate of first vector.
+   * @param {number} y1 - Y coordinate of first vector.
+   * @param {number} x2 - X coordinate of second vector.
+   * @param {number} y2 - Y coordinate of second vector.
+   * @returns {number} Counter clockwise angle between the vectors.
+   */
+  angleBetweenVector2(x1: number, y1: number, x2: number, y2: number): number;
+
+  /**
+   * Calculates the minimum (absolute) angle change for rotation
+   * from one angle to another on the [-Pi, Pi] interval.
+   * @param {number} angle1 - Start angle.
+   * @param {number} angle2 - Destination angle.
+   * @returns {number} Absolute angle change between angles.
+   */
+  angleDifference(angle1: number, angle2: number): number;
+
+  /**
+   * Calculates the relative rotation angle between two
+   * angle-axis vectors.
+   * @param {number} rotation1 - First angle-axis vector.
+   * @param {number} rotation2 - Second angle-axis vector.
+   * @returns {number} Relative rotation angle.
+   */
+  relativeRotationAngle(rotation1: number[], rotation2: number[]): number;
+
+  /**
+   * Calculates the angle from a vector to a plane.
+   * @param {Array<number>} vector - The vector.
+   * @param {Array<number>} planeNormal - Normal of the plane.
+   * @returns {number} Angle from between plane and vector.
+   */
+  angleToPlane(vector: number[], planeNormal: number[]): number;
+  azimuthal(direction: number[], up: number[]): number;
+
+  /**
+   * Calculates the distance between two coordinates
+   * (longitude, latitude pairs) in meters according to
+   * the haversine formula.
+   * @param {number} lat1 - Latitude of the first coordinate in degrees.
+   * @param {number} lng1 - Longitude of the first coordinate in degrees.
+   * @param {number} lat2 - Latitude of the second coordinate in degrees.
+   * @param {number} lng2 - Longitude of the second coordinate in degrees.
+   * @returns {number} Distance between lat lon positions in meters.
+   */
+  distanceFromLngLat(
+    lng1: number,
+    lat1: number,
+    lng2: number,
+    lat2: number
+  ): number;
+}
+/**
+ * @class ViewportCoords
+ * @classdesc Provides methods for calculating 2D coordinate conversions
+ * as well as 3D projection and unprojection.
+ *
+ * Basic coordinates are 2D coordinates on the [0, 1] interval and
+ * have the origin point, (0, 0), at the top left corner and the
+ * maximum value, (1, 1), at the bottom right corner of the original
+ * image.
+ *
+ * Viewport coordinates are 2D coordinates on the [-1, 1] interval and
+ * have the origin point in the center. The bottom left corner point is
+ * (-1, -1) and the top right corner point is (1, 1).
+ *
+ * Canvas coordiantes are 2D pixel coordinates on the [0, canvasWidth] and
+ * [0, canvasHeight] intervals. The origin point (0, 0) is in the top left
+ * corner and the maximum value is (canvasWidth, canvasHeight) is in the
+ * bottom right corner.
+ *
+ * 3D coordinates are in the topocentric world reference frame.
+ */
+declare class ViewportCoords {
+  /**
+   * Convert basic coordinates to canvas coordinates.
+   * @description Transform origin and camera position needs to be the
+   * equal for reliable return value.
+   * @param {number} basicX - Basic X coordinate.
+   * @param {number} basicY - Basic Y coordinate.
+   * @param {HTMLElement} container - The viewer container.
+   * @param {Transform} transform - Transform of the image to unproject from.
+   * @param {THREE.Camera} camera - Camera used in rendering.
+   * @returns {Array<number>} 2D canvas coordinates.
+   */
+  basicToCanvas(
+    basicX: number,
+    basicY: number,
+    container: {
+      offsetHeight: number,
+      offsetWidth: number,
+      ...
+    },
+    transform: Transform
+  ): number[];
+
+  /**
+   * Convert basic coordinates to canvas coordinates safely. If 3D point is
+   * behind camera null will be returned.
+   * @description Transform origin and camera position needs to be the
+   * equal for reliable return value.
+   * @param {number} basicX - Basic X coordinate.
+   * @param {number} basicY - Basic Y coordinate.
+   * @param {HTMLElement} container - The viewer container.
+   * @param {Transform} transform - Transform of the image to unproject from.
+   * @param {THREE.Camera} camera - Camera used in rendering.
+   * @returns {Array<number>} 2D canvas coordinates if the basic point represents a 3D point
+   * in front of the camera, otherwise null.
+   */
+  basicToCanvasSafe(
+    basicX: number,
+    basicY: number,
+    container: {
+      offsetHeight: number,
+      offsetWidth: number,
+      ...
+    },
+    transform: Transform
+  ): number[];
+
+  /**
+   * Convert basic coordinates to viewport coordinates.
+   * @description Transform origin and camera position needs to be the
+   * equal for reliable return value.
+   * @param {number} basicX - Basic X coordinate.
+   * @param {number} basicY - Basic Y coordinate.
+   * @param {Transform} transform - Transform of the image to unproject from.
+   * @param {THREE.Camera} camera - Camera used in rendering.
+   * @returns {Array<number>} 2D viewport coordinates.
+   */
+  basicToViewport(
+    basicX: number,
+    basicY: number,
+    transform: Transform
+  ): number[];
+
+  /**
+   * Convert basic coordinates to viewport coordinates safely. If 3D point is
+   * behind camera null will be returned.
+   * @description Transform origin and camera position needs to be the
+   * equal for reliable return value.
+   * @param {number} basicX - Basic X coordinate.
+   * @param {number} basicY - Basic Y coordinate.
+   * @param {Transform} transform - Transform of the image to unproject from.
+   * @param {THREE.Camera} camera - Camera used in rendering.
+   * @returns {Array<number>} 2D viewport coordinates.
+   */
+  basicToViewportSafe(
+    basicX: number,
+    basicY: number,
+    transform: Transform
+  ): number[];
+
+  /**
+   * Get canvas pixel position from event.
+   * @param {Event} event - Event containing clientX and clientY properties.
+   * @param {HTMLElement} element - HTML element.
+   * @returns {Array<number>} 2D canvas coordinates.
+   */
+  canvasPosition(
+    event: {
+      clientX: number,
+      clientY: number,
+      ...
+    },
+    element: HTMLElement
+  ): number[];
+
+  /**
+   * Convert canvas coordinates to viewport coordinates.
+   * @param {number} canvasX - Canvas X coordinate.
+   * @param {number} canvasY - Canvas Y coordinate.
+   * @param {HTMLElement} container - The viewer container.
+   * @returns {Array<number>} 2D viewport coordinates.
+   */
+  canvasToViewport(
+    canvasX: number,
+    canvasY: number,
+    container: {
+      offsetHeight: number,
+      offsetWidth: number,
+      ...
+    }
+  ): number[];
+
+  /**
+   * Determines the width and height of the container in canvas coordinates.
+   * @param {HTMLElement} container - The viewer container.
+   * @returns {Array<number>} 2D canvas coordinates.
+   */
+  containerToCanvas(container: {
+    offsetHeight: number,
+    offsetWidth: number,
+    ...
+  }): number[];
+
+  /**
+   * Determine if an event occured inside an element.
+   * @param {Event} event - Event containing clientX and clientY properties.
+   * @param {HTMLElement} element - HTML element.
+   * @returns {boolean} Value indicating if the event occured inside the element or not.
+   */
+  insideElement(
+    event: {
+      clientX: number,
+      clientY: number,
+      ...
+    },
+    element: HTMLElement
+  ): boolean;
+
+  /**
+   * Convert viewport coordinates to canvas coordinates.
+   * @param {number} viewportX - Viewport X coordinate.
+   * @param {number} viewportY - Viewport Y coordinate.
+   * @param {HTMLElement} container - The viewer container.
+   * @returns {Array<number>} 2D canvas coordinates.
+   */
+  viewportToCanvas(
+    viewportX: number,
+    viewportY: number,
+    container: {
+      offsetHeight: number,
+      offsetWidth: number,
+      ...
+    }
+  ): number[];
+}
+declare class PanService {
+  constructor(
+    graphService: GraphService,
+    stateService: StateService,
+    enabled?: boolean,
+    graphCalculator?: GraphCalculator,
+    spatial?: Spatial,
+    viewportCoords?: ViewportCoords
+  ): this;
+  dispose(): void;
+  enable(): void;
+  disable(): void;
+  start(): void;
+  stop(): void;
+}
+declare class PlayService {
+  static +sequenceSpeed: number;
+  constructor(graphService: GraphService, stateService: StateService): this;
+  playing: boolean;
+  play(): void;
+  dispose(): void;
+  setDirection(direction: $Values<typeof NavigationDirection>): void;
+  setSpeed(speed: number): void;
+  stop(): void;
+}
+declare class Navigator {
+  constructor(
+    options: ViewerOptions,
+    api?: APIWrapper,
+    graphService?: GraphService,
+    loadingService?: LoadingService,
+    stateService?: StateService,
+    cacheService?: CacheService,
+    playService?: PlayService,
+    panService?: PanService
+  ): this;
+  api: APIWrapper;
+  cacheService: CacheService;
+  graphService: GraphService;
+  loadingService: LoadingService;
+  panService: PanService;
+  playService: PlayService;
+  stateService: StateService;
+  dispose(): void;
+}
+declare class SubscriptionHolder {
+  unsubscribe(): void;
+}
+export interface IComponent {
+  /**
+   * Value indicating if the component is currently active.
+   */
+  +activated: boolean;
+
+  /**
+   * Default configuration for the component.
+   */
+  +defaultConfiguration: ComponentConfiguration;
+
+  /**
+   * The name of the component. Used when interacting with the
+   * component through the Viewer's API.
+   */
+  +name: string;
+
+  /**
+   * Configure the component.
+   */
+  configure(configuration: ComponentConfiguration): void;
+}
+/**
+ * @event
+ */
+export type ComponentEventType =
+  | "geometrycreate"
+  | "hover"
+  | "markerdragend"
+  | "markerdragstart"
+  | "markerposition"
+  | "playing"
+  | "tagcreateend"
+  | "tagcreatestart"
+  | "tagmode"
+  | "tags";
+declare class Component<TConfiguration: ComponentConfiguration>
+  implements IEventEmitter, IComponent
+{
+  static componentName: string;
+  _activated: boolean;
+  _container: Container;
+  _name: string;
+  _navigator: Navigator;
+  +_subscriptions: SubscriptionHolder;
+  constructor(name: string, container: Container, navigator: Navigator): this;
+
+  /**
+   * Get activated.
+   * @returns {boolean} Value indicating if the component is
+   * currently active.
+   */
+  activated: boolean;
+
+  /**
+   * Get default configuration.
+   * @returns {TConfiguration} Default configuration for component.
+   */
+  defaultConfiguration: TConfiguration;
+
+  /**
+   * Get name.
+   * @description The name of the component. Used when interacting with the
+   * component through the Viewer's API.
+   */
+  name: string;
+
+  /**
+   * @ignore
+   */
+  activate(conf?: TConfiguration): void;
+
+  /**
+   * Configure the component.
+   * @param configuration Component configuration.
+   */
+  configure(configuration: ComponentConfiguration): void;
+
+  /**
+   * @ignore
+   */
+  deactivate(): void;
+
+  /**
+   * @inheritdoc
+   */
+  fire<T>(type: string, event: T): void;
+
+  /**
+   * @inheritdoc
+   */
+  off<T>(type: string, handler: (event: T) => void): void;
+
+  /**
+   * @inheritdoc
+   */
+  on<T>(type: string, handler: (event: T) => void): void;
+
+  /**
+   * Detect the viewer's new width and height and resize the component's
+   * rendered elements accordingly if applicable.
+   * @ignore
+   */
+  resize(): void;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): TConfiguration;
+}
+/**
+ * @class BearingComponent
+ * @classdesc Component for indicating bearing and field of view.
+ * @example ```js
+ * var viewer = new Viewer({ ... });
+ * var bearingComponent = viewer.getComponent("bearing");
+ * bearingComponent.configure({ size: ComponentSize.Small });
+ * ```
+ */
+declare class BearingComponent extends Component<BearingConfiguration> {
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(name: string, container: Container, navigator: Navigator): this;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): BearingConfiguration;
+}
+declare class CacheComponent extends Component<CacheConfiguration> {
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(name: string, container: Container, navigator: Navigator): this;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): CacheConfiguration;
+}
+/**
+ * Interface for general component events.
+ */
+export interface ComponentEvent {
+  /**
+   * The component object that fired the event.
+   */
+  target: IComponent;
+
+  /**
+   * The event type.
+   */
+  type: ComponentEventType;
+}
+/**
+ * Interface for component hover events.
+ */
+export type ComponentHoverEvent = {
+  /**
+   * The image id corresponding to the element or object that
+   * is being hovered. When the mouse leaves the element or
+   * object the id will be null.
+   */
+  id: string,
+  type: "hover",
+  ...
+} & ComponentEvent;
+
+/**
+ * @class Geometry
+ * @abstract
+ * @classdesc Represents a geometry.
+ */
+declare class Geometry {
+  /**
+   * Create a geometry.
+   * @constructor
+   * @ignore
+   */
+  constructor(): this;
+
+  /**
+   * Get the 2D basic coordinates for the centroid of the geometry.
+   * @returns {Array<number>} 2D basic coordinates representing the centroid.
+   * @ignore
+   */
+  getCentroid2d(): number[];
+
+  /**
+   * Get the 3D world coordinates for the centroid of the geometry.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @returns {Array<number>} 3D world coordinates representing the centroid.
+   * @ignore
+   */
+  getCentroid3d(transform: Transform): number[];
+
+  /**
+   * Set the 2D centroid of the geometry.
+   * @param {Array<number>} value - The new value of the centroid in basic coordinates.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @ignore
+   */
+  setCentroid2d(value: number[], transform: Transform): void;
+}
+/**
+ * Interface for component geometry events.
+ */
+export type ComponentGeometryEvent = {
+  /**
+   * Geometry related to the event.
+   */
+  geometry: Geometry,
+  type: "geometrycreate",
+  ...
+} & ComponentEvent;
+
+/**
+ * @class Marker
+ * @classdesc Represents an abstract marker class that should be extended
+ * by marker implementations used in the marker component.
+ */
+declare class Marker {
+  constructor(id: string, lngLat: LngLat): this;
+
+  /**
+   * Get id.
+   * @returns {string} The id of the marker.
+   */
+  id: string;
+
+  /**
+   * Get lngLat.
+   * @returns {LngLat} The geographic coordinates of the marker.
+   */
+  lngLat: LngLat;
+
+  /**
+   * @ignore
+   */
+  createGeometry(position: number[]): void;
+
+  /**
+   * @ignore
+   */
+  disposeGeometry(): void;
+
+  /**
+   * @ignore
+   */
+  lerpAltitude(alt: number, alpha: number): void;
+
+  /**
+   * @ignore
+   */
+  updatePosition(position: number[], lngLat?: LngLat): void;
+  _createGeometry(position: number[]): void;
+  _disposeGeometry(): void;
+}
+/**
+ * Interface for component marker events.
+ */
+export type ComponentMarkerEvent = {
+  /**
+   * The marker that was affected by the event.
+   */
+  marker: Marker,
+  type: "markerdragend" | "markerdragstart" | "markerposition",
+  ...
+} & ComponentEvent;
+
+/**
+ * Interface for component play events.
+ */
+export type ComponentPlayEvent = {
+  /**
+   * Value indiciating if the component is playing or not.
+   */
+  playing: boolean,
+  type: "playing",
+  ...
+} & ComponentEvent;
+
+/**
+ * Interface for component state events.
+ * @example ```js
+ * // The `hover` event is an example of a `ComponentStateEvent`.
+ * // Set up an event listener on the direction component.
+ * var directionComponent = viewer.getComponent('direction');
+ * directionComponent.on('hover', function(e) {
+ *   console.log('A hover event has occured');
+ * });
+ * ```
+ */
+export type ComponentStateEvent = {
+  type: "tagcreateend" | "tagcreatestart" | "tags",
+  ...
+} & ComponentEvent;
+
+/**
+ * Interface for component tag mode events.
+ */
+export type ComponentTagModeEvent = {
+  /**
+   * Value indicating the current tag mode of the component.
+   */
+  mode: $Values<typeof TagMode>,
+  type: "tagmode",
+  ...
+} & ComponentEvent;
+
+/**
+ * @class DirectionDOMRenderer
+ * @classdesc DOM renderer for direction arrows.
+ */
+declare class DirectionDOMRenderer {
+  constructor(configuration: DirectionConfiguration, size: ViewportSize): this;
+
+  /**
+   * Get needs render.
+   * @returns {boolean} Value indicating whether render should be called.
+   */
+  needsRender: boolean;
+
+  /**
+   * Renders virtual DOM elements.
+   * @description Calling render resets the needs render property.
+   */
+  setEdges(edgeStatus: NavigationEdgeStatus, sequence: Sequence): void;
+
+  /**
+   * Set image for which to show edges.
+   * @param {Image} image
+   */
+  setImage(image: Image): void;
+
+  /**
+   * Set the render camera to use for calculating rotations.
+   * @param {RenderCamera} renderCamera
+   */
+  setRenderCamera(renderCamera: RenderCamera): void;
+
+  /**
+   * Set configuration values.
+   * @param {DirectionConfiguration} configuration
+   */
+  setConfiguration(configuration: DirectionConfiguration): void;
+
+  /**
+   * Detect the element's width and height and resize
+   * elements accordingly.
+   * @param {ViewportSize} size Size of vßiewer container element.
+   */
+  resize(size: ViewportSize): void;
+}
+/**
+ * @class DirectionComponent
+ * @classdesc Component showing navigation arrows for steps and turns.
+ */
+declare class DirectionComponent extends Component<DirectionConfiguration> {
+  /**
+   * @inheritdoc
+   */
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(
+    name: string,
+    container: Container,
+    navigator: Navigator,
+    directionDOMRenderer?: DirectionDOMRenderer
+  ): this;
+
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): DirectionConfiguration;
+}
+declare class HandlerBase<TConfiguration: ComponentConfiguration> {
+  _component: Component<TConfiguration>;
+  _container: Container;
+  _navigator: Navigator;
+  _enabled: boolean;
+
+  /**
+   * @ignore
+   */
+  constructor(
+    component: Component<TConfiguration>,
+    container: Container,
+    navigator: Navigator
+  ): this;
+
+  /**
+   * Returns a Boolean indicating whether the interaction is enabled.
+   * @returns {boolean} `true` if the interaction is enabled.
+   */
+  isEnabled: boolean;
+
+  /**
+   * Enables the interaction.
+   * @example ```js
+   * <component-name>.<handler-name>.enable();
+   * ```
+   */
+  enable(): void;
+
+  /**
+   * Disables the interaction.
+   * @example ```js
+   * <component-name>.<handler-name>.disable();
+   * ```
+   */
+  disable(): void;
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): TConfiguration;
+}
+/**
+ * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the
+ * following key commands:
+ *
+ * `ALT` + `Up Arrow`: Navigate to next image in the sequence.
+ * `ALT` + `Down Arrow`: Navigate to previous image in sequence.
+ * @example ```js
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keySequenceNavigation.disable();
+ * keyboardComponent.keySequenceNavigation.enable();
+ *
+ * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;
+ * ```
+ */
+declare class KeySequenceNavigationHandler
+  extends HandlerBase<KeyboardConfiguration>
+{
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): KeyboardConfiguration;
+}
+/**
+ * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the
+ * following key commands:
+ *
+ * `Up Arrow`: Step forward.
+ * `Down Arrow`: Step backward.
+ * `Left Arrow`: Step to the left.
+ * `Rigth Arrow`: Step to the right.
+ * `SHIFT` + `Down Arrow`: Turn around.
+ * `SHIFT` + `Left Arrow`: Turn to the left.
+ * `SHIFT` + `Rigth Arrow`: Turn to the right.
+ * @example ```js
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keySpatialNavigation.disable();
+ * keyboardComponent.keySpatialNavigation.enable();
+ *
+ * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;
+ * ```
+ */
+declare class KeySpatialNavigationHandler
+  extends HandlerBase<KeyboardConfiguration>
+{
+  /**
+   * @ignore
+   */
+  constructor(
+    component: Component<KeyboardConfiguration>,
+    container: Container,
+    navigator: Navigator,
+    spatial: Spatial
+  ): this;
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): KeyboardConfiguration;
+}
+/**
+ * The `KeyZoomHandler` allows the user to zoom in and out using the
+ * following key commands:
+ *
+ * `+`: Zoom in.
+ * `-`: Zoom out.
+ * @example ```js
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keyZoom.disable();
+ * keyboardComponent.keyZoom.enable();
+ *
+ * var isEnabled = keyboardComponent.keyZoom.isEnabled;
+ * ```
+ */
+declare class KeyZoomHandler extends HandlerBase<KeyboardConfiguration> {
+  /**
+   * @ignore
+   */
+  constructor(
+    component: Component<KeyboardConfiguration>,
+    container: Container,
+    navigator: Navigator,
+    viewportCoords: ViewportCoords
+  ): this;
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): KeyboardConfiguration;
+}
+/**
+ * The `KeyPlayHandler` allows the user to control the play behavior
+ * using the following key commands:
+ *
+ * `Spacebar`: Start or stop playing.
+ * `SHIFT` + `D`: Switch direction.
+ * `<`: Decrease speed.
+ * `>`: Increase speed.
+ * @example ```js
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keyPlay.disable();
+ * keyboardComponent.keyPlay.enable();
+ *
+ * var isEnabled = keyboardComponent.keyPlay.isEnabled;
+ * ```
+ */
+declare class KeyPlayHandler extends HandlerBase<KeyboardConfiguration> {
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): KeyboardConfiguration;
+}
+/**
+ * @class KeyboardComponent
+ * @classdesc Component for keyboard event handling.
+ *
+ * To retrive and use the keyboard component
+ * @example ```js
+ * var viewer = new Viewer({ ... });
+ *
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ * ```
+ */
+declare class KeyboardComponent extends Component<KeyboardConfiguration> {
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(name: string, container: Container, navigator: Navigator): this;
+
+  /**
+   * Get key play.
+   * @returns {KeyPlayHandler} The key play handler.
+   */
+  keyPlay: KeyPlayHandler;
+
+  /**
+   * Get key sequence navigation.
+   * @returns {KeySequenceNavigationHandler} The key sequence navigation handler.
+   */
+  keySequenceNavigation: KeySequenceNavigationHandler;
+
+  /**
+   * Get spatial.
+   * @returns {KeySpatialNavigationHandler} The spatial handler.
+   */
+  keySpatialNavigation: KeySpatialNavigationHandler;
+
+  /**
+   * Get key zoom.
+   * @returns {KeyZoomHandler} The key zoom handler.
+   */
+  keyZoom: KeyZoomHandler;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): KeyboardConfiguration;
+}
+/**
+ * @interface CircleMarkerOptions
+ *
+ * Interface that represents the options for configuring a `CircleMarker`.
+ */
+export interface CircleMarkerOptions {
+  /**
+   * The color of the marker.
+   * @default "#fff"
+   */
+  color?: number | string;
+
+  /**
+   * The opacity of the marker.
+   * @default 0.4
+   */
+  opacity?: number;
+
+  /**
+   * The radius of the circle in meters.
+   * @default 1
+   */
+  radius?: number;
+}
+/**
+ * @class CircleMarker
+ * @classdesc Non-interactive marker with a flat circle shape. The circle
+ * marker can not be configured to be interactive.
+ *
+ * Circle marker properties can not be updated after creation.
+ *
+ * To create and add one `CircleMarker` with default configuration
+ * and one with configuration use
+ * @example ```js
+ * var defaultMarker = new CircleMarker(
+ *     "id-1",
+ *     { lat: 0, lng: 0, });
+ *
+ * var configuredMarker = new CircleMarker(
+ *     "id-2",
+ *     { lat: 0, lng: 0, },
+ *     {
+ *         color: "#0ff",
+ *         opacity: 0.3,
+ *         radius: 0.7,
+ *     });
+ *
+ * markerComponent.add([defaultMarker, configuredMarker]);
+ * ```
+ */
+declare class CircleMarker extends Marker {
+  constructor(id: string, lngLat: LngLat, options?: CircleMarkerOptions): this;
+  _createGeometry(position: number[]): void;
+  _disposeGeometry(): void;
+}
+/**
+ * @class MarkerComponent
+ * @classdesc Component for showing and editing 3D marker objects.
+ *
+ * The `add` method is used for adding new markers or replacing
+ * markers already in the set.
+ *
+ * If a marker already in the set has the same
+ * id as one of the markers added, the old marker will be removed and
+ * the added marker will take its place.
+ *
+ * It is not possible to update markers in the set by updating any properties
+ * directly on the marker object. Markers need to be replaced by
+ * re-adding them for updates to geographic position or configuration
+ * to be reflected.
+ *
+ * Markers added to the marker component can be either interactive
+ * or non-interactive. Different marker types define their behavior.
+ * Markers with interaction support can be configured with options
+ * to respond to dragging inside the viewer and be detected when
+ * retrieving markers from pixel points with the `getMarkerIdAt` method.
+ *
+ * To retrive and use the marker component
+ * @example ```js
+ * var viewer = new Viewer({ component: { marker: true }, ... });
+ *
+ * var markerComponent = viewer.getComponent("marker");
+ * ```
+ */
+declare class MarkerComponent extends Component<MarkerConfiguration> {
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(name: string, container: Container, navigator: Navigator): this;
+
+  /**
+   * Add markers to the marker set or replace markers in the marker set.
+   * @description If a marker already in the set has the same
+   * id as one of the markers added, the old marker will be removed
+   * the added marker will take its place.
+   *
+   * Any marker inside the visible bounding bbox
+   * will be initialized and placed in the viewer.
+   * @param {Array<Marker>} markers - Markers to add.
+   * @example ```js
+   * markerComponent.add([marker1, marker2]);
+   * ```
+   */
+  add(markers: Marker[]): void;
+
+  /**
+   * Returns the marker in the marker set with the specified id, or
+   * undefined if the id matches no marker.
+   * @param {string} markerId - Id of the marker.
+   * @example ```js
+   * var marker = markerComponent.get("markerId");
+   * ```
+   */
+  get(markerId: string): Marker;
+
+  /**
+   * Returns an array of all markers.
+   * @example ```js
+   * var markers = markerComponent.getAll();
+   * ```
+   */
+  getAll(): Marker[];
+
+  /**
+   * Returns the id of the interactive marker closest to the current camera
+   * position at the specified point.
+   * @description Notice that the pixelPoint argument requires x, y
+   * coordinates from pixel space.
+   *
+   * With this function, you can use the coordinates provided by mouse
+   * events to get information out of the marker component.
+   *
+   * If no interactive geometry of an interactive marker exist at the pixel
+   * point, `null` will be returned.
+   * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
+   * @returns {string} Id of the interactive marker closest to the camera. If no
+   * interactive marker exist at the pixel point, `null` will be returned.
+   * @example ```js
+   * markerComponent.getMarkerIdAt([100, 100])
+   *     .then((markerId) => { console.log(markerId); });
+   * ```
+   */
+  getMarkerIdAt(pixelPoint: number[]): Promise<string>;
+
+  /**
+   * Check if a marker exist in the marker set.
+   * @param {string} markerId - Id of the marker.
+   * @example ```js
+   * var markerExists = markerComponent.has("markerId");
+   * ```
+   */
+  has(markerId: string): boolean;
+
+  /**
+   * Remove markers with the specified ids from the marker set.
+   * @param {Array<string>} markerIds - Ids for markers to remove.
+   * @example ```js
+   * markerComponent.remove(["id-1", "id-2"]);
+   * ```
+   */
+  remove(markerIds: string[]): void;
+
+  /**
+   * Remove all markers from the marker set.
+   * @example ```js
+   * markerComponent.removeAll();
+   * ```
+   */
+  removeAll(): void;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): MarkerConfiguration;
+}
+/**
+ * @interface SimpleMarkerOptions
+ *
+ * Interface that represents the options for configuring a `SimpleMarker`.
+ */
+export interface SimpleMarkerOptions {
+  /**
+   * The color of the ball inside the marker.
+   * @default "#f00"
+   */
+  ballColor?: number | string;
+
+  /**
+   * The opacity of the ball inside the marker.
+   * @default 0.8
+   */
+  ballOpacity?: number;
+
+  /**
+   * The color of the ice creame shape.
+   * @default "#f00"
+   */
+  color?: number | string;
+
+  /**
+   * Value indicating if the marker should be interactive or not.
+   * @description If the marker is configured to be interactive
+   * it will be draggable in the viewer and retrievable with the
+   * `getMarkerIdAt` method on the `MarkerComponent`.
+   * @default false
+   */
+  interactive?: boolean;
+
+  /**
+   * The opacity of the ice creame shape.
+   * @default 0.4
+   */
+  opacity?: number;
+
+  /**
+   * The radius of the ice cream shape in meters.
+   * @default 1
+   */
+  radius?: number;
+}
+/**
+ * @class SimpleMarker
+ * @classdesc Interactive marker with ice cream shape. The sphere
+ * inside the ice cream can be configured to be interactive.
+ *
+ * Simple marker properties can not be updated after creation.
+ *
+ * To create and add one `SimpleMarker` with default configuration
+ * (non-interactive) and one interactive with configuration use
+ * @example ```js
+ * var defaultMarker = new SimpleMarker(
+ *     "id-1",
+ *     { lat: 0, lng: 0, });
+ *
+ * var interactiveMarker = new SimpleMarker(
+ *     "id-2",
+ *     { lat: 0, lng: 0, },
+ *     {
+ *         ballColor: "#00f",
+ *         ballOpacity: 0.5,
+ *         color: "#00f",
+ *         interactive: true,
+ *         opacity: 0.3,
+ *         radius: 0.7,
+ *     });
+ *
+ * markerComponent.add([defaultMarker, interactiveMarker]);
+ * ```
+ */
+declare class SimpleMarker extends Marker {
+  constructor(id: string, lngLat: LngLat, options?: SimpleMarkerOptions): this;
+  _createGeometry(position: number[]): void;
+  _disposeGeometry(): void;
+}
+/**
+ * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor.
+ * @example ```js
+ * var pointerComponent = viewer.getComponent("pointer");
+ *
+ * pointerComponent.dragPan.disable();
+ * pointerComponent.dragPan.enable();
+ *
+ * var isEnabled = pointerComponent.dragPan.isEnabled;
+ * ```
+ */
+declare class DragPanHandler extends HandlerBase<PointerConfiguration> {
+  /**
+   * @ignore
+   */
+  constructor(
+    component: Component<PointerConfiguration>,
+    container: Container,
+    navigator: Navigator,
+    viewportCoords: ViewportCoords,
+    spatial: Spatial
+  ): this;
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): PointerConfiguration;
+}
+declare class EarthControlHandler extends HandlerBase<PointerConfiguration> {
+  /**
+   * @ignore
+   */
+  constructor(
+    component: Component<PointerConfiguration>,
+    container: Container,
+    navigator: Navigator,
+    viewportCoords: ViewportCoords,
+    spatial: Spatial
+  ): this;
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(): PointerConfiguration;
+}
+/**
+ * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling.
+ * @example ```js
+ * var pointerComponent = viewer.getComponent("pointer");
+ *
+ * pointerComponent.scrollZoom.disable();
+ * pointerComponent.scrollZoom.enable();
+ *
+ * var isEnabled = pointerComponent.scrollZoom.isEnabled;
+ * ```
+ */
+declare class ScrollZoomHandler extends HandlerBase<PointerConfiguration> {
+  /**
+   * @ignore
+   */
+  constructor(
+    component: Component<PointerConfiguration>,
+    container: Container,
+    navigator: Navigator,
+    viewportCoords: ViewportCoords
+  ): this;
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): PointerConfiguration;
+}
+/**
+ * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen.
+ * @example ```js
+ * var pointerComponent = viewer.getComponent("pointer");
+ *
+ * pointerComponent.touchZoom.disable();
+ * pointerComponent.touchZoom.enable();
+ *
+ * var isEnabled = pointerComponent.touchZoom.isEnabled;
+ * ```
+ */
+declare class TouchZoomHandler extends HandlerBase<PointerConfiguration> {
+  /**
+   * @ignore
+   */
+  constructor(
+    component: Component<PointerConfiguration>,
+    container: Container,
+    navigator: Navigator,
+    viewportCoords: ViewportCoords
+  ): this;
+  _enable(): void;
+  _disable(): void;
+  _getConfiguration(enable: boolean): PointerConfiguration;
+}
+/**
+ * @class PointerComponent
+ * @classdesc Component handling mouse, pen, and touch events for camera movement.
+ *
+ * To retrive and use the mouse component
+ * @example ```js
+ * var viewer = new Viewer({ ... });
+ *
+ * var pointerComponent = viewer.getComponent("pointer");
+ * ```
+ */
+declare class PointerComponent extends Component<PointerConfiguration> {
+  /**
+   * @inheritdoc
+   */
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(name: string, container: Container, navigator: Navigator): this;
+
+  /**
+   * Get drag pan.
+   * @returns {DragPanHandler} The drag pan handler.
+   */
+  dragPan: DragPanHandler;
+
+  /**
+   * Get earth control.
+   * @returns {EarthControlHandler} The earth control handler.
+   */
+  earthControl: EarthControlHandler;
+
+  /**
+   * Get scroll zoom.
+   * @returns {ScrollZoomHandler} The scroll zoom handler.
+   */
+  scrollZoom: ScrollZoomHandler;
+
+  /**
+   * Get touch zoom.
+   * @returns {TouchZoomHandler} The touch zoom handler.
+   */
+  touchZoom: TouchZoomHandler;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): PointerConfiguration;
+}
+/**
+ * Interface for the popup offset with respect to its anchor point.
+ * @description An object of number arrays specifying an offset for
+ * each float direction. Negative offsets indicate left and up.
+ * @interface
+ * @example ```js
+ * var offset = = {
+ *     bottom: [0, 10],
+ *     bottomLeft: [-10, 10],
+ *     bottomRight: [10, 10],
+ *     center: [0, 0],
+ *     left: [-10, 0],
+ *     right: [10, 0],
+ *     top: [0, -10],
+ *     topLeft: [-10, -10],
+ *     topRight: [10, -10],
+ * }
+ *
+ * var popup = new Popup({ offset: offset });
+ * ```
+ */
+export interface PopupOffset {
+  bottom: number[];
+  bottomLeft: number[];
+  bottomRight: number[];
+  center: number[];
+  left: number[];
+  right: number[];
+  top: number[];
+  topLeft: number[];
+  topRight: number[];
+}
+/**
+ * Interface for the options that define behavior and
+ * appearance of a popup.
+ * @interface
+ */
+export interface PopupOptions {
+  /**
+   * Specify if the popup should capture pointer events.
+   * @description If the popup is specified to not capture
+   * pointer events the provided content can still override
+   * this behavior for the individual content HTML elements
+   * by specifying the appropriate CSS.
+   * @default true
+   */
+  capturePointer?: boolean;
+
+  /**
+   * Specify that the popup should not have any tooltip
+   * like visuals around the provided content.
+   * @default false
+   */
+  clean?: boolean;
+
+  /**
+   * The direction in which the popup floats with respect to the
+   * anchor point or points. If no value is supplied the popup
+   * will change float automatically based on the its position
+   * in the viewport so that as much of its area as possible is
+   * visible.
+   * @description For automatic floating (undefined) the popup
+   * will float in eight directions around a point or a position
+   * in a rect. When a rectangle is set without a position option
+   * specified, the popup will float outward from the rectangle
+   * center based on the side it is currently rendered in. The
+   * default floating direction is to the bottom for both points
+   * and rectangles.
+   * @default undefined
+   */
+  float?: $Values<typeof Alignment>;
+
+  /**
+   * A pixel offset applied to the popup's location specfied as:
+   *
+   * - A single number in pixels in the float direction that the popup
+   * will be translated with respect to the current anchor point.
+   *
+   * - An object of number arrays specifying an offset for
+   * each float direction. Negative offsets indicate left and up.
+   * @default 0
+   */
+  offset?: number | PopupOffset;
+
+  /**
+   * Opacity of the popup visuals.
+   * @default 1
+   */
+  opacity?: number;
+
+  /**
+   * The popup position in a rectangle (does not apply to points).
+   * When not set the popup will change position automatically
+   * based on the viewport so that as much of it as possible is
+   * visible.
+   * @default undefined
+   */
+  position?: $Values<typeof Alignment>;
+}
+/**
+ * @class Popup
+ * @classdesc [object Object],[object Object],[object Object]
+ * @example ```js
+ * var defaultSpan = document.createElement('span');
+ * defaultSpan.innerHTML = 'hello default';
+ *
+ * var defaultPopup = new Popup();
+ * defaultPopup.setDOMContent(defaultSpan);
+ * defaultPopup.setBasicPoint([0.3, 0.3]);
+ *
+ * var cleanSpan = document.createElement('span');
+ * cleanSpan.innerHTML = 'hello clean';
+ *
+ * var cleanPopup = new Popup({
+ *     clean: true,
+ *     float: Alignment.Top,
+ *     offset: 10,
+ *     opacity: 0.7,
+ * });
+ *
+ * cleanPopup.setDOMContent(cleanSpan);
+ * cleanPopup.setBasicPoint([0.6, 0.6]);
+ *
+ * popupComponent.add([defaultPopup, cleanPopup]);
+ * ```
+ * @description Implementation of API methods and API documentation inspired
+ * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js
+ */
+declare class Popup {
+  constructor(
+    options?: PopupOptions,
+    viewportCoords?: ViewportCoords,
+    dom?: DOM
+  ): this;
+
+  /**
+   * @description Internal method used by the component to
+   * remove all references to the popup.
+   * @ignore
+   */
+  remove(): void;
+
+  /**
+   * Sets a 2D basic image coordinates point to the popup's anchor, and
+   * moves the popup to it.
+   * @description Overwrites any previously set point or rect.
+   * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.
+   * @example ```js
+   * var popup = new Popup();
+   * popup.setText('hello image');
+   * popup.setBasicPoint([0.3, 0.3]);
+   *
+   * popupComponent.add([popup]);
+   * ```
+   */
+  setBasicPoint(basicPoint: number[]): void;
+
+  /**
+   * Sets a 2D basic image coordinates rect to the popup's anchor, and
+   * moves the popup to it.
+   * @description Overwrites any previously set point or rect.
+   * @param {Array<number>} basicRect - Rect in 2D basic image
+   * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .
+   * @example ```js
+   * var popup = new Popup();
+   * popup.setText('hello image');
+   * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);
+   *
+   * popupComponent.add([popup]);
+   * ```
+   */
+  setBasicRect(basicRect: number[]): void;
+
+  /**
+   * Sets the popup's content to the element provided as a DOM node.
+   * @param {Node} htmlNode - A DOM node to be used as content for the popup.
+   * @example ```js
+   * var div = document.createElement('div');
+   * div.innerHTML = 'hello image';
+   *
+   * var popup = new Popup();
+   * popup.setDOMContent(div);
+   * popup.setBasicPoint([0.3, 0.3]);
+   *
+   * popupComponent.add([popup]);
+   * ```
+   */
+  setDOMContent(htmlNode: Node): void;
+
+  /**
+   * Sets the popup's content to the HTML provided as a string.
+   * @description [object Object],[object Object],[object Object]
+   * @param {string} html - A string representing HTML content for the popup.
+   * @example ```js
+   * var popup = new Popup();
+   * popup.setHTML('<div>hello image</div>');
+   * popup.setBasicPoint([0.3, 0.3]);
+   *
+   * popupComponent.add([popup]);
+   * ```
+   */
+  setHTML(html: string): void;
+
+  /**
+   * Sets the popup's content to a string of text.
+   * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.
+   * Use this method for security against XSS if the popup content is user-provided.
+   * @param {string} text - Textual content for the popup.
+   * @example ```js
+   * var popup = new Popup();
+   * popup.setText('hello image');
+   * popup.setBasicPoint([0.3, 0.3]);
+   *
+   * popupComponent.add([popup]);
+   * ```
+   */
+  setText(text: string): void;
+
+  /**
+   * @description Internal method for attaching the popup to
+   * its parent container so that it is rendered in the DOM tree.
+   * @ignore
+   */
+  setParentContainer(parentContainer: HTMLElement): void;
+
+  /**
+   * @description Internal method for updating the rendered
+   * position of the popup called by the popup component.
+   * @ignore
+   */
+  update(
+    renderCamera: RenderCamera,
+    size: ViewportSize,
+    transform: Transform
+  ): void;
+}
+/**
+ * @class PopupComponent
+ * @classdesc Component for showing HTML popup objects.
+ *
+ * The `add` method is used for adding new popups. Popups are removed by reference.
+ *
+ * It is not possible to update popups in the set by updating any properties
+ * directly on the popup object. Popups need to be replaced by
+ * removing them and creating new ones with relevant changed properties and
+ * adding those instead.
+ *
+ * Popups are only relevant to a single image because they are based on
+ * 2D basic image coordinates. Popups related to a certain image should
+ * be removed when the viewer is moved to another image.
+ *
+ * To retrive and use the popup component
+ * @example ```js
+ * var viewer = new Viewer({ component: { popup: true }, ... });
+ *
+ * var popupComponent = viewer.getComponent("popup");
+ * ```
+ */
+declare class PopupComponent extends Component<ComponentConfiguration> {
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(
+    name: string,
+    container: Container,
+    navigator: Navigator,
+    dom?: DOM
+  ): this;
+
+  /**
+   * Add popups to the popups set.
+   * @description Adding a new popup never replaces an old one
+   * because they are stored by reference. Adding an already
+   * existing popup has no effect.
+   * @param {Array<Popup>} popups - Popups to add.
+   * @example ```js
+   * popupComponent.add([popup1, popup2]);
+   * ```
+   */
+  add(popups: Popup[]): void;
+
+  /**
+   * Returns an array of all popups.
+   * @example ```js
+   * var popups = popupComponent.getAll();
+   * ```
+   */
+  getAll(): Popup[];
+
+  /**
+   * Remove popups based on reference from the popup set.
+   * @param {Array<Popup>} popups - Popups to remove.
+   * @example ```js
+   * popupComponent.remove([popup1, popup2]);
+   * ```
+   */
+  remove(popups: Popup[]): void;
+
+  /**
+   * Remove all popups from the popup set.
+   * @example ```js
+   * popupComponent.removeAll();
+   * ```
+   */
+  removeAll(): void;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): ComponentConfiguration;
+}
+declare class SequenceDOMRenderer {
+  constructor(container: Container): this;
+  activate(): void;
+  deactivate(): void;
+  getContainerWidth(
+    size: ViewportSize,
+    configuration: SequenceConfiguration
+  ): number;
+}
+/**
+ * @class SequenceComponent
+ * @classdesc Component showing navigation arrows for sequence directions
+ * as well as playing button. Exposes an API to start and stop play.
+ */
+declare class SequenceComponent extends Component<SequenceConfiguration> {
+  /**
+   * @inheritdoc
+   */
+  static componentName: string;
+  constructor(
+    name: string,
+    container: Container,
+    navigator: Navigator,
+    renderer?: SequenceDOMRenderer
+  ): this;
+
+  /**
+   * Start playing.
+   * @fires playing
+   */
+  play(): void;
+
+  /**
+   * Stop playing.
+   * @fires playing
+   */
+  stop(): void;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): SequenceConfiguration;
+}
+/**
+ * @class SliderComponent
+ * @classdesc Component for comparing pairs of images. Renders
+ * a slider for adjusting the curtain of the first image.
+ *
+ * Deactivate the sequence, direction and image plane
+ * components when activating the slider component to avoid
+ * interfering UI elements.
+ *
+ * To retrive and use the slider component
+ * @example ```js
+ * var viewer = new Viewer({ ... });
+ *
+ * viewer.deactivateComponent("image");
+ * viewer.deactivateComponent("direction");
+ * viewer.deactivateComponent("sequence");
+ *
+ * viewer.activateComponent("slider");
+ *
+ * var sliderComponent = viewer.getComponent("slider");
+ * ```
+ */
+declare class SliderComponent extends Component<SliderConfiguration> {
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(
+    name: string,
+    container: Container,
+    navigator: Navigator,
+    viewportCoords?: ViewportCoords
+  ): this;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): SliderConfiguration;
+}
+declare class SpatialComponent extends Component<SpatialConfiguration> {
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(name: string, container: Container, navigator: Navigator): this;
+
+  /**
+   * Returns the image id of the camera frame closest to the current
+   * render camera position at the specified point.
+   * @description Notice that the pixelPoint argument requires x, y
+   * coordinates from pixel space.
+   *
+   * With this function, you can use the coordinates provided by mouse
+   * events to get information out of the spatial component.
+   *
+   * If no camera frame exist at the pixel
+   * point, `null` will be returned.
+   * @param {Array<number>} pixelPoint - Pixel coordinates on
+   * the viewer element.
+   * @returns {string} Image id of the camera frame closest to
+   * the camera. If no camera frame is intersected at the
+   * pixel point, `null` will be returned.
+   * @example ```js
+   * spatialComponent.getFrameIdAt([100, 125])
+   *     .then((imageId) => { console.log(imageId); });
+   * ```
+   */
+  getFrameIdAt(pixelPoint: number[]): Promise<string>;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): SpatialConfiguration;
+}
+declare class GeometryTagError extends MapillaryError {
+  constructor(message?: string): this;
+}
+/**
+ * @class PointGeometry
+ * @classdesc Represents a point geometry in the 2D basic image coordinate system.
+ * @example ```js
+ * var basicPoint = [0.5, 0.7];
+ * var pointGeometry = new PointGeometry(basicPoint);
+ * ```
+ */
+declare class PointGeometry extends Geometry {
+  /**
+   * Create a point geometry.
+   * @constructor
+   * @param {Array<number>} point - An array representing the basic coordinates of
+   * the point.
+   * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
+   */
+  constructor(point: number[]): this;
+
+  /**
+   * Get point property.
+   * @returns {Array<number>} Array representing the basic coordinates of the point.
+   */
+  point: number[];
+
+  /**
+   * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D
+   * basic coordinates of the point itself.
+   * @returns {Array<number>} 2D basic coordinates representing the centroid.
+   * @ignore
+   */
+  getCentroid2d(): number[];
+
+  /**
+   * Get the 3D world coordinates for the centroid of the point, i.e. the 3D
+   * world coordinates of the point itself.
+   * @param {Transform} transform - The transform of the image related to the point.
+   * @returns {Array<number>} 3D world coordinates representing the centroid.
+   * @ignore
+   */
+  getCentroid3d(transform: Transform): number[];
+
+  /**
+   * Set the centroid of the point, i.e. the point coordinates.
+   * @param {Array<number>} value - The new value of the centroid.
+   * @param {Transform} transform - The transform of the image related to the point.
+   * @ignore
+   */
+  setCentroid2d(value: number[], transform: Transform): void;
+}
+/**
+ * @class PointsGeometry
+ * @classdesc Represents a point set in the 2D basic image coordinate system.
+ * @example ```js
+ * var points = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5]];
+ * var pointsGeometry = new PointsGeometry(points);
+ * ```
+ */
+declare class PointsGeometry extends Geometry {
+  /**
+   * Create a points geometry.
+   * @constructor
+   * @param {Array<Array<number>>} points - Array of 2D points on the basic coordinate
+   * system. The number of points must be greater than or equal to two.
+   * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
+   */
+  constructor(points: number[][]): this;
+
+  /**
+   * Get points property.
+   * @returns {Array<Array<number>>} Array of 2d points.
+   */
+  points: number[][];
+
+  /**
+   * Add a point to the point set.
+   * @param {Array<number>} point - Point to add.
+   * @ignore
+   */
+  addPoint2d(point: number[]): void;
+
+  /**
+   * Get the coordinates of a point from the point set representation of the geometry.
+   * @param {number} index - Point index.
+   * @returns {Array<number>} Array representing the 2D basic coordinates of the point.
+   * @ignore
+   */
+  getPoint2d(index: number): number[];
+
+  /**
+   * Remove a point from the point set.
+   * @param {number} index - The index of the point to remove.
+   * @ignore
+   */
+  removePoint2d(index: number): void;
+
+  /**
+   * @ignore
+   */
+  setVertex2d(index: number, value: number[], transform: Transform): void;
+
+  /**
+   * @ignore
+   */
+  setPoint2d(index: number, value: number[], transform: Transform): void;
+
+  /**
+   * @ignore
+   */
+  getPoints3d(transform: Transform): number[][];
+
+  /**
+   * @ignore
+   */
+  getPoint3d(index: number, transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getPoints2d(): number[][];
+
+  /**
+   * @ignore
+   */
+  getCentroid2d(transform?: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getCentroid3d(transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getRect2d(transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  setCentroid2d(value: number[], transform: Transform): void;
+}
+/**
+ * @class VertexGeometry
+ * @abstract
+ * @classdesc Represents a vertex geometry.
+ */
+declare class VertexGeometry extends Geometry {
+  /**
+   * Create a vertex geometry.
+   * @constructor
+   * @ignore
+   */
+  constructor(): this;
+
+  /**
+   * Get the 3D coordinates for the vertices of the geometry with possibly
+   * subsampled points along the lines.
+   * @param {Transform} transform - The transform of the image related to
+   * the geometry.
+   * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
+   * representing the geometry.
+   * @ignore
+   */
+  getPoints3d(transform: Transform): number[][];
+
+  /**
+   * Get the polygon pole of inaccessibility, the most
+   * distant internal point from the polygon outline.
+   * @returns {Array<number>} 2D basic coordinates for the pole of inaccessibility.
+   * @ignore
+   */
+  getPoleOfInaccessibility2d(): number[];
+
+  /**
+   * Get the polygon pole of inaccessibility, the most
+   * distant internal point from the polygon outline.
+   * @param transform - The transform of the image related to
+   * the geometry.
+   * @returns {Array<number>} 3D world coordinates for the pole of inaccessibility.
+   * @ignore
+   */
+  getPoleOfInaccessibility3d(transform: Transform): number[];
+
+  /**
+   * Get the coordinates of a vertex from the polygon representation of the geometry.
+   * @param {number} index - Vertex index.
+   * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+   * @ignore
+   */
+  getVertex2d(index: number): number[];
+
+  /**
+   * Get a vertex from the polygon representation of the 3D coordinates for the
+   * vertices of the geometry.
+   * @param {number} index - Vertex index.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @returns {Array<number>} Array representing the 3D world coordinates of the vertex.
+   * @ignore
+   */
+  getVertex3d(index: number, transform: Transform): number[];
+
+  /**
+   * Get a polygon representation of the 2D basic coordinates for the vertices of the geometry.
+   * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing
+   * the vertices of the geometry.
+   * @ignore
+   */
+  getVertices2d(): number[][];
+
+  /**
+   * Get a polygon representation of the 3D world coordinates for the vertices of the geometry.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
+   * the vertices of the geometry.
+   * @ignore
+   */
+  getVertices3d(transform: Transform): number[][];
+
+  /**
+   * Get a flattend array of the 3D world coordinates for the
+   * triangles filling the geometry.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @returns {Array<number>} Flattened array of 3D world coordinates of the triangles.
+   * @ignore
+   */
+  getTriangles3d(transform: Transform): number[];
+
+  /**
+   * Set the value of a vertex in the polygon representation of the geometry.
+   * @description The polygon is defined to have the first vertex at the
+   * bottom-left corner with the rest of the vertices following in clockwise order.
+   * @param {number} index - The index of the vertex to be set.
+   * @param {Array<number>} value - The new value of the vertex.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @ignore
+   */
+  setVertex2d(index: number, value: number[], transform: Transform): void;
+
+  /**
+   * Finds the polygon pole of inaccessibility, the most distant internal
+   * point from the polygon outline.
+   * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
+   * @returns {Array<number>} Point of inaccessibility.
+   * @ignore
+   */
+  _getPoleOfInaccessibility2d(points2d: number[][]): number[];
+  _project(points2d: number[][], transform: Transform): number[][];
+  _subsample(points2d: number[][], threshold?: number): number[][];
+
+  /**
+   * Triangulates a 2d polygon and returns the triangle
+   * representation as a flattened array of 3d points.
+   * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
+   * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.
+   * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.
+   * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.
+   * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.
+   * @ignore
+   */
+  _triangulate(
+    points2d: number[][],
+    points3d: number[][],
+    holes2d?: number[][][],
+    holes3d?: number[][][]
+  ): number[];
+  _triangulateSpherical(
+    points2d: number[][],
+    holes2d: number[][][],
+    transform: Transform
+  ): number[];
+  _unproject(
+    points2d: number[][],
+    transform: Transform,
+    distance?: number
+  ): number[][];
+}
+/**
+ * @class PolygonGeometry
+ * @classdesc Represents a polygon geometry in the 2D basic image coordinate system.
+ * All polygons and holes provided to the constructor needs to be closed.
+ * @example ```js
+ * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]];
+ * var polygonGeometry = new PolygonGeometry(basicPolygon);
+ * ```
+ */
+declare class PolygonGeometry extends VertexGeometry {
+  /**
+   * Create a polygon geometry.
+   * @constructor
+   * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.
+   * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.
+   * Each array of holes vertices must be closed.
+   * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.
+   */
+  constructor(polygon: number[][], holes?: number[][][]): this;
+
+  /**
+   * Get polygon property.
+   * @returns {Array<Array<number>>} Closed 2d polygon.
+   */
+  polygon: number[][];
+
+  /**
+   * Get holes property.
+   * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.
+   */
+  holes: number[][][];
+
+  /**
+   * Add a vertex to the polygon by appending it after the last vertex.
+   * @param {Array<number>} vertex - Vertex to add.
+   * @ignore
+   */
+  addVertex2d(vertex: number[]): void;
+
+  /**
+   * Get the coordinates of a vertex from the polygon representation of the geometry.
+   * @param {number} index - Vertex index.
+   * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+   * @ignore
+   */
+  getVertex2d(index: number): number[];
+
+  /**
+   * Remove a vertex from the polygon.
+   * @param {number} index - The index of the vertex to remove.
+   * @ignore
+   */
+  removeVertex2d(index: number): void;
+
+  /**
+   * @ignore
+   */
+  setVertex2d(index: number, value: number[], transform: Transform): void;
+
+  /**
+   * @ignore
+   */
+  setCentroid2d(value: number[], transform: Transform): void;
+
+  /**
+   * @ignore
+   */
+  getPoints3d(transform: Transform): number[][];
+
+  /**
+   * @ignore
+   */
+  getVertex3d(index: number, transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getVertices2d(): number[][];
+
+  /**
+   * @ignore
+   */
+  getVertices3d(transform: Transform): number[][];
+
+  /**
+   * Get a polygon representation of the 3D coordinates for the vertices of each hole
+   * of the geometry. Line segments between vertices will possibly be subsampled
+   * resulting in a larger number of points than the total number of vertices.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
+   * representing the vertices of each hole of the geometry.
+   * @ignore
+   */
+  getHolePoints3d(transform: Transform): number[][][];
+
+  /**
+   * Get a polygon representation of the 3D coordinates for the vertices of each hole
+   * of the geometry.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
+   * representing the vertices of each hole of the geometry.
+   * @ignore
+   */
+  getHoleVertices3d(transform: Transform): number[][][];
+
+  /**
+   * @ignore
+   */
+  getCentroid2d(): number[];
+
+  /**
+   * @ignore
+   */
+  getCentroid3d(transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  get3dDomainTriangles3d(transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getTriangles3d(transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getPoleOfInaccessibility2d(): number[];
+
+  /**
+   * @ignore
+   */
+  getPoleOfInaccessibility3d(transform: Transform): number[];
+}
+/**
+ * @class RectGeometry
+ * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.
+ * @example ```js
+ * var basicRect = [0.5, 0.3, 0.7, 0.4];
+ * var rectGeometry = new RectGeometry(basicRect);
+ * ```
+ */
+declare class RectGeometry extends VertexGeometry {
+  /**
+   * Create a rectangle geometry.
+   * @constructor
+   * @param {Array<number>} rect - An array representing the top-left and bottom-right
+   * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].
+   * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.
+   */
+  constructor(rect: number[]): this;
+
+  /**
+   * Get anchor index property.
+   * @returns {number} Index representing the current anchor property if
+   * achoring indexing has been initialized. If anchor indexing has not been
+   * initialized or has been terminated undefined will be returned.
+   * @ignore
+   */
+  anchorIndex: number;
+
+  /**
+   * Get inverted property.
+   * @returns {boolean} Boolean determining whether the rect geometry is
+   * inverted. For spherical the rect geometrye may be inverted.
+   * @ignore
+   */
+  inverted: boolean;
+
+  /**
+   * Get rect property.
+   * @returns {Array<number>} Array representing the top-left and bottom-right
+   * corners of the rectangle in basic coordinates.
+   */
+  rect: number[];
+
+  /**
+   * Initialize anchor indexing to enable setting opposite vertex.
+   * @param {number} [index] - The index of the vertex to use as anchor.
+   * @throws {GeometryTagError} If anchor indexing has already been initialized.
+   * @throws {GeometryTagError} If index is not valid (0 to 3).
+   * @ignore
+   */
+  initializeAnchorIndexing(index?: number): void;
+
+  /**
+   * Terminate anchor indexing to disable setting pposite vertex.
+   * @ignore
+   */
+  terminateAnchorIndexing(): void;
+
+  /**
+   * Set the value of the vertex opposite to the anchor in the polygon
+   * representation of the rectangle.
+   * @description Setting the opposite vertex may change the anchor index.
+   * @param {Array<number>} opposite - The new value of the vertex opposite to the anchor.
+   * @param {Transform} transform - The transform of the image related to the rectangle.
+   * @throws {GeometryTagError} When anchor indexing has not been initialized.
+   * @ignore
+   */
+  setOppositeVertex2d(opposite: number[], transform: Transform): void;
+
+  /**
+   * Set the value of a vertex in the polygon representation of the rectangle.
+   * @description The polygon is defined to have the first vertex at the
+   * bottom-left corner with the rest of the vertices following in clockwise order.
+   * @param {number} index - The index of the vertex to be set.
+   * @param {Array<number>} value - The new value of the vertex.
+   * @param {Transform} transform - The transform of the image related to the rectangle.
+   * @ignore
+   */
+  setVertex2d(index: number, value: number[], transform: Transform): void;
+
+  /**
+   * @ignore
+   */
+  setCentroid2d(value: number[], transform: Transform): void;
+
+  /**
+   * Get the 3D coordinates for the vertices of the rectangle with
+   * interpolated points along the lines.
+   * @param {Transform} transform - The transform of the image related to
+   * the rectangle.
+   * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
+   * representing the rectangle.
+   * @ignore
+   */
+  getPoints3d(transform: Transform): number[][];
+
+  /**
+   * Get the coordinates of a vertex from the polygon representation of the geometry.
+   * @description The first vertex represents the bottom-left corner with the rest of
+   * the vertices following in clockwise order. The method shifts the right side
+   * coordinates of the rectangle by one unit to ensure that the vertices are ordered
+   * clockwise.
+   * @param {number} index - Vertex index.
+   * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+   * @ignore
+   */
+  getVertex2d(index: number): number[];
+
+  /**
+   * Get the coordinates of a vertex from the polygon representation of the geometry.
+   * @description The first vertex represents the bottom-left corner with the rest of
+   * the vertices following in clockwise order. The coordinates will not be shifted
+   * so they may not appear in clockwise order when layed out on the plane.
+   * @param {number} index - Vertex index.
+   * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+   * @ignore
+   */
+  getNonAdjustedVertex2d(index: number): number[];
+
+  /**
+   * Get a vertex from the polygon representation of the 3D coordinates for the
+   * vertices of the geometry.
+   * @description The first vertex represents the bottom-left corner with the rest of
+   * the vertices following in clockwise order.
+   * @param {number} index - Vertex index.
+   * @param {Transform} transform - The transform of the image related to the geometry.
+   * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
+   * the vertices of the geometry.
+   * @ignore
+   */
+  getVertex3d(index: number, transform: Transform): number[];
+
+  /**
+   * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.
+   * @description The first vertex represents the bottom-left corner with the rest of
+   * the vertices following in clockwise order.
+   * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing
+   * the rectangle vertices.
+   * @ignore
+   */
+  getVertices2d(): number[][];
+
+  /**
+   * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.
+   * @description The first vertex represents the bottom-left corner with the rest of
+   * the vertices following in clockwise order.
+   * @param {Transform} transform - The transform of the image related to the rectangle.
+   * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
+   * the rectangle vertices.
+   * @ignore
+   */
+  getVertices3d(transform: Transform): number[][];
+
+  /**
+   * @ignore
+   */
+  getCentroid2d(): number[];
+
+  /**
+   * @ignore
+   */
+  getCentroid3d(transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getPoleOfInaccessibility2d(): number[];
+
+  /**
+   * @ignore
+   */
+  getPoleOfInaccessibility3d(transform: Transform): number[];
+
+  /**
+   * @ignore
+   */
+  getTriangles3d(transform: Transform): number[];
+
+  /**
+   * Check if a particular bottom-right value is valid according to the current
+   * rectangle coordinates.
+   * @param {Array<number>} bottomRight - The bottom-right coordinates to validate
+   * @returns {boolean} Value indicating whether the provided bottom-right coordinates
+   * are valid.
+   * @ignore
+   */
+  validate(bottomRight: number[]): boolean;
+}
+/**
+ * @event
+ */
+export type TagEventType = "click" | "geometry" | "tag";
+/**
+ * Interface for tag state events.
+ * @example ```js
+ * var tag = new OutlineTag({ // tag options });
+ * // Set an event listener
+ * tag.on('tag', function() {
+ *   console.log("A tag event has occurred.");
+ * });
+ * ```
+ */
+export interface TagStateEvent {
+  /**
+   * The component object that fired the event.
+   */
+  target: Tag;
+
+  /**
+   * The event type.
+   */
+  type: TagEventType;
+}
+/**
+ * @class Tag
+ * @abstract
+ * @classdesc Abstract class representing the basic functionality of for a tag.
+ */
+declare class Tag extends EventEmitter {
+  _id: string;
+  _geometry: Geometry;
+
+  /**
+   * Create a tag.
+   * @constructor
+   * @param {string} id
+   * @param {Geometry} geometry
+   */
+  constructor(id: string, geometry: Geometry): this;
+
+  /**
+   * Get id property.
+   * @returns {string}
+   */
+  id: string;
+
+  /**
+   * Get geometry property.
+   * @returns {Geometry} The geometry of the tag.
+   */
+  geometry: Geometry;
+}
+/**
+ * Interface for the options that define the behavior and
+ * appearance of the outline tag.
+ * @interface
+ */
+export interface ExtremePointTagOptions {
+  /**
+   * Indicate whether the tag geometry should be editable.
+   * @description Polygon tags with two dimensional domain
+   * are never editable.
+   * @default false
+   */
+  editable?: boolean;
+
+  /**
+   * Color for the interior fill as a hexadecimal number.
+   * @default 0xFFFFFF
+   */
+  fillColor?: number;
+
+  /**
+   * Opacity of the interior fill between 0 and 1.
+   * @default 0.3
+   */
+  fillOpacity?: number;
+
+  /**
+   * Determines whether vertices should be indicated by points
+   * when tag is editable.
+   * @default true
+   */
+  indicateVertices?: boolean;
+
+  /**
+   * Color for the edge lines as a hexadecimal number.
+   * @default 0xFFFFFF
+   */
+  lineColor?: number;
+
+  /**
+   * Opacity of the edge lines on [0, 1].
+   * @default 1
+   */
+  lineOpacity?: number;
+
+  /**
+   * Line width in pixels.
+   * @default 1
+   */
+  lineWidth?: number;
+}
+/**
+ * @class ExtremePointTag
+ * @classdesc Tag holding properties for visualizing a extreme points
+ * and their outline.
+ * @example ```js
+ * var geometry = new PointsGeometry([[0.3, 0.3], [0.5, 0.4]]);
+ * var tag = new ExtremePointTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, lineColor: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
+ */
+declare class ExtremePointTag extends Tag {
+  /**
+   * Create an extreme point tag.
+   * @override
+   * @constructor
+   * @param {string} id - Unique identifier of the tag.
+   * @param {PointsGeometry} geometry - Geometry defining points of tag.
+   * @param {ExtremePointTagOptions} options - Options defining the visual appearance and
+   * behavior of the extreme point tag.
+   */
+  constructor(
+    id: string,
+    geometry: PointsGeometry,
+    options?: ExtremePointTagOptions
+  ): this;
+
+  /**
+   * Get editable property.
+   * @returns {boolean} Value indicating if tag is editable.
+   */
+  editable: boolean;
+
+  /**
+   * Set editable property.
+   * @param {boolean}
+   * @fires changed
+   */
+  -editable: boolean;
+
+  /**
+   * Get fill color property.
+   * @returns {number}
+   */
+  fillColor: number;
+
+  /**
+   * Set fill color property.
+   * @param {number}
+   * @fires changed
+   */
+  -fillColor: number;
+
+  /**
+   * Get fill opacity property.
+   * @returns {number}
+   */
+  fillOpacity: number;
+
+  /**
+   * Set fill opacity property.
+   * @param {number}
+   * @fires changed
+   */
+  -fillOpacity: number;
+
+  /**
+   * @inheritdoc
+   */
+  geometry: Geometry;
+
+  /**
+   * Get indicate vertices property.
+   * @returns {boolean} Value indicating if vertices should be indicated
+   * when tag is editable.
+   */
+  indicateVertices: boolean;
+
+  /**
+   * Get line color property.
+   * @returns {number}
+   */
+  lineColor: number;
+
+  /**
+   * Get line opacity property.
+   * @returns {number}
+   */
+  lineOpacity: number;
+
+  /**
+   * Get line width property.
+   * @returns {number}
+   */
+  lineWidth: number;
+
+  /**
+   * Set options for tag.
+   * @description Sets all the option properties provided and keeps
+   * the rest of the values as is.
+   * @param {ExtremePointTagOptions} options - Extreme point tag options
+   * @fires changed
+   */
+  setOptions(options: ExtremePointTagOptions): void;
+}
+/**
+ * Enumeration for tag domains.
+ * @enum {number} *
+ * @readonly
+ * @description Defines where lines between two vertices are treated
+ * as straight.
+ *
+ * Only applicable for polygons. For rectangles lines between
+ * vertices are always treated as straight in the distorted 2D
+ * projection and bended in the undistorted 3D space.
+ */
+
+declare var TagDomain: {|
+  +TwoDimensional: 0, // 0
+  +ThreeDimensional: 1, // 1
+|};
+
+/**
+ * Interface for the options that define the behavior and
+ * appearance of the outline tag.
+ * @interface
+ */
+export interface OutlineTagOptions {
+  /**
+   * The domain where lines between vertices are treated as straight.
+   * @description Only applicable for tags that renders polygons.
+   *
+   * If the domain is specified as two dimensional, editing of the
+   * polygon will be disabled.
+   * @default {TagDomain.TwoDimensional}
+   */
+  domain?: $Values<typeof TagDomain>;
+
+  /**
+   * Indicate whether the tag geometry should be editable.
+   * @description Polygon tags with two dimensional domain
+   * are never editable.
+   * @default false
+   */
+  editable?: boolean;
+
+  /**
+   * Color for the interior fill as a hexadecimal number.
+   * @default 0xFFFFFF
+   */
+  fillColor?: number;
+
+  /**
+   * Opacity of the interior fill between 0 and 1.
+   * @default 0.3
+   */
+  fillOpacity?: number;
+
+  /**
+   * A string referencing the sprite data property to pull from.
+   * @description Icon is not shown for tags with polygon
+   * geometries in spherical.
+   */
+  icon?: string;
+
+  /**
+   * Value determining how the icon will float with respect to its anchor
+   * position when rendering.
+   * @default {Alignment.Center}
+   */
+  iconFloat?: $Values<typeof Alignment>;
+
+  /**
+   * Number representing the index for where to show the icon or
+   * text for a rectangle geometry.
+   * @description The default index corresponds to the bottom right corner.
+   * @default 3
+   */
+  iconIndex?: number;
+
+  /**
+   * Determines whether vertices should be indicated by points
+   * when tag is editable.
+   * @default true
+   */
+  indicateVertices?: boolean;
+
+  /**
+   * Color for the edge lines as a hexadecimal number.
+   * @default 0xFFFFFF
+   */
+  lineColor?: number;
+
+  /**
+   * Opacity of the edge lines on [0, 1].
+   * @default 1
+   */
+  lineOpacity?: number;
+
+  /**
+   * Line width in pixels.
+   * @default 1
+   */
+  lineWidth?: number;
+
+  /**
+   * Text shown as label if no icon is provided.
+   * @description Text is not shown for tags with
+   * polygon geometries in spherical.
+   */
+  text?: string;
+
+  /**
+   * Text color as hexadecimal number.
+   * @default 0xFFFFFF
+   */
+  textColor?: number;
+}
+/**
+ * Interface for the options that define the behavior and
+ * appearance of the spot tag.
+ * @interface
+ */
+export interface SpotTagOptions {
+  /**
+   * Color for the spot specified as a hexadecimal number.
+   * @default 0xFFFFFF
+   */
+  color?: number;
+
+  /**
+   * Indicate whether the tag geometry should be editable.
+   * @default false
+   */
+  editable?: boolean;
+
+  /**
+   * A string referencing the sprite data property to pull from.
+   */
+  icon?: string;
+
+  /**
+   * Text shown as label if no icon is provided.
+   */
+  text?: string;
+
+  /**
+   * Text color as hexadecimal number.
+   * @default 0xFFFFFF
+   */
+  textColor?: number;
+}
+/**
+ * @class OutlineTag
+ * @classdesc Tag holding properties for visualizing a geometry outline.
+ * @example ```js
+ * var geometry = new RectGeometry([0.3, 0.3, 0.5, 0.4]);
+ * var tag = new OutlineTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, lineColor: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
+ */
+declare class OutlineTag extends Tag {
+  /**
+   * Create an outline tag.
+   * @override
+   * @constructor
+   * @param {string} id - Unique identifier of the tag.
+   * @param {VertexGeometry} geometry - Geometry defining vertices of tag.
+   * @param {OutlineTagOptions} options - Options defining the visual appearance and
+   * behavior of the outline tag.
+   */
+  constructor(
+    id: string,
+    geometry: VertexGeometry,
+    options?: OutlineTagOptions
+  ): this;
+
+  /**
+   * Get domain property.
+   * @description Readonly property that can only be set in constructor.
+   * @returns Value indicating the domain of the tag.
+   */
+  domain: $Values<typeof TagDomain>;
+
+  /**
+   * Get editable property.
+   * @returns {boolean} Value indicating if tag is editable.
+   */
+  editable: boolean;
+
+  /**
+   * Set editable property.
+   * @param {boolean}
+   * @fires changed
+   */
+  -editable: boolean;
+
+  /**
+   * Get fill color property.
+   * @returns {number}
+   */
+  fillColor: number;
+
+  /**
+   * Set fill color property.
+   * @param {number}
+   * @fires changed
+   */
+  -fillColor: number;
+
+  /**
+   * Get fill opacity property.
+   * @returns {number}
+   */
+  fillOpacity: number;
+
+  /**
+   * Set fill opacity property.
+   * @param {number}
+   * @fires changed
+   */
+  -fillOpacity: number;
+
+  /**
+   * @inheritdoc
+   */
+  geometry: Geometry;
+
+  /**
+   * Get icon property.
+   * @returns {string}
+   */
+  icon: string;
+
+  /**
+   * Set icon property.
+   * @param {string}
+   * @fires changed
+   */
+  -icon: string;
+
+  /**
+ * Get icon float property.
+ * @returns {$Values<
+                typeof
+                Alignment>}
+ */
+  iconFloat: $Values<typeof Alignment>;
+
+  /**
+ * Set icon float property.
+ * @param {$Values<
+                typeof
+                Alignment>}
+ * @fires changed
+ */
+  -iconFloat: $Values<typeof Alignment>;
+
+  /**
+   * Get icon index property.
+   * @returns {number}
+   */
+  iconIndex: number;
+
+  /**
+   * Set icon index property.
+   * @param {number}
+   * @fires changed
+   */
+  -iconIndex: number;
+
+  /**
+   * Get indicate vertices property.
+   * @returns {boolean} Value indicating if vertices should be indicated
+   * when tag is editable.
+   */
+  indicateVertices: boolean;
+
+  /**
+   * Set indicate vertices property.
+   * @param {boolean}
+   * @fires changed
+   */
+  -indicateVertices: boolean;
+
+  /**
+   * Get line color property.
+   * @returns {number}
+   */
+  lineColor: number;
+
+  /**
+   * Set line color property.
+   * @param {number}
+   * @fires changed
+   */
+  -lineColor: number;
+
+  /**
+   * Get line opacity property.
+   * @returns {number}
+   */
+  lineOpacity: number;
+
+  /**
+   * Set line opacity property.
+   * @param {number}
+   * @fires changed
+   */
+  -lineOpacity: number;
+
+  /**
+   * Get line width property.
+   * @returns {number}
+   */
+  lineWidth: number;
+
+  /**
+   * Set line width property.
+   * @param {number}
+   * @fires changed
+   */
+  -lineWidth: number;
+
+  /**
+   * Get text property.
+   * @returns {string}
+   */
+  text: string;
+
+  /**
+   * Set text property.
+   * @param {string}
+   * @fires changed
+   */
+  -text: string;
+
+  /**
+   * Get text color property.
+   * @returns {number}
+   */
+  textColor: number;
+
+  /**
+   * Set text color property.
+   * @param {number}
+   * @fires changed
+   */
+  -textColor: number;
+
+  /**
+   * Set options for tag.
+   * @description Sets all the option properties provided and keeps
+   * the rest of the values as is.
+   * @param {OutlineTagOptions} options - Outline tag options
+   * @fires changed
+   */
+  setOptions(options: OutlineTagOptions): void;
+}
+/**
+ * @class SpotTag
+ * @classdesc Tag holding properties for visualizing the centroid of a geometry.
+ * @example ```js
+ * var geometry = new PointGeometry([0.3, 0.3]);
+ * var tag = new SpotTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, color: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
+ */
+declare class SpotTag extends Tag {
+  _geometry: Geometry;
+
+  /**
+   * Create a spot tag.
+   * @override
+   * @constructor
+   * @param {string} id
+   * @param {Geometry} geometry
+   * @param {IOutlineTagOptions} options - Options defining the visual appearance and
+   * behavior of the spot tag.
+   */
+  constructor(id: string, geometry: Geometry, options?: SpotTagOptions): this;
+
+  /**
+   * Get color property.
+   * @returns {number} The color of the spot as a hexagonal number;
+   */
+  color: number;
+
+  /**
+   * Set color property.
+   * @param {number}
+   * @fires changed
+   */
+  -color: number;
+
+  /**
+   * Get editable property.
+   * @returns {boolean} Value indicating if tag is editable.
+   */
+  editable: boolean;
+
+  /**
+   * Set editable property.
+   * @param {boolean}
+   * @fires changed
+   */
+  -editable: number;
+
+  /**
+   * Get icon property.
+   * @returns {string}
+   */
+  icon: string;
+
+  /**
+   * Set icon property.
+   * @param {string}
+   * @fires changed
+   */
+  -icon: string;
+
+  /**
+   * Get text property.
+   * @returns {string}
+   */
+  text: string;
+
+  /**
+   * Set text property.
+   * @param {string}
+   * @fires changed
+   */
+  -text: string;
+
+  /**
+   * Get text color property.
+   * @returns {number}
+   */
+  textColor: number;
+
+  /**
+   * Set text color property.
+   * @param {number}
+   * @fires changed
+   */
+  -textColor: number;
+
+  /**
+   * Set options for tag.
+   * @description Sets all the option properties provided and keps
+   * the rest of the values as is.
+   * @param {SpotTagOptions} options - Spot tag options
+   * @fires changed
+   */
+  setOptions(options: SpotTagOptions): void;
+}
+/**
+ * @class TagComponent
+ * @classdesc [object Object],[object Object],[object Object]
+ * @example ```js
+ * var viewer = new Viewer({ component: { tag: true } }, ...);
+ *
+ * var tagComponent = viewer.getComponent("tag");
+ * ```
+ */
+declare class TagComponent extends Component<TagConfiguration> {
+  /**
+   * @inheritdoc
+   */
+  static componentName: string;
+
+  /**
+   * @ignore
+   */
+  constructor(name: string, container: Container, navigator: Navigator): this;
+
+  /**
+   * Add tags to the tag set or replace tags in the tag set.
+   * @description If a tag already in the set has the same
+   * id as one of the tags added, the old tag will be removed
+   * the added tag will take its place.
+   * @param {Array<Tag>} tags - Tags to add.
+   * @example ```js
+   * tagComponent.add([tag1, tag2]);
+   * ```
+   */
+  add(tags: Tag[]): void;
+
+  /**
+   * Calculate the smallest rectangle containing all the points
+   * in the points geometry.
+   * @description The result may be different depending on if the
+   * current image is an spherical or not. If the
+   * current image is an spherical the rectangle may
+   * wrap the horizontal border of the image.
+   * @returns {Promise<Array<number>>} [object Object],[object Object],[object Object]
+   */
+  calculateRect(geometry: PointsGeometry): Promise<number[]>;
+
+  /**
+   * Force the creation of a geometry programatically using its
+   * current vertices.
+   * @description [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
+   * @fires geometrycreate
+   * @example ```js
+   * tagComponent.on("geometrycreate", function(geometry) {
+   *     console.log(geometry);
+   * });
+   *
+   * tagComponent.create();
+   * ```
+   */
+  create(): void;
+
+  /**
+ * Change the current tag mode.
+ * @description Change the tag mode to one of the create modes for creating new geometries.
+ * @param {$Values<
+                typeof
+                TagMode>} mode - New tag mode.
+ * @fires tagmode
+ * @example ```js
+ * tagComponent.changeMode(TagMode.CreateRect);
+ * ```
+ */
+  changeMode(mode: $Values<typeof TagMode>): void;
+
+  /**
+   * Returns the tag in the tag set with the specified id, or
+   * undefined if the id matches no tag.
+   * @param {string} tagId - Id of the tag.
+   * @example ```js
+   * var tag = tagComponent.get("tagId");
+   * ```
+   */
+  get(tagId: string): Tag;
+
+  /**
+   * Returns an array of all tags.
+   * @example ```js
+   * var tags = tagComponent.getAll();
+   * ```
+   */
+  getAll(): Tag[];
+
+  /**
+   * Returns an array of tag ids for tags that contain the specified point.
+   * @description The pixel point must lie inside the polygon or rectangle
+   * of an added tag for the tag id to be returned. Tag ids for
+   * tags that do not have a fill will also be returned if the point is inside
+   * the geometry of the tag. Tags with point geometries can not be retrieved.
+   *
+   * No tag ids will be returned for polygons rendered in cropped spherical or
+   * rectangles rendered in spherical.
+   *
+   * Notice that the pixelPoint argument requires x, y coordinates from pixel space.
+   *
+   * With this function, you can use the coordinates provided by mouse
+   * events to get information out of the tag component.
+   *
+   * If no tag at exist the pixel point, an empty array will be returned.
+   * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
+   * @returns {Promise<Array<string>>} Promise to the ids of the tags that
+   * contain the specified pixel point.
+   * @example ```js
+   * tagComponent.getTagIdsAt([100, 100])
+   *     .then((tagIds) => { console.log(tagIds); });
+   * ```
+   */
+  getTagIdsAt(pixelPoint: number[]): Promise<string[]>;
+
+  /**
+   * Check if a tag exist in the tag set.
+   * @param {string} tagId - Id of the tag.
+   * @example ```js
+   * var tagExists = tagComponent.has("tagId");
+   * ```
+   */
+  has(tagId: string): boolean;
+
+  /**
+   * Remove tags with the specified ids from the tag set.
+   * @param {Array<string>} tagIds - Ids for tags to remove.
+   * @example ```js
+   * tagComponent.remove(["id-1", "id-2"]);
+   * ```
+   */
+  remove(tagIds: string[]): void;
+
+  /**
+   * Remove all tags from the tag set.
+   * @example ```js
+   * tagComponent.removeAll();
+   * ```
+   */
+  removeAll(): void;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): TagConfiguration;
+}
+/**
+ * @class ZoomComponent
+ * @classdesc Component rendering UI elements used for zooming.
+ * @example ```js
+ * var viewer = new Viewer({ ... });
+ *
+ * var zoomComponent = viewer.getComponent("zoom");
+ * zoomComponent.configure({ size: ComponentSize.Small });
+ * ```
+ */
+declare class ZoomComponent extends Component<ZoomConfiguration> {
+  static componentName: string;
+  constructor(name: string, container: Container, navigator: Navigator): this;
+  _activate(): void;
+  _deactivate(): void;
+  _getDefaultConfiguration(): ZoomConfiguration;
+}
+declare export {
+  Alignment,
+  ArgumentMapillaryError,
+  BearingComponent,
+  CacheComponent,
+  CameraControls,
+  CameraVisualizationMode,
+  CancelMapillaryError,
+  CircleMarker,
+  Component,
+  ComponentSize,
+  DataProviderBase,
+  DirectionComponent,
+  DragPanHandler,
+  EventEmitter,
+  ExtremePointTag,
+  Geometry,
+  GeometryProviderBase,
+  GeometryTagError,
+  GraphDataProvider,
+  GraphMapillaryError,
+  Image,
+  KeyPlayHandler,
+  KeySequenceNavigationHandler,
+  KeySpatialNavigationHandler,
+  KeyZoomHandler,
+  KeyboardComponent,
+  MapillaryError,
+  Marker,
+  MarkerComponent,
+  NavigationDirection,
+  OriginalPositionMode,
+  OutlineTag,
+  PointGeometry,
+  PointerComponent,
+  PointsGeometry,
+  PointVisualizationMode,
+  PolygonGeometry,
+  Popup,
+  PopupComponent,
+  RectGeometry,
+  RenderMode,
+  RenderPass,
+  S2GeometryProvider,
+  ScrollZoomHandler,
+  SequenceComponent,
+  SimpleMarker,
+  SliderComponent,
+  SliderConfigurationMode,
+  SpatialComponent,
+  SpotTag,
+  Tag,
+  TagComponent,
+  TagDomain,
+  TagMode,
+  TouchZoomHandler,
+  TransitionMode,
+  VertexGeometry,
+  Viewer,
+  ZoomComponent,
+  decompress,
+  ecefToEnu,
+  ecefToGeodetic,
+  enuToEcef,
+  enuToGeodetic,
+  fetchArrayBuffer,
+  geodeticToEcef,
+  geodeticToEnu,
+  isFallbackSupported,
+  isSupported,
+  readMeshPbf,
+};