Guide Complet de la Bibliothèque de Projection PROJ.4

Ce document décrit l'ensemble des paramètres de PROJ.4, applicables à la plupart des systèmes de coordonnées. Nous n'aborderons pas ici les paramètres spécifiques à certains types de projections, qui peuvent être trouvés dans la liste des transformations GeoTIFF. La documentation détaillée de la plupart des paramètres est accessible depuis la page principale de PROJ.4.

Liste des Paramètres

Paramètres généraux:

(incluant la configuration PROJ.4 et la prise en charge des datum par cs2cs)

+a         Demi-grand axe de l'ellipsoïde
+alpha     ? utilisé pour Mercator oblique et autres projections
+axis      Orientation des axes (depuis 4.8.0)
+b         Demi-petit axe de l'ellipsoïde
+datum     Nom du datum (voir `proj -ld`)
+ellps     Nom de l'ellipsoïde (voir `proj -le`)
+k         Facteur d'échelle (ancien nom)
+k_0       Facteur d'échelle (nouveau nom)
+lat_0     Latitude d'origine
+lat_1     Première parallèle standard
+lat_2     Deuxième parallèle standard
+lat_ts    Latitude à échelle réelle
+lon_0     Méridien central
+lonc      ? longitude pour Mercator oblique et autres
+lon_wrap  Longitude centrale pour l'enveloppement (voir ci-dessous)
+nadgrids  Nom du fichier grille NTv2 pour transformation de datum
+no_defs   N'utiliser pas le fichier par défaut /usr/share/proj/proj_def.dat
+over      Autoriser les longitudes hors de [-180,180], désactiver l'enveloppement
+pm        Méridien origine alternatif (généralement nom de ville)
+proj      Nom de projection (voir `proj -l`)
+south     Indiquer zone UTM sud
+to_meter  Multiplicateur pour convertir les unités de carte en mètres
+towgs84   Transformation datum 3 ou 7 paramètres vers WGS84
+units     mètres, pieds survey américains, etc.
+vto_meter  Facteur de conversion vertical en mètres
+vunits    Unités verticales
+x_0       Fausse abscisse
+y_0       Fausse ordonnée
+zone      Zone UTM

Liste étendue par Gerald Evenden "extraite du répertoire RCS".

+a         Demi-grand axe de l'ellipsoïde
+alpha     ? pour Mercator oblique et autres
+azi
+b         Demi-petit axe de l'ellipsoïde
+belgium
+beta
+czech
+e         Excentricité de l'ellipsoïde
+ellps     Nom de l'ellipsoïde
+es        Carré de l'excentricité
+f         Aplatissement de l'ellipsoïde
+geoc
+guam
+h
+k         Facteur d'échelle (ancien)
+K
+k_0       Facteur d'échelle (nouveau)
+lat_0     Latitude d'origine
+lat_1     Première parallèle standard
+lat_2     Deuxième parallèle standard
+lat_b
+lat_t
+lat_ts    Latitude à échelle réelle
+lon_0     Méridien central
+lon_1
+lon_2
+lonc      ? longitude pour Mercator oblique
+lsat
+m
+M
+n
+no_cut
+no_off
+no_rot
+ns
+o_alpha
+o_lat_1
+o_lat_2
+o_lat_c
+o_lat_p
+o_lon_1
+o_lon_2
+o_lon_c
+o_lon_p
+o_proj
+over
+p
+path
+proj      Nom de projection
+q
+R
+R_a
+R_A       Rayon calculé pour surface équivalente sphère-ellipsoïde
+rf        Inverse de l'aplatissement
+R_g
+R_h
+R_lat_a
+R_lat_g
+rot
+R_V
+s
+south     Zone UTM sud
+sym
+t
+theta
+tilt
+to_meter  Multiplicateur vers mètres
+units     mètres, pieds, etc.
+vopt
+W
+westo
+x_0       Fausse abscisse
+y_0       Fausse ordonnée
+zone      Zone UTM

Pour plus de détails, voir le manuel libproj4 de GE.

Unités

Les unités horizontales peuvent être spécifiées avec +units= en utilisant un nom symbolique (ex: us-ft). Alternativement, la conversion en mètres peut être spécifiée avec +to_meter (ex: 0.304800609601219 pour les pieds américains). L'option -lu pour cs2cs ou proj liste les unités supportées. L'unité par défaut est le degré.

Unités Verticales

Les unités verticales (Z) peuvent être spécifiées avec +vunits= (ex: us-ft). La conversion en mètres peut utiliser +vto_meter. L'option -lu liste également les unités verticales. Si aucune unité verticale n'est spécifiée, elle sera identique aux unités horizontales.

Note: La conversion des unités verticales n'est disponible que dans pj_transform() et les programmes basés dessus (comme cs2cs). Les fonctions de bas niveau pj_fwd() et pj_inv() ne gèrent pas les unités verticales.

Fausse Abscisse/Ordonnée

Presque tous les systèmes de coordonnées supportent les fausses abscisses (+x_0) et ordonnées (+y_0). Ces valeurs sont en mètres même si le système utilise d'autres unités. Certains systèmes (comme UTM) ont des valeurs implicites.

Enveloppement des Longitudes (lon_wrap, over)

Par défaut, PROJ.4 enveloppe les longitudes entre -180 et 180. +over désactive cet enveloppement de bas niveau dans pj_inv(). Utile pour des projections comme eqc où on souhaite continuer après -180 au lieu de revenir à +180.

L'option +lon_wrap fournit un moyen alternatif d'envelopper dans pj_transform(). L'argument est une longitude centrale. +lon_wrap=180 enveloppe dans [0,360]. +over ne désactive pas +lon_wrap.

Méridien Origine (pm)

Le méridien origine peut être déclaré pour indiquer le décalage entre le méridien du système et Greenwich. Utilisé avec le paramètre "pm", assigné à un nom symbolique ou une longitude (ex: +pm=-10 pour 10° Est de Greenwich).

Actuellement utilisé uniquement par l'API pj_transform(), pas par pj_inv() et pj_fwd(). cs2cs respecte ce paramètre mais proj l'ignore.

Noms supportés (listés avec cs2cs -lm):

greenwich 0dE lisbon 9d07'54.862"W paris 2d20'14.025"E bogota 74d04'51.3"E madrid 3d41'16.48"W rome 12d27'8.4"E bern 7d26'22.5"E jakarta 106d48'27.79"E ferro 17d40'W brussels 4d22'4.71"E stockholm 18d3'29.8"E athens 23d42'58.815"E oslo 10d43'22.5"E

Exemple: conversion de long=0, lat=0 de Greenwich vers Madrid comme méridien origine:

# Source: +proj=latlong +datum=WGS84
# Cible: +proj=latlong +datum=WGS84 +pm=madrid
cs2cs +proj=latlong +datum=WGS84 +to +proj=latlong +datum=WGS84 +pm=madrid
0 0
3d41'16.48"E 0dN 0.000

Transformation Datum vers WGS84 (towgs84)

La transformation datum peut utiliser 3 paramètres (translation) ou 7 paramètres (trasnlation + rotation + échelle) avec towgs84.

Pour 3 paramètres, ce sont des translations en coordonnées géocentriques en mètres.

Exemple: GGRS87 (Grèce) vers WGS84:

# Source: +proj=latlong +ellps=GRS80 +towgs84=-199.87,74.79,246.62
# Cible: +proj=latlong +datum=WGS84
cs2cs +proj=latlong +ellps=GRS80 +towgs84=-199.87,74.79,246.62 \
 +to +proj=latlong +datum=WGS84
20 35
20d0'5.467"E 35d0'9.575"N 8.570

Exemple EPSG: WGS72 vers WGS84:

cs2cs +proj=latlong +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.219 \
 +to +proj=latlong +datum=WGS84
4 55
4d0'0.554"E 55d0'0.09"N 3.223

Pour 7 paramètres: delta_x, delta_y, delta_z, Rx, Ry, Rz, M_BF. Les translations sont en mètres, les rotations en secondes d'arc, l'échelle en parties par million.

Calculs utilisés dans PROJ.4 pour towgs84:

3 paramètres:

x[io] = x[io] + defn->datum_params[0];
y[io] = y[io] + defn->datum_params[1];
z[io] = z[io] + defn->datum_params[2];

7 paramètres:

#define Dx_BF (defn->datum_params[0])
#define Dy_BF (defn->datum_params[1])
#define Dz_BF (defn->datum_params[2])
#define Rx_BF (defn->datum_params[3])
#define Ry_BF (defn->datum_params[4])
#define Rz_BF (defn->datum_params[5])
#define M_BF (defn->datum_params[6])

x_out = M_BF*( x[io] - Rz_BF*y[io] + Ry_BF*z[io]) + Dx_BF;
y_out = M_BF*( Rz_BF*x[io] + y[io] - Rx_BF*z[io]) + Dy_BF;
z_out = M_BF*(-Ry_BF*x[io] + Rx_BF*y[io] + z[io]) + Dz_BF;

Note: Les coefficients EPSG 9607 (coordinate frame rotation) peuvent être utilisés par PROJ.4 en inversant le signe des rotations pour correspondre à la méthode EPSG 9606 (position vector 7-parameter).

Ajustements Datum Basés sur Grille (nadgrids)

Dans plusieurs régions (Amérique du Nord, Australie), des organisations géodésiques fournissent des fichiers de transformation par grille entre datums (ex: NAD27 à NAD83). Ces fichiers contiennent des décalages appliqués à chaque position de grille, généralement interpolés entre quatre points.

PROJ.4 supporte l'utilisation de ces fichiers pour la transformation directe vers WGS84. Formats supportés: ctable (binaire via nad2bin), NTv1 (ancien format canadien), NTv2 (.gsb, nouveau format canadien et australien).

Spécifié avec le paramètre nadgrids dans la définition du système de coordonnées. Exemple:

cs2cs +proj=latlong +ellps=clrk66 +nadgrids=ntv1_can.dat \
 +to +proj=latlong +ellps=GRS80 +datum=NAD83 << EOF
-111 50
EOF
111d0'2.952"W 50d0'0.111"N 0.000

Plusieurs fichiers peuvent être listés, essayés séquentiellement jusqu'à trouver un contenant le point:

cs2cs +proj=latlong +ellps=clrk66 \
 +nadgrids=conus,alaska,hawaii,stgeorge,stlrnc,stpaul \
 +to +proj=latlong +ellps=GRS80 +datum=NAD83 << EOF
-111 44
EOF
111d0'2.788"W 43d59'59.725"N 0.000

Ignorer Grilles Manquantes

Le préfixe @ permet d'ignorer un fichier manquant et continuer la recherche:

cs2cs +proj=latlong +ellps=clrk66 +nadgrids=@ntv2_0.gsb,ntv1_can.dat \
 +to +proj=latlong +ellps=GRS80 +datum=NAD83 << EOF
-111 50
EOF
111d0'3.006"W 50d0'0.103"N 0.000

Grille Nulle

Une grille spéciale '''null''' fournit une transformation nulle partout. Ajoutée à la fin de la liste pour les points hors de toute grille:

cs2cs +proj=latlong +ellps=clrk66 +nadgrids=conus,null \
 +to +proj=latlong +ellps=GRS80 +datum=NAD83 << EOF
-111 45
EOF
111d0'3.006"W 50d0'0.103"N 0.000

Installation des Grilles

La distribution source PROJ.4 contient uniquement ntv1_can.dat. Pour obtenir les grilles américaines, téléchargez proj-nad27-1.1.tar.gz depuis le site PROJ.4. Extrayez sur la source, reconfigurez, compilez et installez. Les fichiers .lla sont convertis en binaires spécifiques à la plateforme.

La grille NTv2 canadienne ne peut être redistribuée librement mais est téléchargeable depuis le site NRCan. Placez-la dans le répertoire de données (généralement /usr/local/share/proj).

Précautions

  • Pour les points dans des zones de chevauchement, la première grille trouvée est utilisée. L'ordre des fichiers est donc important.
  • Des grilles additionnelles existent pour les transformations entre diverses versions HPGN de NAD83. Utilisation à vos risques.
  • La variable d'environnement PROJ_DEBUG fournit des informations sur les grilles appliquées.
  • PROJ.4 suppose toujours que les grilles contiennent la transformation vers NAD83 (essentiellement WGS84).

Orientation des Axes

Depuis PROJ 4.8.0, +axis contrôle l'orientation des axes. Par défaut: "easting, northing, up". Les directions peuvent être inversées avec des combinaisons dans +axis:

  • "e" - est
  • "w" - ouest
  • "n" - nord
  • "s" - sud
  • "u" - haut
  • "d" - bas

Formes avec +axis:

  • +axis=enu - défaut: est, nord, altitude
  • +axis=neu - nord, est, haut - utile pour coordonnées "lat/long"
  • +axis=wnu - ouest, nord, haut - certains systèmes planétaires

