Пример #1
0
    def populateMetadata(self):
        """
            Create the appropriate metadata objects from our CEOSFormat metadata
        """
        frame = self._decodeSceneReferenceNumber(
            self.leaderFile.sceneHeaderRecord.
            metadata['Scene reference number'])
        try:
            rangePixelSize = Const.c / (2 * self.leaderFile.sceneHeaderRecord.
                                        metadata['Range sampling rate'])
        except ZeroDivisionError:
            rangePixelSize = 0

        print(
            'Average height: ', self.leaderFile.sceneHeaderRecord.
            metadata['Average terrain height in km'])

        ins = self.frame.getInstrument()
        platform = ins.getPlatform()
        platform.setMission(self.leaderFile.sceneHeaderRecord.
                            metadata['Sensor platform mission identifier'])
        platform.setAntennaLength(self.constants['antennaLength'])
        platform.setPointingDirection(1)
        platform.setPlanet(Planet(pname='Earth'))

        ins.setRadarWavelength(
            self.leaderFile.sceneHeaderRecord.metadata['Radar wavelength'])
        ins.setIncidenceAngle(self.leaderFile.sceneHeaderRecord.
                              metadata['Incidence angle at scene centre'])
        self.frame.getInstrument().setPulseRepetitionFrequency(
            self.leaderFile.sceneHeaderRecord.
            metadata['Pulse Repetition Frequency'])
        ins.setRangePixelSize(rangePixelSize)
        ins.setRangeSamplingRate(
            self.leaderFile.sceneHeaderRecord.metadata['Range sampling rate'])
        ins.setPulseLength(
            self.leaderFile.sceneHeaderRecord.metadata['Range pulse length'])

        #        chirpPulseBandwidth = self.leaderFile.processingRecord.metadata['Pulse bandwidth code']*1e4
        #        ins.setChirpSlope(chirpPulseBandwidth/self.leaderFile.sceneHeaderRecord.metadata['Range pulse length'])

        ins.setChirpSlope(7.5e12)
        ins.setInPhaseValue(127.0)
        ins.setQuadratureValue(127.0)

        self.lineDirection = self.leaderFile.sceneHeaderRecord.metadata[
            'Time direction indicator along line direction'].strip()
        self.pixelDirection = self.leaderFile.sceneHeaderRecord.metadata[
            'Time direction indicator along pixel direction'].strip()

        ######RISAT-1 sensor orientation convention is opposite to ours
        #        lookSide = self.leaderFile.processingRecord.metadata['Sensor orientation']
        #        if lookSide == 'RIGHT':
        #            platform.setPointingDirection(1)
        #        elif lookSide == 'LEFT':
        #            platform.setPointingDirection(-1)
        #        else:
        #            raise Exception('Unknown look side')

        self.frame.setFrameNumber(frame)
        self.frame.setOrbitNumber(
            self.leaderFile.sceneHeaderRecord.metadata['Orbit number'])
        self.frame.setProcessingFacility(
            self.leaderFile.sceneHeaderRecord.
            metadata['Processing facility identifier'])
        self.frame.setProcessingSystem(
            self.leaderFile.sceneHeaderRecord.
            metadata['Processing system identifier'])
        self.frame.setProcessingSoftwareVersion(
            self.leaderFile.sceneHeaderRecord.
            metadata['Processing version identifier'])
        self.frame.setPolarization(self.constants['polarization'])
        self.frame.setNumberOfLines(
            self.imageFile.imageFDR.metadata['Number of lines per data set'])
        self.frame.setNumberOfSamples(
            self.imageFile.imageFDR.
            metadata['Number of pixels per line per SAR channel'])

        ######

        self.frame.getOrbit().setOrbitSource('Header')
        self.frame.getOrbit().setOrbitQuality(
            self.leaderFile.platformPositionRecord.
            metadata['Orbital elements designator'])
        t0 = datetime.datetime(year=2000 +
                               self.leaderFile.platformPositionRecord.
                               metadata['Year of data point'],
                               month=self.leaderFile.platformPositionRecord.
                               metadata['Month of data point'],
                               day=self.leaderFile.platformPositionRecord.
                               metadata['Day of data point'])
        t0 = t0 + datetime.timedelta(
            seconds=self.leaderFile.platformPositionRecord.
            metadata['Seconds of day'])

        #####Read in orbit in inertial coordinates
        orb = Orbit()
        deltaT = self.leaderFile.platformPositionRecord.metadata[
            'Time interval between DATA points']
        numPts = self.leaderFile.platformPositionRecord.metadata[
            'Number of data points']

        for i in range(numPts):
            vec = StateVector()
            t = t0 + datetime.timedelta(seconds=i * deltaT)
            vec.setTime(t)

            dataPoints = self.leaderFile.platformPositionRecord.metadata[
                'Positional Data Points'][i]
            pos = [
                dataPoints['Position vector X'],
                dataPoints['Position vector Y'],
                dataPoints['Position vector Z']
            ]
            vel = [
                dataPoints['Velocity vector X'],
                dataPoints['Velocity vector Y'],
                dataPoints['Velocity vector Z']
            ]
            vec.setPosition(pos)
            vec.setVelocity(vel)
            orb.addStateVector(vec)

        #####Convert orbits from ECI to ECEF frame.
        t0 = orb._stateVectors[0]._time
        ang = self.leaderFile.platformPositionRecord.metadata[
            'Greenwich mean hour angle']

        cOrb = ECI2ECR(orb, GAST=ang, epoch=t0)
        wgsorb = cOrb.convert()

        #####Extend the orbits by a few points
        planet = self.frame.instrument.platform.planet
        orbExt = OrbitExtender()
        orbExt.configure()
        orbExt._newPoints = 4
        newOrb = orbExt.extendOrbit(wgsorb)

        orb = self.frame.getOrbit()

        for sv in newOrb:
            orb.addStateVector(sv)
