Exemple #1
0
    else:
        longitudeLink = False

    if not os.path.isfile(os.path.basename(height)):
        heightLink = True
        os.symlink(height, os.path.basename(height))
        os.symlink(height+'.vrt', os.path.basename(height)+'.vrt')
        os.symlink(height+'.xml', os.path.basename(height)+'.xml')
    else:
        heightLink = False



    track = loadTrack(dateParDir, date)
    if useGPU and hasGPU():
        geo2RdrGPU(track, numberRangeLooks1, numberAzimuthLooks1, 
            latitude, longitude, height, rangeOffset, azimuthOffset)
    else:
        geo2RdrCPU(track, numberRangeLooks1, numberAzimuthLooks1, 
            latitude, longitude, height, rangeOffset, azimuthOffset)



    if latitudeLink == True:
        os.remove(os.path.basename(latitude))
        os.remove(os.path.basename(latitude)+'.vrt')
        os.remove(os.path.basename(latitude)+'.xml')

    if longitudeLink == True:
        os.remove(os.path.basename(longitude))
        os.remove(os.path.basename(longitude)+'.vrt')
        os.remove(os.path.basename(longitude)+'.xml')
Exemple #2
0
def runCoregGeom(self):
    '''compute geometric offset
    '''
    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
    self.updateParamemetersFromUser()

    masterTrack = self._insar.loadTrack(master=True)
    slaveTrack = self._insar.loadTrack(master=False)

    demFile = os.path.abspath(self._insar.dem)
    wbdFile = os.path.abspath(self._insar.wbd)
    ###############################################################################

    for i, frameNumber in enumerate(self._insar.masterFrames):
        frameDir = 'f{}_{}'.format(i + 1, frameNumber)
        os.chdir(frameDir)
        for j, swathNumber in enumerate(
                range(self._insar.startingSwath, self._insar.endingSwath + 1)):
            swathDir = 's{}'.format(swathNumber)
            os.chdir(swathDir)

            print('processing frame {}, swath {}'.format(
                frameNumber, swathNumber))

            masterSwath = masterTrack.frames[i].swaths[j]
            slaveSwath = slaveTrack.frames[i].swaths[j]

            ##################################################
            # compute geometric offsets
            ##################################################
            #set up track parameters just for computing offsets
            #ALL track parameters are listed here
            #master
            #masterTrack.passDirection =
            #masterTrack.pointingDirection =
            #masterTrack.operationMode =
            #masterTrack.radarWavelength =
            masterTrack.numberOfSamples = masterSwath.numberOfSamples
            masterTrack.numberOfLines = masterSwath.numberOfLines
            masterTrack.startingRange = masterSwath.startingRange
            #masterTrack.rangeSamplingRate =
            masterTrack.rangePixelSize = masterSwath.rangePixelSize
            masterTrack.sensingStart = masterSwath.sensingStart
            #masterTrack.prf =
            #masterTrack.azimuthPixelSize =
            masterTrack.azimuthLineInterval = masterSwath.azimuthLineInterval
            #masterTrack.dopplerVsPixel =
            #masterTrack.frames =
            #masterTrack.orbit =

            #slave
            slaveTrack.numberOfSamples = slaveSwath.numberOfSamples
            slaveTrack.numberOfLines = slaveSwath.numberOfLines
            slaveTrack.startingRange = slaveSwath.startingRange
            slaveTrack.rangePixelSize = slaveSwath.rangePixelSize
            slaveTrack.sensingStart = slaveSwath.sensingStart
            slaveTrack.azimuthLineInterval = slaveSwath.azimuthLineInterval

            if self.useGPU and self._insar.hasGPU():
                topoGPU(masterTrack, 1, 1, demFile, self._insar.latitude,
                        self._insar.longitude, self._insar.height,
                        self._insar.los)
                geo2RdrGPU(slaveTrack, 1, 1, self._insar.latitude,
                           self._insar.longitude, self._insar.height,
                           self._insar.rangeOffset, self._insar.azimuthOffset)
            else:
                topoCPU(masterTrack, 1, 1, demFile, self._insar.latitude,
                        self._insar.longitude, self._insar.height,
                        self._insar.los)
                geo2RdrCPU(slaveTrack, 1, 1, self._insar.latitude,
                           self._insar.longitude, self._insar.height,
                           self._insar.rangeOffset, self._insar.azimuthOffset)

            waterBodyRadar(self._insar.latitude, self._insar.longitude,
                           wbdFile, self._insar.wbdOut)

            #clear up, leaving only range/azimuth offsets
            os.remove(self._insar.latitude)
            os.remove(self._insar.latitude + '.vrt')
            os.remove(self._insar.latitude + '.xml')
            os.remove(self._insar.longitude)
            os.remove(self._insar.longitude + '.vrt')
            os.remove(self._insar.longitude + '.xml')
            os.remove(self._insar.height)
            os.remove(self._insar.height + '.vrt')
            os.remove(self._insar.height + '.xml')
            os.remove(self._insar.los)
            os.remove(self._insar.los + '.vrt')
            os.remove(self._insar.los + '.xml')

            ##################################################
            # resample bursts
            ##################################################
            slaveBurstResampledDir = self._insar.slaveBurstPrefix + '_1_coreg_geom'
            #interferogramDir = self._insar.masterBurstPrefix + '-' + self._insar.slaveBurstPrefix + '_coreg_geom'
            interferogramDir = 'burst_interf_1_coreg_geom'
            interferogramPrefix = self._insar.masterBurstPrefix + '-' + self._insar.slaveBurstPrefix
            resampleBursts(masterSwath,
                           slaveSwath,
                           self._insar.masterBurstPrefix,
                           self._insar.slaveBurstPrefix,
                           slaveBurstResampledDir,
                           interferogramDir,
                           self._insar.masterBurstPrefix,
                           self._insar.slaveBurstPrefix,
                           self._insar.slaveBurstPrefix,
                           interferogramPrefix,
                           self._insar.rangeOffset,
                           self._insar.azimuthOffset,
                           rangeOffsetResidual=0,
                           azimuthOffsetResidual=0)

            ##################################################
            # mosaic burst amplitudes and interferograms
            ##################################################
            os.chdir(slaveBurstResampledDir)
            mosaicBurstAmplitude(masterSwath,
                                 self._insar.slaveBurstPrefix,
                                 self._insar.slaveMagnitude,
                                 numberOfLooksThreshold=4)
            os.chdir('../')

            #the interferogram is not good enough, do not mosaic
            mosaic = False
            if mosaic:
                os.chdir(interferogramDir)
                mosaicBurstInterferogram(masterSwath,
                                         interferogramPrefix,
                                         self._insar.interferogram,
                                         numberOfLooksThreshold=4)
                os.chdir('../')

            os.chdir('../')
        os.chdir('../')

