Xarray Sentinel1 python SAFE files reader
- Install xarray-safe-s1
conda create -n safe_s1
conda activate safe_s1
conda install -c conda-forge xarray-safe-s1
- Install xarray-safe-s1
conda create -n safe_s1
conda activate safe_s1
pip install xarray-safe-s1
>>> from safe_s1 import Sentinel1Reader, sentinel1_xml_mappings >>> filename = sentinel1_xml_mappings.get_test_file('S1A_IW_GRDH_1SDV_20170907T103020_20170907T103045_018268_01EB76_Z010.SAFE') >>> Sentinel1Reader(filename).datatree DataTree('None', parent=None) ├── DataTree('geolocationGrid') │ Dimensions: (line: 10, sample: 21) │ Coordinates: │ * line (line) int64 0 2014 4028 6042 ... 12084 14098 16112 16777 │ * sample (sample) int64 0 1260 2520 3780 ... 21420 22680 23940 25186 │ Data variables: │ longitude (line, sample) float64 -67.84 -67.96 -68.08 ... -70.4 -70.51 │ latitude (line, sample) float64 20.73 20.75 20.77 ... 19.62 19.64 │ height (line, sample) float64 8.405e-05 8.058e-05 ... 3.478e-05 │ azimuthTime (line, sample) datetime64[ns] 2017年09月07日T10:30:20.936147 ... │ slantRangeTime (line, sample) float64 0.005331 0.005375 ... 0.006382 │ incidenceAngle (line, sample) float64 30.82 31.7 32.57 ... 44.71 45.36 46.0 │ elevationAngle (line, sample) float64 27.5 28.27 29.02 ... 39.89 40.41 │ Attributes: │ history: longitude:\n annotation/s1a.xml:\n - /product/geolocationGrid... ├── DataTree('orbit') │ Dimensions: (time: 17) │ Coordinates: │ * time (time) datetime64[ns] 2017年09月07日T10:29:14.474905 ... 2017-09-... │ Data variables: │ velocity_x (time) float64 -116.7 -154.1 -191.4 ... -628.1 -663.4 -698.6 │ velocity_y (time) float64 -3.433e+03 -3.368e+03 ... -2.413e+03 -2.342e+03 │ velocity_z (time) float64 -6.776e+03 -6.808e+03 ... -7.174e+03 -7.194e+03 │ position_x (time) float64 2.892e+06 2.89e+06 ... 2.833e+06 2.826e+06 │ position_y (time) float64 -5.782e+06 -5.816e+06 ... -6.222e+06 -6.246e+06 │ position_z (time) float64 2.869e+06 2.801e+06 ... 1.82e+06 1.748e+06 │ Attributes: │ orbit_pass: Descending │ platform_heading: -167.7668824808032 │ frame: Earth Fixed │ history: orbit:\n annotation/s1a.xml:\n - //product/generalAn... ├── DataTree('image') │ Dimensions: (dim_0: 2) │ Dimensions without coordinates: dim_0 │ Data variables: (12/14) │ LineUtcTime (dim_0) datetime64[ns] 2017年09月07日T10:30:20.93640... │ numberOfLines int64 16778 │ numberOfSamples int64 25187 │ azimuthPixelSpacing float64 10.0 │ slantRangePixelSpacing float64 10.0 │ groundRangePixelSpacing float64 10.0 │ ... ... │ slantRangeTime float64 0.005331 │ swath_subswath <U2 'IW' │ radarFrequency float64 5.405e+09 │ rangeSamplingRate float64 6.435e+07 │ azimuthSteeringRate float64 1.59 │ history <U824 'image:\n annotation/s1a.xml:\n - /produ... ├── DataTree('azimuth_fmrate') │ Dimensions: (azimuthTime: 11) │ Coordinates: │ * azimuthTime (azimuthTime) datetime64[ns] 2017年09月07日T10:30:18... │ Data variables: │ t0 (azimuthTime) float64 0.005331 ... 0.005331 │ azimuthFmRatePolynomial (azimuthTime) object -2337.303489601216 + 448953... │ Attributes: │ history: azimuth_fmrate:\n annotation/s1a.xml:\n - //product/generalAn... ├── DataTree('doppler_estimate') │ Dimensions: (azimuthTime: 27, nb_fine_dce: 20) │ Coordinates: │ * azimuthTime (azimuthTime) datetime64[ns] 2017年09月07日T10:... │ * nb_fine_dce (nb_fine_dce) int64 0 1 2 3 4 ... 16 17 18 19 │ Data variables: │ t0 (azimuthTime) float64 0.005332 ... 0.005331 │ geometryDcPolynomial (azimuthTime) object -1.070619 - 183.4602·x... │ dataDcPolynomial (azimuthTime) object -74.90705 + 85274.16·x... │ fineDceAzimuthStartTime (azimuthTime) datetime64[ns] 2017年09月07日T10:... │ fineDceAzimuthStopTime (azimuthTime) datetime64[ns] 2017年09月07日T10:... │ dataDcRmsError (azimuthTime) float64 6.181 6.181 ... 7.745 │ slantRangeTime (azimuthTime, nb_fine_dce) float64 0.006021... │ frequency (azimuthTime, nb_fine_dce) float64 -28.36 .... │ dataDcRmsErrorAboveThreshold (azimuthTime) bool False False ... False False │ Attributes: │ history: doppler_estimate:\n annotation/s1a.xml:\n - /product/dopplerC... ├── DataTree('bursts') │ Dimensions: (burst: 0) │ Dimensions without coordinates: burst │ Data variables: │ azimuthTime (burst) float64 │ linesPerBurst int64 0 │ samplesPerBurst int64 0 │ Attributes: │ history: bursts_grd:\n annotation/s1a.xml:\n - /product/swathTiming/li... ├── DataTree('calibration_luts') │ Dimensions: (line: 27, sample: 631, pol: 2) │ Coordinates: │ * line (line) int64 0 671 1342 2013 2684 ... 15436 16107 16778 17449 │ * sample (sample) int64 0 40 80 120 160 ... 25040 25080 25120 25160 25186 │ * pol (pol) object 'VV' 'VH' │ Data variables: │ sigma0_lut (pol, line, sample) float64 662.0 661.7 661.5 ... 558.9 558.8 │ gamma0_lut (pol, line, sample) float64 613.4 613.1 612.7 ... 465.8 465.7 ├── DataTree('noise_azimuth_raw') │ Dimensions: (swath: 0, pol: 2) │ Coordinates: │ * swath (swath) float64 │ * pol (pol) object 'VV' 'VH' │ Data variables: │ line_start (pol, swath) int64 │ line_stop (pol, swath) int64 │ sample_start (pol, swath) int64 │ sample_stop (pol, swath) int64 │ Attributes: │ history: noise_lut_azi_raw_grd:\n annotation/calibration/noise.xml:\n ... └── DataTree('noise_range_raw') Dimensions: (line: 27, sample: 634, pol: 2) Coordinates: * line (line) int64 0 671 1342 2013 2684 ... 15433 16104 16775 16777 * sample (sample) int64 0 40 80 120 160 ... 25028 25068 25108 25148 25186 * pol (pol) object 'VV' 'VH' Data variables: noise_lut (pol, line, sample) float64 1.641e+03 1.62e+03 ... 0.0 0.0
Example of usage for S3: access
url = 's3:///eodata/..../.SAFE'
storage_options = {"anon": False, "client_kwargs": {"endpoint_url": 'https://'+entrypoint_url, 'aws_access_key_id':access_key,
'aws_secret_access_key':secret_key}}
reader = Sentinel1Reader(url,backend_kwargs={"storage_options": storage_options})