Martouf le synthéticien
 
 

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.

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 inversément.

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
}

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.

Salut Martouf,

Etant tombé sur ton site au hasard d'une recherche Google, je me suis permis de copier les foncitons PHP de conversion de coordonnées carto !
C'est pour un site de recensement botanique pour le canton de Vaud.
Merci beaucoup pour ce beau boulot !

A+

Nicolas

gravatar Rubin Nicolas le 1 août 2010 : 10:55bulle

Très heureux que ce code puisse être utile à quelqu'un, il est là pour ça !
Alors bon recensement botanique !

gravatar Martouf le 1 août 2010 : 11:37bulle
blog comments powered by Disqus
 
 
 
 
 
login
Identification

loading loading