ISCE_INSAR/contrib/frameUtils/FrameInfoExtractor.py

216 lines
9.2 KiB
Python
Raw Permalink Normal View History

2025-01-16 09:33:42 +00:00
#!/usr/bin/env python3
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Copyright 2010 California Institute of Technology. ALL RIGHTS RESERVED.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# United States Government Sponsorship acknowledged. This software is subject to
# U.S. export control laws and regulations and has been classified as 'EAR99 NLR'
# (No [Export] License Required except when exporting to an embargoed country,
# end user, or in support of a prohibited end use). By downloading this software,
# the user agrees to comply with all applicable U.S. export laws and regulations.
# The user has the responsibility to obtain export licenses, or other export
# authority as may be required before exporting this software to any 'EAR99'
# embargoed foreign country or citizen of those countries.
#
# Author: Giangi Sacco
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from __future__ import print_function
import os
from mroipac.geolocate.Geolocate import Geolocate
import logging
from contrib.frameUtils.FrameMetaData import FrameMetaData
class FrameInfoExtractor():
def __init__(self):
self.logger = logging.getLogger("contrib.frameUtils.FrameInfoExtractor")
self._frameFilename = ''
self._frame = None
def __getstate__(self):
d = dict(self.__dict__)
del d['logger']
return d
def __setstate__(self,d):
self.__dict__.update(d)
self.logger = logging.getLogger("FrameInfoExtractor")
def setFrameFilename(self,name):
self._frameFilename = name
def calculateCorners(self):
"""
Calculate the approximate geographic coordinates of corners of the SAR image.
@return (\a tuple) a list with the corner coordinates and a list with the look angles to these coordinates
"""
# Extract the planet from the hh object
planet = self._frame.getInstrument().getPlatform().getPlanet()
# Wire up the geolocation object
geolocate = Geolocate()
geolocate.wireInputPort(name='planet',object=planet)
try:
earlySquint = self._frame._squintAngle
except:
earlySquint = 0.0
lookSide = int(self._frame.getInstrument().getPlatform().pointingDirection)
# Get the ranges, squints and state vectors that defined the boundaries of the frame
orbit = self._frame.getOrbit()
nearRange = self._frame.getStartingRange()
farRange = self._frame.getFarRange()
earlyStateVector = orbit.interpolateOrbit(self._frame.getSensingStart())
lateStateVector = orbit.interpolateOrbit(self._frame.getSensingStop())
nearEarlyCorner,nearEarlyLookAngle,nearEarlyIncAngle = geolocate.geolocate(earlyStateVector.getPosition(),
earlyStateVector.getVelocity(),
nearRange,earlySquint,lookSide)
farEarlyCorner,farEarlyLookAngle,farEarlyIncAngle = geolocate.geolocate(earlyStateVector.getPosition(),
earlyStateVector.getVelocity(),
farRange,earlySquint,lookSide)
nearLateCorner,nearLateLookAngle,nearLateIncAngle = geolocate.geolocate(lateStateVector.getPosition(),
lateStateVector.getVelocity(),
nearRange,earlySquint,lookSide)
farLateCorner,farLateLookAngle,farLateIncAngle = geolocate.geolocate(lateStateVector.getPosition(),
lateStateVector.getVelocity(),
farRange,earlySquint,lookSide)
self.logger.debug("Near Early Corner: %s" % nearEarlyCorner)
self.logger.debug("Near Early Look Angle: %s" % nearEarlyLookAngle)
self.logger.debug("Near Early Incidence Angle: %s " % nearEarlyIncAngle)
self.logger.debug("Far Early Corner: %s" % farEarlyCorner)
self.logger.debug("Far Early Look Angle: %s" % farEarlyLookAngle)
self.logger.debug("Far Early Incidence Angle: %s" % farEarlyIncAngle)
self.logger.debug("Near Late Corner: %s" % nearLateCorner)
self.logger.debug("Near Late Look Angle: %s" % nearLateLookAngle)
self.logger.debug("Near Late Incidence Angle: %s" % nearLateIncAngle)
self.logger.debug("Far Late Corner: %s" % farLateCorner)
self.logger.debug("Far Late Look Angle: %s" % farLateLookAngle)
self.logger.debug("Far Late Incidence Angle: %s" % farLateIncAngle)
corners = [nearEarlyCorner,farEarlyCorner,nearLateCorner,farLateCorner]
lookAngles = [nearEarlyLookAngle,farEarlyLookAngle,nearLateLookAngle,farLateLookAngle]
return corners,lookAngles
def convertBboxToPoly(self,bbox):
nearEarlyCorner = bbox[0]
farEarlyCorner = bbox[1]
nearLateCorner = bbox[2]
farLateCorner = bbox[3]
# save the corners starting from nearEarly and going clockwise
if (nearEarlyCorner[1] < farEarlyCorner[1]):
if (nearEarlyCorner[0] > farEarlyCorner[0]):
corners = [nearEarlyCorner,farEarlyCorner,farLateCorner,nearLateCorner]
else:
corners = [nearEarlyCorner,nearLateCorner,farLateCorner,farEarlyCorner]
else:
if (nearEarlyCorner[0] > farEarlyCorner[0]):
corners = [nearEarlyCorner,nearLateCorner,farLateCorner,farEarlyCorner]
else:
corners = [nearEarlyCorner,farEarlyCorner,farLateCorner,nearLateCorner]
return corners
def extractInfoFromFile(self, filename = None):
import cPickle as cP
if(filename == None):
filename = self._frameFilename
fp = open(filename,'r')
self._frame = cP.load(fp)
fp.close()
return self.extractInfo()
def extractInfoFromFrame(self,frame):
self._frame = frame
return self.extractInfo()
# update the frame by setting the attribute attr to the value val. if obj is a string then assume that is a filename, otherwise assume that is a frame object
def updateFrameInfo(self,attr,val,obj):
from isceobj.Scene import Frame
if(isinstance(obj,str)):
import cPickle as cP
fp = open(obj,'r')
frame = cP.load(fp)
fp.close()
if(isinstance(attr,list)):
for i in range(len(attr)):
setattr(frame,attr[i],val[i])
else:
setattr(frame,attr,val)
#update the pickled file
fp = open(obj,'w')
cP.dump(frame,fp,2)
fp.close()
elif(isinstance(obj,Frame)):
frame = obj
if(isinstance(attr,list)):
for i in range(len(attr)):
setattr(frame,attr[i],val[i])
else:
setattr(frame,attr,val)
else:
self.logger.error("Error. The method updateFrameInfo takes as third argument a strig or a Frame object.")
raise Exception
def extractInfo(self):
FM = FrameMetaData()
bbox , dummy = self.calculateCorners()
for bb in bbox:
FM._bbox.append((bb.getLatitude(),bb.getLongitude()))
#try since sometimes is and empty string. if so set it to None
try:
FM._frameNumber = int(self._frame.getFrameNumber())
except:
FM._frameNumber = None
try:
FM._trackNumber = int(self._frame.getTrackNumber())
except:
FM._trackNumber = None
try:
FM._orbitNumber = int(self._frame.getOrbitNumber())
except:
FM._orbitNumber = None
FM._sensingStart = self._frame.getSensingStart()
FM._sensingStop = self._frame.getSensingStop()
FM._spacecraftName = self._frame.getInstrument().getPlatform().getSpacecraftName()
#bbox is nearEarly,farEarly,nearLate,farLate
if(FM._bbox[0][0] < FM._bbox[2][0]):
#if latEarly < latLate then asc otherwise dsc
FM._direction = 'asc'
else:
FM._direction = 'dsc'
return FM
def main(argv):
import isce
FI = FrameInfoExtractor()
FM = FI.extractInfoFromFile(argv[0])
print(FM.bbox)
if __name__ == "__main__":
import sys
argv = sys.argv[1:]
sys.exit(main(argv))