Slippy tile bounding box
Get the full rectangle covered by any web map tile from its column, row and zoom: tile 0/0/0 spans the whole world, from -180° to 180° in longitude and from -85.0511287798° to 85.0511287798° in latitude. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- X
- 0
- Y
- 0
- Z
- 0
- Zoom
- 0
- N
- 1
- Min lat
- -85.0511287798
- Min lon
- -180
A slippy map tile is one square cell in the fixed Web Mercator grid that powers OpenStreetMap, Leaflet, Mapbox, and most raster tile caches. Each tile is addressed by integers x, y, and zoom z: at zoom zero a single tile covers the world, and each zoom step doubles the grid on both axes. The path is pure finite arithmetic with no network tile fetches, no sampling, and no date-dependent shortcuts.
How a map tile turns into a rectangle on the globe
Web maps cut the world into square tiles on a Web Mercator grid, and each tile is named by three whole numbers: a zoom level, a column and a row. At zoom 0 a single tile covers the whole map, and each step in zoom doubles the number of columns and rows. Columns count eastward from the antimeridian at -180° longitude, and rows count southward from the top edge, so row 0 is always the northernmost band. The calculator turns those three numbers into the tile's full rectangle: its south, west, north and east edges, the four named corners, the center, and the width and height in degrees. Longitudes are spaced evenly, while latitudes follow the Mercator stretch, which is why the single world tile runs from -85.0511287798° to 85.0511287798°.
When it helps and the mistakes to avoid
Use it to clip data or a database query to exactly the area of one tile, to read a column, row and zoom from a tile address or an error log and see where on Earth they point, or to check your own tile code. The most common mistake is assuming that rows count upward from the south; here row 0 is the top band. Another is entering a column or row that does not exist at that zoom: indexes must stay between 0 and 2 to the power of the zoom minus 1, and the zoom must be from 0 to 22, otherwise the input is refused. Results are rounded to the number of decimals you choose, 10 by default.
What a tile bounding box is and what you get
A slippy map tile is one square cell in a fixed Web Mercator grid addressed by integers x, y, and z. Zoom z sets the resolution: there are two to the z columns and the same number of rows, so the world is covered by four to the z tiles. Column x increases eastward from the antimeridian at longitude negative one hundred eighty; row y increases southward from the northern edge of the mercator square, so y equals zero is always the northernmost band.
This calculator returns the full geographic rectangle of the requested tile — not only the north-west corner, not the tile center alone, and not a geohash or radius envelope.
What you can do with it
Clip vectors and spatial SQL to a tile
Turn x, y, and zoom into min/max lat-lon for BETWEEN clauses, R-tree filters, and GeoJSON rectangles that match a slippy tile URL.
Debug tile URLs and CDN logs
Paste column, row, and zoom from a raster path or 404 log and see the full geographic envelope for quick map context.
FAQ
What does the slippy tile bounding box calculator cost?
It is free in your browser on this page.
How is this different from map tile to lat/lon?
Map tile to lat/lon returns only the north-west corner. This tool returns the full min/max latitude and longitude rectangle of the tile, plus corners and center.
What happens if x or y is outside the zoom range?
For zoom z, both x and y must be integers in [0, 2^z − 1].
Why are results rounded to a precision?
Default precision is 10 decimal places; you can set precision from 0 to 15.
Which way do tile rows and columns count?
Columns count eastward from the antimeridian at -180° longitude, and rows count southward from the top edge of the map. Row 0 is therefore always the northernmost band at every zoom level.
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/tile-bounds \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"x":0,"y":0,"z":0}'const res = await fetch("https://api.kit.forhosting.com/geo/tile-bounds", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"x": 0,
"y": 0,
"z": 0
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/tile-bounds",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"x": 0,
"y": 0,
"z": 0
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/tile-bounds", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"x":0,"y":0,"z":0}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"x":0,"y":0,"z":0}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/tile-bounds", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"x": 0,
"y": 0,
"z": 0
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.tile_bounds",
"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.
Limits
max_zoom | 22 |
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
Use it free in the browser for debug sessions and teaching demos, or call the API at $0.002 per successful request when pipelines need reproducible tile envelopes.
What a slippy tile bounding box is and what the response contains
The response echoes the validated integers x, y, and z, a zoom alias, the grid size n equals two to the z, a bbox object with min_lat, min_lon, max_lat, and max_lon rounded to the requested precision, flat aliases for those four extents, named corners sw, ne, nw, and se as latitude and longitude pairs, a center midpoint, width_deg and height_deg for the angular span, the method tag slippy_web_mercator_tile_bounds, the precision used, and a compact formula string for documentation. There is no reverse geocoding path, no network call to a tile CDN, and no random jitter: the engine either projects the four edges inside the supported zoom range or rejects the input with invalid_input. Rejected cases include missing x, y, or z, non-integer values, zoom outside zero through twenty-two, and any tile index that is negative or greater than or equal to two to the z for that zoom.
How x, y, and z are read and how bounds stay reproducible
Zoom must lie in zero through twenty-two inclusive, matching common web-map practice and keeping two to the z inside a safe integer grid. Longitude edges use simple linear scaling: west equals x over n times three hundred sixty minus one hundred eighty, and east uses x plus one. Latitude edges use the classic inverse mercator: north from row y and south from row y plus one via arctangent of sinh of pi times one minus two times the row over n, converted to degrees. The preferred fields are x for the tile column, y for the tile row, and z for the zoom level, but aliases tile_x, col, and column for x, tile_y and row for y, and zoom, zoom_level, and level for z are accepted so query strings, spreadsheets, and typed forms can reuse the same contract. Values may arrive as JSON numbers or as decimal integer strings; floats, hex prefixes, and empty strings are rejected with a clear message so a bad cell does not become a wrong meridian. After z is known, both x and y must satisfy zero less than or equal to index less than two to the z; an out-of-range pair fails with invalid_input and an explicit message that the tile indices exceed the range allowed for that zoom. An optional precision field, with aliases decimals and dp, chooses how many decimal places to expose for all latitudes and longitudes, defaulting to ten and capped at fifteen so JSON goldens stay stable. Pair the free browser run on this page with the priced API when you need the identical mathematical result inside an automated pipeline without re-implementing Web Mercator tile bounds yourself.
Where tile bounding boxes fit in maps, GIS, and software
GIS students use the same conversion when a course introduces Web Mercator after plate carrée and asks for the latitude range of a given tile, not just one corner. Backend services expand tile addresses from CDN logs or client requests into SQL BETWEEN filters, R-tree queries, or GeoJSON rectangles for analytics and heatmaps. Support engineers paste x, y, and z from a 404 and need the full geographic context in one step. On this page the work runs entirely in your browser; through the API each successful lookup costs $0.002, failed validation is not charged, and nothing is stored after the response returns. That split — free interactive exploration and a priced, identical API — matches the rest of the KIT tier-A catalog and lets you move from a classroom demo to an automated pipeline without changing the mathematical result. Pair it with corner-only tile projection, geohash decode, or other geo endpoints when you are building a small lab of free, deterministic mapping helpers, and keep this tool focused on the single question: given a slippy tile, what is its geographic bounding box on Earth.
Integration use cases
Deterministic map test fixtures
Generate reproducible bounding boxes for unit tests of Web Mercator layout, zoom math, viewport code, and tile-bound labels.
Technical questions
Is this the same grid as OpenStreetMap and Leaflet?
Yes. It uses the standard Web Mercator XYZ numbering (y=0 at the north, x=0 at longitude −180) shared by OSM, Leaflet, Mapbox, and most slippy caches.