Coverage for src/ensae_teaching_cs/helpers/geo_helper.py: 100%
27 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
1# -*- coding: utf-8 -*-
2"""
3@file
4@brief Helpers about longitude, latitude.
5"""
6import math
9def lambert93_to_WGPS(lambertE, lambertN):
10 """
11 Converts coordinates given in
12 `Lambert 93 <https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert>`_
13 system, this system is used by `IGN <http://http://professionnels.ign.fr/>`_
14 and their :epkg:`GEOFLA` file format.
16 @param lambertE east
17 @param lambertN north
18 @return longitude, latitude
20 The function is inspired from
21 `lam93toLatLon.py <https://gist.github.com/flire/0a305eeec77bc84a73af8ddc8f9ec043>`_.
23 .. faqref::
24 :tag: geo
25 :title: Les fichiers GEOFLA ne contiennent pas de longitude, latitude ?
27 Les coordonnées contenues dans les fichiers :epkg:`GEOFLA`
28 ne sont pas toujours des longitudes, latitudes mais des coordonnées exprimées dans un système
29 de projection conique `Lambert 93 <https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert>`_.
30 Il faut convertir les coordonnées avant de pouvoir tracer la carte ou changer la projection
31 utilisée par :epkg:`cartopy` :
32 `Lambert Conformal Projection <https://scitools.org.uk/cartopy/docs/v0.15/crs/projections.html#lambertconformal>`_.
33 """
34 class constantes:
35 GRS80E = 0.081819191042816
36 LONG_0 = 3
37 XS = 700000
38 YS = 12655612.0499
39 n = 0.7256077650532670
40 C = 11754255.4261
42 delX = lambertE - constantes.XS
43 delY = lambertN - constantes.YS
44 gamma = math.atan(-delX / delY)
45 R = math.sqrt(delX * delX + delY * delY)
46 latiso = math.log(constantes.C / R) / constantes.n
47 sinPhiit0 = math.tanh(latiso + constantes.GRS80E *
48 math.atanh(constantes.GRS80E * math.sin(1)))
49 sinPhiit1 = math.tanh(latiso + constantes.GRS80E *
50 math.atanh(constantes.GRS80E * sinPhiit0))
51 sinPhiit2 = math.tanh(latiso + constantes.GRS80E *
52 math.atanh(constantes.GRS80E * sinPhiit1))
53 sinPhiit3 = math.tanh(latiso + constantes.GRS80E *
54 math.atanh(constantes.GRS80E * sinPhiit2))
55 sinPhiit4 = math.tanh(latiso + constantes.GRS80E *
56 math.atanh(constantes.GRS80E * sinPhiit3))
57 sinPhiit5 = math.tanh(latiso + constantes.GRS80E *
58 math.atanh(constantes.GRS80E * sinPhiit4))
59 sinPhiit6 = math.tanh(latiso + constantes.GRS80E *
60 math.atanh(constantes.GRS80E * sinPhiit5))
62 longRad = math.asin(sinPhiit6)
63 latRad = gamma / constantes.n + constantes.LONG_0 / 180 * math.pi
65 longitude = latRad / math.pi * 180
66 latitude = longRad / math.pi * 180
68 return longitude, latitude