| from __future__ import annotations | |
| import numpy as np | |
| def lambert_grid(image_size: tuple[int, int]) -> tuple[np.ndarray, np.ndarray]: | |
| """Create the project's regional latitude/longitude grid in pure NumPy.""" | |
| if image_size != (512, 640): | |
| raise ValueError("The regional grid must have shape (512, 640)") | |
| radius = 6371229.0 | |
| standard_latitude = np.deg2rad(38.5) | |
| origin_latitude = np.deg2rad(38.5) | |
| central_longitude = np.deg2rad(-97.5) | |
| x = -2697520.1425219304 + 3000.0 * np.arange(1799, dtype=np.float64) | |
| y = -1587306.1525566636 + 3000.0 * np.arange(1059, dtype=np.float64) | |
| x = x[579:1219] | |
| y = y[273:785] | |
| xx, yy = np.meshgrid(x, y) | |
| n = np.sin(standard_latitude) | |
| f = np.cos(standard_latitude) * np.tan(np.pi / 4 + standard_latitude / 2) ** n / n | |
| rho0 = radius * f / np.tan(np.pi / 4 + origin_latitude / 2) ** n | |
| rho = np.hypot(xx, rho0 - yy) | |
| theta = np.arctan2(xx, rho0 - yy) | |
| latitude = 2 * np.arctan((radius * f / rho) ** (1 / n)) - np.pi / 2 | |
| longitude = central_longitude + theta / n | |
| return np.rad2deg(latitude).astype(np.float32), np.mod(np.rad2deg(longitude), 360).astype(np.float32) | |