Conversion de coordonnées CH 1903 vers WGS84
Sur les cartes suisses on utilise le système de coordonnées CH 1903. De plus en plus en cartographie, on utilise des outils avec le système WGS84. Le système global utilisé par le GPS. Comment changer de système de coordonnées.
------ edit en 2019 ---
Je vois que le monde a bien changé. En 2009, j'avais eu de la peine à trouver un code de conversion en php. J'ai fini par l'écrire moi même et le publier. En 2019 on en trouve plusieurs et je vois que les liens sont souvent cassé. Ainsi je les mets à jours.
Je profite également d'ajouter un calculateur de longueur du degré de méridien, c'est pas très courant. Le seul que je connais est sur un vieux site en voie de disparition. Ainsi j'ai refait une petite app.
(J'utilise ça pour montrer que le périmètre de la grande pyramide de Gizeh est bien lié à plein d'unité de mesures de la Terre.... )
--------------
Programmes online
Swisstopo fourni sur son site plein de services intéressants:
Autres sources
La théorie de la conversion d'unité selon swisstopo
Conversion de coordonnées WGS84 de notation décimale à sexagésimale
Les coordonnées WGS84 peuvent être données dans plusieurs notation différente. Parfois en notation sexagésimale avec des latitude et longitude en degré, minutes et secondes. Parfois la notation est en degré décimale: tout est en degré et virgules de degré. La notation en degré décimale est celle utilisée par google maps. Ex: lat: 46.94952985143932 long: 6.834204196929932
Code PHP de conversion WGS84 - CH1903
Parfois, il est utile de faire la conversion dans un bout de programme. Ainsi voici les fonctions php qui convertissent des coordonnées wgs84 en CH1903 et inversement.
Ces fonctions on été écrites selon les formules fournies par swisstopo. (dans la théorie ci-dessus)
/**
* converti les coordonnées lat long en wgs84 pour avoir des coordonnées ch1903
* Ex: lat: 46.94952985143932 long: 6.834204196929932 => 553 986/200 005
*
* @return array() y et x les coordonnées au format CH1903
* @param latitude en degré décimal
* @param longitude en degré décimal
*/
function getCoordonneeCH1903($lat,$long){
// Les latitudes φ et les longitudes λ sont à convertir en secondes sexagesimales ["]
// Les grandeurs auxiliaires suivantes sont à calculer (les écarts en latitude et en longitude par rapport à
// Berne sont exprimés dans l'unité [10000"]) :
// φ' = (φ – 169028.66 ")/10000
// λ' = (λ – 26782.5 ")/10000
//
// 3. y [m] = 600072.37
// + 211455.93 * λ'
// - 10938.51 * λ' * φ'
// - 0.36 * λ' * φ'2
// - 44.54 * λ'3
//
// x [m] = 200147.07
// + 308807.95 * φ'
// + 3745.25 * λ' 2
// + 76.63 * φ' 2
// - 194.56 * λ' 2 * φ'
// + 119.79 * φ' 3
// conversion degré décimal en seconde sexagétimale
// deg = 60 * minutes
// minutes = 60 * seconde
// =>deg = 3600 * seconde
$lat = $lat * 3600;
$long = $long * 3600;
// latitude: φ =>lat ( φ' =>lat2)
$lat2 = ($lat - 169028.66)/10000;
// longitude: λ =>long ( λ' =>long2)
$long2 = ($long - 26782.5)/10000;
$y = 600072.37 + (211455.93 * $long2) - (10938.51 * $long2 * $lat2) - (0.36 * $long2 * ($lat2*$lat2)) - (44.54 * ($long2*$long2*$long2));
$y = round($y);
$x = 200147.07 + (308807.95 * $lat2) + (3745.25 * $long2*$long2) + (76.63 * $lat2*$lat2) - (194.56 * $long2*$long2 * $lat2) + (119.79 * $lat2*$lat2*$lat2);
$x = round($x);
return array('y'=>$y,'x'=>$x); // 600000,200000
}
/**
* converti les coordonnées ch1903 en latitude et longitude du système wgs84.
* Calcul selon: http://geomatics.ladetto.ch/swiss_projection_fr.pdf
* Pour des altitudes positives, les 2 systèmes sont équivalents au mètre près. Donc on n'en tient pas compte dans cette fonction.
* Ex: 553 986/200 005 => lat: 46.949532367683 long: 6.8342057996687
*
* @return array() lat et long les coordonnées au format wgs84 en notation degré décimale: 46.951081111111,7.4386372222222
* @param x (nord) à indiquer en m au format: 200000
* @param y (est) à indiquer en m au format: 600000
*/
function getCoordonneeWGS84($x,$y){
// 1. Les coordonnées en projection y (coordonnée est) et x (coordonnée nord) sont à convertir dans le
// système civil (Berne = 0 / 0) et à exprimer dans l'unité [1000 km] :
// y' = (y – 600000 m)/1000000
// x' = (x – 200000 m)/1000000
// 2. La longitude et la latitude sont à calculer dans l'unité [10000"] :
// λ' = 2.6779094
// + 4.728982 * y'
// + 0.791484 * y' * x'
// + 0.1306 * y' * x'2
// - 0.0436 * y'3
// φ' = 16.9023892
// + 3.238272 * x'
// - 0.270978 * y' 2
// - 0.002528 * x' 2
// - 0.0447 * y' 2 * x'
// - 0.0140 * x' 3
// h [m] = h' + 49.55
// - 12.60 * y'
// - 22.64 * x'
//
// 3. La longitude et la latitude sont à convertir dans l'unité [°] :
// λ = λ' * 100 / 36
// φ = φ' *100 / 36
$y2 = ($y-600000)/1000000;
$x2 = ($x-200000)/1000000;
// longitude: λ =>long ( λ' =>long2)
$long2 = 2.6779094 + (4.728982 * $y2) + (0.791484 * $y2 * $x2) + (0.1306 * $y2 * $x2*$x2) - (0.0436 * $y2*$y2*$y2);
// latitude: φ =>lat ( φ' =>lat2)
$lat2 = 16.9023892 + (3.238272 * $x2) - (0.270978 * $y2*$y2) - (0.002528 * $x2*$x2) - (0.0447 * $y2*$y2 * $x2) - (0.0140 * $x2*$x2*$x2);
// conversion en °
$long = $long2 *100/36;
$lat = $lat2 *100/36;
return array('lat'=>$lat,'long'=>$long); //pour y=600000, x=200000 => 46.951081111111,7.4386372222222
}
Je vois qu'il y a également tout ce qu'il faut sur github pour avoir un code de conversion WGS84 to CH1903... ou plutôt LV3 maintenant !
Et ceci dans plein de langages comme C#, Java, php, python, R, SQL...
Calculateur de degré de longueur de degré de méridien
Comme je l'ai annoncé plus haut. J'ai ajouté un nouvel outil.
Un calculateur de la longueur de l'arc d'un degré d'un méridien. Ce calculateur permet de calculer la longueur d'un arc de l'éllipsoïde de la terre pour 1° de longitude et/ou 1° de latitude et ceci en fonction de la latitude à laquelle on se trouve.
Pour ceux que la cartographie intéresse, je recommande de lire aussi tout ce que j'ai écrit à propos de l'outil de cartographie libre OpenStreetMap.
(j'y ai beaucoup contribué à ses débuts.. maintenant je suis plutôt en mode utilisation, notamment les cartes personnalisées sur openStreetMap :p.. donc mes outils d'il y a 10 ans ne sont peut être plus très pertinent.)