Speed made good calculator
Work out how fast you really advanced between two position fixes: two points 5.314523 km apart and half an hour apart give 10.629047 km/h, or 5.739226 knots, made good. Distance comes in km, nautical miles and metres. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Lat1
- 40.7128
- Lon1
- -74.006
- Lat2
- 40.758
- Lon2
- -73.9855
- Elapsed hours
- 0.5
- Distance km
- 5.314523
- Distance nmi
- 2.869613
- Distance m
- 5,314.523
- Smg kmh
- 10.629047
Speed made good, often abbreviated SMG, is the effective progress speed along a route measured from position fixes rather than from the path length of the track you actually followed. Skippers, pilots, fleet operators, and GPS log analysts ask a simple question after two position reports: how fast did we advance in a straight line between those points over the time that separated them? This speed made good calculator answers that question with a deterministic haversine great-circle distance between the two latitudes and longitudes, divided by the elapsed hours you supply. Results include distance in kilometres, nautical miles, and metres, plus SMG in kilometres per hour, knots, and metres per second—ready for marine, aviation, and land-nav contexts without unit converters on the side.
What speed made good means and how it differs from average speed
Speed made good is the ratio of straight-line displacement between two geographic fixes to the elapsed time between those fixes. On a sphere the straight line is the great-circle arc: the shortest surface path connecting fix one to fix two. Average speed uses the odometer or log distance you actually travelled, including detours, tacks, and traffic loops, so it can be much larger than SMG when the track wanders.
SMG answers how fast you made good toward the next waypoint in a straight-line sense; it is the number voyage planners compare against required speed of advance and against current or wind effects that pull you off the rhumb. When the two fixes coincide, distance is zero and SMG is zero for any positive elapsed time—stationary over ground in the straight-line sense. Use SMG when your source data is a pair of lat/lon timestamps; use path-length average speed when you already know total track distance including every bend.
What to enter and what you get back
Latitudes must lie in the closed interval from negative ninety to ninety degrees; longitudes must lie in the closed interval from negative one hundred eighty to one hundred eighty degrees. Elapsed hours must be strictly greater than zero because speed made good divides distance by time.
Example: a departure near Manhattan at about forty point seven one two eight north, seventy-four point zero zero six west, an arrival a few kilometres north-east half an hour later, yields a few kilometres of straight-line distance and an SMG on the order of urban transit speeds in km/h and knots. Fractional hours are allowed: fifteen minutes is zero point two five hours. Convert minutes to hours before calling if your log stores mm:ss rather than decimal hours.
Where speed made good is useful
Coastal and offshore sailing crews use SMG between successive GPS fixes to judge whether a current, a tack, or a routing choice actually improved progress toward the next mark, not merely increased water speed. Delivery fleets and long-haul trucking platforms compare SMG between depot geofences against scheduled speed-of-advance so late-risk alerts fire on true progress, not on noisy path-length averages swollen by urban loops. Aviation and UAV operators estimate ground progress between reported positions when ADS-B or telemetry samples arrive with timestamps but without a full integrated path.
Education and exam-prep sites that rank for speed made good calculator need a live tool whose free path matches the paid automation path on the same pure module. Pair this capability with a separate haversine distance tool when you only need the arc length, or with average-speed tools when your distance is already a path total rather than two fixes.
What you can do with it
Sailing and coastal navigation logs
Compute SMG between successive GPS fixes to measure true progress toward a waypoint against current, wind, and tacking efficiency.
Fleet progress and ETA risk
Convert depot-to-depot or stop-to-stop position pairs and elapsed hours into straight-line SMG for schedule risk dashboards.
Telemetry and education widgets
Give aviation, UAV, and classroom tools a deterministic SMG oracle from lat/lon pairs without a GIS server.
FAQ
How is speed made good different from average speed?
SMG uses straight-line great-circle distance between two position fixes. Average speed uses total path length travelled, including detours, so the two numbers diverge whenever the track is not a direct arc.
What units does the speed made good calculator return?
Distance in kilometres, nautical miles, and metres; SMG in kilometres per hour, knots (nmi/h), and metres per second. Elapsed time is always supplied in hours.
Why must the elapsed time be greater than zero?
Because speed made good divides the distance by the time. With zero time the speed would be infinite, so zero or negative hours are refused instead of producing a meaningless number.
How do I enter a time in minutes?
Convert it to decimal hours first: fifteen minutes is 0.25 hours and half an hour is 0.5. If your log stores minutes and seconds, convert that value to hours before you calculate.
When is speed made good useful at sea?
Between successive GPS fixes it shows whether a current or the wind is slowing your progress, and voyage planners compare it with the speed of advance they need.
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/speed-made-good \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"lat1":40.7128,"lon1":-74.006,"lat2":40.758,"lon2":-73.9855,"elapsed_hours":0.5}'const res = await fetch("https://api.kit.forhosting.com/geo/speed-made-good", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"lat1": 40.7128,
"lon1": -74.006,
"lat2": 40.758,
"lon2": -73.9855,
"elapsed_hours": 0.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/speed-made-good",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"lat1": 40.7128,
"lon1": -74.006,
"lat2": 40.758,
"lon2": -73.9855,
"elapsed_hours": 0.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/speed-made-good", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"lat1":40.7128,"lon1":-74.006,"lat2":40.758,"lon2":-73.9855,"elapsed_hours":0.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"lat1":40.7128,"lon1":-74.006,"lat2":40.758,"lon2":-73.9855,"elapsed_hours":0.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/speed-made-good", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"lat1": 40.7128,
"lon1": -74.006,
"lat2": 40.758,
"lon2": -73.9855,
"elapsed_hours": 0.5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.speed_made_good",
"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
What speed made good means and how it differs from average speed
This endpoint computes that arc with the haversine formula on a mean Earth radius of six thousand three hundred seventy-one kilometres, then divides by elapsed hours to produce SMG. That definition is intentionally different from overall average speed based on path length. When elapsed time approaches zero while fixes differ, SMG grows without bound, which is why this API rejects non-positive elapsed hours instead of inventing an infinite speed.
Input contract, response fields, and validation rules
POST a JSON body with five required finite numbers: lat1 and lon1 for the first fix, lat2 and lon2 for the second fix, and elapsed_hours for the positive time between the reports in hours. Missing fields, empty strings, non-finite values, out-of-range coordinates, and non-positive elapsed time all fail with invalid_input and are not billed. On success the body echoes the five inputs, then reports distance_km, distance_nmi, and distance_m for the haversine arc, and smg_kmh, smg_knots, and smg_mps for the resulting speeds. The formula field restates SMG equals haversine distance over elapsed hours, and the method field identifies the algorithm as speed_made_good_haversine.
Technical questions
How do I calculate speed made good from two fixes?
Send lat1, lon1, lat2, lon2 in decimal degrees and elapsed_hours greater than zero. The API returns haversine distance and SMG in km/h, knots, and m/s using SMG = distance / elapsed_hours.
Why is elapsed_hours rejected when zero or negative?
Speed made good divides distance by time. Zero or negative elapsed time makes the ratio undefined, so the task fails with invalid_input and is not billed.
What does the speed made good calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.