now_world
now_world

Reputation: 1096

Polar to Cartesian coordinates function not outputting the correct data

I have a flight path with lat/long and elevation and I need to convert this to cartesin X,Y,Z for cesium.js. I am running into the wall trying to convert this because I don't seem to be getting the right results from my function.

var R = 6371;
function polarToCartesian(latitude, longitude, elevation){
    x = (R+elevation) * math.cos(latitude) * math.cos(longitude);
    y = (R+elevation) * math.cos(latitude) * math.sin(longitude);
    z = (R+elevation) * math.sin(latitude);

    var ar = [x,y,z];
    return  ar;
}

I must not either have the correct formula for polar to cartesian or I don't have the correct radius of earth. I found somewhere that my radius should be 6371 but can't seem to find that same SO question for reference.

I am partialy checking if my code is correct by manually adding up the radius of the earth + altitude of the flight path at a given location and seeing if this equals the length of my x,y,z vector.

For example: x,y,z (3689.2472215653725,3183.2401988117012,13306.90338789763) is outputted when I give my function this

-93.028,44.6942,7800

lat,long,elevation

Could someone point me to find the right js code to accomplish this conversion?

Upvotes: 2

Views: 1479

Answers (2)

emackey
emackey

Reputation: 12383

You should be using Cesium's built-in functions for this. See Cartesian3.fromDegrees and Cartesian3.fromDegreesArray.

For example:

var result = Cesium.Cartesian3.fromDegrees(latitude, longitude, elevation);

Note the result will be as Cesium expects: in meters, not kilometers. This also takes into account the shape of the Ellipsoid, for which the default is WGS84 (the Earth is not a perfect sphere, as your function presumes).

Upvotes: 2

broguinn
broguinn

Reputation: 591

There is nothing wrong with the Yavascript per se. However, your equations are incorrect. You're looking to convert from Lat/Long/Alt to Spherical (aka Cartesian), which was answered here.

So you could rewrite above as:

function polarToCartesian(latitude, longitude, elevation){
    const x = math.cos(latitude) * math.cos(longitude) * elevation;
    const y = math.cos(latitude) * math.sin(longitude) * elevation;
    const z = math.sin(latitude) * elevation;

    return  [x, y, z];
}

Upvotes: 1

Related Questions