Hello the below algorithm is the most precise, see
http://en.wikipedia.org/wiki/Haversine_formula .
for Area measurement, I give you another snippet to test (good precision):
/**
*
* @param x
* @return the value of Haversine
*/
function Haversine(x) {
return (1.0 - Math.cos(x)) / 2.0;
}
/**
*
* @param arrayCartographic {Array[Cesium.Cartographic]} array of cartographics which defines area
* @return area in km²
*/
function surfaceTerre(arrayCartographic) {
var earthRayInKilometers=6378.137;
var lam1 = 0, lam2 = 0, beta1 = 0, beta2 = 0, cosB1 = 0, cosB2 = 0;
var hav = 0;
var sum = 0;
var k;
for (var j = 0; j < arrayCartographic.length; j++) {
if (j == 0) {
k = j + 1;
lam1 = arrayCartographic[j].longitude;
beta1 = arrayCartographic[j].latitude;
lam2 = arrayCartographic[j+1].longitude;
beta2 = arrayCartographic[j+1].latitude;
cosB1 = Math.cos(beta1);
cosB2 = Math.cos(beta2);
} else {
k = (j + 1) % arrayCartographic.length;
lam1 = lam2;
beta1 = beta2;
lam2 = arrayCartographic[k].longitude;
beta2 = arrayCartographic[k].latitude;
cosB1 = cosB2;
cosB2 = Math.cos(beta2);
}
if (lam1 != lam2) {
hav = Haversine(beta2 - beta1) + cosB1 * cosB2
* Haversine(lam2 - lam1);
var a = 2 * Math.asin(Math.sqrt(hav));
var b = Math.PI / 2 - beta2;
var c = Math.PI / 2 - beta1;
var s = 0.5 * (a + b + c);
var t = Math.tan(s / 2) * Math.tan((s - a) / 2)
* Math.tan((s - b) / 2) * Math.tan((s - c) / 2);
var excess = Math.abs(4 * Math.atan(Math.sqrt(Math.abs(t))));
if (lam2 < lam1) {
excess = -excess;
}
sum += excess;
}
}
return Math.abs(sum) * earthRayInKilometers* earthRayInKilometers;
}
var positions = [new Cesium.Cartesian3(17832.12, 83234.52, 952313.73),
new Cesium.Cartesian3(17832.13, 83234.53, 952313.73),
new Cesium.Cartesian3(17832.14, 83234.54, 952313.73)];
var cartographicPositions = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions);
console.log(surfaceTerre(cartographicPositions));