Conversion code PHP en Excel VBA

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:
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);
}
 

Staple1600

XLDnaute Barbatruc
Re : Conversion code PHP en Excel VBA

Bonjour

Peux-tu nous donner l'URL du site en question ?

PS: en attendant l'url, regardes sur ce site (merci g..gle)
Prsentation de Convers - Conversion de coordonnes gographiques
Notamment la DLL proposée
Convers est livré avec une API (ConversApi.dll) afin de pouvoir effectuer des conversions à partir d'Excel ou de vos propres applications développées en Visual Basic, C, C++, Delphi ou autre.
 
Dernière édition:

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87