Skip to main content

Coordinates

wemap-sdk-js


Class: Coordinates

A Coordinates position using at least latitude (lat) and longitude (lng). Optionnal fields are: altitude (alt) and level.

Basic geo methods are directly accessibles from here: distanceTo, bearingTo, toEcef...

Coordinates are WGS84 and every transformation here uses the ellipsoid, so the local up axis is the ellipsoid normal and the ECEF / ENU geometry reads alt as a height above the ellipsoid.

What alt actually carries is not settled across the SDK, and that predates this class: the position providers put a height above the ground in it (Constants.DEFAULT_ALTITUDE is 1.6m, a phone in a hand), while GeoRef.localToWorld compares it against the absolute floorAltitude / ceilingAltitude of a building level. Both cannot be right. Only differences matter to the geometry here, which is why the ambiguity has never surfaced as a bug, but level detection does depend on the answer.

(Until 2026-08 this class modelled the earth as a sphere of radius R_MAJOR for speed. That cost ~0.35% of anisotropic scale error at mid-latitude and tilted the local vertical by 11.5', i.e. ~33cm of altitude error per 100m of horizontal travel.)

Extended by

Constructors

Constructor

new Coordinates(lat, lng, alt?, level?): Coordinates

Parameters

lat

number

lng

number

alt?

number | null

level?

Level_t = null

Returns

Coordinates

Properties

autoWrap

autoWrap: boolean = true

Accessors

alt

Get Signature

get alt(): number | null

alt does not denote the altitude of a point but its height from the "level" field (if defined) or from the ground /!\ This is the providers' convention, not GeoRef's: see the class header.

Returns

number | null

Set Signature

set alt(alt): void

Parameters
alt

number | null

Returns

void


ecef

Get Signature

get ecef(): Vector3_t

https://gist.github.com/klucar/1536194

Returns

Vector3_t


ecefToEnuRotation

Get Signature

get ecefToEnuRotation(): Quaternion_t

Returns

Quaternion_t


enuToEcefRotation

Get Signature

get enuToEcefRotation(): Quaternion_t

ECEF Transformations (WGS84 ellipsoid)

Returns

Quaternion_t


heightFromFloor

Get Signature

get heightFromFloor(): number | null

Returns

number | null

Set Signature

set heightFromFloor(heightFromFloor): void

Parameters
heightFromFloor

number | null

Returns

void


heightFromGround

Get Signature

get heightFromGround(): number | null

Returns

number | null

Set Signature

set heightFromGround(heightFromGround): void

Parameters
heightFromGround

number | null

Returns

void


lat

Get Signature

get lat(): number

Returns

number

Set Signature

set lat(lat): void

Parameters
lat

number

Returns

void


latitude

Get Signature

get latitude(): number

Returns

number

Set Signature

set latitude(_): void

Parameters
_

number

Returns

void


level

Get Signature

get level(): Level_t

Returns

Level_t

Set Signature

set level(level): void

Parameters
level

Level_t

Returns

void


lng

Get Signature

get lng(): number

Returns

number

Set Signature

set lng(lng): void

Parameters
lng

number

Returns

void


longitude

Get Signature

get longitude(): number

Returns

number

Set Signature

set longitude(_): void

Parameters
_

number

Returns

void

Methods

bearingTo()

bearingTo(location2): number

Azimuth to another point, in radians, clockwise from north. Taken in the local ENU frame, so it matches the true geodesic azimuth within 0.02" even at 100km.

Parameters

location2

Coordinates

Returns

number


clone()

clone(): Coordinates

Deep clone coordinates

Returns

Coordinates


destinationPoint()

destinationPoint(distance, bearing, elevation?): Coordinates

Parameters

distance

number

bearing

number

elevation?

number | null

Returns

Coordinates

Throws

if elevation is defined and point altitude is not defined


distanceTo()

distanceTo(location2): number

Returns the ground distance between two points in meters, on the WGS84 ellipsoid. Altitudes are ignored, as many callers compare positions across levels.

The chord between the two ECEF points is exact; converting it back to an arc length on the locally fitting sphere is what costs accuracy, and it costs very little: 3nm at 340m, 3um at 14km, 1.2m at 557km.

The one case where this is worse than the old haversine is a path along the equator, where the arc radius is R_MAJOR but the Gaussian radius is R_MINOR: 264m over 3340km, 9.3km over 10000km, against an exact haversine there. Everywhere else, and at every distance this SDK works at, it is orders of magnitude better.

Parameters

location2

Coordinates

Returns

number


equals()

equals(other): boolean

Parameters

other

Coordinates

Returns

boolean


equalsWithoutLevel()

equalsWithoutLevel(other, eps?, epsAlt?): boolean

Parameters

other

Coordinates

eps?

number = EPS_DEG_MM

epsAlt?

number = EPS_MM

Returns

boolean


getSegmentProjection()

getSegmentProjection(p1, p2): Coordinates | null

https://stackoverflow.com/questions/1299567/how-to-calculate-distance-from-a-point-to-a-line-segment-on-a-sphere

Great-circle geometry, so it stays on the sphere: normalizing an ellipsoidal ECEF vector would yield a geocentric direction and shift the projection by tens of meters. The closure test that rejects a point off the segment measures angles between the same unit vectors, for the same reason: mixing in the geodesic distanceTo would compare a great circle with a geodesic and reject valid projections on long segments.

Parameters

p1

Coordinates

p2

Coordinates

Returns

Coordinates | null


move()

move(distance, bearing, elevation?): Coordinates

Moves the point by a ground distance (in meters) along a bearing, on the WGS84 ellipsoid. The displacement is built in the local ENU frame as the chord of the arc travelled, then converted back through ECEF. ponytail: micrometer-accurate at working range (7um at 10km), then degrades as distance^3 / radius^2 (7mm at 100km, ~20m at 1200km). Use Karney's geodesics if continental distances ever matter.

Parameters

distance

number

bearing

number

elevation?

number | null

Returns

Coordinates

Throws

if elevation is defined and point altitude is not defined


toCompressedJson()

toCompressedJson(): CoordinatesCompressedJson

Returns

CoordinatesCompressedJson


toJson()

toJson(): CoordinatesJson

Returns

CoordinatesJson


toString()

toString(): string

Input / Output

Returns

string


wrap()

wrap(): void

Returns

void


bearingTo()

static bearingTo(point1, point2): number

Parameters

point1

Coordinates

point2

Coordinates

Returns

number


distanceBetween()

static distanceBetween(point1, point2): number

Parameters

point1

Coordinates

point2

Coordinates

Returns

number


equals()

static equals(pos1, pos2, eps?, epsAlt?): boolean

Parameters

pos1

Coordinates | null

pos2

Coordinates | null

eps?

number = EPS_DEG_MM

epsAlt?

number = EPS_MM

Returns

boolean


equalsWithoutLevel()

static equalsWithoutLevel(pos1, pos2, eps?, epsAlt?): boolean

Parameters

pos1

Coordinates | null

pos2

Coordinates | null

eps?

number = EPS_DEG_MM

epsAlt?

number = EPS_MM

Returns

boolean


fromCompressedJson()

static fromCompressedJson(json): Coordinates

Parameters

json

CoordinatesCompressedJson

Returns

Coordinates


fromECEF()

static fromECEF(ecef): Coordinates

Parameters

ecef

Vector3_t

Returns

Coordinates


fromJson()

static fromJson(json): Coordinates

Parameters

json

CoordinatesJson

Returns

Coordinates