Cette fonction permet de convertir des données géographiques Lambert II étendu en WGS84 avec le langage PHP.
Le code a été réadapté à partir d'un site (initialement en javascript) ; mais je ne me souviens plus de l'URL, donc si l'auteur se reconnaît merci de m'envoyer un message afin que je puisse ajouter son nom.
Cette fonction renvoie un tableau de type (x, y)./**
* Fonction de conversion de coordonnees au format Lambert 2 etendu vers WGS84
*
* @param $valX Longitude au format l2e (de type XXX.XXX)
* @param $valY Latitude au format l2e (de type YYYY.YYY)
*
* @return tableau (de deux dimensions) contenant les valeurs transformees
* - Longitude (numerique)
* - Latitude (numerique)
*/
function conversionLambert2eVersWGS84($valX, $valY)
{
// Definition des constantes
$Xs = 600000;
$Ys = 6199695.769;
$n = 0.7289686274;
$C = 11745793.39;
$e = 0.08248325676;
$delta = 0.040792344;
$PI = 3.14159265358979323846264338327950288419716939937510;
$ret = array();
// Calcul de la latitude
$X = ($valX) * 1000;
$Y = ($valY - 2000 ) * 1000;
$R = sqrt(pow($X - $Xs,2) + pow($Y - $Ys,2));
$G = atan(($X - $Xs) / ($Ys - $Y));
$longitude = $delta + $G / $n;
$lambert = -1 / $n * log(abs($R / $C));
$temp = abs($longitude / $PI * 180);
// Format NTF
$degres = floor($temp);
$minutes = floor( ($temp - $degres) * 60);
$secondes = round(($temp - $degres - $minutes / 60) * 3600);
// Format WGS84
$ret[1] = round(($degres + ($minutes/60) + ($secondes/3600)), 5);
if (!($temp > 0)) {
$ret[1] *= -1;
}
// Calcul de la longitude
$P = 42 / 180 * $PI;
$F = 0; $Q = 0; $V = 0; $O = 0;
while(abs($V-$P) > 0.00000000000001)
{
$F = $P;
$O = $lambert - (0.5 * log( (1+sin($F)) / (1-sin($F))) - $e / 2 * log( (1.0 + ($e * sin($F))) / (1.0 - ($e * sin($F)))));
$F = $P + 0.0001;
$Q = $lambert - (0.5 * log( (1+sin($F)) / (1-sin($F))) - $e / 2 * log( (1.0 + ($e * sin($F))) / (1.0 - ($e * sin($F)))));
$V = $P;
$P = $P - 0.0001 * $O / ($Q - $O);
}
$temp = abs($P / $PI * 180);
// Format NTF
$degres = floor($temp);
$minutes = floor( ($temp - $degres) * 60);
$secondes = round(($temp - $degres - $minutes / 60) * 3600);
// Format WGS84
$ret[0] = round(($degres + ($minutes/60) + ($secondes/3600)), 5);
if (!($temp > 0)) {
$ret[0] *= -1;
}
return $ret;
}
0 commentaires:
Enregistrer un commentaire