Web Mercator Latitude Limits and Distortion

Web Mercator cuts off at ±85.0511287798° because that is the latitude at which the projected world becomes exactly square, and a square world is what makes the quadtree tiling scheme work. Everything above that line has no tile. Everything below it is stretched by a factor that grows without bound as you approach the pole, and that stretch changes what a zoom level means depending on where you are.

When to Use This

Three situations force this into view: a dataset with features above 85° that vanish from the tileset, an area or length calculation done in projected coordinates that comes out wrong, and a zoom-level plan derived from equatorial ground resolution that turns out to be far too coarse at high latitude.

Specification Detail

Quantity Value Note
Latitude limit ±85.0511287798° atan(sinh(π)) in degrees
Projected extent ±20037508.34 m Half the equatorial circumference
Scale factor at latitude φ 1 / cos(φ) 1.0 at the equator, 2.0 at 60°, 11.5 at 85°
Area distortion 1 / cos²(φ) 4× at 60°, 132× at 85°
Ground resolution at z, φ 156543.03 × cos(φ) / 2^z metres per pixel

The forward projection is:

text
x = R × λ
y = R × ln(tan(π/4 + φ/2))

As φ approaches ±90°, y approaches infinity. Choosing φ so that y = ±R × π — the same magnitude as the x range at the antimeridian — gives the square world and the 85.0511° cut-off.

The scale factor grows slowly, then very fastLinear scale factor plotted against latitude from the equator to 85 degrees, showing a doubling at 60 degrees and a factor above 11 at the cut-off.DISTORTION11963020°40°50°60°70°80°85°latitude
Below about 40° the distortion is a curiosity. Above 60° it is a factor of two or more, and every ground-distance assumption derived at the equator is wrong by at least that much.

What This Means for a Tile Pipeline

Ground resolution per zoom is latitude-dependent. The familiar table of metres per pixel — 156543 at z0, halving each level — is the equatorial figure. At 60° north, every value is halved again; a z14 tile in Oslo covers about half the ground of a z14 tile in Nairobi.

The practical consequence lands on zoom planning. A maximum zoom calculation that measures feature density per square kilometre and converts to features per tile must use the tile’s local ground area, not the equatorial one. Using the equatorial figure for a Scandinavian city overestimates the features per tile by a factor of four, and produces a max zoom one or two levels deeper than necessary.

Areas computed in projected coordinates are meaningless. A polygon’s area in EPSG:3857 square metres is inflated by 1/cos²(φ). At 60° that is a factor of four; at 85° it is 132. Compute areas in a suitable equal-area projection or on the ellipsoid, never in Web Mercator.

Features above the limit are not in the tileset. They are not dropped by a flag or a filter, they simply have no tile to be in. A dataset of Arctic monitoring stations tiled without comment will silently lose everything above 85.05°.

The two ways this catches a pipeline outTwo panels: features above the latitude limit having no tile at all, and calculations performed in projected coordinates being inflated by the scale factor.TWO FAILURE MODESAbove the limitNo tile exists above 85.0511°Features there are simply absentNo warning from any toolAffects polar and Arctic datasetsData loss, silentlyBelow the limitCoordinates are fineDistances inflated by 1/cos(lat)Areas inflated by 1/cos²(lat)Zoom planning skewed at high latitudeCorrect geometry, wrong measurements
Neither raises an error. The first loses data quietly; the second produces numbers that are plausible and wrong.

Production Command

Find features that will not survive tiling, and measure the local ground resolution properly:

python
import math

MAX_LAT = 85.0511287798

def ground_resolution(latitude: float, zoom: int, tile_px: int = 256) -> float:
    """Metres per pixel at a latitude and zoom."""
    return (156543.03392 * math.cos(math.radians(latitude))) / (2 ** zoom) * (256 / tile_px)


def tile_ground_area_km2(latitude: float, zoom: int) -> float:
    side_m = ground_resolution(latitude, zoom) * 256
    return (side_m / 1000) ** 2


for city, lat in [("Nairobi", -1.29), ("London", 51.5), ("Oslo", 59.9), ("Tromsø", 69.6)]:
    print(f"{city:9s} z14 tile ≈ {tile_ground_area_km2(lat, 14):5.2f} km², "
          f"{ground_resolution(lat, 14):.2f} m/px")

# Nairobi   z14 tile ≈  9.36 km², 11.94 m/px
# London    z14 tile ≈  3.64 km²,  7.44 m/px
# Oslo      z14 tile ≈  2.36 km²,  6.00 m/px
# Tromsø    z14 tile ≈  1.15 km²,  4.18 m/px
bash
# Features that will have no tile at all
ogrinfo -dialect SQLite -sql \
  "SELECT COUNT(*) AS above_limit FROM stations WHERE ST_Y(geometry) > 85.0511" \
  stations.geojson
The same zoom level covers very different groundGround area of a single zoom 14 tile at four latitudes, from the equator to the Arctic Circle, showing an eightfold difference.GROUND AREAkm² covered by one z14 tileNairobi, 1.3°S9.36 km²London, 51.5°N3.64 km²Oslo, 59.9°N2.36 km²Tromsø, 69.6°N1.15 km²
A density threshold derived at the equator over-estimates features per tile by four times in Oslo. The zoom plan has to use the local figure.

Interaction Effects

With zoom-level optimisation. Density thresholds must be computed with the local tile area. A single global threshold produces tiles that are over budget at the equator or wastefully deep at high latitude — see zoom level optimization strategies.

With simplification tolerance. Tolerance expressed in ground units suffers the same latitude dependence. Expressing it in tile units — which is what Tippecanoe’s --simplification does — sidesteps the problem entirely, and is one reason that parameterisation is preferable.

With alternative projections. Polar datasets are usually better served by a projection built for them, such as EPSG:3413 for the Arctic, with its own tiling scheme. Vector tiles do not require Web Mercator; the tooling defaults to it, and stepping outside means giving up most of that tooling.

Common Mistakes

Clamping latitude to ±90° in a conversion. Produces a y tile index outside 0..2^z-1, and depending on the code either an exception or a request for a tile that cannot exist.

Using equatorial metres-per-pixel everywhere. The most common version of this error, and it makes every high-latitude zoom decision one or two levels too deep.

Computing area in EPSG:3857. Inflated by up to two orders of magnitude. This appears in choropleth density calculations more often than anywhere else, where it silently exaggerates high-latitude regions.

Assuming the limit is 85°. It is 85.0511287798°. The difference is about six kilometres, which is enough to include or exclude real features on a polar dataset.

FAQ

Why is the limit not exactly 85 degrees?

Because it is derived, not chosen. The value is atan(sinh(π)) expressed in degrees — the latitude at which the projected y extent equals the x extent, making the world square and the quadtree tiling scheme possible.

Can vector tiles cover the poles at all?

Not in Web Mercator. A different projection with its own tiling scheme can, and MapLibre supports custom projections to a limited extent, but the standard tooling — Tippecanoe, PMTiles clients, most tile servers — assumes Web Mercator throughout.

Does the distortion affect tile size?

Indirectly and significantly. A high-latitude tile covers less ground, so it holds fewer features, so it is smaller for the same data density. That is exactly why a max-zoom calculated at the equator is too deep further north.

Is Web Mercator wrong for maps?

It is wrong for measurement and fine for navigation, which is what it was designed for: it preserves angles locally, so shapes look right at any zoom. The failure is treating projected coordinates as measurable ground distances.