Web Mercator ground resolution calculator
At the equator and zoom 0, one pixel of a standard web map covers 156,543.033928 m and a full 256-pixel tile 40,075,016.6856 m. Each zoom level halves that, and higher latitudes shrink it further. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Latitude
- 0
- Zoom
- 0
- Meters per pixel
- 156,543.033928
- Meters per tile
- 40,075,016.6856
- Tile size px
- 256
- Earth radius m
- 6,378,137
This Web Mercator ground resolution calculator tells you how many meters on the ground are represented by one pixel at a chosen latitude and slippy-map zoom level. It uses the standard EPSG:3857 sphere, a 256-pixel tile, and the familiar XYZ tile pyramid used by common web maps. The result is useful when converting screen distances into approximate real-world distances, sizing map symbols, building scale bars, or selecting imagery for a target level of detail. The calculation is deterministic, requires no network access, and also reports the ground width represented by one complete tile.
Understand what ground resolution measures
Ground resolution expresses the approximate real-world distance covered by one map pixel, usually in meters per pixel. It is not the resolution of a monitor, the accuracy of a GPS reading, or the native detail of aerial imagery. Instead, it connects the digital grid of a Web Mercator map with distance along the Earth at a specified latitude.
At zoom zero, a standard slippy map places the full projected world into one 256-pixel tile. Every increase of one zoom level doubles the number of tiles in each direction, so the ground distance represented by each pixel is halved. Latitude matters because Web Mercator stretches the projected map as it approaches the poles.
A pixel at a high latitude therefore corresponds to less east-west ground distance than a pixel at the equator at the same zoom.
How the Web Mercator formula works
The calculator uses the equatorial radius 6,378,137 meters adopted by EPSG:3857. First it calculates the spherical equatorial circumference as two times pi times that radius. Dividing the circumference by 256 gives the initial resolution at zoom zero on the equator.
It then divides by two raised to the requested zoom, reflecting the doubling of the slippy-map grid at every level. Finally, it multiplies by the cosine of latitude in radians. In compact form, resolution equals cos(latitude) times 2πR, divided by 256 times 2^zoom.
The response uses a fixed 256-pixel tile because that is the standard logical tile size for XYZ maps. A renderer serving 512-pixel image tiles at the same logical zoom may need to account for its tile and zoom conventions before applying the value. Inputs are restricted to integer zoom levels from zero through thirty and latitudes inside the practical Web Mercator boundary of approximately plus or minus 85.05112878 degrees.
Rejecting values outside that boundary prevents a mathematically plausible number from being mistaken for a valid position in the finite slippy-map world.
Apply the result without overstating precision
Use ground resolution as a map-scale conversion, not as a promise that the source data is equally accurate. For example, a result of two meters per pixel means a ten-pixel line spans approximately twenty meters near the chosen latitude, but the underlying road geometry, satellite image, or device location may have a much larger uncertainty.
Scale also varies across a viewport because latitude changes from its top edge to its bottom edge; using the map center latitude is normally adequate for an ordinary interactive view, while tall regional exports may need values sampled at several latitudes. The result is especially practical for choosing clustering radii, converting a click tolerance into meters, estimating the footprint of a raster export, and labeling a scale bar. When comparing different zooms, remember that each whole zoom step halves meters per pixel.
When comparing places at one zoom, higher absolute latitudes produce smaller values because of the cosine adjustment.
What you can do with it
Build an accurate map scale bar
Convert a desired pixel width at the map center latitude into an approximate labeled ground distance.
Choose clustering and hit-test radii
Translate interface thresholds measured in pixels into meters at a specific zoom and latitude.
Plan raster exports
Estimate the ground width of tiles or image pixels before requesting or processing mapped imagery.
FAQ
What formula does this calculator use?
It uses cos(latitude) × 2π × 6378137 divided by 256 × 2^zoom. Latitude is converted to radians before applying cosine.
Why does resolution change with latitude?
Web Mercator expands scale toward the poles, so one projected pixel represents less ground distance at higher absolute latitudes.
Which tile size is assumed?
The calculation assumes the conventional logical slippy-map tile size of 256 pixels.
Can I use a fractional zoom level?
No. This capability accepts integer tile-pyramid zoom levels from 0 through 30.
How do I turn a distance on screen into metres on the ground?
Multiply the metres-per-pixel value by the width in pixels you measured on the map. The figure holds near the latitude you entered, so recalculate it when you move far north or south.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/geo/web-mercator-ground-resolution \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"latitude":40.7128,"zoom":12}'const res = await fetch("https://api.kit.forhosting.com/geo/web-mercator-ground-resolution", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"latitude": 40.7128,
"zoom": 12
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/web-mercator-ground-resolution",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"latitude": 40.7128,
"zoom": 12
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/web-mercator-ground-resolution", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"latitude":40.7128,"zoom":12}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"latitude":40.7128,"zoom":12}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/web-mercator-ground-resolution", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"latitude": 40.7128,
"zoom": 12
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.web_mercator_ground_resolution",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Understand what ground resolution measures
Use the returned meters_per_pixel value for scale estimates near the supplied latitude, and multiply it by a screen or symbol width in pixels to estimate the corresponding ground distance. The accompanying meters_per_tile value applies the same resolution to the full 256-pixel width of a conventional XYZ tile.
Technical questions
How much does an API request cost?
Each successful API item costs $0.002. Invalid input is returned as an invalid_input error.