141 lines
3.5 KiB
Python
141 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
#
|
|
# Author: Bekaert David
|
|
# Year: 2017
|
|
|
|
import os
|
|
import sys
|
|
import argparse
|
|
from osgeo import gdal
|
|
|
|
import isce
|
|
import isceobj
|
|
|
|
|
|
# command line parsing of input file
|
|
def cmdLineParse():
|
|
'''
|
|
Command line parser.
|
|
'''
|
|
parser = argparse.ArgumentParser(description='Generate ISCE xml from gdal products')
|
|
parser.add_argument('-i','--input', dest='fname', type=str, required=True, help='Input filename (GDAL supported)')
|
|
return parser.parse_args()
|
|
|
|
|
|
def gdal2isce_xml(fname):
|
|
"""
|
|
Generate ISCE xml file from gdal supported file
|
|
|
|
Example: import isce
|
|
from applications.gdal2isce_xml import gdal2isce_xml
|
|
xml_file = gdal2isce_xml(fname+'.vrt')
|
|
"""
|
|
|
|
# open the GDAL file and get typical data informationi
|
|
GDAL2ISCE_DATATYPE = {
|
|
1 : 'BYTE',
|
|
2 : 'uint16',
|
|
3 : 'SHORT',
|
|
4 : 'uint32',
|
|
5 : 'INT',
|
|
6 : 'FLOAT',
|
|
7 : 'DOUBLE',
|
|
10: 'CFLOAT',
|
|
11: 'complex128',
|
|
}
|
|
# 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,
|
|
# }
|
|
|
|
# check if the input file is a vrt
|
|
fbase, fext = os.path.splitext(fname)
|
|
print(fext)
|
|
if fext == ".vrt":
|
|
outname = fbase
|
|
else:
|
|
outname = fname
|
|
print(outname)
|
|
|
|
# open the GDAL file and get typical ds information
|
|
ds = gdal.Open(fname, gdal.GA_ReadOnly)
|
|
width = ds.RasterXSize
|
|
length = ds.RasterYSize
|
|
bands = ds.RasterCount
|
|
print("width: " + "\t" + str(width))
|
|
print("length: " + "\t" + str(length))
|
|
print("num of bands:" + "\t" + str(bands))
|
|
|
|
# getting the datatype information
|
|
raster = ds.GetRasterBand(1)
|
|
dataTypeGdal = raster.DataType
|
|
|
|
# user look-up dictionary from gdal to isce format
|
|
dataType= GDAL2ISCE_DATATYPE[dataTypeGdal]
|
|
print("dataType: " + "\t" + str(dataType))
|
|
|
|
# transformation contains gridcorners (lines/pixels or lonlat and the spacing 1/-1 or deltalon/deltalat)
|
|
transform = ds.GetGeoTransform()
|
|
# if a complex data type, then create complex image
|
|
# if a real data type, then create a regular image
|
|
|
|
img = isceobj.createImage()
|
|
img.setFilename(os.path.abspath(outname))
|
|
img.setWidth(width)
|
|
img.setLength(length)
|
|
img.setAccessMode('READ')
|
|
img.bands = bands
|
|
img.dataType = dataType
|
|
|
|
# interleave
|
|
md = ds.GetMetadata('IMAGE_STRUCTURE')
|
|
sch = md.get('INTERLEAVE', None)
|
|
if sch == 'LINE':
|
|
img.scheme = 'BIL'
|
|
elif sch == 'PIXEL':
|
|
img.scheme = 'BIP'
|
|
elif sch == 'BAND':
|
|
img.scheme = 'BSQ'
|
|
else:
|
|
print('Unrecognized interleaving scheme, {}'.format(sch))
|
|
if bands < 2:
|
|
print('Assuming default, BIP')
|
|
img.scheme = 'BIP'
|
|
else:
|
|
print('Assuming default, BSQ')
|
|
img.scheme = 'BSQ'
|
|
|
|
img.firstLongitude = transform[0]
|
|
img.firstLatitude = transform[3]
|
|
img.deltaLatitude = transform[5]
|
|
img.deltaLongitude = transform[1]
|
|
|
|
xml_file = outname + ".xml"
|
|
img.dump(xml_file)
|
|
|
|
return xml_file
|
|
|
|
|
|
# main script
|
|
if __name__ == '__main__':
|
|
'''
|
|
Main driver.
|
|
'''
|
|
|
|
# Parse command line
|
|
inps = cmdLineParse()
|
|
|
|
# check if the input file exist
|
|
if not os.path.isfile(inps.fname):
|
|
raise Exception('Input file is not found ....')
|
|
|
|
gdal2isce_xml(inps.fname)
|
|
|