366 lines
11 KiB
Python
366 lines
11 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import isce
|
|
import datetime
|
|
import isceobj
|
|
import numpy as np
|
|
from iscesys.Component.Component import Component
|
|
from isceobj.Image.Image import Image
|
|
from isceobj.Orbit.Orbit import Orbit
|
|
from isceobj.Util.decorators import type_check
|
|
from iscesys.Traits import datetimeType
|
|
|
|
|
|
####List of parameters
|
|
NUMBER_OF_SAMPLES = Component.Parameter('numberOfSamples',
|
|
public_name='number of samples',
|
|
default=None,
|
|
type=int,
|
|
mandatory=True,
|
|
doc='Width of the burst slc')
|
|
|
|
NUMBER_OF_LINES = Component.Parameter('numberOfLines',
|
|
public_name='number of lines',
|
|
default=None,
|
|
type=int,
|
|
mandatory=True,
|
|
doc='Length of the burst slc')
|
|
|
|
STARTING_RANGE = Component.Parameter('startingRange',
|
|
public_name='starting range',
|
|
default=None,
|
|
type=float,
|
|
mandatory=True,
|
|
doc='Slant range to first pixel in m')
|
|
|
|
SENSING_START = Component.Parameter('sensingStart',
|
|
public_name='sensing start',
|
|
default=None,
|
|
type=datetimeType,
|
|
mandatory=True,
|
|
doc='UTC time corresponding to first line of burst SLC')
|
|
|
|
SENSING_STOP = Component.Parameter('sensingStop',
|
|
public_name='sensing stop',
|
|
default=None,
|
|
type=datetimeType,
|
|
mandatory=True,
|
|
doc='UTC time corresponding to last line of burst SLC')
|
|
|
|
BURST_START_UTC = Component.Parameter('burstStartUTC',
|
|
public_name = 'burst start utc',
|
|
default=None,
|
|
type=datetimeType,
|
|
mandatory=True,
|
|
doc='Actual sensing time corresponding to start of the burst')
|
|
|
|
BURST_STOP_UTC = Component.Parameter('burstStopUTC',
|
|
public_name = 'burst stop utc',
|
|
default = None,
|
|
type=datetimeType,
|
|
mandatory=True,
|
|
doc='Actual sensing time corresponding to end of the burst')
|
|
|
|
TRACK_NUMBER = Component.Parameter('trackNumber',
|
|
public_name = 'track number',
|
|
default = None,
|
|
type=int,
|
|
mandatory = True,
|
|
doc = 'Track number for bookkeeping')
|
|
|
|
FRAME_NUMBER = Component.Parameter('frameNumber',
|
|
public_name = 'frame number',
|
|
default = None,
|
|
type =int,
|
|
mandatory=True,
|
|
doc = 'Frame number for bookkeeping')
|
|
|
|
ORBIT_NUMBER = Component.Parameter('orbitNumber',
|
|
public_name = 'orbit number',
|
|
default = None,
|
|
type = int,
|
|
mandatory = True,
|
|
doc = 'Orbit number for bookkeeping')
|
|
|
|
SWATH_NUMBER = Component.Parameter('swathNumber',
|
|
public_name = 'swath number',
|
|
default = None,
|
|
type = int,
|
|
mandatory = True,
|
|
doc = 'Swath number for bookkeeping')
|
|
|
|
BURST_NUMBER = Component.Parameter('burstNumber',
|
|
public_name = 'burst number',
|
|
default = None,
|
|
type = int,
|
|
mandatory = True,
|
|
doc = 'Burst number for bookkeeping')
|
|
|
|
PASS_DIRECTION = Component.Parameter('passDirection',
|
|
public_name='pass direction',
|
|
default = None,
|
|
type=str,
|
|
mandatory=True,
|
|
doc = 'Ascending or descending')
|
|
|
|
AZIMUTH_STEERING_RATE = Component.Parameter('azimuthSteeringRate',
|
|
public_name = 'azimuth steering rate',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Azimuth steering rate in radians per sec')
|
|
|
|
RANGE_PIXEL_SIZE = Component.Parameter('rangePixelSize',
|
|
public_name = 'range pixel size',
|
|
default = None,
|
|
type=float,
|
|
mandatory = True,
|
|
doc = 'Slant range pixel size in m')
|
|
|
|
RANGE_SAMPLING_RATE = Component.Parameter('rangeSamplingRate',
|
|
public_name = 'range sampling rate',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Range sampling rate in Hz')
|
|
|
|
AZIMUTH_TIME_INTERVAL = Component.Parameter('azimuthTimeInterval',
|
|
public_name = 'azimuth time interval',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Azimuth time interval between lines in seconds')
|
|
|
|
RADAR_WAVELENGTH = Component.Parameter('radarWavelength',
|
|
public_name = 'radarWavelength',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Radar wavelength in m')
|
|
|
|
POLARIZATION = Component.Parameter('polarization',
|
|
public_name = 'polarization',
|
|
default = None,
|
|
type = str,
|
|
mandatory = True,
|
|
doc = 'Polarization')
|
|
|
|
TERRAIN_HEIGHT = Component.Parameter('terrainHeight',
|
|
public_name = 'terrain height',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Average terrain height used for focusing')
|
|
|
|
PRF = Component.Parameter('prf',
|
|
public_name = 'pulse repetition frequency',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Pulse repetition frequency in Hz')
|
|
|
|
FIRST_VALID_LINE = Component.Parameter('firstValidLine',
|
|
public_name = 'first valid line',
|
|
default = None,
|
|
type = int,
|
|
mandatory = True,
|
|
doc = 'First valid line in the burst SLC')
|
|
|
|
NUMBER_VALID_LINES = Component.Parameter('numValidLines',
|
|
public_name = 'number of valid lines',
|
|
default = None,
|
|
type = int,
|
|
mandatory = True,
|
|
doc = 'Number of valid lines in the burst SLC')
|
|
|
|
FIRST_VALID_SAMPLE = Component.Parameter('firstValidSample',
|
|
public_name = 'first valid sample',
|
|
default = None,
|
|
type = int,
|
|
mandatory = True,
|
|
doc = 'First valid sample in the burst SLC')
|
|
|
|
NUMBER_VALID_SAMPLES = Component.Parameter('numValidSamples',
|
|
public_name = 'number of valid samples',
|
|
default = None,
|
|
type = int,
|
|
mandatory = True,
|
|
doc = 'Number of valid samples in the burst SLC')
|
|
|
|
#add these for doing bandpass filtering, Cunren Liang, 27-FEB-2018
|
|
RANGE_WINDOW_TYPE = Component.Parameter('rangeWindowType',
|
|
public_name='range window type',
|
|
default = None,
|
|
type=str,
|
|
mandatory=True,
|
|
doc = 'Range weight window type')
|
|
|
|
RANGE_WINDOW_COEEFICIENT = Component.Parameter('rangeWindowCoefficient',
|
|
public_name = 'range window coefficient',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Range weight window coefficient')
|
|
|
|
RANGE_PROCESSING_BANDWIDTH = Component.Parameter('rangeProcessingBandwidth',
|
|
public_name = 'range processing bandwidth',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Range processing bandwidth in Hz')
|
|
|
|
AZIMUTH_WINDOW_TYPE = Component.Parameter('azimuthWindowType',
|
|
public_name='azimuth window type',
|
|
default = None,
|
|
type=str,
|
|
mandatory=True,
|
|
doc = 'Azimuth weight window type')
|
|
|
|
AZIMUTH_WINDOW_COEEFICIENT = Component.Parameter('azimuthWindowCoefficient',
|
|
public_name = 'azimuth window coefficient',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Azimuth weight window coefficient')
|
|
|
|
AZIMUTH_PROCESSING_BANDWIDTH = Component.Parameter('azimuthProcessingBandwidth',
|
|
public_name = 'azimuth processing bandwidth',
|
|
default = None,
|
|
type = float,
|
|
mandatory = True,
|
|
doc = 'Azimuth processing bandwidth in Hz')
|
|
|
|
|
|
####List of facilities
|
|
ORBIT = Component.Facility('orbit',
|
|
public_name='orbit',
|
|
module='isceobj.Orbit.Orbit',
|
|
factory='createOrbit',
|
|
args=(),
|
|
doc = 'Orbit information')
|
|
|
|
IMAGE = Component.Facility('image',
|
|
public_name='image',
|
|
module='isceobj.Image',
|
|
factory='createSlcImage',
|
|
args = (),
|
|
doc = 'Image on disk')
|
|
|
|
DOPPLER = Component.Facility('doppler',
|
|
public_name='doppler',
|
|
module = 'isceobj.Util.PolyFactory',
|
|
factory = 'createPoly',
|
|
args=('1d',),
|
|
doc = 'Doppler polynomial')
|
|
|
|
AZIMUTH_FM_RATE = Component.Facility('azimuthFMRate',
|
|
public_name = 'azimuthFMRate',
|
|
module = 'isceobj.Util.PolyFactory',
|
|
factory = 'createPoly',
|
|
args = ('1d'),
|
|
doc = 'Azimuth FM rate polynomial')
|
|
|
|
class BurstSLC(Component):
|
|
"""A class to represent a burst SLC along a radar track"""
|
|
|
|
family = 'burstslc'
|
|
logging_name = 'isce.burstslc'
|
|
|
|
parameter_list = (NUMBER_OF_LINES,
|
|
NUMBER_OF_SAMPLES,
|
|
STARTING_RANGE,
|
|
SENSING_START,
|
|
SENSING_STOP,
|
|
BURST_START_UTC,
|
|
BURST_STOP_UTC,
|
|
TRACK_NUMBER,
|
|
FRAME_NUMBER,
|
|
ORBIT_NUMBER,
|
|
SWATH_NUMBER,
|
|
BURST_NUMBER,
|
|
RANGE_PIXEL_SIZE,
|
|
AZIMUTH_TIME_INTERVAL,
|
|
PASS_DIRECTION,
|
|
AZIMUTH_STEERING_RATE,
|
|
RADAR_WAVELENGTH,
|
|
PRF,
|
|
POLARIZATION,
|
|
TERRAIN_HEIGHT,
|
|
FIRST_VALID_LINE,
|
|
NUMBER_VALID_LINES,
|
|
FIRST_VALID_SAMPLE,
|
|
NUMBER_VALID_SAMPLES,
|
|
RANGE_WINDOW_TYPE,
|
|
RANGE_WINDOW_COEEFICIENT,
|
|
RANGE_PROCESSING_BANDWIDTH,
|
|
AZIMUTH_WINDOW_TYPE,
|
|
AZIMUTH_WINDOW_COEEFICIENT,
|
|
AZIMUTH_PROCESSING_BANDWIDTH,
|
|
)
|
|
|
|
|
|
facility_list = (ORBIT,
|
|
IMAGE,
|
|
DOPPLER,
|
|
AZIMUTH_FM_RATE,)
|
|
|
|
|
|
|
|
def __init__(self,name=''):
|
|
super(BurstSLC, self).__init__(family=self.__class__.family, name=name)
|
|
return None
|
|
|
|
|
|
@property
|
|
def lastValidLine(self):
|
|
return self.firstValidLine + self.numValidLines
|
|
|
|
@property
|
|
def lastValidSample(self):
|
|
return self.firstValidSample + self.numValidSamples
|
|
|
|
@property
|
|
def sensingMid(self):
|
|
return self.sensingStart + 0.5 * (self.sensingStop - self.sensingStart)
|
|
|
|
@property
|
|
def burstMidUTC(self):
|
|
return self.burstStartUTC + 0.5 * (self.burstStopUTC - self.burstStartUTC)
|
|
|
|
@property
|
|
def farRange(self):
|
|
return self.startingRange + (self.numberOfSamples-1) * self.rangePixelSize
|
|
|
|
@property
|
|
def midRange(self):
|
|
return 0.5 * (self.startingRange + self.farRange)
|
|
|
|
def getBbox(self ,hgtrange=[-500,9000]):
|
|
'''
|
|
Bounding box estimate.
|
|
'''
|
|
|
|
ts = [self.sensingStart, self.sensingStop]
|
|
rngs = [self.startingRange, self.farRange]
|
|
|
|
pos = []
|
|
for ht in hgtrange:
|
|
for tim in ts:
|
|
for rng in rngs:
|
|
llh = self.orbit.rdr2geo(tim, rng, height=ht)
|
|
pos.append(llh)
|
|
|
|
pos = np.array(pos)
|
|
|
|
bbox = [np.min(pos[:,0]), np.max(pos[:,0]), np.min(pos[:,1]), np.max(pos[:,1])]
|
|
return bbox
|
|
|
|
def clone(self):
|
|
import copy
|
|
res = copy.deepcopy(self)
|
|
res.image._accessor = None
|
|
res.image._factory = None
|
|
|
|
return res
|
|
|