Пример #2
0
    def populateMetadata(self):
        """
            Create the appropriate metadata objects from our CEOSFormat metadata
        """
        frame = self._decodeSceneReferenceNumber(
            self.leaderFile.sceneHeaderRecord.
            metadata['Scene reference number'])

        fsamplookup = int(self.leaderFile.sceneHeaderRecord.
                          metadata['Range sampling rate in MHz'])

        rangePixelSize = Const.c / (2 * self.fsampConst[fsamplookup])

        ins = self.frame.getInstrument()
        platform = ins.getPlatform()
        platform.setMission(self.leaderFile.sceneHeaderRecord.
                            metadata['Sensor platform mission identifier'])
        platform.setAntennaLength(self.constants['antennaLength'])
        platform.setPointingDirection(1)
        platform.setPlanet(Planet(pname='Earth'))

        if self.wavelength:
            ins.setRadarWavelength(float(self.wavelength))
#            print('ins.radarWavelength = ', ins.getRadarWavelength(),
#                  type(ins.getRadarWavelength()))
        else:
            ins.setRadarWavelength(
                self.leaderFile.sceneHeaderRecord.metadata['Radar wavelength'])

        ins.setIncidenceAngle(self.leaderFile.sceneHeaderRecord.
                              metadata['Incidence angle at scene centre'])
        self.frame.getInstrument().setPulseRepetitionFrequency(
            self.leaderFile.sceneHeaderRecord.
            metadata['Pulse Repetition Frequency in mHz'] * 1.0e-3)
        ins.setRangePixelSize(rangePixelSize)
        ins.setRangeSamplingRate(self.fsampConst[fsamplookup])
        ins.setPulseLength(self.leaderFile.sceneHeaderRecord.
                           metadata['Range pulse length in microsec'] * 1.0e-6)
        chirpSlope = self.leaderFile.sceneHeaderRecord.metadata[
            'Nominal range pulse (chirp) amplitude coefficient linear term']
        chirpPulseBandwidth = abs(
            chirpSlope * self.leaderFile.sceneHeaderRecord.
            metadata['Range pulse length in microsec'] * 1.0e-6)
        ins.setChirpSlope(chirpSlope)
        ins.setInPhaseValue(7.5)
        ins.setQuadratureValue(7.5)

        self.lineDirection = self.leaderFile.sceneHeaderRecord.metadata[
            'Time direction indicator along line direction'].strip()
        self.pixelDirection = self.leaderFile.sceneHeaderRecord.metadata[
            'Time direction indicator along pixel direction'].strip()

        ######ALOS2 includes this information in clock angle
        clockAngle = self.leaderFile.sceneHeaderRecord.metadata[
            'Sensor clock angle']
        if clockAngle == 90.0:
            platform.setPointingDirection(-1)
        elif clockAngle == -90.0:
            platform.setPointingDirection(1)
        else:
            raise Exception(
                'Unknown look side. Clock Angle = {0}'.format(clockAngle))