Note: +axis s'applique uniquement aux transformations via pj_transform() (disponible dans cs2cs mais pas proj).

Compliation et Utilisation de Proj.4

Proj.4 est la bibliothèque de projection cartographique open source la plus connue, utilisée par GRASS GIS, MapServer, PostGIS, GDAL/OGR et bien d'autres. Elle permet les conversions entre coordonnées géographiques et projetées, ainsi que les transformations entre systèmes de coordonnées incluant les changements de datum.

Compilation et Installation de Proj.4

Téléchargement avec git:

git clone https://github.com/OSGeo/proj.4.git

Compilation sous Linux

Utilisation de cmake pour générer le Makefile:

mkdir -p build && cd build
cmake -DCMAKE_INSTALL_PREFIX=./install -DBUILD_LIBPROJ_SHARED=OFF ..
make
make install

Après installation dans install:

> tree
.
├── bin
│   ├── cs2cs
│   ├── geod
│   ├── nad2bin
│   └── proj
├── include
│   ├── geodesic.h
│   ├── proj_api.h
│   └── projects.h
├── lib
│   └── libproj.a
└── share
    ├── cmake
    ├── man
    └── proj

Compilation sous Windows avec VS2013

Génération avec cmake:

cd build
cmake -DCMAKE_INSTALL_PREFIX=D:/proj.4 -DBUILD_LIBPROJ_SHARED=OFF -G"Visual Studio 12 Win64" ..

Compilation avec la ligne de commande VS2013 x64:

msbuild ALL_BUILD.vcxproj /p:Configuration="Release"
msbuild INSTALL.vcxproj /p:Configuration="Release"

Utilisation de Proj.4

Exemple de code test:

#include <stdio.h>
#include <stdlib.h>
#include "proj_api.h"

int main()
{
    // Définition projection Beijing54 Lambert Conformal Conic
    const char* beijing1954 = "+proj=lcc +ellps=krass +lat_1=25n +lat_2=47n +lon_0=117e +x_0=20500000 +y_0=0 +units=m +k=1.0";
    // Pour conversion vers WGS84: "+towgs84=22,-118,30.5,0,0,0,0"
    
    projPJ coord_system;
    if (!(coord_system = pj_init_plus(beijing1954))){
        exit(-1);
    }
    
    // Points à convertir (coordonnées projetées)
    projUV points[4] = {
        {20634500.0,4660000.0},
        {20635000.0,4661000.0},
        {20635500.0,4659000.0},
        {20634000.0,4662000.0}
    };
    
    printf("DEG_TO_RAD = %f\n", DEG_TO_RAD);
    
    // Conversion point par point
    for(int i = 0; i < 4; i++)
    {
        printf("\n--- Point %d ---\n", i+1);
        projUV geo_point, proj_point;
        
        geo_point = pj_inv(points[i], coord_system);
        printf("Proj Beijing54: %10lf,%10lf\n", points[i].u, points[i].v);
        printf("Geo Beijing54: %10lf,%10lf\n", geo_point.u/DEG_TO_RAD, geo_point.v/DEG_TO_RAD);
        
        proj_point = pj_fwd(geo_point, coord_system);
        printf("Proj retourné: %10lf,%10lf\n", proj_point.u, proj_point.v);
    }
    
    pj_free(coord_system);
    return 0;
}

Compilation:

gcc test.c -Iinclude -Llib -lproj -lpthread -lm -o test

Résultat d'exécution:

> ./test
DEG_TO_RAD = 0.017453

--- Point 1 ---
Proj Beijing54: 20634500.000000,4660000.000000
Geo Beijing54: 118.611065, 40.462077
Proj retourné: 20634500.000000,4660000.000000

--- Point 2 ---
Proj Beijing54: 20635000.000000,4661000.000000
Geo Beijing54: 118.617253, 40.471148
Proj retourné: 20635000.000000,4661000.000000

--- Point 3 ---
Proj Beijing54: 20635500.000000,4659000.000000
Geo Beijing54: 118.622841, 40.452777
Proj retourné: 20635500.000000,4659000.000000

--- Point 4 ---
Proj Beijing54: 20634000.000000,4662000.000000
Geo Beijing54: 118.605475, 40.480447
Proj retourné: 20634000.000000,4662000.000000

Étiquettes: PROJ.4 cartographic projection GIS coordinate transformation geodesy

Publié le 12 octobre à 21h48