Skip to content

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).