Skip to main content

Web Mercator Utility Functions

From-v3.1

lngLatToWorld(lngLat)​

Project a coordinate on sphere onto the 512x512 Web Mercator plane.

Parameters:

  • lngLat (Array, required) - Specifies a point on the sphere to project. [lng,lat] in degrees.

Returns:

  • [x, y]

worldToLngLat(xy, scale)​

Unproject a coordinate from the 512x512 Web Mercator plane back to the sphere.

Parameters:

  • xy (Array, required) - Specifies a point on the Web Mercator tile to unproject. [x, y] in pixels.

Returns:

  • [lng, lat]

worldToPixels(xyz, projectionMatrix)​

Project a coordinate from the Web Mercator coordinate system to screen.

Parameters:

  • xyz (Array, required) - Specifies a point in the Web Mercator tile. z is the elevation and optional.
  • projectionMatrix (Matrix4, required) - The projection matrix.

Returns:

  • [x, y, z] - coordinates on screen, z is the pixel depth.

pixelsToWorld(xyz, unprojectionMatrix, targetZ)​

Project a coordinate from screen to the Web Mercator coordinate system.

Parameters:

  • xyz (Array, required) - Specifies a point on screen. z is the pixel depth and optional.
  • unprojectionMatrix (Matrix4, required) - The unprojection matrix.
  • targetZ (Number, optional) - If pixel depth is not specified, targetZ is used as the elevation plane to unproject onto. Default 0.

Returns:

  • [x, y, z] - coordinates on the Web Mercator tile, z is the elevation.

getMeterZoom(viewport)​

Returns the zoom level that gives a 1 meter pixel at a certain latitude.

Parameters:

  • viewport (Object) - viewport props
  • viewport.latitude (Number, required)

getDistanceScales(viewport)​

Calculate linear scales for quick conversion between meters/degrees/pixels distances around the given lat/lon.

In mercator projection mode, the distance scales vary significantly with latitude. The scale is only reasonably accurate locally.

Parameters:

  • viewport (Object) - viewport props
  • viewport.longitude (Number, required)
  • viewport.latitude (Number, required)
  • viewport.highPrecision (bool, optional) - default false

Returns:

  • distanceScales (Object)
  • distanceScales.unitsPerMeter (Array) - world units per meter in [x, y, z].
  • distanceScales.metersPerUnit (Array) - meters per world unit in [x, y, z]
  • distanceScales.unitsPerDegree (Array) - world units per degree in [x, y, z]
  • distanceScales.degreesPerUnit (Array) - degree per world unit in [x, y, z]
  • distanceScales.unitsPerMeter2 (Array) - if highPrecision is true, returns world units per meter adjustment in [x2, y2, z2]. It offers a cheap way to compensate for the precision loss with latitude. Amends unitsPerMeter by y offset (in meters): [x + x2 * dy, y + y2 * dy, z + z2 * dy].
  • distanceScales.unitsPerDegree2 (Array) - if highPrecision is true, returns world units per degree adjustment in [x2, y2, z2]. It offers a cheap way to compensate for the precision loss with latitude. Amends unitsPerDegree by y offset (in degrees): [x + x2 * dy, y + y2 * dy, z + z2 * dy].

addMetersToLngLat(lngLatZ, xyz)​

Offset a spherical position by meters.

Parameters:

  • lngLatZ (Array) - origin in [lng, lat, alt]. Altitude is optional.
  • xyz (Array) - offset from the origin [x, y, z] in meters. x is easting and y is northing. z is optional.

Returns:

  • [lng, lat] if the third component in neither argument is specified, or
  • [lng, lat, alt] otherwise.

getViewMatrix(viewport)​

Get a transform matrix that projects from the mercator (pixel) space into the camera (view) space. Centers the map at the given coordinates.

Parameters:

  • viewport (Object) - viewport props
  • viewport.height (Number, required)
  • viewport.pitch (Number, required)
  • viewport.bearing (Number, required)
  • viewport.scale (Number, required)
  • viewport.altitude (Number, required)
  • viewport.center (Array, optional) - pre-calculated world position of map center using getWorldPosition. Default [0, 0].

Returns:

  • viewMatrix (Array) 4x4 matrix.

getProjectionMatrix(viewport)​

Get a transform matrix that projects from camera (view) space to clipspace.

Parameters:

  • viewport (Object) - viewport props
  • viewport.width (Number, required)
  • viewport.height (Number, required)
  • viewport.pitch (Number, required)
  • viewport.scale (Number, optional) - required if center is specified
  • viewport.center (Number[], optional) - offset of the target, vec3 in world space
  • viewport.offset (Number[], optional) - offset of the focal point, vec2 in screen space
  • viewport.fovy (Number, optional) - field of view in degrees
  • viewport.altitude (Number, optional) - if provided, field of view is calculated using altitudeToFovy()
  • viewport.nearZMultiplier (Number, optional) - near plane multiplier. Default 1.
  • viewport.farZMultiplier (Number, optional) - far plane multiplier. Default 1

Notes:

To match Mapbox's z-buffer, use these parameters:

  • Before 0.29:

    • nearZMultiplier: 0.1
    • farZMultiplier: 1
  • Starting 0.29:

    • nearZMultiplier: 1 / viewport.height
    • farZMultiplier: 1.01
  • fovy: altitudeToFovy(1.5)

