Maps from L2 points
egms_client.decompose ¶
Maps from L2 points: gridding, and ascending + descending into vertical and east-west.
L2A / L2B points measure motion along the satellite's line of sight (LOS).
Each point carries the LOS unit vector, from the ground to the satellite:
los_east, los_north, los_up (descending, looking west: east
~ +0.65, up ~ +0.75; ascending, looking east: east ~ -0.69, up ~ +0.72). A
positive mean_velocity moves towards the satellite, so for a ground
motion (E, N, U)::
v_los = E * los_east + N * los_north + U * los_up
Both Sentinel-1 orbits fly almost north-south, so los_north is small
(~0.1) and north motion is left out, as EGMS does for L3. With one
ascending and one descending grid over the same cells, the two equations
give U and E cell by cell. This is what L3 does on its own 100 m
grid, here on any grid and any area.
Only numpy is needed; frames are anything indexable by column name
(a pandas DataFrame from :func:egms_client.tables.read_csv, for example).
LosGrid
dataclass
¶
L2 points averaged per cell: LOS velocity, LOS direction, and how many points.
velocity is a :class:Mosaic (mm/year, NaN where no point);
east and up are the mean LOS unit vector components per cell;
count the points per cell.
grid_los ¶
grid_los(frame: Any, *, minx: float, miny: float, maxx: float, maxy: float, pixel: float = 100.0, min_coherence: float = MIN_COHERENCE) -> LosGrid
Average the points of one geometry onto a grid in EPSG:3035 metres.
The rectangle widens to the pixel grid, aligned like L3 when the
pixel is 100 m. Points outside it, or with temporal_coherence below
min_coherence, are left out.
decompose ¶
decompose(ascending: LosGrid, descending: LosGrid) -> tuple[Mosaic, Mosaic]
Vertical and east-west velocity (mm/year) from two LOS grids of the same cells.
NaN where either geometry has no point. ValueError if the grids are
not the same, or if both look the same way (two ascending grids cannot
be separated).