File: USER-REQUIREMENTS.md

package info (click to toggle)
xarray-sentinel 0.9.5%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 21,476 kB
  • sloc: xml: 77,744; python: 2,075; makefile: 37; sh: 31
file content (84 lines) | stat: -rw-r--r-- 3,162 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Data groups:

- SLC complex measurements by swath and burst
  - azimuth / time, slant_range as dimensions, polarisation as variables
  - azimuth / slant_range coordinates as distances instead of times for
    easier interpretation? (slant_range == two-ways-time * speed-of-light,
    azimuth as linear distance from ascending node?) - rejected for now
  - keep time coordinates as UTC, TAI, UT1 and elapsed time from ascending node (NOT PRESENT??)
- calibration information (azimuth / slant_range dimensions on a reduced grid)
- ground control points (azimuth / slant_range dimensions on one more reduced grid)
- de-ramping parameters
- kinematic description:
  - orbit / state vectors
  - attitude / quaternions
- antenna pattern
- Doppler centroid / Doppler rate
- incidence angle & Co.

Not loaded:

- noise

Attributes:

- mission, acquisition, processing, etc

Conformance in order of precedence:

- STAC metadata for attributes with SAT and SAR extensions
- CF conventions for the coordinates (with special attentions to time)

High level requirements:

- keep all naming as close to the original al possible (with XML camel case to Python snake case?)
- support opening a swath when other swaths are missing (especially the tifs)

# User experience

```python
>>> import xarray as xr
>>> ds = xr.open_dataset("tests/data/S1B_IW_SLC__1SDV_20210401T052622_20210401T052650_026269_032297_EFA4.SAFE/manifest.safe")
>>> ds = xr.open_dataset("tests/data/S1B_IW_SLC__1SDV_20210401T052622_20210401T052650_026269_032297_EFA4.SAFE")
>>> ds
<xarray.Dataset>
...
>>> ds_iw1_gpc = xr.open_dataset("tests/data/S1B_IW_SLC__1SDV_20210401T052622_20210401T052650_026269_032297_EFA4.SAFE", group="IW1/VV/gcp")

```

Structure:

- root / SAFE
  - swaths "IW1" "IW2" "S3" etc / duplicated in VH-VV annotation XML
    - bursts "R022_N433_E0120" etc
      - polarizations are data variables
    - gcp "gcp"
    - calibration "calibration"
    - orbit "orbit" / duplicated in annotation XML for different polarizations
    - attitude "attitude" / same as above
    - antenna pattern "antenna"
    - zero-Doppler "doppler"

examples: `group="IW2/orbit"`, `group="IW2/N433_E0120`, `group="S3/gcp"` etc

Dimensions, coordinates and variables

We may either keep names and unit of measures as close as possible to the original
or going for easier-to-use choices.

In all cases we add the XML tag name in the long_name so it is clear the provenance of the
information: e.g. for `slant_range_time` -> `"long_name": "two way delay (slantRangeTime)"`

- `azimuth_time` as CF time in UTC (warn: may fail on leap seconds)
- `slant_range_time` as CF time interval in `"s"`

# Accuracy considerations

- `azimuth_time` can be expressed as `np.datetime64[ns]` because
  spatial resolution at LEO speed is 10km/s * 1ns ~= 0.001cm
- `slant_range_time` cannot be expressed as `np.timedelta64[ns]` because
  spatial resolution at the speed of light is 300_000km/s * 1ns / 2 ~= 15cm,
  that it is not enough for interferometric applications.
  `slant_range_time` needs a spatial resolution of 0.001cm at a 1_000km distance
  so around 1e-9 that is well within 1e-15 resolution of IEEE-754 float64.