Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
d1c4d7f
disable polarimetric symmetrization by default
gshiroma Jul 3, 2025
0ef09a8
Merge branch 'isce-framework:develop' into develop
gshiroma Jul 9, 2025
2ac2694
revert changes to `symmetrize_cross_pol_channels`
gshiroma Jul 22, 2025
05d7fda
Update GCOV and GSLC specification XMLs
gshiroma Jul 22, 2025
749058d
Revert changes to the GCOV and GSLC specification XMLs
gshiroma Jul 23, 2025
fc8ac53
Merge branch 'isce-framework:develop' into develop
gshiroma Jul 24, 2025
064d073
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 7, 2025
22464ef
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 7, 2025
a75e7f1
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 11, 2025
ab21d36
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 12, 2025
d61d489
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 18, 2025
0af53dd
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 20, 2025
d454e6a
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 21, 2025
6e7e9d1
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 28, 2025
dd80c38
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 29, 2025
63853b2
Merge branch 'isce-framework:develop' into develop
gshiroma Aug 29, 2025
7c7272f
Merge branch 'isce-framework:develop' into develop
gshiroma Sep 2, 2025
dd18a84
Merge branch 'isce-framework:develop' into develop
gshiroma Sep 17, 2025
d43ca22
Merge branch 'isce-framework:develop' into develop
gshiroma Oct 6, 2025
fa38bc0
Make the radar grid azimuth and range spacing parameters configurable…
gshiroma Oct 6, 2025
7b88217
Make the radar grid azimuth and range spacing parameters configurable…
gshiroma Oct 7, 2025
fd7453b
Make the radar grid azimuth and range spacing parameters configurable…
gshiroma Nov 10, 2025
4ee53eb
Expose sensing start/end times and starting/ending ranges in the STAT…
gshiroma Jan 21, 2026
70355b3
Merge branch 'isce-framework:develop' into improve_static_layers_work…
gshiroma Jan 21, 2026
31a98f0
Expose sensing start/end times and starting/ending ranges in the STAT…
gshiroma Jan 21, 2026
78a018d
rename some radar grid parameters to match focus
gshiroma Jan 26, 2026
9db1f5a
rename some radar grid parameters to match focus (2)
gshiroma Jan 26, 2026
c168e7f
add margin to user-specified radar-grid extents, if provided
gshiroma Jan 29, 2026
fdd79bc
enable fractional precision for radargrid start and end times
gshiroma Feb 8, 2026
a72949c
convert start & end date-time string to isce3.core.DateTime before ad…
gshiroma Feb 8, 2026
f21d9e7
Merge branch 'isce-framework:develop' into improve_static_layers_work…
gshiroma Apr 23, 2026
6a65472
Merge branch 'develop' into improve_static_layers_workflow_expose_rad…
gshiroma Apr 23, 2026
10a0f37
Merge branch 'develop' into improve_static_layers_workflow_expose_rad…
gshiroma Apr 23, 2026
ed6b95e
revert import changes
gshiroma Apr 23, 2026
6af9229
remove unnecessary imports
gshiroma Apr 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions python/packages/isce3/geometry/bounding_radar_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,11 @@ def get_bounding_radar_grid(
Azimuth time spacing of the output grid, in seconds. Must be > 0.
rg_spacing : float
Slant range spacing of the output grid, in meters. Must be > 0.
sensing_start : float
The sensing start time of the input `geo_grid`, in seconds since the epoch of
`orbit`.
starting_range : float
The starting slant range of the input `geo_grid`, in meters.
orbit : isce3.core.Orbit
The trajectory of the radar antenna phase center over a time interval that
includes the observation times of each point in `geo_grid` at each height
Expand Down
123 changes: 106 additions & 17 deletions python/packages/nisar/workflows/static.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

import isce3
from isce3.geometry import make_geo_grid_bounding_polygon, load_dem_from_proj
from isce3.core import normalize_data_interp_method
from isce3.core import normalize_look_side, normalize_data_interp_method


def run_static_layers_workflow(config_file: os.PathLike | str) -> None:
Expand Down Expand Up @@ -117,6 +117,7 @@ def run_static_layers_workflow(config_file: os.PathLike | str) -> None:
radar_grid_spacing_params = radar_grid_params["spacing"]
az_spacing = radar_grid_spacing_params["az_spacing"]
rg_spacing = radar_grid_spacing_params["rg_spacing"]

pts_per_side = radar_grid_spacing_params["pts_per_side"]

if az_spacing is not None and not (az_spacing > 0.0):
Expand All @@ -125,12 +126,61 @@ def run_static_layers_workflow(config_file: os.PathLike | str) -> None:
if rg_spacing is not None and not (rg_spacing > 0.0):
raise ValueError(f"Runconfig {rg_spacing=}, must be > 0")

logger.info("Estimate radar grid spacing")
bounding_box_params = radar_grid_params["bounding_box"]
start_datetime_str = bounding_box_params["start_time"]
end_datetime_str = bounding_box_params["end_time"]
start_range = bounding_box_params["start_range"]
end_range = bounding_box_params["end_range"]
min_height = bounding_box_params["min_height"]
max_height = bounding_box_params["max_height"]
pts_per_edge = bounding_box_params["pts_per_edge"]
az_margin = bounding_box_params["az_margin"]
rg_margin = bounding_box_params["rg_margin"]

start_time = None
end_time = None

# Print user radar grid bounding box parameters, if provided.
if (start_datetime_str is not None or start_range is not None or
end_datetime_str is not None or end_range is not None):

logger.info("Using user-specified radar grid bounding box parameters")
if start_datetime_str is not None:
logger.info(f' start time: {start_datetime_str}')
start_time = isce3.core.DateTime(start_datetime_str)

if end_datetime_str is not None:
logger.info(f' end time: {end_datetime_str}')
end_time = isce3.core.DateTime(end_datetime_str)

if start_range is not None:
logger.info(f' start range: {start_range}')

if end_range is not None:
logger.info(f' end range: {end_range}')

if rg_spacing is not None:
logger.info(f' range spacing: {rg_spacing}')
if az_spacing is not None:
logger.info(f' azimuth time interval: {az_spacing}')

if start_time is not None and az_margin != 0.0:
start_time -= isce3.core.TimeDelta(az_margin)
logger.info(f' start time (adjusted for az. margin) {az_margin}:'
f' {start_time}')
if end_time is not None and az_margin != 0.0:
end_time += isce3.core.TimeDelta(az_margin)
logger.info(f' end time (adjusted for az. margin) {az_margin}:'
f' {end_time}')
if start_range is not None and rg_margin != 0.0:
start_range -= rg_margin
logger.info(f' start range (adjusted for rg margin) {rg_margin}:'
f' {start_range}')
if end_range is not None and rg_margin != 0.0:
end_range += rg_margin
logger.info(f' end range (adjusted for rg margin) {rg_margin}:'
f' {end_range}')

if rg_spacing is None or az_spacing is None:
az_spacing_inferred, rg_spacing_inferred = \
isce3.geometry.infer_radar_grid_spacing_from_geo_grid(
Expand All @@ -143,25 +193,64 @@ def run_static_layers_workflow(config_file: os.PathLike | str) -> None:
pts_per_side=pts_per_side
)
if rg_spacing is None:
logger.info(f' inferred range spacing: {rg_spacing}')
rg_spacing = rg_spacing_inferred
logger.info(f' inferred range spacing: {rg_spacing}')
if az_spacing is None:
logger.info(f' inferred azimuth time interval: {az_spacing}')
az_spacing = az_spacing_inferred
logger.info(f' inferred azimuth time interval: {az_spacing}')

# Compute a radar grid whose footprint on the ground encloses the geocoded
# grid on which each output layer is defined.
logger.info("Compute a radar grid spanning the region of interest")
radar_grid = isce3.geometry.get_bounding_radar_grid(
geo_grid=geo_grid,
az_spacing=az_spacing,
rg_spacing=rg_spacing,
orbit=orbit,
look_side=look_side,
wavelength=wavelength,
doppler=img_grid_doppler,
**radar_grid_params["bounding_box"],
)
if (start_time is not None and start_range is not None and
end_time is not None and end_range is not None):

epoch = orbit.reference_epoch

t0 = (isce3.core.DateTime(start_time) - epoch).total_seconds()
tf = (isce3.core.DateTime(end_time) - epoch).total_seconds()

num_az = round((tf - t0) / az_spacing)
num_rg = round((end_range - start_range) / rg_spacing)

logger.info(f' number of lines: {num_az}')
logger.info(f' number of range samples: {num_rg}')

radar_grid = isce3.product.RadarGridParameters(
sensing_start=t0,
wavelength=wavelength,
prf=1.0 / az_spacing,
starting_range=start_range,
range_pixel_spacing=rg_spacing,
lookside=normalize_look_side(look_side),
length=num_az,
width=num_rg,
ref_epoch=epoch,
)

elif (start_time is not None or start_range is not None or
end_time is not None or end_range is not None):
raise ValueError(
"If specifying radar grid bounding box parameters, must provide"
" all of 'start_time', 'start_range', 'end_time', and"
" 'end_range'"
)
else:

# Compute a radar grid whose footprint on the ground encloses the geocoded
# grid on which each output layer is defined.
logger.info("Compute a radar grid spanning the region of interest")
radar_grid = isce3.geometry.get_bounding_radar_grid(
geo_grid=geo_grid,
az_spacing=az_spacing,
rg_spacing=rg_spacing,
orbit=orbit,
look_side=look_side,
wavelength=wavelength,
doppler=img_grid_doppler,
min_height=min_height,
max_height=max_height,
pts_per_edge=pts_per_edge,
az_margin=az_margin,
rg_margin=rg_margin
)
logger.info(f"Using radar grid: {radar_grid}")

# Get the native Doppler LUT.
Expand Down
25 changes: 25 additions & 0 deletions share/nisar/defaults/static.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,31 @@ runconfig:
# Defaults to 5.
pts_per_side: 5
bounding_box:
# [OPTIONAL] Azimuth start UTC date and time of the start of the radar
# observation, as a string in ISO 8601 format with up to nanosecond precision.
# If not provided, it will be inferred from the specified geographic grid.
# If provided, must be a valid azimuth time within the observation time
# interval.
start_time:

# [OPTIONAL] Azimuth ending UTC date and time of the end of the radar
# observation, as a string in ISO 8601
# format with up to nanosecond precision. Must be >= `start_time`.
# If not provided, it will be inferred from the specified geographic grid.
# If provided, must be a valid azimuth time within the observation time
# interval.
end_time:

# [OPTIONAL] Starting range, in meters, of the first column of the radar grid.
# If not provided, it will be inferred from the specified geographic grid.
# If provided, must be a positive value.
start_range:

# [OPTIONAL] Ending range, in meters, of the last column of the radar grid.
# If not provided, it will be inferred from the specified geographic grid.
# If provided, must be a positive value.
end_range:

# [OPTIONAL] Lower bound on the height of targets within the region of interest,
# in meters above the reference ellipsoid of the output product.
# Used to estimate the bounds of a radar grid that spans the region of interest.
Expand Down
12 changes: 12 additions & 0 deletions share/nisar/schemas/static.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,18 @@ radar_grid_spacing_options:
pts_per_side: int(min=2, required=False)

radar_grid_bounding_box_options:
start_time: any(
timestamp(),
regex(r'^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d{1,9})?$'),
required=False
)
end_time: any(
timestamp(),
regex(r'^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d{1,9})?$'),
required=False
)
start_range: num(required=False)
end_range: num(required=False)
min_height: num(required=False)
max_height: num(required=False)
pts_per_edge: int(min=2, required=False)
Expand Down
Loading