-
-
Save blemoine/e6045ed93b3d90a52891 to your computer and use it in GitHub Desktop.
Math.tanh = Math.tanh || function(x) { | |
if(x === Infinity) { | |
return 1; | |
} else if(x === -Infinity) { | |
return -1; | |
} else { | |
return (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)); | |
} | |
}; | |
Math.atanh = Math.atanh || function(x) { | |
return Math.log((1+x)/(1-x)) / 2; | |
}; | |
function lambert93toWGPS(lambertE, lambertN) { | |
var constantes = { | |
GRS80E: 0.081819191042816, | |
LONG_0: 3, | |
XS: 700000, | |
YS: 12655612.0499, | |
n: 0.7256077650532670, | |
C: 11754255.4261 | |
} | |
var delX = lambertE - constantes.XS; | |
var delY = lambertN - constantes.YS; | |
var gamma = Math.atan(-delX / delY); | |
var R = Math.sqrt(delX * delX + delY * delY); | |
var latiso = Math.log(constantes.C / R) / constantes.n; | |
var sinPhiit0 = Math.tanh(latiso + constantes.GRS80E * Math.atanh(constantes.GRS80E * Math.sin(1))); | |
var sinPhiit1 = Math.tanh(latiso + constantes.GRS80E * Math.atanh(constantes.GRS80E * sinPhiit0)); | |
var sinPhiit2 = Math.tanh(latiso + constantes.GRS80E * Math.atanh(constantes.GRS80E * sinPhiit1)); | |
var sinPhiit3 = Math.tanh(latiso + constantes.GRS80E * Math.atanh(constantes.GRS80E * sinPhiit2)); | |
var sinPhiit4 = Math.tanh(latiso + constantes.GRS80E * Math.atanh(constantes.GRS80E * sinPhiit3)); | |
var sinPhiit5 = Math.tanh(latiso + constantes.GRS80E * Math.atanh(constantes.GRS80E * sinPhiit4)); | |
var sinPhiit6 = Math.tanh(latiso + constantes.GRS80E * Math.atanh(constantes.GRS80E * sinPhiit5)); | |
var longRad = Math.asin(sinPhiit6); | |
var latRad = gamma / constantes.n + constantes.LONG_0 / 180 * Math.PI; | |
var longitude = latRad / Math.PI * 180; | |
var latitude = longRad / Math.PI * 180; | |
return {longitude: longitude, latitude: latitude}; | |
} |
Hi,
If you need an npm package, you can user proj4js , a project that has the goal to convert from "any" coordinate system to any other coordinate system. To help you further, you can find here https://spatialreference.org/ref/epsg/rgf93-lambert-93/
the definition of lambert 93 for proj4s (https://spatialreference.org/ref/epsg/rgf93-lambert-93/proj4js/ to be precise ),
so you can after that probably do something like (pseudo-code, I haven't tested):
proj4.defs["EPSG:2154"] = "+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs";
function lambert93toWGPS(lambertE, lambertN) {
return proj4('EPSG:2154', 'WGS84', [lambertE, lambertN]);
}
Otherwise, a good old copy/pasta will do the job (and you will even be able to rename constantes
to constants
) :)
Thanks, this will save me time to convert it to C#.
Hello I've had to make a Lambert CC Zone 49 version today in ES6 so here it is.
Thanks a lot. I grabbed the constants from your link and updated it accordingly.
// Référentiel IAG GRS 80 / Constantes Lambert-CC zone 49
const geodesicReferential = {
GRS80E: 0.08181919112,
LONG_0: 3, // OK
XS: 1700000.00, // OK
YS: 13754395.745, // OK
n: 0.75473138518, // OK
C: 11626445.901, // OK
};
const findGPSFromLambertCC = (lambertE, lambertN) => {
const delX = lambertE - geodesicReferential.XS;
const delY = lambertN - geodesicReferential.YS;
const gamma = Math.atan(-delX / delY);
const R = Math.sqrt(delX * delX + delY * delY);
const latiso = Math.log(geodesicReferential.C / R) / geodesicReferential.n;
const sinPhiit0 = Math.tanh(
latiso +
geodesicReferential.GRS80E *
Math.atanh(geodesicReferential.GRS80E * Math.sin(1))
);
const sinPhiit1 = Math.tanh(
latiso +
geodesicReferential.GRS80E *
Math.atanh(geodesicReferential.GRS80E * sinPhiit0)
);
const sinPhiit2 = Math.tanh(
latiso +
geodesicReferential.GRS80E *
Math.atanh(geodesicReferential.GRS80E * sinPhiit1)
);
const sinPhiit3 = Math.tanh(
latiso +
geodesicReferential.GRS80E *
Math.atanh(geodesicReferential.GRS80E * sinPhiit2)
);
const sinPhiit4 = Math.tanh(
latiso +
geodesicReferential.GRS80E *
Math.atanh(geodesicReferential.GRS80E * sinPhiit3)
);
const sinPhiit5 = Math.tanh(
latiso +
geodesicReferential.GRS80E *
Math.atanh(geodesicReferential.GRS80E * sinPhiit4)
);
const sinPhiit6 = Math.tanh(
latiso +
geodesicReferential.GRS80E *
Math.atanh(geodesicReferential.GRS80E * sinPhiit5)
);
const longRad = Math.asin(sinPhiit6);
const latRad =
gamma / geodesicReferential.n +
(geodesicReferential.LONG_0 / 180) * Math.PI;
const longitude = (latRad / Math.PI) * 180;
const latitude = (longRad / Math.PI) * 180;
return { lon: longitude, lat: latitude };
};
export { findGPSFromLambertCC, geodesicReferential };
Thx a lot !
Would you consider make it an NPM package ?