Conversion code PHP en Excel VBA

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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);
}
 
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:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour