Bathymetry processing (subdomain + 1d interpolation)
This commit is contained in:
parent
d69a39f25b
commit
f42edfb8f8
4 changed files with 244 additions and 0 deletions
12
data/config.ini
Normal file
12
data/config.ini
Normal file
|
@ -0,0 +1,12 @@
|
|||
[bathy]
|
||||
inp=Database_20220224.xyz
|
||||
sub=bathy_sub.npy
|
||||
out=bathy.npy
|
||||
|
||||
[artha]
|
||||
lat=43.398450
|
||||
lon=-1.673097
|
||||
|
||||
[buoy]
|
||||
lat=43.408333
|
||||
lon=-1.681667
|
100
data/processing/lambert.py
Normal file
100
data/processing/lambert.py
Normal file
|
@ -0,0 +1,100 @@
|
|||
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
|
||||
)
|
82
data/processing/projection.py
Normal file
82
data/processing/projection.py
Normal file
|
@ -0,0 +1,82 @@
|
|||
import argparse
|
||||
import configparser
|
||||
import logging
|
||||
import pathlib
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
from scipy import interpolate
|
||||
|
||||
from .lambert import Lambert
|
||||
|
||||
parser = argparse.ArgumentParser(description="Pre-process bathymetry")
|
||||
parser.add_argument("-v", "--verbose", action="count", default=0)
|
||||
args = parser.parse_args()
|
||||
|
||||
logging.basicConfig(level=max((10, 20 - 10 * args.verbose)))
|
||||
log = logging.getLogger("bathy")
|
||||
|
||||
log.info("Starting bathymetry pre-processing")
|
||||
config = configparser.ConfigParser()
|
||||
config.read("config.ini")
|
||||
|
||||
bathy_inp = pathlib.Path(config.get("bathy", "sub"))
|
||||
bathy_out = pathlib.Path(config.get("bathy", "out"))
|
||||
|
||||
log.info(f"Loading bathymetry from {bathy_inp}")
|
||||
bathy_curvi = np.load(bathy_inp)
|
||||
|
||||
projection = Lambert()
|
||||
bathy = np.stack(
|
||||
(
|
||||
*projection.cartesian(bathy_curvi[:, 0], bathy_curvi[:, 1]),
|
||||
bathy_curvi[:, 2],
|
||||
),
|
||||
axis=1
|
||||
)
|
||||
log.debug(f"Cartesian bathy: {bathy}")
|
||||
|
||||
artha_curvi = np.array(
|
||||
(config.getfloat("artha", "lon"), config.getfloat("artha", "lat"))
|
||||
)
|
||||
buoy_curvi = np.array(
|
||||
(config.getfloat("buoy", "lon"), config.getfloat("buoy", "lat"))
|
||||
)
|
||||
|
||||
artha = np.asarray(projection.cartesian(*artha_curvi))
|
||||
buoy = np.asarray(projection.cartesian(*buoy_curvi))
|
||||
|
||||
|
||||
def display():
|
||||
x = np.linspace(bathy[:, 0].min(), bathy[:, 0].max())
|
||||
y = np.linspace(bathy[:, 1].min(), bathy[:, 1].max())
|
||||
|
||||
X, Y = np.meshgrid(x, y)
|
||||
|
||||
Z = interpolate.griddata(
|
||||
bathy[:, :2], bathy[:, 2], (X, Y), method="nearest"
|
||||
)
|
||||
|
||||
fix, ax = plt.subplots()
|
||||
ax.pcolormesh(X, Y, Z)
|
||||
ax.scatter(*artha, c="k")
|
||||
ax.scatter(*buoy, c="k")
|
||||
|
||||
ax.axis("equal")
|
||||
return ax
|
||||
|
||||
|
||||
D = np.diff(np.stack((artha, buoy)), axis=0)
|
||||
x = np.arange(-150, np.sqrt((D**2).sum()) + 150)
|
||||
theta = np.angle(D.dot((1, 1j)))
|
||||
|
||||
coords = artha + (x * np.stack((np.cos(theta), np.sin(theta)))).T
|
||||
|
||||
z = interpolate.griddata(bathy[:,:2], bathy[:,2], coords)
|
||||
|
||||
ax = display()
|
||||
ax.scatter(*coords.T, c="k", marker=".")
|
||||
|
||||
fig_1d, ax_1d = plt.subplots()
|
||||
ax_1d.plot(x, z)
|
||||
plt.show(block=True)
|
50
data/processing/subdomain.py
Normal file
50
data/processing/subdomain.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
import argparse
|
||||
import configparser
|
||||
import logging
|
||||
import pathlib
|
||||
|
||||
import numpy as np
|
||||
|
||||
parser = argparse.ArgumentParser(description="Pre-process bathymetry")
|
||||
parser.add_argument("-v", "--verbose", action="count", default=0)
|
||||
args = parser.parse_args()
|
||||
|
||||
logging.basicConfig(level=max((10, 20 - 10 * args.verbose)))
|
||||
log = logging.getLogger("bathy")
|
||||
|
||||
log.info("Starting bathymetry pre-processing")
|
||||
config = configparser.ConfigParser()
|
||||
config.read("config.ini")
|
||||
|
||||
artha = np.array(
|
||||
(config.getfloat("artha", "lon"), config.getfloat("artha", "lat"))
|
||||
)
|
||||
buoy = np.array(
|
||||
(config.getfloat("buoy", "lon"), config.getfloat("buoy", "lat"))
|
||||
)
|
||||
log.debug(f"artha: {artha}")
|
||||
log.debug(f"buoy: {buoy}")
|
||||
|
||||
domain = np.stack((artha, buoy))
|
||||
domain.sort(axis=0)
|
||||
log.debug(f"domain: {domain}")
|
||||
|
||||
domain[0] -= 0.002
|
||||
domain[1] += 0.002
|
||||
log.debug(f"domain: {domain}")
|
||||
|
||||
bathy_inp = pathlib.Path(config.get("bathy", "inp"))
|
||||
bathy_out = pathlib.Path(config.get("bathy", "sub"))
|
||||
log.info(f"Reading bathymetry from '{bathy_inp}'")
|
||||
raw_bathy = np.genfromtxt(bathy_inp)
|
||||
log.debug(f"Initial size: {raw_bathy.shape}")
|
||||
|
||||
bathy = raw_bathy[
|
||||
((raw_bathy[:, :2] > domain[0]) & (raw_bathy[:, :2] < domain[1])).all(
|
||||
axis=1
|
||||
)
|
||||
]
|
||||
log.debug(f"Final size: {bathy.shape}")
|
||||
|
||||
log.info(f"Saving subdomain to 'bathy'")
|
||||
np.save(bathy_out, bathy)
|
Loading…
Reference in a new issue