ISCE_INSAR/contrib/stack/stripmapStack/reader.py

127 lines
3.2 KiB
Python
Executable File

# Heresh Fattahi
import os
from osgeo import gdal
from osgeo.gdalconst import GA_ReadOnly
import numpy as np
from lxml import objectify
standardMetadatKeys={'width':'WIDTH','Width':'WIDTH','length':'LENGTH','FILE_LENGTH':'LENGTH',
'wavelength':'WAVELENGTH','Wavelength':'WAVELENGTH', 'prf':'PRF'
}
GDAL2NUMPY_DATATYPE = {
1 : np.uint8,
2 : np.uint16,
3 : np.int16,
4 : np.uint32,
5 : np.int32,
6 : np.float32,
7 : np.float64,
10: np.complex64,
11: np.complex128,
}
def read(file, processor='ISCE' , bands=None , dataType=None):
''' raeder based on GDAL.
Args:
* file -> File name to be read
Kwargs:
* processor -> the processor used for the InSAR processing. default: ISCE
* bands -> a list of bands to be extracted. If not specified all bands will be extracted.
* dataType -> if not specified, it will be extracted from the data itself
Returns:
* data : A numpy array with dimensions : number_of_bands * length * width
'''
#if processor == 'ISCE':
# cmd = 'isce2gis.py envi -i ' + file
# os.system(cmd)
dataset = gdal.Open(file,GA_ReadOnly)
######################################
# if the bands have not been specified, all bands will be extracted
if bands is None:
bands = range(1,dataset.RasterCount+1)
######################################
# if dataType is not known let's get it from the data:
if dataType is None:
band = dataset.GetRasterBand(1)
dataType = GDAL2NUMPY_DATATYPE[band.DataType]
######################################
# Form a numpy array of zeros with the the shape of (number of bands * length * width) and a given data type
data = np.zeros((len(bands), dataset.RasterYSize, dataset.RasterXSize),dtype=dataType)
######################################
# Fill the array with the Raster bands
idx=0
for i in bands:
band=dataset.GetRasterBand(i)
data[idx,:,:] = band.ReadAsArray()
idx+=1
dataset = None
return data
def read_metadata(file, processor):
if processor == 'ISCE':
metadataDict = read_isce_xml(file + '.xml')
elif processor == 'ROI_PAC':
metadataDict = read_rsc(file + '.rsc')
metadataDict = standardize_metadat(metadataDict , standardMetadatKeys)
return metadataDict
def read_isce_xml(file):
xmlDict={}
fObj=objectify.parse(file)
root=fObj.getroot()
for c in root.property:
xmlDict[c.attrib['name']] = str(c.value)
return xmlDict
def read_rsc(inname):
'''Reading a ROI-PAC style RSC file.
Args:
* inname (str): Path to the RSC file.
Returns:
* rdict (dict): Dictionaty of values in RSC file.
'''
logging.info("PROGRESS: READING %s RSC FILE"%(inname))
rsc_dict = dict(np.loadtxt(file,dtype=str))
return rsc_dict
def standardize_metadat(xmlDict , standardMetadatKeys):
keys = xmlDict.keys()
standardKeys = standardMetadatKeys.keys()
xmlDict_standard = {}
for k in keys:
if k in standardKeys:
xmlDict_standard[standardMetadatKeys[k]] = xmlDict[k]
else:
xmlDict_standard[k] = xmlDict[k]
return xmlDict_standard