#        print(self.leaderFile.sceneHeaderRecord.metadata["Sensor ID and mode of operation for this channel"])
        self.frame.setFrameNumber(frame)
        self.frame.setOrbitNumber(
            self.leaderFile.sceneHeaderRecord.metadata['Orbit number'])
        self.frame.setProcessingFacility(
            self.leaderFile.sceneHeaderRecord.
            metadata['Processing facility identifier'])
        self.frame.setProcessingSystem(
            self.leaderFile.sceneHeaderRecord.
            metadata['Processing system identifier'])
        self.frame.setProcessingSoftwareVersion(
            self.leaderFile.sceneHeaderRecord.
            metadata['Processing version identifier'])
        self.frame.setPolarization(self.constants['polarization'])
        self.frame.setNumberOfLines(
            self.imageFile.imageFDR.metadata['Number of lines per data set'])
        self.frame.setNumberOfSamples(
            self.imageFile.imageFDR.
            metadata['Number of pixels per line per SAR channel'])

        ######
        orb = self.frame.getOrbit()

        orb.setOrbitSource('Header')
        orb.setOrbitQuality(self.orbitElementsDesignator[
            self.leaderFile.platformPositionRecord.
            metadata['Orbital elements designator']])
        t0 = datetime.datetime(year=self.leaderFile.platformPositionRecord.
                               metadata['Year of data point'],
                               month=self.leaderFile.platformPositionRecord.
                               metadata['Month of data point'],
                               day=self.leaderFile.platformPositionRecord.
                               metadata['Day of data point'])
        t0 = t0 + datetime.timedelta(
            seconds=self.leaderFile.platformPositionRecord.
            metadata['Seconds of day'])

        #####Read in orbit in inertial coordinates
        deltaT = self.leaderFile.platformPositionRecord.metadata[
            'Time interval between data points']
        numPts = self.leaderFile.platformPositionRecord.metadata[
            'Number of data points']

        orb = self.frame.getOrbit()
        for i in range(numPts):
            vec = StateVector()
            t = t0 + datetime.timedelta(seconds=i * deltaT)
            vec.setTime(t)

            dataPoints = self.leaderFile.platformPositionRecord.metadata[
                'Positional Data Points'][i]
            pos = [
                dataPoints['Position vector X'],
                dataPoints['Position vector Y'],
                dataPoints['Position vector Z']
            ]
            vel = [
                dataPoints['Velocity vector X'],
                dataPoints['Velocity vector Y'],
                dataPoints['Velocity vector Z']
            ]
            vec.setPosition(pos)
            vec.setVelocity(vel)
            orb.addStateVector(vec)

        ###This is usually available with ALOS SLC data.
        ###Unfortunately set to all zeros for ScanSAR data
        #self.doppler_coeff = [self.leaderFile.sceneHeaderRecord.metadata['Cross track Doppler frequency centroid constant term'],
        #self.leaderFile.sceneHeaderRecord.metadata['Cross track Doppler frequency centroid linear term'],
        #self.leaderFile.sceneHeaderRecord.metadata['Cross track Doppler frequency centroid quadratic term']]

        self.azfmrate_coeff = [
            self.leaderFile.sceneHeaderRecord.
            metadata['Cross track Doppler frequency rate constant term'],
            self.leaderFile.sceneHeaderRecord.
            metadata['Cross track Doppler frequency rate linear term'],
            self.leaderFile.sceneHeaderRecord.
            metadata['Cross track Doppler frequency rate quadratic term']
        ]

        ###Reading in approximate values instead
        ###Note that these are coeffs vs slant range in km
        self.doppler_coeff = [
            self.leaderFile.sceneHeaderRecord.
            metadata['Doppler center frequency constant term'],
            self.leaderFile.sceneHeaderRecord.
            metadata['Doppler center frequency linear term']
        ]
Пример #3
0
    def testNotEqualCompare(self):
        """
        Test that __cmp__ returns false when the times are different, but the
        positions and velocities are the same.
        """
        sv1 = StateVector()
        time1 = datetime.datetime(year=2001,
                                  month=2,
                                  day=7,
                                  hour=12,
                                  minute=13,
                                  second=5)
        pos1 = [1.0, 2.0, 3.0]
        vel1 = [0.6, 0.6, 0.6]
        sv1.setTime(time1)
        sv1.setPosition(pos1)
        sv1.setVelocity(vel1)

        sv2 = StateVector()
        time2 = datetime.datetime(year=2001,
                                  month=2,
                                  day=7,
                                  hour=12,
                                  minute=13,
                                  second=4)
        pos2 = [1.0, 2.0, 3.0]
        vel2 = [0.6, 0.6, 0.6]
        sv2.setTime(time2)
        sv2.setPosition(pos2)
        sv2.setVelocity(vel2)

        self.assertFalse(sv1 == sv2)