def runGeo(frame, demImage, inImage, looks=(1, 1), doppler=None, nativedop=False, bbox=None, method='nearest'): from zerodop.geozero import createGeozero from isceobj.Planet.Planet import Planet #####Run Topo planet = Planet(pname='Earth') topo = createGeozero() topo.configure() alooks = looks[0] rlooks = looks[1] tStart = frame.sensingStart topo.slantRangePixelSpacing = frame.getInstrument().getRangePixelSize() topo.prf = frame.getInstrument().getPulseRepetitionFrequency() topo.radarWavelength = frame.getInstrument().getRadarWavelength() topo.orbit = frame.orbit topo.width = inImage.getWidth() topo.length = inImage.getLength() topo.wireInputPort(name='dem', object=demImage) topo.wireInputPort(name='planet', object=planet) topo.wireInputPort(name='tobegeocoded', object=inImage) topo.numberRangeLooks = rlooks topo.numberAzimuthLooks = alooks topo.lookSide = frame.instrument.platform.pointingDirection() topo.setSensingStart(tStart) topo.rangeFirstSample = frame.startingRange topo.method = method topo.demCropFilename = 'crop.dem' topo.geoFilename = inImage.filename + '.geo' if inps.nativedop and (doppler is not None): try: topo.dopplerCentroidCoeffs = [ x / topo.prf for x in doppler._coeffs ] except: topo.dopplerCentroidCoeffs = [x / topo.prf for x in doppler] else: topo.dopplerCentroidCoeffs = [0.] topo.snwe = bbox topo.geocode() print('South: ', topo.minimumGeoLatitude) print('North: ', topo.maximumGeoLatitude) print('West: ', topo.minimumGeoLongitude) print('East: ', topo.maximumGeoLongitude) return
def runGeo(frame, demImage, inImage, bbox, rlks, alks, method, outputName, aff, topShift, leftShift): from zerodop.geozero import createGeozero from isceobj.Planet.Planet import Planet #####Run Topo planet = Planet(pname='Earth') topo = createGeozero() topo.configure() topo.slantRangePixelSpacing = 0.5 * SPEED_OF_LIGHT / frame.rangeSamplingRate topo.prf = frame.PRF #should be changed to reciprocal of azimuth time interval for burst mode!!! topo.radarWavelength = frame.radarWavelegth topo.orbit = frame.getOrbit() topo.width = frame.getNumberOfSamples() topo.length = frame.getNumberOfLines() topo.wireInputPort(name='dem', object=demImage) topo.wireInputPort(name='planet', object=planet) topo.wireInputPort(name='tobegeocoded', object=inImage) topo.numberRangeLooks = rlks topo.numberAzimuthLooks = alks #topo.lookSide = -1 topo.lookSide = frame.getInstrument().getPlatform().pointingDirection topo.setSensingStart(frame.getSensingStart()) topo.rangeFirstSample = frame.startingRange topo.method = method topo.demCropFilename = 'crop.dem' topo.geoFilename = outputName topo.dopplerCentroidCoeffs = [0.] topo.snwe = bbox ############## topo.ATCa = aff.a topo.ATCb = aff.b topo.ATCc = aff.c topo.ATCd = aff.d topo.ATCe = aff.e topo.ATCf = aff.f topo.ATCrlks = aff.rlks topo.ATCalks = aff.alks ############## ##consider the shifts topo.rangeFirstSample += leftShift * topo.slantRangePixelSpacing topo.setSensingStart(frame.getSensingStart() + datetime.timedelta(seconds=(topShift / topo.prf))) topo.geocode() print('South: ', topo.minimumGeoLatitude) print('North: ', topo.maximumGeoLatitude) print('West: ', topo.minimumGeoLongitude) print('East: ', topo.maximumGeoLongitude) return
def geocode(track, demFile, inputFile, bbox, numberRangeLooks, numberAzimuthLooks, interpMethod, topShift, leftShift, addMultilookOffset=True): import datetime from zerodop.geozero import createGeozero from isceobj.Planet.Planet import Planet pointingDirection = {'right': -1, 'left' :1} demImage = isceobj.createDemImage() demImage.load(demFile + '.xml') demImage.setAccessMode('read') inImage = isceobj.createImage() inImage.load(inputFile + '.xml') inImage.setAccessMode('read') planet = Planet(pname='Earth') topo = createGeozero() topo.configure() topo.slantRangePixelSpacing = numberRangeLooks * track.rangePixelSize topo.prf = 1.0 / (numberAzimuthLooks*track.azimuthLineInterval) topo.radarWavelength = track.radarWavelength topo.orbit = track.orbit topo.width = inImage.width topo.length = inImage.length topo.wireInputPort(name='dem', object=demImage) topo.wireInputPort(name='planet', object=planet) topo.wireInputPort(name='tobegeocoded', object=inImage) topo.numberRangeLooks = 1 topo.numberAzimuthLooks = 1 topo.lookSide = pointingDirection[track.pointingDirection] sensingStart = track.sensingStart + datetime.timedelta(seconds=topShift*track.azimuthLineInterval) rangeFirstSample = track.startingRange + leftShift * track.rangePixelSize if addMultilookOffset: sensingStart += datetime.timedelta(seconds=(numberAzimuthLooks-1.0)/2.0*track.azimuthLineInterval) rangeFirstSample += (numberRangeLooks-1.0)/2.0*track.rangePixelSize topo.setSensingStart(sensingStart) topo.rangeFirstSample = rangeFirstSample topo.method=interpMethod topo.demCropFilename = 'crop.dem' #looks like this does not work #topo.geoFilename = outputName topo.dopplerCentroidCoeffs = [0.] #snwe list <class 'list'> topo.snwe = bbox topo.geocode() print('South: ', topo.minimumGeoLatitude) print('North: ', topo.maximumGeoLatitude) print('West: ', topo.minimumGeoLongitude) print('East: ', topo.maximumGeoLongitude) return
def runGeocode(self, prodlist, bbox, is_offset_mode=False): '''Generalized geocoding of all the files listed above.''' from isceobj.Catalog import recordInputsAndOutputs logger.info("Geocoding Image") insar = self._insar if (not self.doDenseOffsets) and (is_offset_mode): print('Skipping geocoding as Dense Offsets has not been requested ....') return if isinstance(prodlist,str): from isceobj.Util.StringUtils import StringUtils as SU tobeGeocoded = SU.listify(prodlist) else: tobeGeocoded = prodlist #remove files that have not been processed newlist=[] for toGeo in tobeGeocoded: if os.path.exists(toGeo): newlist.append(toGeo) tobeGeocoded = newlist print('Number of products to geocode: ', len(tobeGeocoded)) if len(tobeGeocoded) == 0: print('No products found to geocode') return ###Read in the product burst = self._insar.loadProduct( self._insar.masterSlcCropProduct) ####Get required values from product t0 = burst.sensingStart prf = burst.PRF r0 = burst.startingRange dr = 0.5* SPEED_OF_LIGHT/ burst.rangeSamplingRate wvl = burst.radarWavelegth side= burst.getInstrument().getPlatform().pointingDirection orb = burst.orbit planet = Planet(pname='Earth') if (bbox is None): snwe = self._insar.estimatedBbox else: snwe = bbox if len(snwe) != 4 : raise Exception('Bbox must be 4 floats in SNWE order.') if is_offset_mode: ### If using topsOffsetApp, image has been "pre-looked" by the numberRangeLooks = self.denseSkipWidth ### skips in runDenseOffsets numberAzimuthLooks = self.denseSkipHeight rangeFirstSample = r0 + (self._insar.offset_left-1) * dr sensingStart = t0 + datetime.timedelta(seconds=((self._insar.offset_top-1)/prf)) else: ###Resolve number of looks azLooks, rgLooks = self.insar.numberOfLooks(burst, self.posting, self.numberAzimuthLooks, self.numberRangeLooks) numberRangeLooks = rgLooks numberAzimuthLooks = azLooks rangeFirstSample = r0 + ((numberRangeLooks-1)/2.0) * dr sensingStart = t0 + datetime.timedelta(seconds=(((numberAzimuthLooks-1)/2.0)/prf)) ###Ughhh!! Doppler handling if self._insar.masterGeometrySystem.lower().startswith('native'): ###Need to fit polynomials ###Geozero fortran assumes that starting range for radar image and polynomial are same ###Also assumes that the polynomial spacing is original spacing at full looks ###This is not true for multilooked data. Need to fix this with good datastruct in ISCEv3 ###Alternate method is to modify the mean and norm of a Poly1D structure such that the ###translation is accounted for correctly. poly = burst._dopplerVsPixel if len(poly) != 1: slcPix = np.linspace(0., burst.numberOfSamples, len(poly)+1) dopplers = np.polyval(poly[::-1], slcPix) newPix = slcPix - (rangeFirstSample - r0)/dr nppoly = np.polyfit(newPix, dopplers, len(poly)-1) dopplercoeff = list(nppoly[::-1]) else: dopplercoeff = poly else: dopplercoeff = [0.] ##Scale by PRF since the module needs it dopplercoeff = [x/prf for x in dopplercoeff] ###Setup DEM demfilename = self.verifyDEM() demImage = isceobj.createDemImage() demImage.load(demfilename + '.xml') ###Catalog for tracking catalog = isceobj.Catalog.createCatalog(insar.procDoc.name) catalog.addItem('Dem Used', demfilename, 'geocode') #####Geocode one by one first = False ge = Geocodable() for prod in tobeGeocoded: objGeo = createGeozero() objGeo.configure() ####IF statements to check for user configuration objGeo.snwe = snwe objGeo.demCropFilename = insar.demCropFilename objGeo.dopplerCentroidCoeffs = dopplercoeff objGeo.lookSide = side #create the instance of the input image and the appropriate #geocode method inImage,method = ge.create(prod) objGeo.method = method objGeo.slantRangePixelSpacing = dr objGeo.prf = prf objGeo.orbit = orb objGeo.width = inImage.getWidth() objGeo.length = inImage.getLength() objGeo.dopplerCentroidCoeffs = dopplercoeff objGeo.radarWavelength = wvl objGeo.rangeFirstSample = rangeFirstSample objGeo.setSensingStart(sensingStart) objGeo.numberRangeLooks = numberRangeLooks objGeo.numberAzimuthLooks = numberAzimuthLooks objGeo.wireInputPort(name='dem', object=demImage) objGeo.wireInputPort(name='planet', object=planet) objGeo.wireInputPort(name='tobegeocoded', object=inImage) objGeo.geocode() # NEW COMMANDS added by YL --start catalog.addItem('Geocoding', inImage.filename, 'geocode') catalog.addItem('Output file', inImage.filename + '.geo', 'geocode') # NEW COMMANDS added by YL --end catalog.addItem('Width', inImage.width, 'geocode') catalog.addItem('Length', inImage.length, 'geocode') catalog.addItem('Range looks', objGeo.numberRangeLooks, 'geocode') catalog.addItem('Azimuth looks', objGeo.numberAzimuthLooks, 'geocode') catalog.addItem('South' , objGeo.minimumGeoLatitude, 'geocode') catalog.addItem('North', objGeo.maximumGeoLatitude, 'geocode') catalog.addItem('West', objGeo.minimumGeoLongitude, 'geocode') catalog.addItem('East', objGeo.maximumGeoLongitude, 'geocode') catalog.printToLog(logger, "runGeocode") self._insar.procDoc.addAllFromCatalog(catalog)
def runGeocode(self, prodlist, unwrapflag, bbox, is_offset_mode=False): '''Generalized geocoding of all the files listed above.''' from isceobj.Catalog import recordInputsAndOutputs logger.info("Geocoding Image") insar = self._insar if (not self.doInSAR) and (not is_offset_mode): print( 'Skipping geocoding as InSAR processing has not been requested ....' ) return elif (not self.doDenseOffsets) and (is_offset_mode): print( 'Skipping geocoding as Dense Offsets has not been requested ....') return if isinstance(prodlist, str): from isceobj.Util.StringUtils import StringUtils as SU tobeGeocoded = SU.listify(prodlist) else: tobeGeocoded = prodlist #remove files that have not been processed newlist = [] for toGeo in tobeGeocoded: if os.path.exists(toGeo): newlist.append(toGeo) tobeGeocoded = newlist print('Number of products to geocode: ', len(tobeGeocoded)) if len(tobeGeocoded) == 0: print('No products found to geocode') return swathList = self._insar.getValidSwathList(self.swaths) frames = [] for swath in swathList: referenceProduct = insar.loadProduct( os.path.join(insar.fineCoregDirname, 'IW{0}.xml'.format(swath))) frames.append(referenceProduct) orb = self._insar.getMergedOrbit(frames) if bbox is None: bboxes = [] for frame in frames: bboxes.append(frame.getBbox()) snwe = [ min([x[0] for x in bboxes]), max([x[1] for x in bboxes]), min([x[2] for x in bboxes]), max([x[3] for x in bboxes]) ] else: snwe = list(bbox) if len(snwe) != 4: raise ValueError('Bounding box should be a list/tuple of length 4') ###Identify the 4 corners and dimensions topSwath = min(frames, key=lambda x: x.sensingStart) leftSwath = min(frames, key=lambda x: x.startingRange) ####Get required values from product burst = frames[0].bursts[0] t0 = topSwath.sensingStart dtaz = burst.azimuthTimeInterval r0 = leftSwath.startingRange dr = burst.rangePixelSize wvl = burst.radarWavelength planet = Planet(pname='Earth') ###Setup DEM demfilename = self.verifyGeocodeDEM() demImage = isceobj.createDemImage() demImage.load(demfilename + '.xml') ###Catalog for tracking catalog = isceobj.Catalog.createCatalog(insar.procDoc.name) catalog.addItem('Dem Used', demfilename, 'geocode') #####Geocode one by one first = False ge = Geocodable() for prod in tobeGeocoded: objGeo = createGeozero() objGeo.configure() ####IF statements to check for user configuration objGeo.snwe = snwe objGeo.demCropFilename = os.path.join(insar.mergedDirname, insar.demCropFilename) if is_offset_mode: ### If using topsOffsetApp, image has been "pre-looked" by the objGeo.numberRangeLooks = self.skipwidth ### skips in runDenseOffsets objGeo.numberAzimuthLooks = self.skiphgt else: objGeo.numberRangeLooks = self.numberRangeLooks objGeo.numberAzimuthLooks = self.numberAzimuthLooks objGeo.lookSide = -1 #S1A is currently right looking only #create the instance of the input image and the appropriate #geocode method inImage, method = ge.create(prod) objGeo.method = method objGeo.slantRangePixelSpacing = dr objGeo.prf = 1.0 / dtaz objGeo.orbit = orb objGeo.width = inImage.getWidth() objGeo.length = inImage.getLength() objGeo.dopplerCentroidCoeffs = [0.] objGeo.radarWavelength = wvl if is_offset_mode: ### If using topsOffsetApp, as above, the "pre-looking" adjusts the range/time start objGeo.rangeFirstSample = r0 + (self._insar.offset_left - 1) * dr objGeo.setSensingStart(t0 + datetime.timedelta(seconds=( (self._insar.offset_top - 1) * dtaz))) else: objGeo.rangeFirstSample = r0 + ( (self.numberRangeLooks - 1) / 2.0) * dr objGeo.setSensingStart(t0 + datetime.timedelta(seconds=(( (self.numberAzimuthLooks - 1) / 2.0) * dtaz))) objGeo.wireInputPort(name='dem', object=demImage) objGeo.wireInputPort(name='planet', object=planet) objGeo.wireInputPort(name='tobegeocoded', object=inImage) objGeo.geocode() catalog.addItem('Geocoding: ', inImage.filename, 'geocode') catalog.addItem('Output file: ', inImage.filename + '.geo', 'geocode') catalog.addItem('Width', inImage.width, 'geocode') catalog.addItem('Length', inImage.length, 'geocode') catalog.addItem('Range looks', self.numberRangeLooks, 'geocode') catalog.addItem('Azimuth looks', self.numberAzimuthLooks, 'geocode') catalog.addItem('South', objGeo.minimumGeoLatitude, 'geocode') catalog.addItem('North', objGeo.maximumGeoLatitude, 'geocode') catalog.addItem('West', objGeo.minimumGeoLongitude, 'geocode') catalog.addItem('East', objGeo.maximumGeoLongitude, 'geocode') catalog.printToLog(logger, "runGeocode") self._insar.procDoc.addAllFromCatalog(catalog)
def runGeocode(self, prodlist, unwrapflag, bbox): '''Generalized geocoding of all the files listed above.''' from isceobj.Catalog import recordInputsAndOutputs logger.info("Geocoding Image") insar = self.insar if isinstance(prodlist, str): from isceobj.Util.StringUtils import StringUtils as SU tobeGeocoded = SU.listify(prodlist) else: tobeGeocoded = prodlist #####Remove the unwrapped interferogram if no unwrapping is done if not unwrapflag: try: tobeGeocoded.remove(insar.unwrappedIntFilename) except ValueError: pass print('Number of products to geocode: ', len(tobeGeocoded)) frame = insar.masterFrame slc = insar.formSLC1 planet = frame._instrument._platform._planet prf = frame._instrument.getPulseRepetitionFrequency() wvl = frame._instrument.getRadarWavelength() lookSide = frame._instrument._platform.pointingDirection sensingStart = insar.formSLC1.slcSensingStart delr = 0.5 * SPEED_OF_LIGHT / frame.rangeSamplingRate startingRange = slc.startingRange if bbox is None: snwe = insar.topo.snwe else: snwe = list(bbox) if len(snwe) != 4: raise ValueError('Bounding box should be a list/tuple of length 4') #####Geocode one by one first = False ge = Geocodable() for prod in tobeGeocoded: objGeo = createGeozero() objGeo.configure() ####IF statements to check for user configuration if objGeo.minimumLatitude is None: objGeo.minimumLatitude = snwe[0] if objGeo.maximumLatitude is None: objGeo.maximumLatitude = snwe[1] if objGeo.minimumLongitude is None: objGeo.minimumLongitude = snwe[2] if objGeo.maximumLongitude is None: objGeo.maximumLongitude = snwe[3] if objGeo.demCropFilename is None: objGeo.demCropFilename = insar.demCropFilename objGeo.orbit = frame.orbit if objGeo.numberRangeLooks is None: objGeo.numberRangeLooks = insar.numberRangeLooks if objGeo.numberAzimuthLooks is None: objGeo.numberAzimuthLooks = insar.numberAzimuthLooks #create the instance of the input image and the appropriate #geocode method inImage, method = ge.create(prod) if objGeo.method is None: objGeo.method = method if (inImage): #demImage = isceobj.createDemImage() #IU.copyAttributes(insar.demImage, demImage) demImage = insar.demImage.clone() objGeo.slantRangePixelSpacing = delr objGeo.radarWavelength = wvl objGeo.width = inImage.getWidth() objGeo.length = inImage.getLength() objGeo.lookSide = lookSide objGeo.prf = prf objGeo.setSensingStart(sensingStart + datetime.timedelta( seconds=(objGeo.numberAzimuthLooks - 1) / (2 * objGeo.prf))) objGeo.rangeFirstSample = startingRange + delr * ( objGeo.numberRangeLooks - 1) / 2 #print('method ', objGeo.method) #print('prf ', objGeo.prf) #print('delr ', objGeo.slantRangePixelSpacing) #print('azlooks ', objGeo.numberAzimuthLooks) #print('rglooks ', objGeo.numberRangeLooks) #print('tstart ', objGeo.sensingStart) #print('rstart ', objGeo.rangeFirstSample) objGeo.demInterpolationMethod = 'BIQUINTIC' objGeo.geoFilename = inImage.filename + '.geo' objGeo.wireInputPort(name='dem', object=demImage) objGeo.wireInputPort(name='planet', object=planet) objGeo.wireInputPort(name='tobegeocoded', object=inImage) ####Doppler coefficients dop = frame._dopplerVsPixel[::-1] xx = np.linspace(0, (slc.slcImage.width - 1), num=len(dop) + 1) x = (slc.startingRange - frame.startingRange) / objGeo.slantRangePixelSpacing + xx v = np.polyval(dop, x) p = np.polyfit(xx, v, len(dop) - 1)[::-1] pp = [x / prf for x in p] objGeo.dopplerCentroidCoeffs = pp objGeo.geocode()