ISCE_INSAR/contrib/stack/stripmapStack/trackCRs.py

201 lines
4.9 KiB
Python
Executable File

#!/usr/bin/env python3
import isce
import numpy as np
import shelve
import os
import logging
import argparse
from isceobj.Constants import SPEED_OF_LIGHT
import datetime
from isceobj.Util.Poly2D import Poly2D
def cmdLineParse():
'''
Command line parser.
'''
parser = argparse.ArgumentParser(description='Plot corner reflectors in SLC')
parser.add_argument('-i', '--input', dest='indir', type=str, required=True,
help='Input SLC directory')
parser.add_argument('-c', '--crs', dest='posfile', type=str, required=True,
help='Input text file with CR positions')
parser.add_argument('-p', '--plot', dest='plot', action='store_true', default=False,
help='Plot')
return parser.parse_args()
def makePlot(filename, pos):
'''
Make plots.
'''
import matplotlib.pyplot as plt
from imageMath import IML
win = 8
mm = IML.mmapFromISCE(filename, logging)
data = mm.bands[0]
plt.figure('CR analysis')
for index, (num, line, pixel) in enumerate(pos):
print(line, pixel)
xx = np.int(pixel)
yy = np.int(line)
box = 10 * np.log10(np.abs(data[yy-win:yy+win, yy-win:yy+win]))
plt.subplot(7,3,index+1)
plt.imshow(box, cmap=plt.cm.gray)
plt.colorbar()
plt.scatter(pixel-xx+win, line-yy+win, marker='+', c='b')
plt.show()
def makeOnePlot(filename, pos):
'''
Make plots.
'''
import matplotlib.pyplot as plt
from imageMath import IML
win = 100
mm = IML.mmapFromISCE(filename, logging)
data = mm.bands[0]
nl, npix = data.shape
pos = np.array(pos)
miny = np.clip(np.min(pos[:,1])-win, 0 , nl-1)
maxy = np.clip(np.max(pos[:,1])+win, 0 , nl-1)
minx = np.clip(np.min(pos[:,2])-win, 0, npix-1)
maxx = np.clip(np.max(pos[:,2])+win, 0, npix-1)
box = np.power(np.abs(data[int(miny):int(maxy), int(minx):int(maxx)]), 0.4)
plt.figure('CR analysis')
plt.imshow(box, cmap=plt.cm.gray)
plt.colorbar()
# plt.scatter(pos[:,2]-minx, pos[:,1]-miny, marker='+', c='b', s=200)
plt.scatter(pos[:,2]-minx, pos[:,1]-miny, marker='o',
facecolors='none', edgecolors='b', s=100)
plt.title(os.path.basename(os.path.dirname(filename)))
plt.show()
def getAzRg(frame,llh):
'''
Return line pixel position.
'''
nl = frame.getImage().getLength() - 1
np = frame.getImage().getWidth() - 1
coeffs = frame._dopplerVsPixel
if coeffs is None:
coeffs = [0.]
pol = Poly2D()
pol._meanRange = frame.startingRange
pol._normRange = frame.instrument.rangePixelSize
pol.initPoly(azimuthOrder=0, rangeOrder=len(coeffs)-1, coeffs=[coeffs])
taz, rgm = frame.orbit.geo2rdr(list(llh)[1:], side=frame.instrument.platform.pointingDirection,
doppler=pol, wvl=frame.instrument.getRadarWavelength())
line = (taz - frame.sensingStart).total_seconds() * frame.PRF
pixel = (rgm - frame.startingRange) / frame.getInstrument().getRangePixelSize()
if (line < 0) or (line > nl):
return None
if (pixel < 0) or (pixel > np):
return None
return (line, pixel)
if __name__ == '__main__':
'''
Main driver.
'''
#Command line parse
inps = cmdLineParse()
#Load shelve
with shelve.open(os.path.join(inps.indir, 'data'), 'r') as db:
frame = db['frame']
####Adjust azimuth for bias
bias = 0.5 * (frame.getStartingRange() + frame.getFarRange()) / SPEED_OF_LIGHT
print('One way bias: ', bias)
delta = datetime.timedelta(seconds = bias) #-0.009)
frame.sensingStart = frame.sensingStart - delta
####Adjust range for bias
# frame.startingRange = frame.startingRange + 100.0
###Load CRS positions
llhs = np.loadtxt(inps.posfile, delimiter=',')
crs = []
for ind, llh in enumerate(llhs):
pos = getAzRg(frame, llh)
if pos is not None:
crs.append([ind, pos[0], pos[1]])
print('Number of CRS in the scene: {0}'.format(len(crs)))
if inps.plot and len(crs) > 0:
makeOnePlot(frame.image.filename, crs)
if False:
'''
Work on the grid file.
'''
import matplotlib.pyplot as plt
fname = '154283811/154283811_RH_L1_SlantRange_grid.txt'
grid = np.loadtxt(fname)
ht = np.linspace(600.0, 900.0, num=150)
lonref = grid[0][1]
latref = grid[0][0]
rngref = grid[0][2]
r0 = frame.startingRange
t0 = frame.sensingStart
orb = frame.orbit
tdiff = []
rdiff = []
for h in ht:
tt,rr = orb.geo2rdr([latref, lonref, h])
tdiff.append( (tt-t0).total_seconds())
rdiff.append( rr - r0)
plt.figure()
plt.subplot(2,1,1)
plt.plot(ht, tdiff)
plt.ylabel('Az diff')
plt.subplot(2,1,2)
plt.plot(ht, rdiff)
plt.xlabel('Rg diff')
plt.show()