SAR Metadata for ISO Standards
Leland Pierce, Univ. of Michigan
Oct 19, 2017

The idea behind this document is to start with Leland’s metadata for SAR
stripmap products and figure out how to fit it in with the current
ISO standards.
Basically, it identifies those parameters that are already in an ISO
standard somewhere, and then proposes ISO-like groupings of the
remainder.

Referenced ISO standards:
19115-2
19130-1
19159-3

1. Parameters that are already in ISO standards:

**parameters that are related to any sensor

std::string platform_name
19115-2: MI_Instrument::mountedOn::MI_Platform::identifier

std::string sensor_name
19115-2: MI_Instrument::identifier

std::string sensor_type
19115-2: MI_Instrument::type

std::string image_id
19115-1: LE_Source::sourceCitation::identifier::code
(I’m not sure about this one)

std::string processing_facility
19115-1: LE_ProcessStep::processor::organizationName

boost::posix_time::ptime processing_datetime
19115-1: LE_ProcessStep::dateTime

std::string processing_software_version
19115-1: LE_ProcessStep::processinginformation::identifier

boost::posix_time::ptime acquisition_datetime
19130-1: SD_SensorSystemAndOperation::collectionStartTime

** orbit parameters
19130-1:: SD_PositionAndOrientation

could also use:
19159-3::CA_AntennaPhaseCentre

** image georeferencing
19115-1: MI_GCPCollection

** per-band
std::vector raw_data_band_names
19115-2: MD_RangeDimension::sequenceidentifier
(if we come up with standardized set of band names)
OR:
19115-2: MD_RangeDimension::descriptor
(free text)

double center_freq_hz, pulse_bandwidth_hz,
std::string center_freq_name, polarizations
19115-2: MD_Band::minValue, maxValue, meanValue, units, descriptor,
transmittedPolarization, detectedPolarization
(would have all these repeated per band in the dataset)

NEEDED:
=======
add “datatype”, which contains:
type: one of:
unsigned int,
2s complement signed int,
sign-magnitude int,
float
complex
bits: one of:
8
16
32
64
128
byte-order: one of: big-endian, little-endian

(I suspect such a thing already exists in ISO,
possibly 11404, I looked at it, but it is unclear how to use it….)

There are many ways for the data to be provided:
1. raw data in some file or files
with or without some kind of “extra” data
2. encoded data in some file or files, such as TIFF, or JPEG, etc.
3. dealing with this variety is complex, so I’m avoiding it for now.
4. All I’m going to deal with for now is the datatype once this data has
successfully been read in.
=======

** misc
std::string antenna_pointing (either right or left)
19130-1: SD_SAROperation::orientation

std::string geometry
19130-1: SD_GSD::referenceSurface
code values: gound, inflatedEllipsoid, ortho, slant

double time_early_azimuth_sec
19130-1: SD_SensorSystemAndOperation::collectionStartTime

double time_late_azimuth_sec
19130-1: SD_SensorSystemAndOperation::collectionEndTime

==============================================================
2. Things to add, at least partially:

CalibrationModel:
=================
(one of these for each Band, or if quad-polarimetric: just 1)
calibrationEquation
(one of: “A*DN^2 + B” or “A*DN + B” or polarimetric-distortion-matrix)
calibrationResult
(one of pre-defined values:
sigma0, gamma0, beta0, or sqrt() of each of these, or scattering-matrix)
calibrationMultiplier
calibrationOffset
both of these are CalibrationValues, see below
calibrationState
(one of 8 pre-defined values:
not-calibrated-amplitude,
not-calibrated-power,
calibrated-to-sigma0,
calibrated-to-gamma0,
calibrated-to-beta0,
calibrated-to-sqrtsigma0,
calibrated-to-sqrtgamma0,
calibrated-to-sqrtbeta0,
calibrated-to-scatteringmatrix )

CalibrationValues:
==================
kind
(scalar, range-vector, azimuth-vector, range-azimuth-vector,
mueller-matrix, mueller-matrix-range-vector,
mueller-matrix-azimuth-vector,
mueller-matrix-range-azimuth-vector,
distortion-matrix)
nvalues
an integer
values
if scalar: a single double
use: 19159-3::CA_RadarSystem::calibrationConstant
if mueller-matrix: 10 doubles in std order
(m11, m12, m13, m14, m22, m23, m24, m33, m34, m44)
if range-vector, near-range is first
if azimuth-vector, early-azimuth is first
if range-azimuth-vector, indexing is (range,azimuth)
if distortion-matrix: use 19159-3::CA_PolSARSensor

