Convertisseur de coordonnées géographiques CH1903 WGS84

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

cartographie topographie swisstopo convertisseur wgs84 ch1903

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.)

Optimisation de sites php mysql

Optimisation de site php mysql

D'une manière générale, le php est rapide a exécuter, mais les connexions entre les hôtes est lente.  0,1 s pour tout le script php par rapport à 0.2s par connexion avec mysql.

 

Mysql

  • mettre les valeurs à NOT NULL si on sait qu'elle vont l'être.. pas besoin de lire le bit pour savoir avant d'aller piocher la valeur.
  • utiliser char à la place de varchar. Char est moins gourmand en CPU car il n'a pas besoin de calculer la taille du champ pour aller au suivant. On fait donc le choix que le coût CPU est plus important que le coût mémoire. Car avec varchar on économise un petit peu de mémoire. Si un champ d'une table est variable, toute la table l'est !!  Un champ text est un champ variable !
  • mettre des index sur les champs utilisés fréquemment pour des recherches. C'est très bien en lecture, mais éviter de mettre des index sur des champs qui doivent être écrit souvent. C'est très lent.
  • éviter select * être plus précis.
  • utiliser limit 1 si l'on est certain d'avoir besoin que d'un enregistrement. Ainsi Mysql stop la recherche et ne va pas tenter de trier les données.. Genre le break.
  • utiliser des nombres plutôt que des string pour faire les jointures !  Comparer des nombres en en gros 2 fois plus rapide que de comparer une chaîne de 3 caractères !  après c'est encore pire.

PHP

  • éviter la fonction in_array() remplacer par un isset() sur les clés d'un tableau. Pour mettre les valeurs d'un tableau dans des clés utiliser array_ fill_ keys. Les clés d'un tableau sont des tables de hachage donc très rapide.
  • ne pas utiliser require_once();  require() ou include() sont beaucoup plus rapide.
  • utiliser la pré-incrémentation plutôt que la post incrémentation. ++$i est 10% plus rapide que $i++. Zend optimizer le fait pour nous!
  • utiliser les multiples paramètre de echo pour faire des concaténations. echo "toto", Mafonction(),"bleu", getTotot()  est mieux que d'utiliser l'opérateur de concaténation . qui va lui générer plein d'objet temporaire.
  • mettre en cache les variables dans un tableau. Sur une boucle de 10millions d'itérations on gagne 15% de temps CPU. $tableau['variable'] oblige php à rechercher la valeur dans le tableau et cette recherche bouffe du temps. Mais c'est tout de même peu.
  • compression ob_gzhandler ... gain de 33% de donnée à transferrer.

 

Mythe php

  • écrire  'toto' ou "toto" ne change pas grand chose en performance c'est de l'ordre de 0,01% Donc négligeable !

 

Apache

  • ne pas utiliser mod access.. donc pas de htaccess.. car il va chercher dans tous le dossier jusqu'au parent qui contient un htaccess. (ou limiter le nombre de niveau de hiérarchie)

Maintenance.

  • OPTIMIZE TABLE table   défragmenter de temps en temps les tables.

à creuser..

  • select in est très rapide ?
  • table temporaire plutôt que script php

Référence

Navigation au sein des articles

1 2
Remonter