getProjectionParameters({width, height, altitude, fovy, pitch, farZMultiplier}})​

Parameters:

  • width (Number, required)
  • height (Number, required)
  • viewport.pitch (Number, optional) - default 0.
  • viewport.scale (Number, optional) - required if center is specified
  • viewport.center (Number[], optional) - offset of the target, vec3 in world space
  • viewport.offset (Number[], optional) - offset of the focal point, vec2 in screen space
  • viewport.fovy (Number, optional) - field of view in degrees
  • altitude (Number, optional) - if provided, field of view is calculated using altitudeToFovy()
  • farZMultiplier (Number, optional) - near plane multiplier. Default 1.
  • farZMultiplier (Number, optional) - far plane multiplier. Default 1.

Returns

  • Object with {fov, aspect, focalDistance, near, far} fields. Note that returned fov is in radians

altitudeToFovy(altitude)​

Convert an altitude to field of view such that the focal distance is equal to the altitude.

Parameters:

  • altitude (Number, required) - altitude of camera in screen units

Returns:

  • fovy field of view in degrees

fovyToAltitude(fovy)​

Convert a field of view to an altitude equal to the focal distance

Parameters:

  • fovy (Number, required) field of view in degrees

Returns:

  • altitude altitude of camera in screen units

fitBounds(opts)​

Returns map settings (longitude, latitude and zoom) that will contain the provided corners within the provided dimensions. Only supports non-perspective mode.

Parameters:

  • opts (Object) - options
  • opts.width (Number, required)
  • opts.height (Number, required)
  • opts.bounds (Array, required) - opposite corners specified as [[lon, lat], [lon, lat]]
  • opts.minExtent (Number, optional) - If supplied, the bounds used to calculate the new map settings will be expanded if the delta width or height of the supplied bounds is smaller than this value.
  • opts.maxZoom=24 (Number, optional) - The returned zoom value will be capped to this value. Avoids returning infinite zoom when the supplied bounds have zero width or height deltas.
  • opts.padding=0 (Number, optional) - the amount of padding in pixels to add to the given bounds.
  • opts.offset=[0,0] (Array, optional) - the center of the given bounds relative to the map's center, [x, y] measured in pixels.

Returns:

  • {longitude, latitude, zoom}

Notes:

  • minExtent - Note that this value represents delta latitude/longitudes and value of 0.01 would roughly represent 1km.

normalizeViewportProps(viewport)​

This will adjust the map center and zoom so that the projected map fits into the target viewport size without white gaps.

Parameters:

  • viewport (Object)
  • viewport.width (Number, required)
  • viewport.height (Number, required)
  • viewport.longitude (Number, required)
  • viewport.latitude (Number, required)
  • viewport.zoom (Number, required)
  • viewport.pitch (Number, optional)

Returns:

  • viewport - normalized {width, height, longitude, latitude, zoom, pitch, bearing}

flyToViewport(startProps, endProps, t, opts)​

While flying from one viewport to another, returns in-transition viewport props at a given time. This util function implements the algorithm described in “Smooth and efficient zooming and panning.” by Jarke J. van Wijk and Wim A.A. Nuij.

Parameters:

  • startProps (Object) - viewport to fly from
  • startProps.width (Number, required)
  • startProps.height (Number, required)
  • startProps.longitude (Number, required)
  • startProps.latitude (Number, required)
  • startProps.zoom (Number, required)
  • endProps (Object) - viewport to fly from
  • endProps.longitude (Number, required)
  • endProps.latitude (Number, required)
  • endProps.zoom (Number, required)
  • t (Number) - a time factor between 0 and 1. 0 indicates the start of the transition, 1 indicates the end of the transition.
  • opts (Object, optional)
  • opts.curve (Number, optional, default: 1.414) - The zooming "curve" that will occur along the flight path, .

Returns:

  • {longitude, latitude, zoom}

getFlyToDuration(startProps, endProps, opts)​

Returns time in milliseconds, that is required perform transition from one viewport to another. Time returned is proportional to the distance we are transitioning to. This util function implements mapbox-gl-js (https://docs.mapbox.com/mapbox-gl-js/api/#map#flyto) duration calculation.

Parameters:

  • startProps (Object) - viewport to fly from
  • startProps.width (Number, required)
  • startProps.height (Number, required)
  • startProps.longitude (Number, required)
  • startProps.latitude (Number, required)
  • startProps.zoom (Number, required)
  • endProps (Object) - viewport to fly from
  • endProps.longitude (Number, required)
  • endProps.latitude (Number, required)
  • endProps.zoom (Number, required)
  • opts (Object, optional) - optional parameters that effect duration calculation.
  • opts.curve (Number, optional, default: 1.414) - The zooming "curve" that will occur along the flight path.
  • opts.speed (Number, optional, default: 1.2) - The average speed of the animation defined in relation to options.curve, it linearly affects the duration, higher speed returns smaller durations and vice versa.
  • opts.screenSpeed (Number, optional) - The average speed of the animation measured in screenfuls per second. Similar to opts.speed it linearly affects the duration, when specified opts.speed is ignored.
  • opts.maxDuration (Number, optional) - Maximum duration in milliseconds, if calculated duration exceeds this value, 0 is returned.

Returns:

  • duration Number, in milliseconds.