Skip to content

Geocoding usage

The perseo_core.geometry.geocoding module provides several direct and inverse geocoding capabilities for SAR geometry computations.

Direct Geocoding

The main implemented functions are:

All functions support vectorized operations on (N, 3) coordinate arrays.

Here are some examples on how to use the direct geocoding functions:

Direct geocoding monostatic

import numpy as np

from perseo_core.geometry.geocoding.direct import direct_geocoding_monostatic

sensor_position = np.array(
    [4387348.749948771, 762123.3489877012, 4553067.931912004],
)
sensor_velocity = np.array(
    [-856.1384108174528, -329.7629775067583, 398.55830806407346],
)

ground_points = direct_geocoding_monostatic(
    sensor_positions=sensor_position,
    sensor_velocities=sensor_velocity,
    range_times=2.05624579e-05,
    doppler_frequencies=0.0,
    altitude=0.0,
    look_direction="RIGHT",
    wavelength=1.0,
)

Direct geocoding bistatic

import numpy as np

from perseo_core.geometry.geocoding.direct import direct_geocoding_bistatic

sensor_position = np.array(
    [4387348.749948771, 762123.3489877012, 4553067.931912004],
)
sensor_velocity = np.array(
    [-856.1384108174528, -329.7629775067583, 398.55830806407346],
)

ground_points = direct_geocoding_bistatic(
    sensor_positions_rx=sensor_position,
    sensor_positions_tx=sensor_position,
    sensor_velocities_rx=sensor_velocity,
    sensor_velocities_tx=sensor_velocity,
    range_times=2.05624579e-05,
    doppler_frequencies=0.0,
    altitude=0.0,
    look_direction="RIGHT",
    wavelength=1.0,
)

Direct geocoding with looking direction

import numpy as np

from perseo_core.geometry.geocoding.direct import direct_geocoding_with_looking_direction

sensor_positions = np.array(
    [
        [5317606.94350283, 610603.985945038, 4577936.89859885],
        [5313024.53547427, 608285.563877273, 4583547.15708167],
        [5308435.7651548, 605967.120830312, 4589152.18047604],
    ]
)
looking_direction = np.array([5317606.0, 610603.0, 4577936.0])

ground_points = direct_geocoding_with_looking_direction(
    sensor_positions=sensor_positions,
    looking_directions=looking_direction,
    altitude=0.0,
)

Inverse Geocoding

The main implemented functions are:

All functions support vectorized operations on (N, 3) coordinate arrays.

Here are some examples on how to use the inverse geocoding functions:

Inverse geocoding monostatic

import numpy as np

from perseo_core.geometry.geocoding.inverse import inverse_geocoding_monostatic

trajectory = ... # (1)!

ground_point = np.array(
    [-2243618.48435212, -4728341.28615007, 3633267.229522297],
)

azimuth_times, range_times = inverse_geocoding_monostatic(
    trajectory=trajectory,
    ground_points=ground_point,
    doppler_frequencies=0.0,
    wavelength=1.0,
    az_initial_time_guesses=trajectory.domain[0],
)
  1. Refer to the trajectory tutorial for further information on how to create a trajectory object.

Inverse geocoding bistatic

import numpy as np

from perseo_core.geometry.geocoding.inverse import inverse_geocoding_bistatic

trajectory_rx = ... # (1)!
trajectory_tx = ...

ground_point = np.array(
    [-2243618.48435212, -4728341.28615007, 3633267.229522297],
)

azimuth_times, range_times = inverse_geocoding_bistatic(
    trajectory_rx=trajectory_rx,
    trajectory_tx=trajectory_tx,
    ground_points=ground_point,
    doppler_frequencies=0.0,
    wavelength=1.0,
    az_initial_time_guesses=trajectory_rx.domain[0] + 0.5,
)
  1. Refer to the trajectory tutorial for further information on how to create a trajectory object.