Azimuth and distance from coordinates calculator for survey stations
This azimuth and distance calculator converts two planar survey station coordinates into the direction and horizontal separation from the first station to the second.
Run — free
Enter the easting and northing for the occupied station, then the matching coordinates for the target station. The result includes clockwise azimuth from grid north, horizontal distance in the same unit as the coordinates, and both coordinate differences for a transparent survey check.
Set up the occupied and target stations correctly
Treat station 1 as the occupied, backsight-free starting point and station 2 as the target whose direction you need. Enter both coordinate pairs in one consistent projected or local grid. Easting measures displacement along the grid's east axis, while northing measures displacement along its north axis. Coordinate values may be positive or negative, but all four values must use the same origin, scale, datum, and linear unit. If your coordinates are in metres, the returned horizontal distance is in metres; if they are in feet, the distance is in feet. The calculator does not transform geographic latitude and longitude and does not apply a map projection. It also does not reconcile mixed grid zones, international feet, US survey feet, or site grids with different rotations. Preserve enough coordinate precision for the accuracy required by your work. Finally, remember that reversing the two stations changes the direction: the distance stays equal, but the reverse azimuth differs by 180 degrees after normalization.
Understand the azimuth and distance calculation
The calculator first subtracts station 1 from station 2. The resulting delta easting is positive when the target lies east of the occupied station, and delta northing is positive when it lies north. Horizontal distance is the planar hypotenuse formed by those two differences. Azimuth uses the survey convention of zero degrees at grid north, increasing clockwise: east is 90 degrees, south is 180 degrees, and west is 270 degrees. Internally, the direction comes from an atan2 calculation with delta easting as the first directional component and delta northing as the second. That ordering matters because the more familiar mathematical polar angle starts at the positive horizontal axis and grows counterclockwise. Negative raw directions are normalized into the interval from zero degrees inclusive to 360 degrees exclusive. Results are rounded consistently to ten decimal places. The returned deltas make it straightforward to reproduce the calculation independently, inspect signs, or carry the components into a traverse worksheet.
Use the result within its surveying limits
This is a plane-coordinate calculation, so its azimuth is a grid azimuth rather than automatically a true, magnetic, or geodetic azimuth. Apply an appropriate convergence or orientation correction separately when your project requires a different north reference. The calculation also returns a two-dimensional horizontal distance; it does not use elevations, slope distance, scale factor, sea-level reduction, combined factor, curvature, refraction, or instrument and target heights. Those corrections belong in the surrounding survey workflow and depend on the coordinate reference system and field method. A zero-distance pair is rejected because two coincident stations do not define a direction. For quality control, compare the delta signs with the expected quadrant, confirm the coordinate units, and check whether the target should lie generally northeast, southeast, southwest, or northwest. In production automation, retain the input coordinates and returned components beside the final azimuth and distance so reviewers can trace the result. The deterministic API performs the same arithmetic for identical inputs and costs $0.002 per request.
What you can do with it
Prepare a stakeout
Convert occupied and target grid coordinates into a clockwise grid azimuth and horizontal distance for field preparation.
Check a traverse course
Recalculate a course direction and length from adjusted station coordinates and compare them with a traverse worksheet.
Audit coordinate geometry
Expose delta easting and delta northing alongside the final result so sign, quadrant, and distance checks remain traceable.
FAQ
From which direction is the azimuth measured?
It is measured clockwise from grid north: north is 0 degrees, east is 90, south is 180, and west is 270.
What unit is the horizontal distance in?
It uses the same linear unit as the supplied coordinates. The calculator does not convert between metres and feet.
Can I enter latitude and longitude?
No. Use easting and northing from one projected or local plane coordinate system. Geographic coordinates require a geodetic calculation or projection first.
Does the result represent true north?
Not necessarily. It is a grid azimuth based on the northing axis. Apply convergence or another orientation correction when true or magnetic north is required.
Why are coincident stations rejected?
They have zero horizontal distance and no unique direction, so an azimuth cannot be defined.
What does the API request cost?
Each API request costs $0.002. The browser calculation is free.
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/eng/azimuth-from-coords \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"easting_1":5000,"northing_1":10000,"easting_2":5125.5,"northing_2":10175.25}'const res = await fetch("https://api.kit.forhosting.com/eng/azimuth-from-coords", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"easting_1": 5000,
"northing_1": 10000,
"easting_2": 5125.5,
"northing_2": 10175.25
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/eng/azimuth-from-coords",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"easting_1": 5000,
"northing_1": 10000,
"easting_2": 5125.5,
"northing_2": 10175.25
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/eng/azimuth-from-coords", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"easting_1":5000,"northing_1":10000,"easting_2":5125.5,"northing_2":10175.25}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"easting_1":5000,"northing_1":10000,"easting_2":5125.5,"northing_2":10175.25}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/eng/azimuth-from-coords", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"easting_1": 5000,
"northing_1": 10000,
"easting_2": 5125.5,
"northing_2": 10175.25
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "eng.azimuth_from_coords",
"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. |