1
Fork 0
internship/data/processing/lambert.py

100 lines
2.5 KiB
Python

import numpy as np
class Lambert:
def __init__(
self,
X0=1.7e6,
Y0=2.2e6,
lambda0=3,
phi0=43,
phi1=42.25,
phi2=43.75,
a=6378137,
e=0.081819190842622,
):
self._X0 = X0
self._Y0 = Y0
self._lambda0 = np.radians(lambda0)
self._phi0 = np.radians(phi0)
self._phi1 = np.radians(phi1)
self._phi2 = np.radians(phi2)
self._a = a
self._e = e
self._set_n()
self._set_rho0()
def cartesian(self, lam, phi):
lam = np.radians(lam)
phi = np.radians(phi)
theta = self._n * (lam - self._lambda0)
rho = self._rho(phi)
rho0 = self._rho(self._phi0)
X = self._X0 + rho * np.sin(theta)
Y = self._Y0 + rho0 - rho * np.cos(theta)
return X, Y
def _set_n(self):
self._n = (
np.log(np.cos(self._phi2) / np.cos(self._phi1))
+ (
np.log(
(1 - (self._e * np.sin(self._phi1) ** 2))
/ (1 - (self._e * np.sin(self._phi2) ** 2))
)
/ 2
)
) / (
np.log(
(
np.tan(self._phi1 / 2 + np.pi / 4)
* (
(1 - self._e * np.sin(self._phi2))
* (1 + self._e * np.sin(self._phi1))
)
** (self._e / 2)
)
/ (
np.tan(self._phi2 / 2 + np.pi / 4)
* (
(1 + self._e * np.sin(self._phi2))
* (1 - self._e * np.sin(self._phi1))
)
** (self._e / 2)
)
)
)
def _set_rho0(self):
self._rho0 = (
self._a
* np.cos(self._phi1)
/ (self._n * np.sqrt(1 - self._e**2 * np.sin(self._phi1) ** 2))
* (
np.tan(self._phi1 / 2 + np.pi / 4)
* (
(1 - self._e * np.sin(self._phi1))
/ (1 + self._e * np.sin(self._phi1))
)
** (self._e / 2)
)
** self._n
)
def _rho(self, phi):
return (
self._rho0
* (
1
/ np.tan(phi / 2 + np.pi / 4)
* ((1 + self._e * np.sin(phi)) / (1 - self._e * np.sin(phi)))
** (self._e / 2)
)
** self._n
)