DopplerModel:
=============
kind
(dopplerCentroid or dopplerRate)
use: 19159-3::CA_SignalProcessing::dopplerCentroid
modelform
(polynomial in range-bin OR values for each range bin)
modelparameters
(either the polynomial coeffs in a prescribed order, or
the values for each range bin, near-range first.)

ProcessingAlgorithm:
====================
dopplerState
(zeroDoppler, dopplerCentroid, N/A)
numRangeLooks
numAzimuthLooks
rangeLookBandwidthHz
azimuthLookBandwidthHz
use: 19159-3::rangeProcBandwidth, azimuthProcBandwidth
rangeWindow (see below)
azimuthWindow (see below)
use: 19159-3::CA_SignalProcessing::procRangeWin, procAzimuthWin
antennaElevationPatternCorrectionApplied (t/f)
rangeSpreadingLossCorrection (true or false or
reference-range-in-meters)
pulseDependentGainCorrectionApplied (t/f)
dividedBySinTheta (t, f, or theta_reference)
platform_radius_at_scene_center_meters
platform_altitude_meters
terrain_height_meters
product_type
(this is a string that contains the short abbreviation for the
product type as defined by the data providers. There are many
of these, and the set is always growing. Stuff like: FBS11 or
PLR15, etc…)

ProcessingWindow:
=================
type
(Kaiser, cos-squared, others…)
parameters
(as many doubles as is needed for the type, in a prescribed order)

DatatakeParameters:
===================
pulseRepetitionFrequency_hz
use: 19159-3::CA_RadarSystem::prf
pulseRepetitionFrequency_perpixel_hz
pulse_length_sec
adc_sampling_rate_hz
use: 19159-3::CA_RadarSystem::samplingFrequency
slant_range_resolution_m
azimuth_range_resolution_m
use: 19159-3::CA_SignalProcessing:rangeRes, azimuthRes
antenna_elevation_pattern (see below)
look_angle_near_range_degrees
look_angle_far_range_degrees
near_slant_range_m
related to: 19159-3::CA_RadarSystem::pulseStartTime

AntennaPattern:
===============
kind
(elevation, azimuth)
way
(1 or 2)
units
(power in dB, others?)
nvalues
values
(the pattern)
angles
(the angle in degrees corresponding to the values above)

use: 19159-3::CA_AntennaSystem
somehow need to add: “way”
(one of these for each polarization)

ImageDataParameters:
====================
azimuth_spacing_m
range_spacing_m
range_direction (+x, +y, -x, -y, N/A)
azimuth_direction (+x, +y, -x, -y, N/A)

number_of_pixels (x-direction)
number_of_lines (y-direction)
use: 19159-3::CA_SignalProcessing::rangeSize, azimuthSize

================================================
3. summary of parameters that are still missing:
================================================

CalibrationModel:
—————-
calibrationEquation
calibrationResult
calibrationOffset
calibrationState

currently this seems to be left as “implicit” based on the type of
data provided.
That will not work.

CA_SignalProcessing:
——————-
dopplerRate
(have dopplercentroid but not rate)
dopplerState
numRangeLooks
numAzimuthLooks
antennaElevationPatternCorrectionApplied (t/f)
rangeSpreadingLossCorrection (true or false or reference-range-in-meters)
pulseDependentGainCorrectionApplied (t/f)
dividedBySinTheta (t, f, or theta_reference)
platform_radius_at_scene_center_meters
platform_altitude_meters
terrain_height_meters
product_type

CA_RadarSystem:
————–
pulseRepetitionFrequency_perpixel_hz
pulse_length_sec
look_angle_near_range_degrees
look_angle_far_range_degrees
near_slant_range_m

CA_AntennaSystem:
—————-
way: need to know if it’s 1-way or 2-way.

ImageDataParameters:
——————-
datatype (#bytes, int, real,complex…)
azimuth_spacing_m
range_spacing_m
range_direction (+x, +y, -x, -y, N/A)
azimuth_direction (+x, +y, -x, -y, N/A)