Dhaulagiri
XLDnaute Nouveau
Bonjour,
J'ai trouvé sur un forum de géomatique un code qui permet de convertir des coordonnées (merci au passage à son propriétaire!). Ce code est en PHP et j'aimerais l'adapter en VBA pour pouvoir l'utiliser dans un fichier Excel, ce qui me permettrait de faire le traitement avec un seul programme. Quelqu'un aurait-il les compétences pour m'y aider? Merci d'avance pour votre aide.
Voici le code:
J'ai trouvé sur un forum de géomatique un code qui permet de convertir des coordonnées (merci au passage à son propriétaire!). Ce code est en PHP et j'aimerais l'adapter en VBA pour pouvoir l'utiliser dans un fichier Excel, ce qui me permettrait de faire le traitement avec un seul programme. Quelqu'un aurait-il les compétences pour m'y aider? Merci d'avance pour votre aide.
Voici le code:
Code:
$wgs84 = array(
'a' => 6378137,
'f' => (1/298.2572229328697),
'e' => 0.08181919092890624,
'delta' => array(
'clarke1880' => array(
'dx' => 168,
'dy' => 60,
'dz' => -320,
),
'grs80' => array(
'dx' => 0,
'dy' => 0,
'dz' => 0,
),
)
);
$clarke1880 = array(
'a' => 6378249.145,
'f' => (1/293.4650060791153),
'e' => 0.08248339919132311,
'delta' => array(
'wgs84' => array(
'dx' => -168,
'dy' => -60,
'dz' => 320,
),
'grs80' => array(
'dx' => -168,
'dy' => -60,
'dz' => 320,
),
)
);
$grs80 = array(
'a' => 6378137,
'f' => (1/298.2572215381486),
'e' => 0.08181919111988833,
'delta' => array(
'wgs84' => array(
'dx' => 0,
'dy' => 0,
'dz' => 0,
),
'clarke1880' => array(
'dx' => 168,
'dy' => 60,
'dz' => -320,
),
)
);
$lambert_france = array(
'lambert_1' => array(
'ellipsoide' => 'clarke1880',
'n' => 0.7604059656,
'c' => 11603796.98,
'XS' => 600000,
'YS' => 5657616.674,
'e' => $clarke1880['e'],
'lambdac' => 0.040792344331976635884653770050923,
'limit_n' => 51.3,
'limit_s' => 48.15),
'lambert_2' => array(
'ellipsoide' => 'clarke1880',
'n' => 0.7289686274,
'c' => 11745793.39,
'XS' => 600000,
'YS' => 6199695.768,
'e' => $clarke1880['e'],
'lambdac' => 0.040792344331976635884653770050923,
'limit_n' => 48.15,
'limit_s' => 45.45),
'lambert_3' => array(
'ellipsoide' => 'clarke1880',
'n' => 0.6959127966,
'c' => 11947992.52,
'XS' => 600000,
'YS' => 6791905.085,
'e' => $clarke1880['e'],
'lambdac' => 0.040792344331976635884653770050923,
'limit_n' => 45.45,
'limit_s' => 42.3),
'lambert_4' => array(
'ellipsoide' => 'clarke1880',
'n' => 0.6712679322,
'c' => 12136281.99,
'XS' => 234.358,
'YS' => 7239161.542,
'e' => $clarke1880['e'],
'lambdac' => 0.040792344331976635884653770050923),
'lambert_2_e' => array(
'ellipsoide' => 'clarke1880',
'n' => 0.7289686274,
'c' => 11745793.39,
'XS' => 600000,
'YS' => 8199695.768,
'e' => $clarke1880['e'],
'lambdac' => 0.04079234433198),
'lambert_93' => array(
'ellipsoide' => 'wgs84',
'n' => 0.7256077650,
'c' => 11754255.426,
'XS' => 700000,
'YS' => 12655612.05,
'e' => $wgs84['e'],
'lambdac' => 0.052359877559829887307710723054658),
'test' => array(
'ellipsoide' => 'clarke1880',
'n' => 0.760405966,
'c' => 11603796.9767,
'XS' => 600000,
'YS' => 5657616.67405,
'e' => 0.0824832568,
'lambdac' => 0.04079234433),
'epsilon' => 1E-11,
);
function angle_rad2deg($a)
{
return 180*$a/M_PI;
}
function angle_deg2rad($a)
{
return M_PI*$a/180;
}
function latitude_iso($phi, $e)
{
$L = log(tan(M_PI_4+$phi/2)*pow((1-$e*sin($phi))/(1+$e*sin($phi)), $e/2));
return $L;
}
function latitude_iso_inv($L, $e, $epsilon)
{
$phi0 = 2*atan(exp($L))-M_PI_2;
$i = 0;
do
{
$i++;
${'phi'.$i} = 2*atan(pow(((1+$e*sin(${'phi'.($i-1)}))/(1-$e*sin(${'phi'.($i-1)}))), $e/2)*exp($L))-M_PI_2;
unset(${'phi'.($i-2)});
}
while (abs(${'phi'.$i} - ${'phi'.($i-1)}) >= $epsilon);
$phi = ${'phi'.$i};
return $phi;
}
function maps2lambert($lat, $lng, $lambert = 'lambert_93')
{
global $lambert_france;
$lambda = angle_deg2rad($lng);
$phi = angle_deg2rad($lat);
if ($lambert_france[$lambert]['ellipsoide'] != 'wgs84')
{
$trs = geo_transform($phi, $lambda, 'wgs84', $lambert_france[$lambert]['ellipsoide']);
$phi = $trs['lat'];
$lambda = $trs['lng'];
}
foreach($lambert_france[$lambert] as $var_name => $var_value)
{
$$var_name = $var_value;
}
$L = latitude_iso($phi, $e);
$X = $XS+$c*exp(-$n*$L)*sin($n*($lambda-$lambdac));
$Y = $YS-$c*exp(-$n*$L)*cos($n*($lambda-$lambdac));
return array('x' => $X, 'y' => $Y);
}
function lambert2maps($X, $Y, $lambert = 'lambert_93')
{
global $lambert_france;
foreach($lambert_france[$lambert] as $var_name => $var_value)
{
$$var_name = $var_value;
}
$R = sqrt(pow($X-$XS, 2) + pow($Y-$YS, 2));
$gamma = atan(($X-$XS)/($YS-$Y));
$lambda = $lambdac+$gamma/$n;
$L = (-1/$n)*log(abs($R/$c));
$phi = latitude_iso_inv($L, $e, $lambert_france['epsilon']);
if ($lambert_france[$lambert]['ellipsoide'] != 'wgs84')
{
$trs = geo_transform($phi, $lambda, $lambert_france[$lambert]['ellipsoide'], 'wgs84');
$phi = $trs['lat'];
$lambda = $trs['lng'];
}
return array('lat' => angle_rad2deg($phi), 'lng' => angle_rad2deg($lambda));
}
function geo_transform($lat, $lng, $from, $to)
{
global $$from, $$to;
$h = 0;
$f = $$from;
$t = $$to;
$sin_lat = sin($lat);
$cos_lat = cos($lat);
$sin_lng = sin($lng);
$cos_lng = cos($lng);
$sin_lat_2 = pow($sin_lat, 2);
$from_e_2 = pow($f['e'], 2);
$da = $t['a']-$f['a'];
$df = $t['f']-$f['f'];
$dx = $f['delta'][$to]['dx'];
$dy = $f['delta'][$to]['dy'];
$dz = $f['delta'][$to]['dz'];
$adb = 1/(1-$f['f']);
$rn = $f['a']/sqrt(1-$from_e_2*$sin_lat_2);
$rm = ($f['a']*(1-$from_e_2))/pow(1-$from_e_2*$sin_lat_2, 1.5);
$dlat = (($dz*$cos_lat)-($dx*$sin_lat*$cos_lng)-($dy*$sin_lat*$sin_lng)
+($da*(($rn*$from_e_2*$sin_lat*$cos_lat)/$f['a']))
+($df*($rm*$adb+$rn/$adb)*$sin_lat*$cos_lat))
/($rm+$h);
$dlng = ($dy*$cos_lng-$dx*$sin_lng)/(($rn+$h)*$cos_lat);
$dh = ($dx*$cos_lat*$cos_lng)+($dy*$cos_lat*$sin_lng)+($dz*$sin_lat)-($da*($f['a']/$rn))+(($df*$rn*$sin_lat_2)/$adb);
return array('lat' => $lat+$dlat, 'lng' => $lng+$dlng, 'h' => $h+$dh);
}