@@ -175,9 +175,10 @@ def parse_direct(path: str, gdal_metadata) -> dict[str, Any]:
175175
176176 r = struct .unpack (">ff5f" , srgr_buf [13 :41 ])
177177
178-
178+ # Envisat file specification says it is SR/GR Conversion ADSR,
179+ # however the polynomial is for GR to SR...
179180 srgr_coeffs = list (r [2 :])
180- metadata ["srgr_coeffs " ] = srgr_coeffs
181+ metadata ["grsr_coeffs " ] = srgr_coeffs
181182
182183
183184
@@ -187,59 +188,69 @@ def parse_direct(path: str, gdal_metadata) -> dict[str, Any]:
187188 # antenna gain
188189 c = 299792458
189190 n_samp = gdal_metadata ["line_length" ]
190- R_first = c * slant_time_first * 1e-9 / 2
191- range_spacing = c / (2 * gdal_metadata ["records" ]["main_processing_params" ]["range_samp_rate" ])
192- range_ref = gdal_metadata ["records" ]["main_processing_params" ]["range_ref" ]
193- R_first = c * slant_time_first * 1e-9 / 2
194-
195- osv = gdal_metadata ["records" ]["main_processing_params" ]["orbit_state_vectors" ]
196191
197- sat_x = osv [0 ]["x_pos_1" ] * 1e-2
198- sat_y = osv [0 ]["y_pos_1" ] * 1e-2
199- sat_z = osv [0 ]["z_pos_1" ] * 1e-2
200192
201193 gain_arr = []
202- for n in range (n_samp ):
203- # https://github.com/senbox-org/microwave-toolbox/blob/master/sar-op-calibration/src/main/java/eu/esa/sar/calibration/gpf/calibrators/ASARCalibrator.java
204- R = R_first + n * range_spacing
205- n_geogrid = len (lats )
206- geo_interp_idx = (n / n_samp ) * (len (lats ) - 1 )
207- idx = int (geo_interp_idx )
208- fract = geo_interp_idx % 1
209- #interpolate geogrid to match first line geogrid to first OSV
210- lat = lats [idx ] + (lats [idx + 1 ] - lats [idx ]) * fract
211- lon = lons [idx ] + (lons [idx + 1 ] - lons [idx ]) * fract
194+ if gdal_metadata ["sample_type" ] == "DETECTED" :
195+ gain_arr = np .ones (n_samp )
196+ spreading_loss = np .ones (n_samp )
197+ else :
198+ # antenna gain
199+ c = 299792458
200+ R_first = c * slant_time_first * 1e-9 / 2
201+ range_spacing = c / (2 * gdal_metadata ["records" ]["main_processing_params" ]["range_samp_rate" ])
202+ range_ref = gdal_metadata ["records" ]["main_processing_params" ]["range_ref" ]
203+ R_first = c * slant_time_first * 1e-9 / 2
204+
205+ osv = gdal_metadata ["records" ]["main_processing_params" ]["orbit_state_vectors" ]
206+
207+ sat_x = osv [0 ]["x_pos_1" ] * 1e-2
208+ sat_y = osv [0 ]["y_pos_1" ] * 1e-2
209+ sat_z = osv [0 ]["z_pos_1" ] * 1e-2
210+
211+ for n in range (n_samp ):
212+ # https://github.com/senbox-org/microwave-toolbox/blob/master/sar-op-calibration/src/main/java/eu/esa/sar/calibration/gpf/calibrators/ASARCalibrator.java
213+ R = R_first + n * range_spacing
214+ n_geogrid = len (lats )
215+ geo_interp_idx = (n / n_samp ) * (len (lats ) - 1 )
216+ idx = int (geo_interp_idx )
217+ fract = geo_interp_idx % 1
218+ #interpolate geogrid to match first line geogrid to first OSV
219+ lat = lats [idx ] + (lats [idx + 1 ] - lats [idx ]) * fract
220+ lon = lons [idx ] + (lons [idx + 1 ] - lons [idx ]) * fract
221+
222+ sar_dis = math .sqrt (sat_x ** 2 + sat_y ** 2 + sat_z ** 2 )
223+
224+ distance = calc_distance (lat , lon )
212225
213- sar_dis = math .sqrt (sat_x ** 2 + sat_y ** 2 + sat_z ** 2 )
226+ # elevation angle, cosine law from three sides, slant range, earth center to satellite, earth center to target
227+ angle_cos = (R * R + sar_dis * sar_dis - distance * distance ) / (2 * R * sar_dis )
228+ elev_angle = np .rad2deg (math .acos (angle_cos ))
214229
215- distance = calc_distance (lat , lon )
230+ # find the gain from LUT, with 201 gains against reference elevation angle with 0.05 degree steps
231+ elev_idx = int ((elev_angle - metadata ["antenna_ref_elev_angle" ]) / 0.05 )
232+ elev_idx += 100
233+ gain = 1.0
234+ if elev_idx >= 0 and elev_idx <= len (antenna_gains ):
235+ # dB -> linear
236+ gain = math .pow (10 , antenna_gains [elev_idx ] / 10 )
216237
217- # elevation angle, cosine law from three sides, slant range, earth center to satellite, earth center to target
218- angle_cos = (R * R + sar_dis * sar_dis - distance * distance ) / (2 * R * sar_dis )
219- elev_angle = np .rad2deg (math .acos (angle_cos ))
238+ gain_arr .append (1 / gain )
220239
221- # find the gain from LUT, with 201 gains against reference elevation angle with 0.05 degree steps
222- elev_idx = int ((elev_angle - metadata ["antenna_ref_elev_angle" ]) / 0.05 )
223- elev_idx += 100
224- gain = 1.0
225- if elev_idx >= 0 and elev_idx <= len (antenna_gains ):
226- # dB -> linear
227- gain = math .pow (10 , antenna_gains [elev_idx ] / 10 )
228240
229- gain_arr .append (gain )
230241
231242
232243
233244
245+ # calculate spreading loss compensation
234246
247+ spreading_loss = []
248+ for n in range (n_samp ):
249+ R = R_first + n * range_spacing
250+ factor = math .sqrt ((range_ref / R ) ** 3 )
251+ spreading_loss .append (1 / factor )
235252
236- # calculate spreading loss compensation
237253
238- spreading_loss = []
239- for n in range (n_samp ):
240- R = R_first + n * range_spacing
241- factor = math .sqrt ((range_ref / R ) ** 3 )
242- spreading_loss .append (1 / factor )
243254
244255 cal_factor = gdal_metadata ["records" ]["main_processing_params" ]["calibration_factors" ][0 ]["ext_cal_fact" ]
245256
0 commit comments