127 lines
3.2 KiB
Python
Executable File
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
|
|
|
|
|