RSS

Convertir des données SIG avec PHP

mardi 9 septembre 2008

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.

/**
* 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;
}
Cette fonction renvoie un tableau de type (x, y).

0 commentaires: