Skip to content

Commit 9a7850e

Browse files
gshiromaGitHub Enterprise
authored andcommitted
Add ground-track velocity to metadata cubes (#827)
* add ground-track velocity to metadata cubes * rename pybind_nisar to nisar * rename pybind_nisar to nisar (2) * rename pybind_nisar to nisar (3) * rename pybind_nisar to nisar (4) * rename pybind_nisar to nisar (5) * remove static from writeVectorDerivedCubes()
1 parent 2d84c22 commit 9a7850e

File tree

5 files changed

+108
-41
lines changed

5 files changed

+108
-41
lines changed

cxx/isce3/geometry/metadataCubes.cpp

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ static void writeArray(isce3::io::Raster* raster,
5959
}
6060
}
6161

62-
static inline void writeVectorDerivedCubes(const int array_pos_i,
62+
inline void writeVectorDerivedCubes(const int array_pos_i,
6363
const int array_pos_j, const double native_azimuth_time,
6464
const isce3::core::Vec3& target_llh,
6565
const isce3::core::Vec3& target_proj, const isce3::core::Orbit& orbit,
@@ -76,7 +76,9 @@ static inline void writeVectorDerivedCubes(const int array_pos_i,
7676
isce3::io::Raster* along_track_unit_vector_y_raster,
7777
isce3::core::Matrix<float>& along_track_unit_vector_y_array,
7878
isce3::io::Raster* elevation_angle_raster,
79-
isce3::core::Matrix<float>& elevation_angle_array)
79+
isce3::core::Matrix<float>& elevation_angle_array,
80+
isce3::io::Raster* ground_track_velocity_raster,
81+
isce3::core::Matrix<double>& ground_track_velocity_array)
8082
{
8183

8284
const int i = array_pos_i;
@@ -99,6 +101,13 @@ static inline void writeVectorDerivedCubes(const int array_pos_i,
99101
// Get target position in ECEF (target_xyz)
100102
const isce3::core::Vec3 target_xyz = ellipsoid.lonLatToXyz(target_llh);
101103

104+
// Ground-track velocity
105+
if (ground_track_velocity_raster != nullptr) {
106+
const double ground_velocity =
107+
target_xyz.norm() * vel_xyz.norm() / sat_xyz.norm();
108+
ground_track_velocity_array(i, j) = ground_velocity;
109+
}
110+
102111
// Create target-to-sat vector in ECEF
103112
const isce3::core::Vec3 look_vector_xyz =
104113
(sat_xyz - target_xyz).normalized();
@@ -270,6 +279,7 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
270279
isce3::io::Raster* along_track_unit_vector_x_raster,
271280
isce3::io::Raster* along_track_unit_vector_y_raster,
272281
isce3::io::Raster* elevation_angle_raster,
282+
isce3::io::Raster* ground_track_velocity_raster,
273283
const double threshold_geo2rdr, const int numiter_geo2rdr,
274284
const double delta_range)
275285
{
@@ -311,6 +321,8 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
311321
getNanArray<float>(along_track_unit_vector_y_raster, geogrid);
312322
auto elevation_angle_array =
313323
getNanArray<float>(elevation_angle_raster, geogrid);
324+
auto ground_track_velocity_array =
325+
getNanArray<double>(ground_track_velocity_raster, geogrid);
314326

315327
double azimuth_time = radar_grid.sensingMid();
316328
double native_azimuth_time = radar_grid.sensingMid();
@@ -360,7 +372,8 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
360372
los_unit_vector_y_raster == nullptr &&
361373
along_track_unit_vector_x_raster == nullptr &&
362374
along_track_unit_vector_y_raster == nullptr &&
363-
elevation_angle_raster == nullptr) {
375+
elevation_angle_raster == nullptr &&
376+
ground_track_velocity_raster == nullptr) {
364377
continue;
365378
}
366379

@@ -390,8 +403,11 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
390403
along_track_unit_vector_x_raster,
391404
along_track_unit_vector_x_array,
392405
along_track_unit_vector_y_raster,
393-
along_track_unit_vector_y_array, elevation_angle_raster,
394-
elevation_angle_array);
406+
along_track_unit_vector_y_array,
407+
elevation_angle_raster,
408+
elevation_angle_array,
409+
ground_track_velocity_raster,
410+
ground_track_velocity_array);
395411
}
396412
}
397413

@@ -407,6 +423,8 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
407423
writeArray(along_track_unit_vector_y_raster,
408424
along_track_unit_vector_y_array, height_count);
409425
writeArray(elevation_angle_raster, elevation_angle_array, height_count);
426+
writeArray(ground_track_velocity_raster, ground_track_velocity_array,
427+
height_count);
410428
}
411429

412430
double geotransform[] = {
@@ -445,6 +463,10 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
445463
elevation_angle_raster->setGeoTransform(geotransform);
446464
elevation_angle_raster->setEPSG(geogrid.epsg());
447465
}
466+
if (ground_track_velocity_raster != nullptr) {
467+
ground_track_velocity_raster->setGeoTransform(geotransform);
468+
ground_track_velocity_raster->setEPSG(geogrid.epsg());
469+
}
448470
}
449471

450472
void makeGeolocationGridCubes(
@@ -461,6 +483,7 @@ void makeGeolocationGridCubes(
461483
isce3::io::Raster* along_track_unit_vector_x_raster,
462484
isce3::io::Raster* along_track_unit_vector_y_raster,
463485
isce3::io::Raster* elevation_angle_raster,
486+
isce3::io::Raster* ground_track_velocity_raster,
464487
const double threshold_geo2rdr, const int numiter_geo2rdr,
465488
const double delta_range)
466489
{
@@ -501,6 +524,8 @@ void makeGeolocationGridCubes(
501524
getNanArrayRadarGrid<float>(along_track_unit_vector_y_raster, radar_grid);
502525
auto elevation_angle_array =
503526
getNanArrayRadarGrid<float>(elevation_angle_raster, radar_grid);
527+
auto ground_track_velocity_array =
528+
getNanArrayRadarGrid<double>(ground_track_velocity_raster, radar_grid);
504529

505530
auto height = heights[height_count];
506531
double native_azimuth_time = radar_grid.sensingMid();
@@ -550,7 +575,8 @@ void makeGeolocationGridCubes(
550575
los_unit_vector_y_raster == nullptr &&
551576
along_track_unit_vector_x_raster == nullptr &&
552577
along_track_unit_vector_y_raster == nullptr &&
553-
elevation_angle_raster == nullptr) {
578+
elevation_angle_raster == nullptr &&
579+
ground_track_velocity_raster == nullptr) {
554580
continue;
555581
}
556582

@@ -579,8 +605,11 @@ void makeGeolocationGridCubes(
579605
along_track_unit_vector_x_raster,
580606
along_track_unit_vector_x_array,
581607
along_track_unit_vector_y_raster,
582-
along_track_unit_vector_y_array, elevation_angle_raster,
583-
elevation_angle_array);
608+
along_track_unit_vector_y_array,
609+
elevation_angle_raster,
610+
elevation_angle_array,
611+
ground_track_velocity_raster,
612+
ground_track_velocity_array);
584613
}
585614
}
586615
writeArray(coordinate_x_raster, coordinate_x_array, height_count);
@@ -595,6 +624,8 @@ void makeGeolocationGridCubes(
595624
writeArray(along_track_unit_vector_y_raster,
596625
along_track_unit_vector_y_array, height_count);
597626
writeArray(elevation_angle_raster, elevation_angle_array, height_count);
627+
writeArray(ground_track_velocity_raster, ground_track_velocity_array,
628+
height_count);
598629
}
599630
}
600631
}

cxx/isce3/geometry/metadataCubes.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ namespace isce3 { namespace geometry {
3737
* @param[out] along_track_unit_vector_y_array Along-track unit vector Y array
3838
* @param[out] elevation_angle_raster Elevation cube raster
3939
* @param[out] elevation_angle_array Elevation cube array
40+
* @param[out] ground_track_velocity_raster Ground-track velocity raster
41+
* @param[out] ground_track_velocity_array Ground-track velocity array
4042
*/
41-
static inline void writeVectorDerivedCubes(const int array_pos_i,
43+
inline void writeVectorDerivedCubes(const int array_pos_i,
4244
const int array_pos_j, const double native_azimuth_time,
4345
const isce3::core::Vec3& target_llh,
4446
const isce3::core::Vec3& target_proj, const isce3::core::Orbit& orbit,
@@ -55,7 +57,9 @@ static inline void writeVectorDerivedCubes(const int array_pos_i,
5557
isce3::io::Raster* along_track_unit_vector_y_raster,
5658
isce3::core::Matrix<float>& along_track_unit_vector_y_array,
5759
isce3::io::Raster* elevation_angle_raster,
58-
isce3::core::Matrix<float>& elevation_angle_array);
60+
isce3::core::Matrix<float>& elevation_angle_array,
61+
isce3::io::Raster* ground_track_velocity_raster,
62+
isce3::core::Matrix<double>& ground_track_velocity_array);
5963

6064
/** Make metadata radar grid cubes
6165
*
@@ -107,6 +111,7 @@ static inline void writeVectorDerivedCubes(const int array_pos_i,
107111
* cube raster
108112
* @param[out] elevation_angle_raster Elevation angle (in degrees wrt
109113
* geodedic nadir) cube raster
114+
* @param[out] ground_track_velocity_raster Ground-track velocity raster
110115
* @param[in] threshold_geo2rdr Range threshold for geo2rdr
111116
* @param[in] numiter_geo2rdr Geo2rdr maximum number of iterations
112117
* @param[in] delta_range Step size used for computing
@@ -126,6 +131,7 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
126131
isce3::io::Raster* along_track_unit_vector_x_raster = nullptr,
127132
isce3::io::Raster* along_track_unit_vector_y_raster = nullptr,
128133
isce3::io::Raster* elevation_angle_raster = nullptr,
134+
isce3::io::Raster* ground_track_velocity_raster = nullptr,
129135
const double threshold_geo2rdr = 1e-8, const int numiter_geo2rdr = 100,
130136
const double delta_range = 1e-8);
131137

@@ -176,6 +182,7 @@ void makeRadarGridCubes(const isce3::product::RadarGridParameters& radar_grid,
176182
* cube raster
177183
* @param[out] elevation_angle_raster Elevation angle (in degrees wrt
178184
* geodedic nadir) cube raster
185+
* @param[out] ground_track_velocity_raster Ground-track velocity raster
179186
* @param[in] threshold_geo2rdr Range threshold for geo2rdr
180187
* @param[in] numiter_geo2rdr Geo2rdr maximum number of iterations
181188
* @param[in] delta_range Step size used for computing
@@ -190,11 +197,12 @@ void makeGeolocationGridCubes(
190197
isce3::io::Raster* coordinate_x_raster = nullptr,
191198
isce3::io::Raster* coordinate_y_raster = nullptr,
192199
isce3::io::Raster* incidence_angle_raster = nullptr,
193-
isce3::io::Raster* losUnitVectorX_raster = nullptr,
194-
isce3::io::Raster* losUnitVectorY_raster = nullptr,
195-
isce3::io::Raster* alongTrackUnitVectorX_raster = nullptr,
196-
isce3::io::Raster* alongTrackUnitVectorY_raster = nullptr,
197-
isce3::io::Raster* elevationAngle_raster = nullptr,
200+
isce3::io::Raster* los_unit_vector_x_raster = nullptr,
201+
isce3::io::Raster* los_unit_vector_y_raster = nullptr,
202+
isce3::io::Raster* along_track_unit_vector_x_raster = nullptr,
203+
isce3::io::Raster* along_track_unit_vector_y_raster = nullptr,
204+
isce3::io::Raster* elevation_angle_raster = nullptr,
205+
isce3::io::Raster* ground_track_velocity_raster = nullptr,
198206
const double threshold_geo2rdr = 1e-8, const int numiter_geo2rdr = 100,
199207
const double delta_range = 1e-8);
200208

python/extensions/pybind_isce3/geometry/metadataCubes.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ void addbinding_metadata_cubes(py::module & m)
2424
py::arg("along_track_unit_vector_x_raster") = nullptr,
2525
py::arg("along_track_unit_vector_y_raster") = nullptr,
2626
py::arg("elevation_angle_raster") = nullptr,
27+
py::arg("ground_track_velocity_raster") = nullptr,
2728
py::arg("threshold_geo2rdr") = 1.0e-8,
2829
py::arg("numiter_geo2rdr") = 100, py::arg("delta_range") = 1.0e-8,
2930
R"(Make metadata radar grid cubes
@@ -85,6 +86,8 @@ void addbinding_metadata_cubes(py::module & m)
8586
Along-track unit vector Y raster
8687
elevation_angle_raster : isce3.io.Raster, optional
8788
Elevation angle (in degrees wrt geodedic nadir) cube raster
89+
ground_track_velocity_raster : isce3.io.Raster, optional
90+
Ground-track velocity cube raster
8891
threshold_geo2rdr : double, optional
8992
Range threshold for geo2rdr
9093
numiter_geo2rdr : int, optional
@@ -106,6 +109,7 @@ void addbinding_metadata_cubes(py::module & m)
106109
py::arg("along_track_unit_vector_x_raster") = nullptr,
107110
py::arg("along_track_unit_vector_y_raster") = nullptr,
108111
py::arg("elevation_angle_raster") = nullptr,
112+
py::arg("ground_track_velocity_raster") = nullptr,
109113
py::arg("threshold_geo2rdr") = 1.0e-8,
110114
py::arg("numiter_geo2rdr") = 100, py::arg("delta_range") = 1.0e-6,
111115
R"(Make metadata geolocation grid cubes
@@ -167,6 +171,8 @@ void addbinding_metadata_cubes(py::module & m)
167171
Along-track unit vector Y raster
168172
elevation_angle_raster : isce3.io.Raster, optional
169173
Elevation angle (in degrees wrt geodedic nadir) cube raster
174+
ground_track_velocity_raster : isce3.io.Raster, optional
175+
Ground-track velocity cube raster
170176
threshold_geo2rdr : double, optional
171177
Range threshold for geo2rdr
172178
numiter_geo2rdr : int, optional

python/packages/nisar/workflows/h5_prep.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,12 @@ def add_radar_grid_cubes_to_hdf5(hdf5_obj, cube_group_name, geogrid,
11761176
long_name='Elevation angle',
11771177
descr='Elevation angle is defined as angle between LOS vector and norm at the sensor',
11781178
units='degrees')
1179+
ground_track_velocity_raster = _get_raster_from_hdf5_ds(
1180+
cube_group, 'groundTrackVelocity', np.float64, cube_shape,
1181+
zds=zds, yds=yds, xds=xds,
1182+
long_name='Ground-track velocity',
1183+
descr='Ground track velocity needed to convert azimuth offsets in pixels to meters',
1184+
units='m/s')
11791185

11801186
isce3.geometry.make_radar_grid_cubes(radar_grid,
11811187
geogrid,
@@ -1192,6 +1198,7 @@ def add_radar_grid_cubes_to_hdf5(hdf5_obj, cube_group_name, geogrid,
11921198
along_track_unit_vector_x_raster,
11931199
along_track_unit_vector_y_raster,
11941200
elevation_angle_raster,
1201+
ground_track_velocity_raster,
11951202
threshold_geo2rdr,
11961203
numiter_geo2rdr,
11971204
delta_range)
@@ -1317,6 +1324,12 @@ def add_geolocation_grid_cubes_to_hdf5(hdf5_obj, cube_group_name, radar_grid,
13171324
long_name='Elevation angle',
13181325
descr='Elevation angle is defined as angle between LOS vector and norm at the sensor',
13191326
units='degrees')
1327+
ground_track_velocity_raster = _get_raster_from_hdf5_ds(
1328+
cube_group, 'groundTrackVelocity', np.float64, cube_shape,
1329+
zds=zds, yds=yds, xds=xds,
1330+
long_name='Ground-track velocity',
1331+
descr='Ground track velocity needed to convert azimuth offsets in pixels to meters',
1332+
units='m/s')
13201333

13211334
isce3.geometry.make_geolocation_cubes(radar_grid,
13221335
heights,
@@ -1333,6 +1346,7 @@ def add_geolocation_grid_cubes_to_hdf5(hdf5_obj, cube_group_name, radar_grid,
13331346
along_track_unit_vector_x_raster,
13341347
along_track_unit_vector_y_raster,
13351348
elevation_angle_raster,
1349+
ground_track_velocity_raster,
13361350
threshold_geo2rdr,
13371351
numiter_geo2rdr,
13381352
delta_range)

0 commit comments

Comments
 (0)