182 lines
5.3 KiB
Python
182 lines
5.3 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
###Our usual import statements
|
||
|
import numpy as np
|
||
|
import isce
|
||
|
import isceobj
|
||
|
from stdproc.model.enu2los.ENU2LOS import ENU2LOS
|
||
|
import argparse
|
||
|
|
||
|
####Method to load pickle information
|
||
|
####from an insarApp run
|
||
|
def load_pickle(step='topo'):
|
||
|
'''Loads the pickle from correct as default.'''
|
||
|
import cPickle
|
||
|
|
||
|
insarObj = cPickle.load(open('PICKLE/{0}'.format(step),'rb'))
|
||
|
return insarObj
|
||
|
|
||
|
|
||
|
###Create dummy model file if needed
|
||
|
###Use this for simple testing
|
||
|
###Modify values as per your test dataset
|
||
|
|
||
|
def createDummyModel():
|
||
|
'''Creates a model image.'''
|
||
|
wid = 401
|
||
|
lgt = 401
|
||
|
startLat = 20.0
|
||
|
deltaLat = -0.025
|
||
|
startLon = -156.0
|
||
|
deltaLon = 0.025
|
||
|
|
||
|
data = np.zeros((lgt,3*wid), dtype=np.float32)
|
||
|
###East only
|
||
|
# data[:,0::3] = 1.0
|
||
|
###North only
|
||
|
# data[:,1::3] = 1.0
|
||
|
###Up only
|
||
|
data[:,2::3] = 1.0
|
||
|
|
||
|
data.tofile('model.enu')
|
||
|
|
||
|
print('Creating model object')
|
||
|
objModel = isceobj.createDemImage()
|
||
|
objModel.setFilename('model.enu')
|
||
|
objModel.setWidth(wid)
|
||
|
objModel.scheme = 'BIP'
|
||
|
objModel.setAccessMode('read')
|
||
|
objModel.imageType='bip'
|
||
|
objModel.dataType='FLOAT'
|
||
|
objModel.bands = 3
|
||
|
dictProp = {'REFERENCE':'WGS84','Coordinate1': \
|
||
|
{'size':wid,'startingValue':startLon,'delta':deltaLon}, \
|
||
|
'Coordinate2':{'size':lgt,'startingValue':startLat, \
|
||
|
'delta':deltaLat},'FILE_NAME':'model.enu'}
|
||
|
objModel.init(dictProp)
|
||
|
objModel.renderHdr()
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
###cmd Line Parser
|
||
|
def cmdLineParser():
|
||
|
parser = argparse.ArgumentParser(description="Project ENU deformation to LOS in radar coordinates")
|
||
|
parser.add_argument('-m','--model', dest='model', type=str,
|
||
|
required=True,
|
||
|
help='Input 3 channel FLOAT model file with DEM like info')
|
||
|
parser.add_argument('-o','--output', dest='output', type=str,
|
||
|
default='enu2los.rdr', help='Output 1 channel LOS file')
|
||
|
|
||
|
return parser.parse_args()
|
||
|
|
||
|
###The main program
|
||
|
if __name__ == '__main__':
|
||
|
|
||
|
###Parse command line
|
||
|
inps = cmdLineParser()
|
||
|
|
||
|
###For testing only
|
||
|
# createDummyModel()
|
||
|
|
||
|
####Load model image
|
||
|
print('Creating model image')
|
||
|
modelImg = isceobj.createDemImage()
|
||
|
modelImg.load(inps.model +'.xml') ##From cmd line
|
||
|
|
||
|
if (modelImg.bands !=3 ):
|
||
|
raise Exception('Model input file should be a 3 band image.')
|
||
|
|
||
|
modelImg.setAccessMode('read')
|
||
|
modelImg.createImage()
|
||
|
|
||
|
|
||
|
####Get geocoded information
|
||
|
startLon = modelImg.coord1.coordStart
|
||
|
deltaLon = modelImg.coord1.coordDelta
|
||
|
startLat = modelImg.coord2.coordStart
|
||
|
deltaLat = modelImg.coord2.coordDelta
|
||
|
|
||
|
####Load geometry information from pickle file.
|
||
|
iObj = load_pickle()
|
||
|
topo = iObj.getTopo() #Get info for the dem in radar coords
|
||
|
|
||
|
####Get the wavelength information.
|
||
|
###This is available in multiple locations within insarProc
|
||
|
#wvl = iObj.getReferenceFrame().getInstrument().getRadarWavelength()
|
||
|
wvl = topo.radarWavelength
|
||
|
|
||
|
|
||
|
####Pixel-by-pixel Latitude image
|
||
|
print('Creating lat image')
|
||
|
objLat = isceobj.createImage()
|
||
|
objLat.load(topo.latFilename+'.xml')
|
||
|
objLat.setAccessMode('read')
|
||
|
objLat.createImage()
|
||
|
|
||
|
####Pixel-by-pixel Longitude image
|
||
|
print('Creating lon image')
|
||
|
objLon = isceobj.createImage()
|
||
|
objLon.load(topo.lonFilename+'.xml')
|
||
|
objLon.setAccessMode('read')
|
||
|
objLon.createImage()
|
||
|
|
||
|
#####Pixel-by-pixel LOS information
|
||
|
print('Creating LOS image')
|
||
|
objLos = isceobj.createImage()
|
||
|
objLos.load(topo.losFilename +'.xml')
|
||
|
objLos.setAccessMode('read')
|
||
|
objLos.createImage()
|
||
|
|
||
|
###Check if dimensions are the same
|
||
|
for img in (objLon, objLos):
|
||
|
if (img.width != objLat.width) or (img.length != objLat.length):
|
||
|
raise Exception('Lat, Lon and LOS files are not of the same size.')
|
||
|
|
||
|
|
||
|
####Create an output object
|
||
|
print ('Creating output image')
|
||
|
objOut = isceobj.createImage()
|
||
|
objOut.initImage(inps.output, 'write', objLat.width, type='FLOAT')
|
||
|
objOut.createImage()
|
||
|
|
||
|
|
||
|
print('Actual processing')
|
||
|
####The actual processing
|
||
|
#Stage 1: Construction
|
||
|
converter = ENU2LOS()
|
||
|
converter.configure()
|
||
|
|
||
|
#Stage 2: No ports for enu2los
|
||
|
#Stage 3: Set values
|
||
|
converter.setWidth(objLat.width) ###Radar coords width
|
||
|
converter.setNumberLines(objLat.length) ###Radar coords length
|
||
|
converter.setGeoWidth(modelImg.width) ###Geo coords width
|
||
|
converter.setGeoNumberLines(modelImg.length) ###Geo coords length
|
||
|
|
||
|
###Set up geo information
|
||
|
converter.setStartLatitude(startLat)
|
||
|
converter.setStartLongitude(startLon)
|
||
|
converter.setDeltaLatitude(deltaLat)
|
||
|
converter.setDeltaLongitude(deltaLon)
|
||
|
|
||
|
####Set up output scaling
|
||
|
converter.setScaleFactor(1.0) ###Change if ENU not in meters
|
||
|
converter.setWavelength(4*np.pi) ###Wavelength for conversion to radians
|
||
|
|
||
|
converter.enu2los(modelImage = modelImg,
|
||
|
latImage = objLat,
|
||
|
lonImage = objLon,
|
||
|
losImage = objLos,
|
||
|
outImage = objOut)
|
||
|
|
||
|
#Step 4: Close the images
|
||
|
modelImg.finalizeImage()
|
||
|
objLat.finalizeImage()
|
||
|
objLon.finalizeImage()
|
||
|
objLos.finalizeImage()
|
||
|
objOut.finalizeImage()
|
||
|
objOut.renderHdr() ###Create output XML file
|
||
|
|