###############################################################################
    catalog.printToLog(logger, "runCoregGeom")
    self._insar.procDoc.addAllFromCatalog(catalog)
Exemple #3
0
def runSlcMatch(self):
    '''match a pair of SLCs
    '''
    if not self.doDenseOffset:
        return
    if not ((self._insar.modeCombination == 0) or (self._insar.modeCombination == 1)):
        return

    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
    self.updateParamemetersFromUser()

    demFile = os.path.abspath(self._insar.dem)
    wbdFile = os.path.abspath(self._insar.wbd)

    denseOffsetDir = 'dense_offset'
    os.makedirs(denseOffsetDir, exist_ok=True)
    os.chdir(denseOffsetDir)

    masterTrack = self._insar.loadProduct(self._insar.masterTrackParameter)
    slaveTrack = self._insar.loadProduct(self._insar.slaveTrackParameter)

#########################################################################################


    ##################################################
    # compute geometric offsets
    ##################################################
    if self.useGPU and self._insar.hasGPU():
        topoGPU(masterTrack, 1, 1, demFile, 
                       'lat.rdr', 'lon.rdr', 'hgt.rdr', 'los.rdr')
        geo2RdrGPU(slaveTrack, 1, 1, 
            'lat.rdr', 'lon.rdr', 'hgt.rdr', 'rg.off', 'az.off')
    else:
        topoCPU(masterTrack, 1, 1, demFile, 
                       'lat.rdr', 'lon.rdr', 'hgt.rdr', 'los.rdr')
        geo2RdrCPU(slaveTrack, 1, 1, 
            'lat.rdr', 'lon.rdr', 'hgt.rdr', 'rg.off', 'az.off')


    ##################################################
    # resample SLC
    ##################################################
    #SlaveSlcResampled = os.path.splitext(self._insar.slaveSlc)[0]+'_resamp'+os.path.splitext(self._insar.slaveSlc)[1]
    SlaveSlcResampled = self._insar.slaveSlcCoregistered
    rangeOffsets2Frac = 0.0
    azimuthOffsets2Frac = 0.0
    resamp(self._insar.slaveSlc,
           SlaveSlcResampled,
           'rg.off',
           'az.off',
           masterTrack.numberOfSamples, masterTrack.numberOfLines,
           slaveTrack.prf,
           slaveTrack.dopplerVsPixel,
           [rangeOffsets2Frac, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
           [azimuthOffsets2Frac, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
    create_xml(SlaveSlcResampled, masterTrack.numberOfSamples, masterTrack.numberOfLines, 'slc')


    if self.estimateResidualOffset:

        numberOfOffsets = 800
        rangeStep = 50

        length = masterTrack.numberOfLines
        width = masterTrack.numberOfSamples
        waterBodyRadar('lat.rdr', 'lon.rdr', wbdFile, 'wbd.rdr')
        wbd=np.memmap('wbd.rdr', dtype=np.int8, mode='r', shape=(length, width))
        azimuthStep = int(length/width*rangeStep+0.5)
        landRatio = np.sum(wbd[0:length:azimuthStep,0:width:rangeStep]!=-1)/(int(length/azimuthStep)*int(width/rangeStep))
        del wbd

        if (landRatio <= 0.00125):
            print('\n\nWARNING: land area too small for estimating residual slc offsets')
            print('do not estimate residual offsets\n\n')
            catalog.addItem('warning message', 'land area too small for estimating residual slc offsets', 'runSlcMatch')
        else:
            numberOfOffsets /= landRatio
            #we use equal number of offsets in range and azimuth here
            numberOfOffsetsRange = int(np.sqrt(numberOfOffsets)+0.5)
            numberOfOffsetsAzimuth = int(np.sqrt(numberOfOffsets)+0.5)
            if numberOfOffsetsRange > int(width/2):
                numberOfOffsetsRange = int(width/2)
            if numberOfOffsetsAzimuth > int(length/2):
                numberOfOffsetsAzimuth = int(length/2)
            if numberOfOffsetsRange < 10:
                numberOfOffsetsRange = 10
            if numberOfOffsetsAzimuth < 10:
                numberOfOffsetsAzimuth = 10


            ##########################################
            #2. match using ampcor
            ##########################################
            ampcor = Ampcor(name='insarapp_slcs_ampcor')
            ampcor.configure()

            mSLC = isceobj.createSlcImage()
            mSLC.load(self._insar.masterSlc+'.xml')
            mSLC.setAccessMode('read')
            mSLC.createImage()

            sSLC = isceobj.createSlcImage()
            sSLC.load(SlaveSlcResampled+'.xml')
            sSLC.setAccessMode('read')
            sSLC.createImage()

            ampcor.setImageDataType1('complex')
            ampcor.setImageDataType2('complex')

            ampcor.setMasterSlcImage(mSLC)
            ampcor.setSlaveSlcImage(sSLC)

            #MATCH REGION
            #compute an offset at image center to use
            rgoff = 0.0
            azoff = 0.0
            #it seems that we cannot use 0, haven't look into the problem
            if rgoff == 0:
                rgoff = 1
            if azoff == 0:
                azoff = 1
            firstSample = 1
            if rgoff < 0:
                firstSample = int(35 - rgoff)
            firstLine = 1
            if azoff < 0:
                firstLine = int(35 - azoff)
            ampcor.setAcrossGrossOffset(rgoff)
            ampcor.setDownGrossOffset(azoff)
            ampcor.setFirstSampleAcross(firstSample)
            ampcor.setLastSampleAcross(mSLC.width)
            ampcor.setNumberLocationAcross(numberOfOffsetsRange)
            ampcor.setFirstSampleDown(firstLine)
            ampcor.setLastSampleDown(mSLC.length)
            ampcor.setNumberLocationDown(numberOfOffsetsAzimuth)

            #MATCH PARAMETERS
            #full-aperture mode
            if (self._insar.modeCombination == 21) or \
               (self._insar.modeCombination == 22) or \
               (self._insar.modeCombination == 31) or \
               (self._insar.modeCombination == 32):
                ampcor.setWindowSizeWidth(64)
                ampcor.setWindowSizeHeight(512)
                #note this is the half width/length of search area, number of resulting correlation samples: 32*2+1
                ampcor.setSearchWindowSizeWidth(32)
                ampcor.setSearchWindowSizeHeight(32)
                #triggering full-aperture mode matching
                ampcor.setWinsizeFilt(8)
                ampcor.setOversamplingFactorFilt(64)
            #regular mode
            else:
                ampcor.setWindowSizeWidth(64)
                ampcor.setWindowSizeHeight(64)
                ampcor.setSearchWindowSizeWidth(16)
                ampcor.setSearchWindowSizeHeight(16)

            #REST OF THE STUFF
            ampcor.setAcrossLooks(1)
            ampcor.setDownLooks(1)
            ampcor.setOversamplingFactor(64)
            ampcor.setZoomWindowSize(16)
            #1. The following not set
            #Matching Scale for Sample/Line Directions                       (-)    = 1. 1.
            #should add the following in Ampcor.py?
            #if not set, in this case, Ampcor.py'value is also 1. 1.
            #ampcor.setScaleFactorX(1.)
            #ampcor.setScaleFactorY(1.)

            #MATCH THRESHOLDS AND DEBUG DATA
            #2. The following not set
            #in roi_pac the value is set to 0 1
            #in isce the value is set to 0.001 1000.0
            #SNR and Covariance Thresholds                                   (-)    =  {s1} {s2}
            #should add the following in Ampcor?
            #THIS SHOULD BE THE ONLY THING THAT IS DIFFERENT FROM THAT OF ROI_PAC
            #ampcor.setThresholdSNR(0)
            #ampcor.setThresholdCov(1)
            ampcor.setDebugFlag(False)
            ampcor.setDisplayFlag(False)

            #in summary, only two things not set which are indicated by 'The following not set' above.

            #run ampcor
            ampcor.ampcor()
            offsets = ampcor.getOffsetField()
            mSLC.finalizeImage()
            sSLC.finalizeImage()


            #3. cull offsets
            refinedOffsets = cullOffsetsRoipac(offsets, numThreshold=50)
            if refinedOffsets == None:
                print('\n\nWARNING: too few offsets left for slc residual offset estimation')
                print('do not estimate residual offsets\n\n')
                catalog.addItem('warning message', 'too few offsets left for slc residual offset estimation', 'runSlcMatch')
            else:
                rangeOffset, azimuthOffset = meanOffset(refinedOffsets)
                os.remove(SlaveSlcResampled)
                os.remove(SlaveSlcResampled+'.vrt')
                os.remove(SlaveSlcResampled+'.xml')
                
                rangeOffsets2Frac = rangeOffset
                azimuthOffsets2Frac = azimuthOffset
                resamp(self._insar.slaveSlc,
                       SlaveSlcResampled,
                       'rg.off',
                       'az.off',
                       masterTrack.numberOfSamples, masterTrack.numberOfLines,
                       slaveTrack.prf,
                       slaveTrack.dopplerVsPixel,
                       [rangeOffsets2Frac, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                       [azimuthOffsets2Frac, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
                create_xml(SlaveSlcResampled, masterTrack.numberOfSamples, masterTrack.numberOfLines, 'slc')

                catalog.addItem('number of offsets range', numberOfOffsetsRange, 'runSlcMatch')
                catalog.addItem('number of offsets azimuth', numberOfOffsetsAzimuth, 'runSlcMatch')
                catalog.addItem('range residual offset after geometric coregistration', rangeOffset, 'runSlcMatch')
                catalog.addItem('azimuth residual offset after geometric coregistration', azimuthOffset, 'runSlcMatch')




    if self.deleteGeometryFiles:
        os.remove('lat.rdr')
        os.remove('lat.rdr.vrt')
        os.remove('lat.rdr.xml')
        os.remove('lon.rdr')
        os.remove('lon.rdr.vrt')
        os.remove('lon.rdr.xml')
        os.remove('hgt.rdr')
        os.remove('hgt.rdr.vrt')
        os.remove('hgt.rdr.xml')
        os.remove('los.rdr')
        os.remove('los.rdr.vrt')
        os.remove('los.rdr.xml')
        # if os.path.isfile('wbd.rdr'):
        #     os.remove('wbd.rdr')
        #     os.remove('wbd.rdr.vrt')
        #     os.remove('wbd.rdr.xml')

#########################################################################################

    os.chdir('../')
    catalog.printToLog(logger, "runSlcMatch")
    self._insar.procDoc.addAllFromCatalog(catalog)