Wind direction to 32-point compass calculator
This wind direction converter turns an angle measured clockwise from north into the nearest point on a thirty-two-point compass rose.
Run — free
It identifies familiar cardinal and intercardinal bearings as well as precise by-points such as Northeast by east and South by west. Enter any finite direction from zero through 360 degrees to receive the point name, standard abbreviation, normalized angle, point index, and exact sector center. The calculation is deterministic and applies nearest-sector rounding consistently at every boundary.
Reading a thirty-two-point compass rose
A thirty-two-point compass rose divides one full turn into 32 equal sectors. Each sector spans 11.25 degrees, providing finer language than the four cardinal directions or the familiar eight-point rose. Starting at North, the sequence moves clockwise through North by east, North-northeast, Northeast by north, and Northeast before continuing toward East. The same pattern repeats around the circle. The short forms preserve those relationships: N means North, NNE means North-northeast, and NEbN means Northeast by north, where the lowercase b reads as “by.” This calculator returns both the abbreviation and the full English name, so its output works for compact logs as well as reports intended for readers who may not recognize every traditional symbol. It also returns a zero-based point index. North is index 0, East is index 8, South is index 16, and West is index 24. That regular numbering makes the result convenient for software, tables, and consistent downstream grouping.
How the nearest compass point is selected
Wind direction degrees are measured clockwise from north: 0 degrees is North, 90 is East, 180 is South, and 270 is West. Because adjacent points on a 32-point rose are 11.25 degrees apart, the converter rounds the supplied direction to the nearest multiple of 11.25. A boundary lies halfway between two centers, or 5.625 degrees from either one. At an exact halfway boundary, the clockwise sector is selected, giving every possible input one deterministic result. For example, an angle centered on 67.5 degrees maps exactly to East-northeast, while an angle just below its clockwise boundary still maps to that same point. The returned sector center shows the representative angle for the chosen point and makes the rounding visible. A supplied value of 360 degrees is valid and represents the same physical bearing as 0, so the normalized angle and sector center are both 0 while the original submitted direction remains available in the output. Inputs below 0 or above 360 are rejected rather than silently wrapped.
Using fine bearings responsibly
The extra precision of a 32-point name is useful when a cardinal or eight-point label would discard too much directional detail. Weather observers can turn station headings into readable fine bearings, sailors can interpret traditional compass notation, and developers can label map arrows or sensor records without maintaining their own boundary table. However, the result is a classification, not a claim that the source measurement is accurate to 11.25 degrees. A direction produced by a gusty sensor may cross a sector boundary repeatedly, and a rounded compass point should not replace the original angle when exact measurements matter. Keep the input degrees alongside the point for auditing or later analysis; this capability does so in every successful response. Wind direction convention also matters: meteorological wind direction normally describes where wind comes from, whereas a travel heading describes where something points or moves. The numerical conversion is identical, but the interpretation is different. Confirm the convention used by your source before presenting the resulting compass label to readers.
What you can do with it
Label weather station readings
Convert numeric wind-direction observations into precise, readable compass points while retaining the original degrees.
Interpret traditional marine bearings
Match degree headings to fine compass-rose names and abbreviations used in navigation notes and historical records.
Build directional interfaces
Assign stable 32-sector labels and indexes to map indicators, dashboards, sensor displays, or exported datasets.
FAQ
How much does the conversion cost?
It runs free in your browser. An API conversion costs $0.002 per request.
Why are there 11.25 degrees between points?
A full 360-degree circle divided by 32 equal compass points gives 11.25 degrees per point.
What happens at an exact boundary between two points?
The calculator consistently selects the clockwise point when the angle is exactly halfway between adjacent sector centers.
Are 0 degrees and 360 degrees both North?
Yes. Both represent North; an input of 360 is normalized to 0 while the submitted value is preserved separately.
Can I enter a negative direction or a value above 360?
No. Values outside the inclusive range from 0 through 360 degrees return an invalid-input error.
Does wind direction mean where the wind comes from?
In meteorology it usually does. The converter classifies the supplied angle, so confirm the convention used by the source of your data.
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/earth/wind-direction-to-compass-32 \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"direction_degrees":73.2}'const res = await fetch("https://api.kit.forhosting.com/earth/wind-direction-to-compass-32", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"direction_degrees": 73.2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/earth/wind-direction-to-compass-32",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"direction_degrees": 73.2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/earth/wind-direction-to-compass-32", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"direction_degrees":73.2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"direction_degrees":73.2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/earth/wind-direction-to-compass-32", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"direction_degrees": 73.2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "earth.wind_direction_to_compass_32",
"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. |