lat1 float required Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive.
Great-circle distance, bearings, destinations and bounding boxes for WGS 84 coordinates on an explicitly documented mean-Earth sphere.
Authoritative reference data or standards computation
| Parameter | Type | Default & allowed | Description |
|---|---|---|---|
lat1
required
| float | allowed: -90 – 90 example: 51.5074 | Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive. |
lon1
required
| float | allowed: -180 – 180 example: -0.1278 | Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180. |
lat2
required
| float | allowed: -90 – 90 example: 40.7128 | Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive. |
lon2
required
| float | allowed: -180 – 180 example: -74.006 | Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180. |
lat1 float required Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive.
lon1 float required Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180.
lat2 float required Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive.
lon2 float required Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180.
| Parameter | Type | Default & allowed | Description |
|---|---|---|---|
fields | list | example: from,to | Return only these fields (comma-separated). Mutually exclusive with 'exclude'. |
exclude | list | example: radiusMeters | Return all fields except these (comma-separated). |
pretty | boolean | default: false example: true | Pretty-print the JSON response. |
unwrap | boolean | default: false example: true | Drop the envelope: return the raw array/object without data/meta wrapper. |
fields list Return only these fields (comma-separated). Mutually exclusive with 'exclude'.
exclude list Return all fields except these (comma-separated).
pretty boolean Pretty-print the JSON response.
unwrap boolean Drop the envelope: return the raw array/object without data/meta wrapper.
| Field | Type | Description | Example |
|---|---|---|---|
from | object | Canonical first coordinate as latitude/longitude. | {"latitude":51.5074,"longitude":-0.1278} |
to | object | Canonical second coordinate as latitude/longitude. | {"latitude":40.7128,"longitude":-74.006} |
centralAngleDegrees | float | Great-circle central angle in degrees. | 50.094212 |
distanceMeters | float | Great-circle arc length on the exposed spherical model, in meters. | 5570229.874 |
distanceKilometers | float | The same arc length in kilometers. | 5570.229874 |
initialBearingDegrees nullable | float | Forward bearing at the first point, clockwise from true north; null for non-unique geometry or a polar first point. | 288.33 |
finalBearingDegrees nullable | float | Forward bearing on arrival, clockwise from true north; null for non-unique geometry or a polar destination. | 231.21 |
isCoincident | boolean | True when both inputs identify the same point on the sphere. | false |
isAntipodal | boolean | True for diametrically opposite points, where infinitely many great circles connect them. | false |
model | string | Explicit calculation model: mean-earth-sphere (not an ellipsoidal or road distance). | mean-earth-sphere |
radiusMeters | float | IUGG mean Earth radius used by every calculation, in meters. | 6371008.8 |
from object Canonical first coordinate as latitude/longitude.
example: {"latitude":51.5074,"longitude":-0.1278}
to object Canonical second coordinate as latitude/longitude.
example: {"latitude":40.7128,"longitude":-74.006}
centralAngleDegrees float Great-circle central angle in degrees.
example: 50.094212
distanceMeters float Great-circle arc length on the exposed spherical model, in meters.
example: 5570229.874
distanceKilometers float The same arc length in kilometers.
example: 5570.229874
initialBearingDegrees float nullable Forward bearing at the first point, clockwise from true north; null for non-unique geometry or a polar first point.
example: 288.33
finalBearingDegrees float nullable Forward bearing on arrival, clockwise from true north; null for non-unique geometry or a polar destination.
example: 231.21
isCoincident boolean True when both inputs identify the same point on the sphere.
example: false
isAntipodal boolean True for diametrically opposite points, where infinitely many great circles connect them.
example: false
model string Explicit calculation model: mean-earth-sphere (not an ellipsoidal or road distance).
example: mean-earth-sphere
radiusMeters float IUGG mean Earth radius used by every calculation, in meters.
example: 6371008.8
/api/geodesy/distance?lat1=51.5074&lon1=-0.1278&lat2=40.7128&lon2=-74.0060 {
"data": {
"from": {
"latitude": 51.5074,
"longitude": -0.1278
},
"to": {
"latitude": 40.7128,
"longitude": -74.006
},
"centralAngleDegrees": 50.09421156,
"distanceMeters": 5570229.874,
"distanceKilometers": 5570.229874,
"initialBearingDegrees": 288.329701594,
"finalBearingDegrees": 231.212616824,
"isCoincident": false,
"isAntipodal": false,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/distance",
"params": {
"lat1": 51.5074,
"lon1": -0.1278,
"lat2": 40.7128,
"lon2": -74.006
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} /api/geodesy/distance?lat1=55.6761&lon1=12.5683&lat2=35.6762&lon2=139.6503 {
"data": {
"from": {
"latitude": 55.6761,
"longitude": 12.5683
},
"to": {
"latitude": 35.6762,
"longitude": 139.6503
},
"centralAngleDegrees": 78.143341114,
"distanceMeters": 8689155.085,
"distanceKilometers": 8689.155085,
"initialBearingDegrees": 41.466326635,
"finalBearingDegrees": 152.635624504,
"isCoincident": false,
"isAntipodal": false,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/distance",
"params": {
"lat1": 55.6761,
"lon1": 12.5683,
"lat2": 35.6762,
"lon2": 139.6503
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} /api/geodesy/distance?lat1=0&lon1=0&lat2=0&lon2=180 {
"data": {
"from": {
"latitude": 0,
"longitude": 0
},
"to": {
"latitude": 0,
"longitude": -180
},
"centralAngleDegrees": 180,
"distanceMeters": 20015114.442,
"distanceKilometers": 20015.114442,
"initialBearingDegrees": null,
"finalBearingDegrees": null,
"isCoincident": false,
"isAntipodal": true,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/distance",
"params": {
"lat1": 0,
"lon1": 0,
"lat2": 0,
"lon2": -180
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} Uses the exposed sphere and normalizes longitude. Non-zero journeys from an exact pole are rejected because initial compass bearing is undefined there.
| Parameter | Type | Default & allowed | Description |
|---|---|---|---|
lat
required
| float | allowed: -90 – 90 example: 55.6761 | Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive. |
lon
required
| float | allowed: -180 – 180 example: 12.5683 | Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180. |
bearing
required
| float | allowed: 0 – 360 example: 90 | Initial bearing clockwise from true north, 0–360 degrees; 360 canonicalizes to 0. |
distanceKm
required
| float | allowed: 0 – 40031 example: 1000 | Non-negative great-circle arc distance in kilometers, capped at 40031 (about one mean-Earth circumference). |
lat float required Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive.
lon float required Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180.
bearing float required Initial bearing clockwise from true north, 0–360 degrees; 360 canonicalizes to 0.
distanceKm float required Non-negative great-circle arc distance in kilometers, capped at 40031 (about one mean-Earth circumference).
| Parameter | Type | Default & allowed | Description |
|---|---|---|---|
fields | list | example: origin,bearingDegrees | Return only these fields (comma-separated). Mutually exclusive with 'exclude'. |
exclude | list | example: radiusMeters | Return all fields except these (comma-separated). |
pretty | boolean | default: false example: true | Pretty-print the JSON response. |
unwrap | boolean | default: false example: true | Drop the envelope: return the raw array/object without data/meta wrapper. |
fields list Return only these fields (comma-separated). Mutually exclusive with 'exclude'.
exclude list Return all fields except these (comma-separated).
pretty boolean Pretty-print the JSON response.
unwrap boolean Drop the envelope: return the raw array/object without data/meta wrapper.
| Field | Type | Description | Example |
|---|---|---|---|
origin | object | Canonical start coordinate. | {"latitude":55.6761,"longitude":12.5683} |
bearingDegrees | float | Canonical initial bearing in [0, 360). | 90 |
distanceKilometers | float | Requested spherical arc distance in kilometers. | 1000 |
destination | object | Calculated coordinate with longitude normalized to [-180, 180). | {"latitude":55.002,"longitude":28.227} |
finalBearingDegrees nullable | float | Forward bearing at the destination; null for zero distance or a polar destination where local north is undefined. | 102.8 |
model | string | Explicit calculation model: mean-earth-sphere (not an ellipsoidal or road distance). | mean-earth-sphere |
radiusMeters | float | IUGG mean Earth radius used by every calculation, in meters. | 6371008.8 |
origin object Canonical start coordinate.
example: {"latitude":55.6761,"longitude":12.5683}
bearingDegrees float Canonical initial bearing in [0, 360).
example: 90
distanceKilometers float Requested spherical arc distance in kilometers.
example: 1000
destination object Calculated coordinate with longitude normalized to [-180, 180).
example: {"latitude":55.002,"longitude":28.227}
finalBearingDegrees float nullable Forward bearing at the destination; null for zero distance or a polar destination where local north is undefined.
example: 102.8
model string Explicit calculation model: mean-earth-sphere (not an ellipsoidal or road distance).
example: mean-earth-sphere
radiusMeters float IUGG mean Earth radius used by every calculation, in meters.
example: 6371008.8
/api/geodesy/destination?lat=55.6761&lon=12.5683&bearing=90&distanceKm=1000 {
"data": {
"origin": {
"latitude": 55.6761,
"longitude": 12.5683
},
"bearingDegrees": 90,
"distanceKilometers": 1000,
"destination": {
"latitude": 54.657697998,
"longitude": 28.246258981
},
"finalBearingDegrees": 102.895471621,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/destination",
"params": {
"lat": 55.6761,
"lon": 12.5683,
"bearing": 90,
"distanceKm": 1000
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} /api/geodesy/destination?lat=0&lon=179&bearing=90&distanceKm=500 {
"data": {
"origin": {
"latitude": 0,
"longitude": 179
},
"bearingDegrees": 90,
"distanceKilometers": 500,
"destination": {
"latitude": 0,
"longitude": -176.503398181
},
"finalBearingDegrees": 90,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/destination",
"params": {
"lat": 0,
"lon": 179,
"bearing": 90,
"distanceKm": 500
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} /api/geodesy/destination?lat=-33.8688&lon=151.2093&bearing=42&distanceKm=0 {
"data": {
"origin": {
"latitude": -33.8688,
"longitude": 151.2093
},
"bearingDegrees": 42,
"distanceKilometers": 0,
"destination": {
"latitude": -33.8688,
"longitude": 151.2093
},
"finalBearingDegrees": null,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/destination",
"params": {
"lat": -33.8688,
"lon": 151.2093,
"bearing": 42,
"distanceKm": 0
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} | Parameter | Type | Default & allowed | Description |
|---|---|---|---|
lat
required
| float | allowed: -90 – 90 example: 55.6761 | Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive. |
lon
required
| float | allowed: -180 – 180 example: 12.5683 | Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180. |
radiusKm
required
| float | allowed: 0 – 40031 example: 100 | Spherical radius in kilometers, 0–40031. A radius reaching either pole spans all longitudes. |
lat float required Latitude in WGS 84 decimal degrees, from -90 to 90 inclusive.
lon float required Longitude in WGS 84 decimal degrees, from -180 to 180 inclusive; +180 canonicalizes to -180.
radiusKm float required Spherical radius in kilometers, 0–40031. A radius reaching either pole spans all longitudes.
| Parameter | Type | Default & allowed | Description |
|---|---|---|---|
fields | list | example: center,radiusKilometers | Return only these fields (comma-separated). Mutually exclusive with 'exclude'. |
exclude | list | example: radiusMeters | Return all fields except these (comma-separated). |
pretty | boolean | default: false example: true | Pretty-print the JSON response. |
unwrap | boolean | default: false example: true | Drop the envelope: return the raw array/object without data/meta wrapper. |
fields list Return only these fields (comma-separated). Mutually exclusive with 'exclude'.
exclude list Return all fields except these (comma-separated).
pretty boolean Pretty-print the JSON response.
unwrap boolean Drop the envelope: return the raw array/object without data/meta wrapper.
| Field | Type | Description | Example |
|---|---|---|---|
center | object | Canonical center coordinate. | {"latitude":55.6761,"longitude":12.5683} |
radiusKilometers | float | Requested spherical radius in kilometers. | 100 |
south | float | Minimum latitude, clamped to -90. | 54.7768 |
north | float | Maximum latitude, clamped to 90. | 56.5754 |
west | float | Western longitude; greater than east when the box crosses the antimeridian. | 10.98 |
east | float | Eastern longitude; less than west when the box crosses the antimeridian. | 14.15 |
crossesAntimeridian | boolean | True when the longitude interval wraps across ±180 degrees. | false |
spansAllLongitudes | boolean | True when the radius reaches a pole or covers the full globe. | false |
model | string | Explicit calculation model: mean-earth-sphere (not an ellipsoidal or road distance). | mean-earth-sphere |
radiusMeters | float | IUGG mean Earth radius used by every calculation, in meters. | 6371008.8 |
center object Canonical center coordinate.
example: {"latitude":55.6761,"longitude":12.5683}
radiusKilometers float Requested spherical radius in kilometers.
example: 100
south float Minimum latitude, clamped to -90.
example: 54.7768
north float Maximum latitude, clamped to 90.
example: 56.5754
west float Western longitude; greater than east when the box crosses the antimeridian.
example: 10.98
east float Eastern longitude; less than west when the box crosses the antimeridian.
example: 14.15
crossesAntimeridian boolean True when the longitude interval wraps across ±180 degrees.
example: false
spansAllLongitudes boolean True when the radius reaches a pole or covers the full globe.
example: false
model string Explicit calculation model: mean-earth-sphere (not an ellipsoidal or road distance).
example: mean-earth-sphere
radiusMeters float IUGG mean Earth radius used by every calculation, in meters.
example: 6371008.8
/api/geodesy/bbox?lat=55.6761&lon=12.5683&radiusKm=100 {
"data": {
"center": {
"latitude": 55.6761,
"longitude": 12.5683
},
"radiusKilometers": 100,
"south": 54.776779636,
"north": 56.575420364,
"west": 10.973253875,
"east": 14.163346125,
"crossesAntimeridian": false,
"spansAllLongitudes": false,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/bbox",
"params": {
"lat": 55.6761,
"lon": 12.5683,
"radiusKm": 100
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} /api/geodesy/bbox?lat=0&lon=179&radiusKm=500 {
"data": {
"center": {
"latitude": 0,
"longitude": 179
},
"radiusKilometers": 500,
"south": -4.496601819,
"north": 4.496601819,
"west": 174.503398181,
"east": -176.503398181,
"crossesAntimeridian": true,
"spansAllLongitudes": false,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/bbox",
"params": {
"lat": 0,
"lon": 179,
"radiusKm": 500
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} /api/geodesy/bbox?lat=89&lon=30&radiusKm=500 {
"data": {
"center": {
"latitude": 89,
"longitude": 30
},
"radiusKilometers": 500,
"south": 84.503398181,
"north": 90,
"west": -180,
"east": 180,
"crossesAntimeridian": false,
"spansAllLongitudes": true,
"model": "mean-earth-sphere",
"radiusMeters": 6371008.8
},
"meta": {
"endpoint": "geodesy",
"route": "/bbox",
"params": {
"lat": 89,
"lon": 30,
"radiusKm": 500
},
"generatedAt": "2026-07-30T15:14:08.000Z"
}
} Pure spherical geodesy for coordinate work: great-circle distance and bearings, a destination from bearing plus distance, and a radius bounding box. Inputs use WGS 84 latitude/longitude order and ranges, while the calculation surface is an explicitly documented sphere with the IUGG mean Earth radius 6,371,008.8 metres.
This honesty matters: the endpoint does not claim ellipsoidal survey precision, road distance, flight routing, terrain clearance or uncertainty inferred from decimal digits. The response always includes model: "mean-earth-sphere" and radiusMeters, so callers can decide whether the approximation fits their use case.
/distance returns central angle, distance, initial/final bearings, and explicit coincident/antipodal flags. Bearings are null where a unique direction or local north reference does not exist (coincident/antipodal geometry and the relevant geographic pole)./destination follows the great circle from one point for a bearing and non-negative distance, normalizing the result longitude to [-180, 180). A non-zero journey cannot start exactly at a pole because an initial compass bearing has no local-north reference there; that case is an explicit 400./bbox returns the smallest latitude/longitude-aligned spherical bounding box for a radius. It exposes antimeridian crossing (west > east) and pole/full-longitude coverage instead of returning a misleading ordinary box.All calculations are deterministic, synchronous and dataset-free.
No. Coordinates use WGS 84 ranges, but the calculation uses the exposed IUGG mean-Earth sphere. It is a great-circle approximation, not survey, route or terrain distance.
Distance remains defined, but coincident/antipodal bearings are null. A bearing evaluated at a pole is also null; a non-zero destination journey cannot start at a pole and returns 400.
Yes. crossesAntimeridian is true and west is greater than east; boxes reaching a pole instead set spansAllLongitudes and use -180 to 180.
Random geographic coordinates: uniform across the globe (no pole clustering), inside a bounding box, or within a radius of a point — with haversine distances.
6,300+ world cities from a pinned GeoNames snapshot: coordinates, IANA timezone, population and capital flag — filter by country, size, name or distance.
Every scheduled-service airport with an IATA code — 4,159 rows with ICAO code, city, country, coordinates, elevation and IANA time zone.
Coherent fake flight fixtures between real hub airports, with working route, status, cabin and departure-window filters — never live operations.
Deterministic unit conversion across 14 categories — length, mass, pressure, energy, power, force, angle, time and more — with exact standard factors.
Encode coordinates to a geohash at any precision, decode a hash to its exact cell bounds and center, and list its eight neighbors.