修改GF3干涉模块配准错误导致干涉图出现条纹的问题

dev
tian jiax 2024-01-26 17:54:33 +08:00
parent 3648f0e7f8
commit d9651dd991
33 changed files with 875 additions and 221171 deletions

View File

@ -407,7 +407,7 @@ class Orbit(Component):
"Orbit interpolation type %s, is not implemented" % method
)
interpolateOrbit = interpolate
# interpolateOrbit = interpolate
def _linearOrbitInterpolation(self,time):
"""
@ -1020,12 +1020,11 @@ class Orbit(Component):
delta = (self.maxTime - self.minTime).total_seconds() * 0.5
tguess = self.minTime + datetime.timedelta(seconds = delta)
outOfBounds = False
# Start the previous guess tracking with dummy value
t_prev_guess = tguess + datetime.timedelta(seconds=10)
for ii in range(51):
try:
sv = self.interpolateOrbit(tguess, method='hermite')
except:
except Exception as e:
print(e)
outOfBounds = True
break
@ -1044,12 +1043,9 @@ class Orbit(Component):
c2 = (fdop/rng + fdopder)
fnprime = c1 + c2 * dopfact
tguess = tguess - datetime.timedelta(seconds = fn/fnprime)
if abs(tguess - t_prev_guess).total_seconds() < 5e-9:
if abs(fn/fnprime) < 1e-6:
break
else:
t_prev_guess = tguess
if outOfBounds:
raise Exception('Interpolation time out of bounds')

View File

@ -27,9 +27,13 @@
# Author: Walter Szeliga
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from xml.etree.ElementTree import ElementTree
import datetime
import isceobj
import copy
from isceobj.Scene.Frame import Frame
from isceobj.Planet.Planet import Planet
from isceobj.Orbit.Orbit import StateVector, Orbit
@ -38,16 +42,8 @@ from isceobj.Planet.AstronomicalHandbook import Const
from iscesys.Component.Component import Component
from iscesys.DateTimeUtil.DateTimeUtil import DateTimeUtil as DTUtil
import os
import copy
import scipy.sparse as ss
from concurrent.futures._base import as_completed, wait
from concurrent.futures.thread import ThreadPoolExecutor
from multiprocessing import Pool
import math
import datetime
from math import sin,cos
from scipy.optimize import leastsq
import numpy as np
sep = "\n"
tab = " "
lookMap = { 'R': -1,
@ -59,7 +55,7 @@ TIFF = Component.Parameter(
default='',
type=str,
mandatory=True,
doc='GF3 tiff imagery file'
doc='GF3_SLC tiff imagery file'
)
XML = Component.Parameter(
@ -68,7 +64,7 @@ XML = Component.Parameter(
default='',
type=str,
mandatory=True,
doc='GF3 xml metadata file'
doc='GF3_SLC xml metadata file'
)
ORBIT_DIRECTORY = Component.Parameter(
@ -77,7 +73,7 @@ ORBIT_DIRECTORY = Component.Parameter(
default=None,
type=str,
mandatory=False,
doc='Directory with GF3 precise orbits')
doc='Directory with GF3_SLC precise orbits')
ORBIT_FILE = Component.Parameter(
'orbitFile',
@ -95,40 +91,87 @@ from .Sensor import Sensor
# 这里采用《Insar原理和应用 》刘国祥著中基于空间定位的轨道参数计算方法一章中的内容Gabriel and Goldstein
# 注意为了方便计算,采用基准时间的方法
######################################################
import math
import datetime
import time
import scipy as sp
from math import sin,cos
from scipy.optimize import leastsq
import numpy as np
def FindInfomationFromJson(HeaderFile_dom_json, node_path_list):
"""
在Json文件中按照指定路径解析出制定节点
"""
result_node = HeaderFile_dom_json
for nodename in node_path_list:
result_node = result_node[nodename]
return result_node
########
# 函数列表
########
def poly1dfunc(p,x): # 一次函数
k,b=p
return k*x+b
def poly2dfunc(p,x): # 二次函数
k1,k2,b=p
return b+k1*x+k2*x*x
def GetVectorNorm(Vecter):
"""
得到向量的模
"""
Vecter = Vecter.reshape(-1,1)
Vecter_Norm_pow = np.matmul(Vecter.T,Vecter)
return np.sqrt(Vecter_Norm_pow)
def poly3dfunc(p,x):
k1,k2,k3,b=p
return b+k1*x+k2*x*x+k3*x*x*x
def poly4dfunc(p,x):
k1,k2,k3,k4,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4
def XYZOuterM2(A, B):
"""
外积叉乘,日后版本换成可以任意维度的外积运算方程
args:
A:nx3
B:nx3
"""
cnt = A.shape[0]
C = np.zeros((cnt, 3))
C[:, 0] = A[:, 1] * B[:, 2] - A[:, 2] * B[:, 1]
C[:, 1] = A[:, 2] * B[:, 0] - A[:, 0] * B[:, 2]
C[:, 2] = A[:, 0] * B[:, 1] - A[:, 1] * B[:, 0]
return C
def poly5dfunc(p,x):
k1,k2,k3,k4,k5,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4+k5*x**5
def poly1derror(p,x,y):
return poly1dfunc(p,x)-y
def poly2derror(p,x,y):
return poly2dfunc(p,x)-y
def poly3derror(p,x,y):
return poly3dfunc(p,x)-y
def poly4derror(p,x,y):
return poly4dfunc(p,x)-y
def poly5derror(p,x,y):
return poly5dfunc(p,x)-y
class orbitVector:
def __init__(self,UTCTimes,vx,vy,vz,px,py,pz,dateformat="%Y-%m-%dT%H:%M:%S.%fZ"):
self.UTCTime=datetime.datetime.strptime(UTCTimes,dateformat) # 字符串转UTC时间
self.time_stamp=self.UTCTime.timestamp() # 时间戳
self.vx=vx
self.vy=vy
self.vz=vz
self.px=px
self.py=py
self.pz=pz
self.orbitVector2GG() # 将坐标进行变换
self.Check()
pass
def orbitVector2GG(self):
Cx=self.py*self.vz-self.pz*self.vy
Cy=self.pz*self.vx-self.px*self.vz
Cz=self.px*self.vy-self.py*self.vx
C=(Cx**2+Cy**2+Cz**2)**0.5
self.rho=(self.px**2+self.py**2+self.pz**2)**0.5
self.I=math.acos(Cz/C)
self.omega=math.asin(self.pz/(self.rho*math.sin(self.I)))
self.Omega=math.atan(-Cx/Cy)
return [self.rho,self.I,self.omega,self.Omega]
def Check(self):
rho=self.rho
I=self.I
omega=self.omega
Omega=self.Omega
Xp=-rho*(cos(omega)*cos(Omega)-sin(omega)*sin(Omega)*cos(I))
Yp=-rho*(cos(omega)*sin(Omega)+sin(omega)*cos(Omega)*cos(I))
Zp=rho*sin(omega)*sin(I)
print("计算插值:",self.UTCTime,self.px,self.py,self.pz,self.vx,self.vy,self.vz,"|",Xp-self.px,Yp-self.py,Zp-self.pz)
class SatelliteOrbit(object):
@ -260,11 +303,53 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
result_arr=np.zeros((1,7))
time_float = time_float - self.starttime
result_arr[0,0]=time_float
#time_arr[0, 4] = time_arr[0, 3] * time_float ** 4
time_float=np.array([1,time_float,time_float**2,time_float**3,time_float**4]).reshape(1,5)
result_arr=np.matmul(time_float,self.A_arr)
return [time_float,result_arr]
#
px=0
py=0
pz=0
vx=0
vy=0
vz=0
for ii in range(self.polynum):
px+=self.A_arr[ii,0]*time_float**ii
py+=self.A_arr[ii,1]*time_float**ii
pz+=self.A_arr[ii,2]*time_float**ii
vx+=self.A_arr[ii,3]*time_float**ii
vy+=self.A_arr[ii,4]*time_float**ii
vz+=self.A_arr[ii,5]*time_float**ii
return [time_float,[px,py,pz,vx,vy,vz]]
def getTimeOrbitStamp(self,UTCStartTime_float):
sv=_StateVector()
temp_sv=self.SatelliteSpaceState(UTCStartTime_float)
sv.timeStamp=datetime.datetime.fromtimestamp(UTCStartTime_float)
sv.xPosition = temp_sv[1][0,0]
sv.yPosition = temp_sv[1][0,1]
sv.zPosition = temp_sv[1][0,2]
sv.xVelocity = temp_sv[1][0,3]
sv.yVelocity = temp_sv[1][0,4]
sv.zVelocity = temp_sv[1][0,5]
return sv
def getTimeOrbits(self,UTCStartTime,UTCEndTime,orbitnum=1000):
#
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()-10
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()+10
if startTime_stamp>endTime_stamp:
raise
delta_t=(endTime_stamp-startTime_stamp)/orbitnum
extractOrbits=[]
#
temptime=startTime_stamp
while temptime<endTime_stamp:
temptime=temptime+delta_t
newOrbit=self.getTimeOrbitStamp(temptime)
extractOrbits.append(newOrbit)
newOrbit=self.getTimeOrbitStamp(endTime_stamp)
extractOrbits.append(newOrbit)
return extractOrbits # 扩展的轨道节点
def getSatelliteSpaceState(self, time_array):
'''
@ -303,97 +388,40 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
#result_arr=result_arr_
return result_arr_ # 位置矩阵
def ReconstructionSatelliteOrbit(GPSPoints_list, starttime):
def ReconstructionSatelliteOrbit(stateVectors, starttime):
'''
构建卫星轨道
args:
GPSPoints_list:卫星轨道点
starttime:起算时间
'''
# GPSPoint_list=[]
# for sv in stateVectors:
# GPSPoint=[sv.timeStamp.timestamp(),
# sv.xPosition,
# sv.yPosition,
# sv.zPosition,
# sv.xVelocity,
# sv.yVelocity,
# sv.zVelocity
# ]
# GPSPoint_list.append(GPSPoint)
SatelliteOrbitModel = SatelliteOrbitFitPoly()
if SatelliteOrbitModel.ReconstructionSatelliteOrbit(GPSPoints_list, starttime=starttime) is None:
if SatelliteOrbitModel.ReconstructionSatelliteOrbit(stateVectors, starttime=starttime) is None:
return None
print("orbit test")
distance=[]
for gpsPoint in stateVectors:
temp_sv=SatelliteOrbitModel.SatelliteSpaceState(gpsPoint[0])
sv=np.array(temp_sv[1])
temp_distance=sv-gpsPoint[1:]
distance.append(temp_distance)
distance=np.array(distance)
print("orbit max:",np.max(distance))
print("orbit min:",np.min(distance))
return SatelliteOrbitModel
########
# 函数列表
########
def poly1dfunc(p,x): # 一次函数
k,b=p
return k*x+b
def poly2dfunc(p,x): # 二次函数
k1,k2,b=p
return b+k1*x+k2*x*x
def poly3dfunc(p,x):
k1,k2,k3,b=p
return b+k1*x+k2*x*x+k3*x*x*x
def poly4dfunc(p,x):
k1,k2,k3,k4,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4
def poly5dfunc(p,x):
k1,k2,k3,k4,k5,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4+k5*x**5
def poly1derror(p,x,y):
return poly1dfunc(p,x)-y
def poly2derror(p,x,y):
return poly2dfunc(p,x)-y
def poly3derror(p,x,y):
return poly3dfunc(p,x)-y
def poly4derror(p,x,y):
return poly4dfunc(p,x)-y
def poly5derror(p,x,y):
return poly5dfunc(p,x)-y
class orbitVector:
def __init__(self,UTCTimes,vx,vy,vz,px,py,pz,dateformat="%Y-%m-%dT%H:%M:%S.%f"):
self.UTCTime=datetime.datetime.strptime(UTCTimes,dateformat) # 字符串转UTC时间
self.time_stamp=self.UTCTime.timestamp() # 时间戳
self.vx=vx
self.vy=vy
self.vz=vz
self.px=px
self.py=py
self.pz=pz
self.orbitVector2GG() # 将坐标进行变换
self.Check()
pass
def orbitVector2GG(self):
Cx=self.py*self.vz-self.pz*self.vy # 叉乘
Cy=self.pz*self.vx-self.px*self.vz
Cz=self.px*self.vy-self.py*self.vx
C=(Cx**2+Cy**2+Cz**2)**0.5
self.rho=(self.px**2+self.py**2+self.pz**2)**0.5
self.I=math.acos(Cz/C)
self.omega=math.asin(self.pz/(self.rho*math.sin(self.I)))
self.Omega=math.atan(Cx*(-1)/Cy)
return [self.rho,self.I,self.omega,self.Omega]
def Check(self):
rho=self.rho
I=self.I
omega=self.omega
Omega=self.Omega
Xp=rho*(cos(omega)*cos(Omega)-sin(omega)*sin(Omega)*cos(I))
Yp=rho*(cos(omega)*sin(Omega)+sin(omega)*cos(Omega)*cos(I))
Zp=rho*sin(Omega)*sin(I)
print("计算插值:",self.UTCTime,self.px,self.py,self.pz,self.vx,self.vy,self.vz,"|",abs(Xp)-abs(self.px),abs(Yp)-abs(self.py),abs(Zp)-abs(self.pz))
class SARorbit(object):
# 作为自定义轨道计算基类
# 定义几个基本方法addvector(),createOrbit(),getTime(),getTimes()
@ -417,13 +445,13 @@ class SARorbit(object):
return None
def getTimeOrbitStamp(self,StampTime):
utcStr=datetime.datetime.fromtimestamp(StampTime).strftime("%Y-%m-%dT%H:%M:%S.%f")
utcStr=datetime.datetime.fromtimestamp(StampTime).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
return self.getTimeOrbit(utcStr)
def getTimeOrbits(self,UTCStartTime,UTCEndTime,orbitnum=100):
#
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()-0.2
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()+0.2
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()-10
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()+10
if startTime_stamp>endTime_stamp:
raise
delta_t=(endTime_stamp-startTime_stamp)*1000/orbitnum
@ -490,7 +518,7 @@ class GGorbit(SARorbit):
# 获取计算结果
def getTimeOrbit(self,UTCTime):
staptime=datetime.datetime.strptime(UTCTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()
staptime=datetime.datetime.strptime(UTCTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()
dtime=0.0001
[Xp,Yp,Zp]=self.getXYZ(staptime)
[Xp_temp,Yp_temp,Zp_temp]=self.getXYZ(staptime+dtime)
@ -548,7 +576,7 @@ class polyorbit(SARorbit):
class GF3_SLC(Sensor):
"""
A Class representing GF3 data
A Class representing GF3_SLC data
"""
family='GF3_SLC'
@ -600,12 +628,15 @@ class GF3_SLC(Sensor):
# azimuthPixelSize = self.product.imageAttributes.rasterAttributes.sampledLineSpacing # ground spacing in meters
totalProcessedAzimuthBandwidth = self.product.imageInfo.eqvPRF
prf = self.product.imageInfo.eqvPRF # effective PRF can be double original, suggested by Piyush
prf_s = ori_prf * np.ceil(totalProcessedAzimuthBandwidth / ori_prf) # effective PRF can be double original, suggested by Piyush
# print("effective PRF %f, original PRF %f" % (prf, orig_prf) )
print('----------------------------------------------------')
print("mission",mission)
print("swath",swath)
print("frequency",frequency)
print("ori_prf",ori_prf)
print("prf",prf)
print("prf_s",prf_s)
print("rangePixelSize",rangePixelSize)
print("rangeSamplingRate",rangeSamplingRate)
print("pulseLength",pulseLength)
@ -638,7 +669,7 @@ class GF3_SLC(Sensor):
####Populate instrument
instrument = self.frame.getInstrument()
instrument.setRadarFrequency(frequency)
instrument.setPulseRepetitionFrequency(prf)
instrument.setPulseRepetitionFrequency(prf_s)
instrument.setPulseLength(pulseLength)
instrument.setChirpSlope(pulseBandwidth/pulseLength)
instrument.setIncidenceAngle(incidenceAngle)
@ -648,7 +679,6 @@ class GF3_SLC(Sensor):
instrument.setBeamNumber(swath)
instrument.setPulseLength(pulseLength)
#Populate Frame
#self.frame.setSatelliteHeight(height)
self.frame.setSensingStart(dataStartTime) # Date time object for UTC of first line
@ -667,19 +697,15 @@ class GF3_SLC(Sensor):
self.frame.getOrbit().setOrbitSource('EOF')
# self.frame.getOrbit().setOrbitSource(self.product.sourceAttributes.orbitAndAttitude.orbitInformation.orbitDataFile)
print("======= 修改轨道代码部分: =================")
if (self.orbitFile is None) and (self.orbitDirectory is None):
print('orbitFile and orbitDirectory are None')
self.extractOrbit()
elif (self.orbitDirectory is not None):
print('orbitDirectory is None')
self.orbitFile = findPreciseOrbit(self.orbitDirectory, self.frame.getOrbit().getOrbitSource(), self.frame.sensingStart.year)
if self.orbitFile is not None:
print('orbitFile is None')
self.extractPreciseOrbit(self.orbitFile, self.frame.sensingStart, self.frame.sensingStop)
@ -689,15 +715,10 @@ class GF3_SLC(Sensor):
# note that RS2 Doppler values are estimated at time dc.dopplerCentroidReferenceTime,
# so the values might need to be adjusted for ISCE usage
# added EJF 2015/08/17
# dc = self.product.imageGenerationParameters.dopplerCentroid
# poly = dc.dopplerCentroidCoefficients
poly = self.product.processInfo.DopplerCentroidCoefficients
# need to convert units
poly[1] = poly[1]/rangeSamplingRate
poly[2] = poly[2]/rangeSamplingRate**2
poly[3] = poly[3]/rangeSamplingRate**3
poly[4] = poly[4]/rangeSamplingRate**4
self.doppler_coeff = poly
# similarly save Doppler azimuth fm rate values, converting units
@ -706,22 +727,12 @@ class GF3_SLC(Sensor):
# note that RS2 Doppler values are estimated at time dc.dopplerRateReferenceTime,
# so the values might need to be adjusted for ISCE usage
# added EJF 2015/08/17
# dr = self.product.imageGenerationParameters.dopplerRateValues
# fmpoly = dr.dopplerRateValuesCoefficients
fmpoly = self.product.processInfo.DopplerRateValuesCoefficients
# need to convert units
fmpoly[1] = fmpoly[1]/rangeSamplingRate
fmpoly[2] = fmpoly[2]/rangeSamplingRate**2
fmpoly[3] = fmpoly[3]/rangeSamplingRate**3
fmpoly[4] = fmpoly[4]/rangeSamplingRate**4
self.azfmrate_coeff = fmpoly
# print("poly",poly)
# print("fmpoly",fmpoly)
# print('------------------------------------------------------')
# now calculate effective PRF from the azimuth line spacing after we have the orbit info EJF 2015/08/15
# this does not work because azimuth spacing is on ground. Instead use bandwidth ratio calculated above EJF
# SCHvelocity = self.frame.getSchVelocity()
@ -740,85 +751,46 @@ class GF3_SLC(Sensor):
print("构建新的轨道程序代码:")
tempOrbit = GGorbit()
self.frame.getOrbit().setOrbitSource('Header: ' + self.frame.getOrbit().getOrbitSource())
# stateVectors = self.product.sourceAttributes.orbitAndAttitude.orbitInformation.stateVectors
stateVectors = self.product.GPS.gpsParam
dataStartTime = self.product.imageInfo.imagingStartTime
dataStopTime = self.product.imageInfo.imagingEndTime
dataCenterTime = self.product.platform.CenterTime
startTime_s = dataStartTime.timestamp()
stopTime_s = dataStopTime.timestamp()
centerTime_s = dataCenterTime.timestamp()
num = 0
dataStartTime = self.frame.sensingStart.timestamp()
dataStopTime = self.frame.sensingStop.timestamp()
time_list = []
self.frame.getOrbit().setOrbitSource('Header: ' + self.frame.getOrbit().getOrbitSource())
stateVectors = self.product.GPS.gpsParam
for i in range(len(stateVectors)):
# print(i,stateVectors[i].timeStamp)
# tempOrbit.addvector(stateVectors[i].timeStamp.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# tempOrbit.addvector(stateVectors[i].timeStamp.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity,
# stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition)
if stateVectors[i].timeStamp>dataStartTime and stateVectors[i].timeStamp < dataStopTime:
# tempOrbit.addvector(stateVectors[i].timeStamp.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity,
# stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition)
# time_list.append(stateVectors[i].timeStamp)
time_list.append([stateVectors[i].timeStamp.timestamp(),
stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition,
stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity])
num += 1
# sv= StateVector()
# sv.setTime(stateVectors[i].timeStamp)
# sv.setPosition([stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition])
# sv.setVelocity([stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity])
# self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
# num+=1
model = ReconstructionSatelliteOrbit(time_list, starttime=centerTime_s)
time_dif = ((stopTime_s + 30) - (startTime_s - 30)) / 1000
model = ReconstructionSatelliteOrbit(time_list, starttime=dataStartTime)
time_dif = ((dataStopTime + 10) - (dataStartTime - 10)) / 1000
time = np.zeros((1000, 1))
for i in range(1000):
time[i,:]=((startTime_s - 10) + time_dif * i)
time[i,:]=((dataStartTime - 10) + time_dif * i)
t = time.reshape(-1)
statepoints = model.getSatelliteSpaceState(t)
# print("初始插值-----------------------------------------------------")
# self.frame.setSensingStart(datetime.datetime.fromtimestamp(t[2]))
# self.frame.setSensingStop(datetime.datetime.fromtimestamp(t[len(t)-3]))
self.frame.setSensingStart(dataStartTime)
self.frame.setSensingStop(dataStopTime)
diffTime = DTUtil.timeDeltaToSeconds(self.frame.sensingStop-self.frame.sensingStart)/2.0
sensingMid = self.frame.sensingStart + datetime.timedelta(microseconds=int(diffTime*1e6))
self.frame.setSensingMid(sensingMid)
# planet = self.frame.instrument.platform.planet
# orbExt = OrbitExtender(planet=planet)
# orbExt.configure()
# newOrb = orbExt.extendOrbit(tempOrbit)
# tempOrbit.createOrbit() # 构建轨道模型
# newOrb=tempOrbit.getTimeOrbits(self.frame.sensingStart.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# self.frame.sensingStop.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# orbitnum=500)
# for svect in newOrb:
# sv= StateVector()
# sv.setTime(svect.UTCTime)
# sv.setPosition([svect.px,svect.py,svect.pz])
# sv.setVelocity([svect.vx,svect.vy,svect.vz])
# self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
for i, value in zip(range(len(statepoints)), statepoints):
sv= StateVector()
sv.setTime(datetime.datetime.fromtimestamp(t[i]))
sv.setPosition([value[0],value[1],value[2]])
sv.setVelocity([value[3],value[4],value[5]])
self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
# print("插值后的gps点", datetime.datetime.fromtimestamp(t[i]),value[0],value[1],value[2],value[3],value[4],value[5])
print('Orbits list len is %d' %num)
# tempOrbit.createOrbit() # 构建轨道模型
# newOrb=tempOrbit.getTimeOrbits(self.frame.sensingStart.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# self.frame.sensingStop.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# orbitnum=500)
# for svect in newOrb:
# sv= StateVector()
# sv.setTime(svect.UTCTime)
# sv.setPosition([svect.px,svect.py,svect.pz])
# sv.setVelocity([svect.vx,svect.vy,svect.vz])
# self.frame.getOrbit().addStateVector(sv)
print('Successfully read state vectors from product XML')
def extractPreciseOrbit(self, orbitfile, tstart, tend):
@ -877,7 +849,7 @@ class GF3_SLC(Sensor):
lgth = self.frame.getNumberOfLines()
# lineFlip = (self.product.imageAttributes.rasterAttributes.lineTimeOrdering.upper() == 'DECREASING')
# pixFlip = (self.product.imageAttributes.rasterAttributes.pixelTimeOrdering.upper() == 'DECREASING')
lineFlip = True
lineFlip = False
pixFlip = False
src = gdal.Open(self.tiff.strip(), gdal.GA_ReadOnly)
@ -888,7 +860,7 @@ class GF3_SLC(Sensor):
imag = src.GetRasterBand(2).ReadAsArray(0,0,width,lgth)
if (real is None) or (imag is None):
raise Exception('Input GF3 SLC seems to not be a 2 band Int16 image.')
raise Exception('Input GF3_SLC SLC seems to not be a 2 band Int16 image.')
data = real+cJ*imag
@ -938,7 +910,6 @@ class GF3_SLC(Sensor):
t0 = self.product.processInfo.DopplerParametersReferenceTime
poly = self.product.processInfo.DopplerCentroidCoefficients
fd_mid = 0.0
for kk in range(len(poly)):
fd_mid += poly[kk] * (tMid - t0)**kk
@ -952,10 +923,10 @@ class GF3_SLC(Sensor):
####For roiApp
####More accurate
from isceobj.Util import Poly1D
coeffs = poly
dr = self.frame.getInstrument().getRangePixelSize()
rref = 0.5 * Const.c * t0
# rref = Const.c * t0
r0 = self.frame.getStartingRange()
norm = 0.5*Const.c/dr
@ -963,44 +934,18 @@ class GF3_SLC(Sensor):
for ind, val in enumerate(coeffs):
dcoeffs.append( val / (norm**ind))
poly = Poly1D.Poly1D()
poly.initPoly(order=len(coeffs)-1)
poly.setMean( (rref - r0)/dr - 1.0)
poly.setCoeffs(dcoeffs)
# print("****" * 10)
# print(Const.c)
# print(rref)
# print(dr)
# print(dcoeffs)
# print(r0)
# print("****" * 10)
poly = Poly1D.Poly1D()
poly.initPoly(order=len(coeffs)-1)
poly.setMean( (rref - r0)/dr - 1.0)
poly.setCoeffs(dcoeffs)
print('getNumberOfSamples', self.frame.getNumberOfSamples())
pix = np.linspace(0, self.frame.getNumberOfSamples(), num=len(coeffs)+1)
evals = poly(pix)
fit = np.polyfit(pix,evals, len(coeffs)-1)
self.frame._dopplerVsPixel = list(fit[::-1])
# print("---- radar ------------------------------------------print")
# print("t0",t0)
# print("****" * 10)
# print('lightspeed',Const.c)
# print('rref',rref)
# print('dr',dr)
# print('dcoeff',dcoeffs)
# print('r0',r0)
# print("****" * 10)
# print('pix',pix)
# print('evals',evals)
# print('fit',fit)
# print('Doppler Fit: ', fit[::-1])
# print('---------------------------------------------------')
return quadratic

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="AtmosphericDelayMain" processorArchitecture="amd64" version="1.0.0.0"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" language="*" processorArchitecture="*" version="6.0.0.0" publicKeyToken="6595b64144ccf1df"/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
</assembly>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,249 +0,0 @@
('D:\\Anaconda\\envs\\micro\\tcl\\tk8.6',
'tk',
['demos', '*.lib', 'tkConfig.sh'],
'DATA',
[('tk\\bgerror.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\bgerror.tcl',
'DATA'),
('tk\\button.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\button.tcl',
'DATA'),
('tk\\choosedir.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\choosedir.tcl',
'DATA'),
('tk\\clrpick.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\clrpick.tcl',
'DATA'),
('tk\\comdlg.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\comdlg.tcl',
'DATA'),
('tk\\console.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\console.tcl',
'DATA'),
('tk\\dialog.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\dialog.tcl',
'DATA'),
('tk\\entry.tcl', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\entry.tcl', 'DATA'),
('tk\\focus.tcl', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\focus.tcl', 'DATA'),
('tk\\fontchooser.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\fontchooser.tcl',
'DATA'),
('tk\\iconlist.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\iconlist.tcl',
'DATA'),
('tk\\icons.tcl', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\icons.tcl', 'DATA'),
('tk\\license.terms',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\license.terms',
'DATA'),
('tk\\listbox.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\listbox.tcl',
'DATA'),
('tk\\megawidget.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\megawidget.tcl',
'DATA'),
('tk\\menu.tcl', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\menu.tcl', 'DATA'),
('tk\\mkpsenc.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\mkpsenc.tcl',
'DATA'),
('tk\\msgbox.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgbox.tcl',
'DATA'),
('tk\\obsolete.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\obsolete.tcl',
'DATA'),
('tk\\optMenu.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\optMenu.tcl',
'DATA'),
('tk\\palette.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\palette.tcl',
'DATA'),
('tk\\panedwindow.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\panedwindow.tcl',
'DATA'),
('tk\\pkgIndex.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\pkgIndex.tcl',
'DATA'),
('tk\\safetk.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\safetk.tcl',
'DATA'),
('tk\\scale.tcl', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\scale.tcl', 'DATA'),
('tk\\scrlbar.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\scrlbar.tcl',
'DATA'),
('tk\\spinbox.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\spinbox.tcl',
'DATA'),
('tk\\tclIndex', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\tclIndex', 'DATA'),
('tk\\tearoff.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\tearoff.tcl',
'DATA'),
('tk\\text.tcl', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\text.tcl', 'DATA'),
('tk\\tk.tcl', 'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\tk.tcl', 'DATA'),
('tk\\tkfbox.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\tkfbox.tcl',
'DATA'),
('tk\\unsupported.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\unsupported.tcl',
'DATA'),
('tk\\xmfbox.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\xmfbox.tcl',
'DATA'),
('tk\\ttk\\altTheme.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\altTheme.tcl',
'DATA'),
('tk\\ttk\\aquaTheme.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\aquaTheme.tcl',
'DATA'),
('tk\\ttk\\button.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\button.tcl',
'DATA'),
('tk\\ttk\\clamTheme.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\clamTheme.tcl',
'DATA'),
('tk\\ttk\\classicTheme.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\classicTheme.tcl',
'DATA'),
('tk\\ttk\\combobox.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\combobox.tcl',
'DATA'),
('tk\\ttk\\cursors.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\cursors.tcl',
'DATA'),
('tk\\ttk\\defaults.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\defaults.tcl',
'DATA'),
('tk\\ttk\\entry.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\entry.tcl',
'DATA'),
('tk\\ttk\\fonts.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\fonts.tcl',
'DATA'),
('tk\\ttk\\menubutton.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\menubutton.tcl',
'DATA'),
('tk\\ttk\\notebook.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\notebook.tcl',
'DATA'),
('tk\\ttk\\panedwindow.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\panedwindow.tcl',
'DATA'),
('tk\\ttk\\progress.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\progress.tcl',
'DATA'),
('tk\\ttk\\scale.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\scale.tcl',
'DATA'),
('tk\\ttk\\scrollbar.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\scrollbar.tcl',
'DATA'),
('tk\\ttk\\sizegrip.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\sizegrip.tcl',
'DATA'),
('tk\\ttk\\spinbox.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\spinbox.tcl',
'DATA'),
('tk\\ttk\\treeview.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\treeview.tcl',
'DATA'),
('tk\\ttk\\ttk.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\ttk.tcl',
'DATA'),
('tk\\ttk\\utils.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\utils.tcl',
'DATA'),
('tk\\ttk\\vistaTheme.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\vistaTheme.tcl',
'DATA'),
('tk\\ttk\\winTheme.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\winTheme.tcl',
'DATA'),
('tk\\ttk\\xpTheme.tcl',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\ttk\\xpTheme.tcl',
'DATA'),
('tk\\msgs\\cs.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\cs.msg',
'DATA'),
('tk\\msgs\\da.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\da.msg',
'DATA'),
('tk\\msgs\\de.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\de.msg',
'DATA'),
('tk\\msgs\\el.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\el.msg',
'DATA'),
('tk\\msgs\\en.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\en.msg',
'DATA'),
('tk\\msgs\\en_gb.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\en_gb.msg',
'DATA'),
('tk\\msgs\\eo.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\eo.msg',
'DATA'),
('tk\\msgs\\es.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\es.msg',
'DATA'),
('tk\\msgs\\fr.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\fr.msg',
'DATA'),
('tk\\msgs\\hu.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\hu.msg',
'DATA'),
('tk\\msgs\\it.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\it.msg',
'DATA'),
('tk\\msgs\\nl.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\nl.msg',
'DATA'),
('tk\\msgs\\pl.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\pl.msg',
'DATA'),
('tk\\msgs\\pt.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\pt.msg',
'DATA'),
('tk\\msgs\\ru.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\ru.msg',
'DATA'),
('tk\\msgs\\sv.msg',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\msgs\\sv.msg',
'DATA'),
('tk\\images\\logo.eps',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\logo.eps',
'DATA'),
('tk\\images\\logo100.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\logo100.gif',
'DATA'),
('tk\\images\\logo64.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\logo64.gif',
'DATA'),
('tk\\images\\logoLarge.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\logoLarge.gif',
'DATA'),
('tk\\images\\logoMed.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\logoMed.gif',
'DATA'),
('tk\\images\\pwrdLogo.eps',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\pwrdLogo.eps',
'DATA'),
('tk\\images\\pwrdLogo100.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\pwrdLogo100.gif',
'DATA'),
('tk\\images\\pwrdLogo150.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\pwrdLogo150.gif',
'DATA'),
('tk\\images\\pwrdLogo175.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\pwrdLogo175.gif',
'DATA'),
('tk\\images\\pwrdLogo200.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\pwrdLogo200.gif',
'DATA'),
('tk\\images\\pwrdLogo75.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\pwrdLogo75.gif',
'DATA'),
('tk\\images\\README',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\README',
'DATA'),
('tk\\images\\tai-ku.gif',
'D:\\Anaconda\\envs\\micro\\tcl\\tk8.6\\images\\tai-ku.gif',
'DATA')])

View File

@ -1,19 +0,0 @@
('D:\\Anaconda\\envs\\micro\\tcl\\tcl8.6\\..\\tcl8',
'tcl8',
[],
'DATA',
[('tcl8\\8.6\\http-2.9.0.tm',
'D:\\Anaconda\\envs\\micro\\tcl\\tcl8.6\\..\\tcl8\\8.6\\http-2.9.0.tm',
'DATA'),
('tcl8\\8.5\\msgcat-1.6.1.tm',
'D:\\Anaconda\\envs\\micro\\tcl\\tcl8.6\\..\\tcl8\\8.5\\msgcat-1.6.1.tm',
'DATA'),
('tcl8\\8.5\\tcltest-2.5.0.tm',
'D:\\Anaconda\\envs\\micro\\tcl\\tcl8.6\\..\\tcl8\\8.5\\tcltest-2.5.0.tm',
'DATA'),
('tcl8\\8.4\\platform-1.0.14.tm',
'D:\\Anaconda\\envs\\micro\\tcl\\tcl8.6\\..\\tcl8\\8.4\\platform-1.0.14.tm',
'DATA'),
('tcl8\\8.4\\platform\\shell-1.1.4.tm',
'D:\\Anaconda\\envs\\micro\\tcl\\tcl8.6\\..\\tcl8\\8.4\\platform\\shell-1.1.4.tm',
'DATA')])

View File

@ -1,620 +0,0 @@
This file lists modules PyInstaller was not able to find. This does not
necessarily mean this module is required for running you program. Python and
Python 3rd-party packages include a lot of conditional or optional modules. For
example the module 'ntpath' only exists on Windows, whereas the module
'posixpath' only exists on Posix systems.
Types if import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported from within a function
* optional: imported within a try-except-statement
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
yourself tracking down the missing module. Thanks!
missing module named 'org.python' - imported by copy (optional), xml.sax (delayed, conditional), setuptools.sandbox (conditional)
missing module named 'win32com.gen_py' - imported by win32com (conditional, optional), D:\ANACONDA\envs\micro\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_win32comgenpy.py (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level), PyInstaller.loader.pyimod02_archive (delayed)
missing module named grp - imported by shutil (optional), tarfile (optional), pathlib (delayed), distutils.archive_util (optional)
missing module named pwd - imported by posixpath (delayed, conditional), shutil (optional), tarfile (optional), pathlib (delayed, conditional, optional), http.server (delayed, optional), webbrowser (delayed), netrc (delayed, conditional), getpass (delayed), distutils.util (delayed, conditional, optional), distutils.archive_util (optional), psutil (optional)
missing module named urllib.urlretrieve - imported by urllib (conditional, optional), pygments.lexers._php_builtins (conditional, optional)
missing module named urllib.FancyURLopener - imported by urllib (conditional, optional), pygments.lexers._sourcemod_builtins (conditional, optional)
missing module named urllib.urlopen - imported by urllib (delayed, optional), lxml.html (delayed, optional), pygments.lexers._postgres_builtins (conditional, optional), pygments.lexers._lua_builtins (conditional, optional)
missing module named urllib.getproxies_environment - imported by urllib (conditional), requests.compat (conditional)
missing module named urllib.proxy_bypass_environment - imported by urllib (conditional), requests.compat (conditional)
missing module named urllib.proxy_bypass - imported by urllib (conditional), requests.compat (conditional)
missing module named urllib.getproxies - imported by urllib (conditional), requests.compat (conditional)
missing module named urllib.unquote_plus - imported by urllib (conditional), requests.compat (conditional)
missing module named urllib.quote_plus - imported by urllib (conditional), requests.compat (conditional), prometheus_client.exposition (optional)
missing module named urllib.unquote - imported by urllib (conditional), requests.compat (conditional)
missing module named urllib.quote - imported by urllib (conditional), requests.compat (conditional), send2trash.plat_other (optional)
missing module named urllib.urlencode - imported by urllib (delayed, conditional, optional), IPython.lib.display (delayed, conditional, optional), requests.compat (conditional), lxml.html (delayed, optional)
missing module named urllib.pathname2url - imported by urllib (conditional), PyInstaller.lib.modulegraph._compat (conditional)
missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional)
missing module named resource - imported by posix (top-level), test.support (optional), psutil._pslinux (optional), IPython.utils.timing (optional), notebook.notebookapp (optional), prometheus_client.process_collector (optional), distributed.utils (optional), distributed.system (delayed, optional), fsspec.asyn (optional)
missing module named _posixsubprocess - imported by subprocess (optional), multiprocessing.util (delayed)
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named fcntl - imported by xmlrpc.server (optional), psutil._compat (delayed, optional), zmq.eventloop.minitornado.platform.posix (top-level), distributed.locket (optional), locket (optional), fasteners.process_lock (conditional)
missing module named termios - imported by tty (top-level), getpass (optional), psutil._compat (delayed, optional), prompt_toolkit.input.vt100 (top-level), IPython.core.page (delayed, optional), click._termui_impl (conditional)
missing module named vms_lib - imported by platform (delayed, conditional, optional)
missing module named 'java.lang' - imported by platform (delayed, optional), xml.sax._exceptions (conditional)
missing module named java - imported by platform (delayed)
missing module named _winreg - imported by platform (delayed, optional), requests.utils (delayed, conditional, optional), nbconvert.preprocessors.svg2pdf (conditional, optional), qtpy.py3compat (conditional, optional), pkg_resources._vendor.appdirs (delayed, conditional), pygments.formatters.img (optional)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.Pool - imported by multiprocessing (delayed, conditional), scipy._lib._util (delayed, conditional)
missing module named multiprocessing.Process - imported by multiprocessing (top-level), jupyter_client.ssh.tunnel (top-level), partd.zmq (top-level)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named console - imported by pyreadline.console.ansi (conditional)
missing module named startup - imported by pyreadline.keysyms.common (conditional), pyreadline.keysyms.keysyms (conditional)
missing module named sets - imported by pyreadline.keysyms.common (optional), pytz.tzinfo (optional)
missing module named System - imported by pyreadline.clipboard.ironpython_clipboard (top-level), pyreadline.keysyms.ironpython_keysyms (top-level), pyreadline.console.ironpython_console (top-level), pyreadline.rlmain (conditional), IPython.utils._process_cli (top-level)
missing module named StringIO - imported by pyreadline.py3k_compat (conditional), PyInstaller.lib.modulegraph._compat (conditional), PyInstaller.lib.modulegraph.zipio (conditional), urllib3.packages.six (conditional), requests.compat (conditional), six (conditional), qtpy.py3compat (conditional, optional), Cython.Compiler.Annotate (optional), partd.compatibility (conditional), xmltodict (optional)
missing module named IronPythonConsole - imported by pyreadline.console.ironpython_console (top-level)
missing module named clr - imported by pyreadline.clipboard.ironpython_clipboard (top-level), pyreadline.console.ironpython_console (top-level), IPython.utils._process_cli (top-level)
missing module named org - imported by pickle (optional)
missing module named pyimod03_importers - imported by D:\ANACONDA\envs\micro\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (top-level), D:\ANACONDA\envs\micro\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (top-level)
missing module named _manylinux - imported by pkg_resources._vendor.packaging.tags (delayed, optional), packaging._manylinux (delayed, optional), setuptools._vendor.packaging.tags (delayed, optional)
missing module named tputil - imported by jinja2.debug (conditional, optional)
missing module named railroad - imported by pyparsing.diagram (top-level)
missing module named _uuid - imported by uuid (optional)
missing module named __builtin__ - imported by osgeo.gdal (optional), osgeo.gdalconst (optional), osgeo.ogr (optional), osgeo.osr (optional), osgeo.gdal_array (optional), ipython_genutils.py3compat (conditional), debugpy.common.compat (conditional), qtpy.py3compat (conditional), Cython.Shadow (optional), Cython.Utils (optional), Cython.Compiler.Main (optional), Cython.Compiler.Errors (optional), Cython.Compiler.Symtab (optional), Cython.Compiler.Code (optional), Cython.Compiler.Optimize (optional), Cython.Compiler.ExprNodes (optional), Cython.Distutils.old_build_ext (optional), Cython.Build.Inline (delayed, optional), pkg_resources._vendor.pyparsing (conditional), setuptools._vendor.pyparsing (conditional)
missing module named ordereddict - imported by pkg_resources._vendor.pyparsing (optional), setuptools._vendor.pyparsing (optional)
missing module named 'pkg_resources.extern.pyparsing' - imported by pkg_resources._vendor.packaging.markers (top-level), pkg_resources._vendor.packaging.requirements (top-level)
missing module named 'com.sun' - imported by pkg_resources._vendor.appdirs (delayed, conditional, optional)
missing module named com - imported by pkg_resources._vendor.appdirs (delayed)
missing module named pkg_resources.extern.packaging - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
missing module named pkg_resources.extern.appdirs - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
missing module named cStringIO - imported by cPickle (top-level), cffi.ffiplatform (optional), Cython.StringIOTree (optional), xmltodict (optional)
missing module named copy_reg - imported by cPickle (top-level), cStringIO (top-level), tblib.pickling_support (conditional)
missing module named defusedexpat - imported by xmltodict (optional)
missing module named IPython.TryNext - imported by IPython (optional), h5py.ipy_completer (optional)
missing module named IPython.generics - imported by IPython (optional), h5py.ipy_completer (optional)
missing module named IPython.ipapi - imported by IPython (delayed, conditional, optional), h5py (delayed, conditional, optional), h5py.ipy_completer (optional)
missing module named 'IPython.kernel.zmq' - imported by IPython (delayed)
missing module named traitlets.config.Application - imported by traitlets.config (delayed, conditional), traitlets.log (delayed, conditional), ipykernel.kernelspec (top-level), notebook.base.handlers (top-level)
missing module named IPython.utils.warn - imported by IPython.utils (delayed), IPython.testing.tools (delayed)
missing module named _curses - imported by curses (top-level), curses.has_key (top-level)
missing module named 'tornado.platform.select' - imported by zmq.eventloop.minitornado.ioloop (delayed)
missing module named 'tornado.platform.kqueue' - imported by zmq.eventloop.minitornado.ioloop (delayed, conditional)
missing module named 'tornado.platform.epoll' - imported by zmq.eventloop.minitornado.ioloop (delayed, conditional)
missing module named monotime - imported by zmq.eventloop.minitornado.platform.auto (optional)
missing module named thread - imported by cffi.lock (conditional, optional), cffi.cparser (conditional, optional), zmq.eventloop.minitornado.ioloop (optional), qtpy.py3compat (conditional), sortedcontainers.sortedlist (conditional, optional)
missing module named 'tornado.stack_context' - imported by zmq.eventloop.zmqstream (optional)
missing module named zmq.ETERM - imported by zmq (delayed), zmq.error (delayed, conditional), zmq.eventloop._deprecated (top-level)
missing module named zmq.ZMQError - imported by zmq (delayed, optional), zmq.sugar.attrsettr (delayed, optional), zmq.eventloop._deprecated (top-level)
missing module named 'gi.repository' - imported by ipykernel.gui.gtk3embed (top-level), send2trash.plat_gio (top-level)
missing module named gi - imported by matplotlib.cbook (delayed, conditional), ipykernel.gui.gtk3embed (top-level)
missing module named gtk - imported by ipykernel.gui.gtkembed (top-level)
missing module named gobject - imported by ipykernel.gui.gtkembed (top-level)
missing module named wx - imported by IPython.lib.guisupport (delayed), ipykernel.eventloops (delayed)
missing module named PySide6 - imported by IPython.external.qt_loaders (delayed)
missing module named PySide2 - imported by IPython.external.qt_loaders (delayed), qtpy (conditional, optional)
missing module named PyQt6 - imported by IPython.external.qt_loaders (delayed)
missing module named sip - imported by IPython.external.qt_loaders (delayed, optional), qtpy (conditional, optional)
missing module named ipyparallel - imported by ipykernel.zmqshell (delayed, conditional)
missing module named pexpect - imported by IPython.utils._process_posix (top-level), jupyter_client.ssh.tunnel (optional)
missing module named pygments.formatters.HtmlFormatter - imported by pygments.formatters (delayed), IPython.lib.display (delayed), nbconvert.filters.highlight (delayed), nbconvert.filters.markdown_mistune (top-level), nbconvert.preprocessors.csshtmlheader (delayed), IPython.core.oinspect (top-level), Cython.Compiler.Annotate (delayed, optional)
missing module named pygments.formatters.LatexFormatter - imported by pygments.formatters (delayed), IPython.lib.display (delayed), nbconvert.filters.highlight (delayed), nbconvert.preprocessors.latex (delayed)
missing module named pygments.lexers.PythonLexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level), IPython.core.oinspect (top-level)
missing module named pygments.lexers.CythonLexer - imported by pygments.lexers (delayed, optional), Cython.Compiler.Annotate (delayed, optional)
missing module named pygments.lexers.TexLexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level)
missing module named pygments.lexers.Python3Lexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level)
missing module named pygments.lexers.PerlLexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level)
missing module named pygments.lexers.RubyLexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level)
missing module named pygments.lexers.JavascriptLexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level)
missing module named pygments.lexers.HtmlLexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level)
missing module named pygments.lexers.BashLexer - imported by pygments.lexers (top-level), IPython.lib.lexers (top-level)
missing module named chardet - imported by requests.compat (optional), requests (optional), requests.packages (optional), pygments.lexer (delayed, conditional, optional)
missing module named ctags - imported by pygments.formatters.html (optional)
missing module named PIL._imagingagg - imported by PIL (delayed, conditional, optional), PIL.ImageDraw (delayed, conditional, optional)
missing module named trio - imported by ipykernel.trio_runner (top-level), IPython.core.async_helpers (delayed)
missing module named repr - imported by IPython.core.debugger (delayed, optional), qtpy.py3compat (conditional)
missing module named _subprocess - imported by jupyter_client.launcher (delayed, conditional, optional), ipykernel.parentpoller (delayed, optional)
missing module named netifaces - imported by jupyter_client.localinterfaces (delayed)
missing module named jupyter_client.write_connection_file - imported by jupyter_client (top-level), ipykernel.connect (top-level), ipykernel.kernelapp (top-level), distributed._ipython_utils (top-level)
missing module named numpy.frombuffer - imported by numpy (delayed), ipykernel.pickleutil (delayed), numpy.ctypeslib (top-level), scipy.misc.common (top-level), scipy.io.netcdf (top-level)
missing module named numpy.ascontiguousarray - imported by numpy (delayed), ipykernel.pickleutil (delayed)
missing module named pickle5 - imported by numpy.compat.py3k (optional), cloudpickle.compat (conditional, optional), distributed.protocol.pickle (conditional, optional), distributed.scheduler (conditional, optional)
missing module named dill - imported by ipykernel.pickleutil (delayed)
missing module named 'ipyparallel.serialize' - imported by ipykernel.serialize (optional), ipykernel.pickleutil (top-level)
missing module named ipykernel.connect_qtconsole - imported by ipykernel (top-level), ipykernel.zmqshell (top-level)
missing module named ipykernel.get_connection_info - imported by ipykernel (top-level), ipykernel.zmqshell (top-level)
missing module named ipykernel.get_connection_file - imported by ipykernel (top-level), ipykernel.zmqshell (top-level)
missing module named appnope - imported by ipykernel.ipkernel (delayed, conditional)
missing module named '_pydevd_bundle.pydevd_api' - imported by ipykernel.debugger (delayed)
missing module named '_pydevd_bundle.pydevd_suspended_frames' - imported by ipykernel.debugger (top-level)
missing module named _pydevd_bundle - imported by debugpy._vendored.force_pydevd (top-level), ipykernel.debugger (top-level)
missing module named pydevd_file_utils - imported by debugpy.server.api (top-level)
missing module named '_pydevd_bundle.pydevd_constants' - imported by debugpy.server.api (top-level)
missing module named Queue - imported by urllib3.util.queue (conditional), debugpy.common.compat (conditional), partd.compatibility (conditional)
missing module named pydevd - imported by debugpy._vendored.force_pydevd (top-level), debugpy.server.api (top-level)
missing module named six.moves.range - imported by six.moves (top-level), dateutil.rrule (top-level)
runtime module named six.moves - imported by dateutil.tz.tz (top-level), dateutil.tz._factories (top-level), dateutil.tz.win (top-level), dateutil.rrule (top-level), h5py._hl.selections (top-level), h5py._hl.dataset (top-level)
missing module named six.moves.xrange - imported by six.moves (top-level), h5py._hl.selections (top-level), h5py._hl.dataset (top-level)
missing module named dateutil.tz.tzfile - imported by dateutil.tz (top-level), dateutil.zoneinfo (top-level)
missing module named backports.lzma - imported by backports (optional), numcodecs.lzma (optional)
missing module named gevent - imported by zmq.green.poll (top-level), zmq.green.core (top-level)
missing module named 'gevent.core' - imported by zmq.green.core (delayed, optional)
missing module named 'gevent.hub' - imported by zmq.green.core (top-level)
missing module named 'gevent.event' - imported by zmq.green.core (top-level)
missing module named zmq.EVENTS - imported by zmq (top-level), zmq._future (top-level)
missing module named zmq.backend.zmq_errno - imported by zmq.backend (delayed), zmq.error (delayed, conditional)
missing module named zmq.backend.strerror - imported by zmq.backend (delayed), zmq.error (delayed)
missing module named zmq.backend.zmq_version_info - imported by zmq.backend (top-level), zmq.sugar.version (top-level)
missing module named zmq.backend.Frame - imported by zmq.backend (top-level), zmq.sugar.frame (top-level), zmq.sugar.tracker (top-level)
missing module named zmq.backend.Socket - imported by zmq.backend (top-level), zmq.sugar.socket (top-level)
missing module named zmq.backend.zmq_poll - imported by zmq.backend (top-level), zmq.sugar.poll (top-level)
missing module named pyczmq - imported by zmq.sugar.context (delayed)
missing module named zmq.backend.Context - imported by zmq.backend (top-level), zmq.sugar.context (top-level)
missing module named zmq.backend.has - imported by zmq.backend (top-level), zmq.sugar.constants (top-level)
missing module named zmq.backend.constants - imported by zmq.backend (top-level), zmq.sugar.constants (top-level)
missing module named zmq.zmq_version_info - imported by zmq (delayed, conditional), zmq.error (delayed, conditional)
missing module named zmq.zmq_version - imported by zmq (delayed, conditional), zmq.error (delayed, conditional)
missing module named zmq.EAGAIN - imported by zmq (delayed), zmq.error (delayed, conditional)
missing module named zmq.libzmq - imported by zmq (delayed, optional)
missing module named paramiko - imported by jupyter_client.ssh.tunnel (optional), distributed.deploy.old_ssh (delayed)
missing module named async_generator - imported by nbclient.client (optional)
missing module named pysqlite2 - imported by IPython.core.history (optional), nbformat.sign (optional), notebook.services.sessions.sessionmanager (optional)
missing module named fastjsonschema - imported by nbformat.json_compat (optional)
missing module named Cookie - imported by requests.compat (conditional)
missing module named cookielib - imported by requests.compat (conditional)
missing module named urllib2 - imported by requests.compat (conditional), seaborn.miscplot (delayed, optional), prometheus_client.exposition (optional), cartopy.io (conditional), lxml.html.html5parser (optional), lxml.ElementInclude (optional)
missing module named urlparse - imported by requests.compat (conditional), lxml.html (optional), prometheus_client.exposition (optional), terminado.websocket (optional), lxml.html.html5parser (optional), lxml.ElementInclude (optional)
missing module named simplejson - imported by osgeo.ogr (delayed, optional), requests.compat (conditional, optional)
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional), fontTools.ttLib.woff2 (optional)
missing module named "'urllib3.packages.six.moves.urllib'.parse" - imported by urllib3.request (top-level), urllib3.poolmanager (top-level)
runtime module named urllib3.packages.six.moves - imported by http.client (top-level), urllib3.util.response (top-level), urllib3.connectionpool (top-level), 'urllib3.packages.six.moves.urllib' (top-level), urllib3.util.queue (top-level)
missing module named socks - imported by urllib3.contrib.socks (optional)
missing module named _dummy_threading - imported by dummy_threading (optional)
missing module named 'typing.io' - imported by importlib.resources (top-level)
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional), distributed.security (delayed, optional)
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed)
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional), distributed.security (delayed, optional)
missing module named 'cryptography.hazmat' - imported by urllib3.contrib.pyopenssl (top-level), distributed.security (delayed, optional)
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
missing module named unicodedata2 - imported by charset_normalizer.utils (optional), fontTools.unicode (delayed, optional)
missing module named UserDict - imported by attr._compat (conditional), pytz.lazy (optional), qtpy.py3compat (conditional)
missing module named isoduration - imported by jsonschema._format (top-level)
missing module named uri_template - imported by jsonschema._format (top-level)
missing module named jsonpointer - imported by jsonschema._format (top-level)
missing module named webcolors - imported by jsonschema._format (top-level)
missing module named rfc3339_validator - imported by jsonschema._format (top-level)
missing module named rfc3986_validator - imported by jsonschema._format (optional)
missing module named rfc3987 - imported by jsonschema._format (optional)
missing module named fqdn - imported by jsonschema._format (top-level)
missing module named SocketServer - imported by prometheus_client.exposition (optional)
missing module named BaseHTTPServer - imported by prometheus_client.exposition (optional)
missing module named json_logging - imported by notebook.notebookapp (delayed, conditional, optional)
missing module named ptyprocess - imported by terminado.management (optional)
missing module named Foundation - imported by pandas.io.clipboard (delayed, conditional, optional), send2trash.plat_osx_pyobjc (top-level)
missing module named xmlrpclib - imported by defusedxml.xmlrpc (conditional)
missing module named 'pyppeteer.util' - imported by nbconvert.exporters.webpdf (delayed, optional)
missing module named pyppeteer - imported by nbconvert.exporters.webpdf (delayed, optional)
missing module named pathlib2 - imported by pickleshare (optional), testpath.asserts (optional)
missing module named _typeshed - imported by prompt_toolkit.eventloop.inputhook (conditional)
missing module named 'backports.functools_lru_cache' - imported by wcwidth.wcwidth (optional)
missing module named black - imported by IPython.terminal.interactiveshell (delayed)
missing module named prompt_toolkit.filters.is_done - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.menus (top-level), prompt_toolkit.widgets.base (top-level), prompt_toolkit.shortcuts.progress_bar.base (top-level), prompt_toolkit.shortcuts.prompt (top-level)
missing module named 'prompt_toolkit.key_binding.key_bindings.vi' - imported by prompt_toolkit.key_binding.vi_state (conditional)
missing module named prompt_toolkit.filters.is_searching - imported by prompt_toolkit.filters (top-level), prompt_toolkit.search (top-level), prompt_toolkit.key_binding.bindings.search (top-level), prompt_toolkit.key_binding.bindings.vi (top-level)
missing module named prompt_toolkit.filters.vi_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.document (top-level), prompt_toolkit.key_binding.bindings.page_navigation (top-level), prompt_toolkit.widgets.toolbars (top-level), IPython.terminal.shortcuts (top-level)
missing module named prompt_toolkit.filters.has_completions - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.menus (top-level), prompt_toolkit.widgets.toolbars (top-level), prompt_toolkit.widgets.dialogs (top-level), IPython.terminal.shortcuts (top-level)
missing module named prompt_toolkit.filters.emacs_insert_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.containers (top-level), prompt_toolkit.key_binding.bindings.basic (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level), IPython.terminal.shortcuts (top-level), IPython.terminal.debugger (top-level)
missing module named prompt_toolkit.filters.vi_insert_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.containers (top-level), prompt_toolkit.key_binding.bindings.basic (top-level), IPython.terminal.shortcuts (top-level), IPython.terminal.debugger (top-level)
missing module named prompt_toolkit.filters.vi_insert_multiple_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.processors (top-level)
missing module named numpy.testing.knownfailureif - imported by numpy.testing (optional), IPython.external.decorators (optional)
missing module named numpy.testing.KnownFailure - imported by numpy.testing (optional), IPython.external.decorators (optional)
missing module named 'nose.plugins' - imported by IPython.testing.iptest (top-level), IPython.testing.plugin.ipdoctest (top-level), numpy.testing._private.noseclasses (top-level), numpy.testing._private.nosetester (delayed), IPython.external.decorators._numpy_testing_noseclasses (top-level)
missing module named numpy.array - imported by numpy (top-level), numpy.ma.core (top-level), numpy.ma.extras (top-level), numpy.ma.mrecords (top-level), numpy.ctypeslib (top-level), scipy.linalg.decomp (top-level), scipy.linalg.decomp_schur (top-level), scipy.sparse.linalg.isolve.utils (top-level), scipy.interpolate.interpolate (top-level), scipy.interpolate._fitpack_impl (top-level), scipy.interpolate.fitpack2 (top-level), scipy.optimize.lbfgsb (top-level), scipy.optimize.tnc (top-level), scipy.optimize.slsqp (top-level), scipy.stats.stats (top-level), scipy.integrate._ode (top-level), scipy.misc.common (top-level), scipy.stats.morestats (top-level), numexpr.tests.test_numexpr (top-level), scipy.io.netcdf (top-level)
missing module named numpy.recarray - imported by numpy (top-level), numpy.ma.mrecords (top-level)
missing module named numpy.ndarray - imported by numpy (top-level), numpy.ma.core (top-level), numpy.ma.extras (top-level), IPython.core.magics.namespace (delayed, conditional, optional), numpy.ma.mrecords (top-level), numpy.ctypeslib (top-level), scipy.stats._distn_infrastructure (top-level), scipy.stats.mstats_basic (top-level), scipy.stats.mstats_extras (top-level), numpy.typing._array_like (top-level), pandas.compat.numpy.function (top-level), scipy.io.mmio (top-level), pyresample._compat (optional)
missing module named numpy.dtype - imported by numpy (top-level), numpy.ma.mrecords (top-level), numpy.ctypeslib (top-level), scipy.optimize.minpack (top-level), numpy.typing._dtype_like (top-level), scipy.io.netcdf (top-level)
missing module named numpy.bool_ - imported by numpy (top-level), numpy.ma.core (top-level), numpy.ma.mrecords (top-level)
missing module named numpy.histogramdd - imported by numpy (delayed), numpy.lib.twodim_base (delayed)
missing module named numpy.core.ufunc - imported by numpy.core (top-level), numpy.lib.utils (top-level)
missing module named numpy.core.ones - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.hstack - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.atleast_1d - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.atleast_3d - imported by numpy.core (top-level), numpy.lib.shape_base (top-level)
missing module named numpy.core.vstack - imported by numpy.core (top-level), numpy.lib.shape_base (top-level)
missing module named numpy.core.linspace - imported by numpy.core (top-level), numpy.lib.index_tricks (top-level)
missing module named numpy.core.transpose - imported by numpy.core (top-level), numpy.lib.function_base (top-level)
missing module named numpy.core.roll - imported by numpy.core (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.integer - imported by numpy.core (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.take - imported by numpy.core (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.conjugate - imported by numpy.core (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.result_type - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.float_ - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.number - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.bool_ - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.inf - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.array2string - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.signbit - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.isscalar - imported by numpy.core (delayed), numpy.testing._private.utils (delayed), numpy.lib.polynomial (top-level)
missing module named numpy.core.isinf - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.isnat - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.ndarray - imported by numpy.core (top-level), numpy.testing._private.utils (top-level), numpy.lib.utils (top-level)
missing module named numpy.core.array_repr - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.arange - imported by numpy.core (top-level), numpy.testing._private.utils (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.float32 - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.iinfo - imported by numpy.core (top-level), numpy.lib.twodim_base (top-level)
missing module named numpy.core.sort - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.argsort - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.sign - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.isnan - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.count_nonzero - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.divide - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.swapaxes - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.matmul - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.object_ - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.asanyarray - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.intp - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.atleast_2d - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.product - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.amax - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.amin - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.moveaxis - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.geterrobj - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.errstate - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.finfo - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.isfinite - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.sum - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.fastCopyAndTranspose - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.sqrt - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.multiply - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.add - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.dot - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.Inf - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.all - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.newaxis - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.complexfloating - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.inexact - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.cdouble - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.csingle - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.double - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.single - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.intc - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.empty_like - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.empty - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.zeros - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.asarray - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level), numpy.fft.helper (top-level), numpy.lib.utils (top-level)
missing module named numpy.core.array - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.eye - imported by numpy (delayed), numpy.core.numeric (delayed), scipy.linalg.decomp (top-level), scipy.interpolate._pade (top-level), scipy.optimize.optimize (top-level), scipy.optimize.minpack (top-level)
missing module named 'nose.util' - imported by IPython.testing.iptest (top-level), IPython.testing.plugin.ipdoctest (top-level), numpy.testing._private.noseclasses (top-level)
missing module named psutil._psutil_aix - imported by psutil (top-level), psutil._psaix (top-level)
missing module named psutil._psutil_sunos - imported by psutil (top-level), psutil._pssunos (top-level)
missing module named psutil._psutil_bsd - imported by psutil (top-level), psutil._psbsd (top-level)
missing module named psutil._psutil_osx - imported by psutil (top-level), psutil._psosx (top-level)
missing module named psutil._psutil_linux - imported by psutil (top-level), psutil._pslinux (top-level)
missing module named fontTools.ttLib.getSearchRange - imported by fontTools.ttLib (top-level), fontTools.ttLib.woff2 (top-level), fontTools.ttLib.tables.otConverters (top-level), fontTools.ttLib.tables._c_m_a_p (top-level), fontTools.ttLib.tables._k_e_r_n (top-level), fontTools.ttLib.sfnt (delayed, conditional)
missing module named zopfli - imported by fontTools.ttLib.sfnt (delayed, conditional)
missing module named xattr - imported by fontTools.misc.macCreatorType (optional)
missing module named brotlicffi - imported by fontTools.ttLib.woff2 (optional)
missing module named fontTools.ttLib.getClassTag - imported by fontTools.ttLib (top-level), fontTools.ttLib.tables.DefaultTable (top-level)
missing module named fontTools.ttLib.getTableClass - imported by fontTools.ttLib (top-level), fontTools.ttLib.woff2 (top-level)
missing module named fontTools.ttLib.getTableModule - imported by fontTools.ttLib (top-level), fontTools.ttLib.woff2 (top-level)
missing module named fontTools.ttLib.TTFont - imported by fontTools.ttLib (top-level), fontTools.ttLib.woff2 (top-level), fontTools.cffLib (top-level), fontTools.varLib (top-level), fontTools.varLib.varStore (delayed), fontTools.otlLib.optimize (top-level), fontTools.otlLib.optimize.gpos (top-level), fontTools.ttx (top-level), fontTools.colorLib.unbuilder (conditional)
missing module named __pypy__ - imported by tblib (optional), msgpack.fallback (conditional), fontTools.misc.etree (optional)
missing module named 'html5lib.treebuilders' - imported by lxml.html.html5parser (top-level), lxml.html._html5builder (top-level)
missing module named cssselect - imported by lxml.cssselect (optional)
missing module named html5lib - imported by lxml.html.html5parser (top-level)
missing module named htmlentitydefs - imported by lxml.html.soupparser (optional)
missing module named BeautifulSoup - imported by lxml.html.soupparser (optional)
missing module named bs4 - imported by pandas.io.html (delayed), lxml.html.soupparser (optional)
missing module named UserList - imported by fontTools.ttLib.tables.otConverters (optional)
missing module named fontTools.ttLib.newTable - imported by fontTools.ttLib (top-level), fontTools.ttLib.tables._n_a_m_e (top-level), fontTools.varLib (top-level), fontTools.varLib.featureVars (top-level), fontTools.varLib.cff (top-level)
missing module named 'lz4.block' - imported by distributed.protocol.compression (optional), fontTools.ttLib.tables.grUtils (optional)
missing module named lz4 - imported by distributed.protocol.compression (top-level), fontTools.ttLib.tables.grUtils (optional)
missing module named 'IPython.kernel.comm' - imported by matplotlib.backends.backend_nbagg (optional)
missing module named matplotlib.axes.Axes - imported by matplotlib.axes (delayed), matplotlib.legend (delayed), matplotlib.projections.geo (top-level), matplotlib.projections.polar (top-level), mpl_toolkits.mplot3d.axes3d (top-level), matplotlib.figure (top-level), matplotlib.pyplot (top-level), pandas.plotting._matplotlib.timeseries (conditional), pandas.plotting._matplotlib.tools (conditional), pandas.plotting._matplotlib.core (conditional), pandas.plotting._matplotlib.boxplot (conditional), pandas.plotting._matplotlib.hist (conditional), pandas.plotting._matplotlib.misc (conditional)
missing module named matplotlib.tri.Triangulation - imported by matplotlib.tri (top-level), matplotlib.tri.trifinder (top-level), matplotlib.tri.tritools (top-level), matplotlib.tri.triinterpolate (top-level)
missing module named numpy.expand_dims - imported by numpy (top-level), numpy.ma.core (top-level)
missing module named numpy.iscomplexobj - imported by numpy (top-level), numpy.ma.core (top-level), scipy.linalg.decomp (top-level), scipy.linalg._decomp_ldl (top-level), scipy.fftpack.pseudo_diffs (top-level)
missing module named numpy.amin - imported by numpy (top-level), numpy.ma.core (top-level), scipy.stats.morestats (top-level)
missing module named numpy.amax - imported by numpy (top-level), numpy.ma.core (top-level), scipy.linalg.matfuncs (top-level), scipy.stats.morestats (top-level)
missing module named pytest - imported by scipy._lib._testutils (delayed), matplotlib (delayed, optional), pandas._testing._io (delayed), pandas._testing (delayed), pandas.util._tester (delayed, optional), bottleneck._pytesttester (delayed), h5py.tests (delayed, optional)
missing module named setuptools_scm - imported by matplotlib (delayed, conditional)
missing module named numpydoc - imported by jedi.inference.docstrings (delayed)
missing module named 'coverage.html' - imported by IPython.testing.iptestcontroller (delayed, conditional)
missing module named coverage - imported by IPython.testing.iptestcontroller (delayed, conditional)
missing module named 'nose.core' - imported by IPython.testing.iptest (top-level)
missing module named nose - imported by IPython.testing.iptest (top-level), IPython.external.decorators._decorators (delayed), IPython.testing.decorators (delayed)
missing module named 'nose.tools' - imported by IPython.testing.tools (delayed, optional), IPython.testing.decorators (delayed)
missing module named curio - imported by IPython.core.async_helpers (delayed)
missing module named docrepr - imported by IPython.core.interactiveshell (optional)
missing module named cPickle - imported by pycparser.ply.yacc (delayed, optional), pickleshare (optional), qtpy.py3compat (conditional, optional), partd.compatibility (conditional)
missing module named 'PySide2.QtGui' - imported by PIL.ImageQt (conditional, optional), qtpy.QtGui (conditional), qtpy.QtCore (conditional, optional)
missing module named 'PyQt5.QtGui' - imported by PIL.ImageQt (conditional, optional), qtpy.QtGui (conditional)
missing module named 'PySide6.QtGui' - imported by PIL.ImageQt (conditional, optional)
missing module named 'PyQt6.QtGui' - imported by PIL.ImageQt (conditional, optional)
missing module named dummy_thread - imported by cffi.lock (conditional, optional), sortedcontainers.sortedlist (conditional, optional)
missing module named 'setuptools.extern.pyparsing' - imported by setuptools._vendor.packaging.markers (top-level), setuptools._vendor.packaging.requirements (top-level)
missing module named 'setuptools.extern.packaging.version' - imported by setuptools.config (top-level), setuptools.msvc (top-level)
missing module named 'setuptools.extern.packaging.utils' - imported by setuptools.wheel (top-level)
missing module named 'setuptools.extern.packaging.tags' - imported by setuptools.wheel (top-level)
missing module named 'setuptools.extern.packaging.specifiers' - imported by setuptools.config (top-level)
missing module named setuptools.extern.ordered_set - imported by setuptools.extern (top-level), setuptools.dist (top-level), setuptools.command.sdist (top-level)
missing module named setuptools.extern.packaging - imported by setuptools.extern (top-level), setuptools.dist (top-level), setuptools.command.egg_info (top-level)
missing module named 'backports.ssl_match_hostname' - imported by setuptools.ssl_support (optional)
missing module named cffi._pycparser - imported by cffi (optional), cffi.cparser (optional)
missing module named netCDF4.Dataset - imported by netCDF4 (delayed), netCDF4.utils (delayed)
missing module named numpy.arctanh - imported by numpy (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.arccosh - imported by numpy (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.arcsinh - imported by numpy (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.arctan - imported by numpy (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.tan - imported by numpy (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.fmod - imported by numpy (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.uint16 - imported by numpy (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.power - imported by numpy (top-level), scipy.stats.kde (top-level)
missing module named numpy.hypot - imported by numpy (top-level), scipy.stats.morestats (top-level)
missing module named numpy.sinh - imported by numpy (top-level), scipy.stats._discrete_distns (top-level), numexpr.tests.test_numexpr (top-level), scipy.fftpack.pseudo_diffs (top-level)
missing module named numpy.cosh - imported by numpy (top-level), scipy.stats._discrete_distns (top-level), numexpr.tests.test_numexpr (top-level), scipy.fftpack.pseudo_diffs (top-level)
missing module named numpy.tanh - imported by numpy (top-level), scipy.stats._discrete_distns (top-level), numexpr.tests.test_numexpr (top-level), scipy.fftpack.pseudo_diffs (top-level)
missing module named numpy.expm1 - imported by numpy (top-level), scipy.stats._discrete_distns (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.log1p - imported by numpy (top-level), scipy.stats._discrete_distns (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.NINF - imported by numpy (top-level), scipy.stats._distn_infrastructure (top-level)
missing module named numpy.log - imported by numpy (top-level), scipy.stats._distn_infrastructure (top-level), scipy.stats._discrete_distns (top-level), scipy.stats.morestats (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.logical_and - imported by numpy (top-level), scipy.stats._distn_infrastructure (top-level)
missing module named numpy.double - imported by numpy (top-level), scipy.optimize._nnls (top-level)
missing module named numpy.greater - imported by numpy (top-level), scipy.optimize.minpack (top-level)
missing module named numpy.float64 - imported by numpy (top-level), scipy.optimize.lbfgsb (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.sign - imported by numpy (top-level), scipy.linalg.matfuncs (top-level)
missing module named numpy.conjugate - imported by numpy (top-level), scipy.linalg.matfuncs (top-level)
missing module named numpy.logical_not - imported by numpy (top-level), scipy.linalg.matfuncs (top-level)
missing module named numpy.single - imported by numpy (top-level), scipy.linalg.decomp_schur (top-level), scipy.linalg.matfuncs (top-level)
missing module named numpy.arcsin - imported by numpy (top-level), scipy.linalg.decomp_svd (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.arccos - imported by numpy (top-level), scipy.linalg.decomp_svd (top-level), scipy.special.orthogonal (top-level), numexpr.tests.test_numexpr (top-level)
missing module named numpy.conj - imported by numpy (top-level), scipy.linalg.decomp (top-level), numexpr.tests.test_numexpr (top-level), scipy.io.mmio (top-level)
missing module named numpy.inexact - imported by numpy (top-level), scipy.linalg.decomp (top-level), scipy.special._basic (top-level), scipy.optimize.minpack (top-level)
missing module named numpy.random.randn - imported by numpy.random (top-level), scipy (top-level)
missing module named numpy.random.rand - imported by numpy.random (top-level), scipy (top-level)
missing module named scipy.sparse.coo_matrix - imported by scipy.sparse (delayed), scipy.sparse.data (delayed), scipy.optimize._numdiff (top-level), scipy.integrate._bvp (top-level), scipy.integrate._ivp.common (top-level), scipy.stats._crosstab (top-level), pandas.core.arrays.sparse.accessor (delayed), scipy.io.mmio (top-level)
missing module named scipy.special.gammaln - imported by scipy.special (top-level), scipy.special.spfun_stats (top-level), scipy.integrate._quadrature (top-level), scipy.stats._discrete_distns (top-level), scipy.stats._hypotests (top-level), scipy.stats._multivariate (top-level), scipy.optimize._dual_annealing (top-level)
missing module named scipy.special.ndtr - imported by scipy.special (top-level), scipy.stats._bootstrap (top-level)
missing module named scipy.special.betaln - imported by scipy.special (top-level), scipy.stats._discrete_distns (top-level), scipy.stats._multivariate (top-level)
missing module named scipy.special.beta - imported by scipy.special (top-level), scipy.stats._tukeylambda_stats (top-level)
missing module named scipy.special.ive - imported by scipy.special (top-level), scipy.stats._distn_infrastructure (top-level)
missing module named scipy.special.entr - imported by scipy.special (top-level), scipy.stats._distn_infrastructure (top-level), scipy.stats._discrete_distns (top-level), scipy.stats._multivariate (top-level)
missing module named scipy.special.chndtr - imported by scipy.special (top-level), scipy.stats._distn_infrastructure (top-level)
missing module named scipy.special.xlogy - imported by scipy.special (top-level), scipy.interpolate.rbf (top-level), scipy.stats._distn_infrastructure (top-level), scipy.stats._multivariate (top-level)
missing module named scipy.special.rel_entr - imported by scipy.special (top-level), scipy.spatial.distance (top-level)
missing module named scipy.special.loggamma - imported by scipy.special (top-level), scipy.fft._fftlog (top-level)
missing module named scipy.special.airy - imported by scipy.special (top-level), scipy.special.orthogonal (top-level)
missing module named scipy.linalg._flapack_64 - imported by scipy.linalg (optional), scipy.linalg.lapack (optional)
missing module named scipy.linalg._clapack - imported by scipy.linalg (optional), scipy.linalg.lapack (optional)
missing module named scipy.linalg._fblas_64 - imported by scipy.linalg (optional), scipy.linalg.blas (optional)
missing module named scipy.linalg._cblas - imported by scipy.linalg (optional), scipy.linalg.blas (optional)
missing module named scipy.stats.iqr - imported by scipy.stats (delayed), scipy.stats._hypotests (delayed)
missing module named 'scikits.umfpack' - imported by scipy.optimize._linprog_ip (optional)
missing module named 'sksparse.cholmod' - imported by scipy.optimize._linprog_ip (optional)
missing module named sksparse - imported by scipy.optimize._trustregion_constr.projections (optional), scipy.optimize._linprog_ip (optional)
missing module named sparse - imported by scipy.sparse.linalg._expm_multiply (delayed, conditional), scipy.sparse.linalg.matfuncs (delayed, conditional), distributed.protocol.sparse (top-level), dask.array.chunk_types (optional), dask.array.backends (delayed), xarray.core.dataset (delayed), xarray.core.variable (delayed, conditional), xarray.core.indexing (delayed, conditional), xarray.core.formatting (top-level)
missing module named uarray - imported by scipy._lib.uarray (conditional, optional)
missing module named scikits - imported by scipy.sparse.linalg.dsolve.linsolve (optional)
missing module named scipy.linalg.qr_insert - imported by scipy.linalg (top-level), scipy.sparse.linalg.isolve._gcrotmk (top-level)
missing module named pyepsg - imported by cartopy._epsg (delayed)
missing module named 'owslib.wmts' - imported by cartopy.io.ogc_clients (optional)
missing module named 'owslib.util' - imported by cartopy.io.ogc_clients (optional)
missing module named 'owslib.wfs' - imported by cartopy.io.ogc_clients (optional)
missing module named owslib - imported by cartopy.io.ogc_clients (optional)
missing module named fiona - imported by cartopy.io.shapereader (optional)
missing module named cartopy_userconfig - imported by cartopy (optional)
missing module named 'cartopy.siteconfig' - imported by cartopy (optional)
missing module named zstandard - imported by distributed.protocol.compression (top-level), fsspec.compression (optional)
missing module named _snappy_cffi - imported by snappy.snappy_cffi (top-level)
missing module named blosc - imported by distributed.protocol.compression (top-level), partd.compressed (top-level), partd.numpy (top-level)
missing module named tlz.identity - imported by tlz (top-level), dask.base (top-level), distributed.protocol.compression (top-level)
missing module named pandas.msgpack - imported by pandas (optional), partd.python (optional), partd.numpy (optional)
missing module named pyarrow - imported by pandas.core.arrays.masked (delayed), pandas.core.arrays.numeric (delayed, conditional), pandas.core.arrays._arrow_utils (top-level), pandas.core.arrays.interval (delayed), pandas.core.arrays.period (delayed), pandas.core.arrays.boolean (delayed, conditional), pandas.io.feather_format (delayed), pandas.core.arrays.string_ (delayed, conditional), pandas.core.arrays.string_arrow (conditional), pandas.core.dtypes.dtypes (delayed, conditional), pandas.compat.pyarrow (optional), distributed.protocol.arrow (top-level), dask.sizeof (delayed), dask.dataframe.io.parquet.arrow (top-level), dask.dataframe.io.orc.core (delayed, conditional), dask.dataframe.io.orc.arrow (top-level)
missing module named 'pyarrow.parquet' - imported by pandas.io.parquet (delayed), dask.dataframe.io.parquet.arrow (top-level)
missing module named PyQt4 - imported by pandas.io.clipboard (delayed, conditional, optional)
missing module named PyQt5 - imported by pandas.io.clipboard (delayed, conditional, optional)
missing module named 'PySide2.QtDataVisualization' - imported by qtpy.QtDataVisualization (conditional)
missing module named 'PyQt5.QtDataVisualization' - imported by qtpy.QtDataVisualization (conditional)
missing module named 'PySide.QtCore' - imported by qtpy (conditional, optional), qtpy.QtCore (conditional)
missing module named PySide - imported by qtpy (conditional, optional)
missing module named 'PyQt4.QtCore' - imported by qtpy (conditional, optional), qtpy.QtCore (conditional)
missing module named 'PyQt4.Qt' - imported by qtpy (conditional, optional), qtpy.QtGui (conditional, optional)
missing module named 'PySide2.QtCore' - imported by qtpy (conditional, optional), qtpy.QtCore (conditional)
missing module named 'PyQt5.QtCore' - imported by qtpy (conditional, optional), qtpy.QtCore (conditional)
missing module named CStringIO - imported by qtpy.py3compat (conditional, optional)
missing module named ConfigParser - imported by qtpy.py3compat (conditional)
missing module named AppKit - imported by pandas.io.clipboard (delayed, conditional, optional)
missing module named 'PyQt4.QtGui' - imported by qtpy.QtGui (conditional, optional), qtpy.QtCore (conditional), qtpy.QtWidgets (conditional), pandas.io.clipboard (delayed, optional)
missing module named 'PyQt5.QtWidgets' - imported by qtpy.QtWidgets (conditional), pandas.io.clipboard (delayed, optional)
missing module named 'PySide.QtGui' - imported by qtpy.QtGui (conditional), qtpy.QtCore (conditional), qtpy.QtWidgets (conditional)
missing module named 'PySide2.QtWidgets' - imported by qtpy.QtWidgets (conditional)
missing module named 'sqlalchemy.types' - imported by pandas.io.sql (delayed, conditional)
missing module named 'sqlalchemy.schema' - imported by pandas.io.sql (delayed, conditional)
missing module named sqlalchemy - imported by pandas.io.sql (delayed, conditional, optional), dask.dataframe.io.sql (delayed)
missing module named tables - imported by pandas.io.pytables (delayed, conditional)
missing module named xlwt - imported by pandas.io.excel._xlwt (delayed, conditional)
missing module named xlsxwriter - imported by pandas.io.excel._xlsxwriter (delayed)
missing module named 'openpyxl.cell' - imported by pandas.io.excel._openpyxl (delayed)
missing module named 'openpyxl.styles' - imported by pandas.io.excel._openpyxl (delayed)
missing module named 'openpyxl.workbook' - imported by pandas.io.excel._openpyxl (delayed)
missing module named openpyxl - imported by pandas.io.excel._openpyxl (delayed, conditional)
missing module named 'odf.config' - imported by pandas.io.excel._odswriter (delayed)
missing module named 'odf.style' - imported by pandas.io.excel._odswriter (delayed)
missing module named 'odf.text' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
missing module named 'odf.table' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
missing module named 'odf.opendocument' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
missing module named xlrd - imported by pandas.io.excel._xlrd (delayed), pandas.io.excel._base (delayed, conditional)
missing module named pyxlsb - imported by pandas.io.excel._pyxlsb (delayed)
missing module named 'odf.element' - imported by pandas.io.excel._odfreader (delayed)
missing module named 'odf.namespaces' - imported by pandas.io.excel._odfreader (delayed)
missing module named odf - imported by pandas.io.excel._odfreader (delayed)
missing module named botocore - imported by pandas.io.common (delayed, conditional, optional)
missing module named 'pyarrow.compute' - imported by pandas.core.arrays.string_arrow (conditional)
missing module named hypothesis - imported by pandas.util._tester (delayed, optional)
missing module named pandas.ExtensionArray - imported by pandas (conditional), pandas.core.construction (conditional)
missing module named uvloop - imported by distributed (conditional)
missing module named tlz.merge - imported by tlz (top-level), dask.base (top-level), distributed.client (top-level), dask.delayed (top-level), distributed.core (top-level), distributed.cfexecutor (top-level), distributed.utils_comm (top-level), distributed.worker (top-level), distributed.dashboard.components.worker (top-level), distributed.diagnostics.progress_stream (top-level), distributed.scheduler (top-level), distributed.variable (top-level), distributed.deploy.old_ssh (top-level), dask.array.percentile (top-level), dask.dataframe.core (top-level), dask.array.slicing (top-level), dask.dataframe.io.hdf (top-level), dask.dataframe.io.io (top-level), dask.bag.core (top-level), dask.dataframe.partitionquantiles (top-level), dask.array.gufunc (top-level)
missing module named bokeh.models.Plot - imported by bokeh.models (top-level), bokeh.plotting.figure (top-level), bokeh.plotting._tools (top-level), bokeh.layouts (top-level), bokeh.events (delayed)
missing module named bokeh.models.Widget - imported by bokeh.models (conditional), bokeh.layouts (conditional)
missing module named bokeh.models.Toolbar - imported by bokeh.models (top-level), bokeh.plotting._tools (top-level), bokeh.layouts (conditional)
missing module named bokeh.models.WidgetBox - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.ToolbarBox - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.Spacer - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.Row - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.ProxyToolbar - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.LayoutDOM - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.GridBox - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.Column - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named bokeh.models.Box - imported by bokeh.models (top-level), bokeh.layouts (top-level)
missing module named 'selenium.webdriver' - imported by bokeh.io.webdriver (top-level), bokeh.io.export (delayed)
missing module named 'selenium.common' - imported by bokeh.io.export (delayed)
missing module named selenium - imported by bokeh.io.export (conditional), bokeh.io.webdriver (top-level)
missing module named bokeh.models.ColumnDataSource - imported by bokeh.models (top-level), bokeh.plotting.figure (top-level), bokeh.plotting._graph (top-level), bokeh.plotting._renderer (top-level), bokeh.plotting (top-level), distributed.dashboard.components.worker (top-level), distributed.dashboard.components.shared (top-level), distributed.dashboard.components.nvml (top-level), distributed.dashboard.components.scheduler (top-level)
missing module named bokeh.models.LegendItem - imported by bokeh.models (top-level), bokeh.plotting._legends (top-level)
missing module named bokeh.models.Legend - imported by bokeh.models (top-level), bokeh.plotting._legends (top-level)
missing module named bokeh.models.GlyphRenderer - imported by bokeh.models (top-level), bokeh.plotting._graph (top-level), bokeh.plotting._renderer (top-level)
missing module named bokeh.models.ColumnarDataSource - imported by bokeh.models (top-level), bokeh.plotting._graph (top-level), bokeh.plotting._renderer (top-level)
missing module named bokeh.models.Marker - imported by bokeh.models (top-level), bokeh.plotting._docstring (top-level)
missing module named bokeh.models.Tool - imported by bokeh.models (top-level), bokeh.plotting.figure (top-level), bokeh.plotting._tools (top-level), distributed.dashboard.export_tool (top-level)
missing module named bokeh.models.HoverTool - imported by bokeh.models (top-level), bokeh.plotting._tools (top-level), distributed.profile (delayed), distributed.dashboard.components.worker (top-level), distributed.dashboard.components.shared (top-level), distributed.dashboard.components.nvml (top-level), distributed.dashboard.components.scheduler (top-level)
missing module named bokeh.models.Range - imported by bokeh.models (top-level), bokeh.plotting.figure (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.MercatorAxis - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.LogScale - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.LogAxis - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.LinearScale - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.Grid - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.FactorRange - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.DatetimeAxis - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.DataRange1d - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level), distributed.dashboard.components.worker (top-level), distributed.dashboard.components.shared (top-level), distributed.dashboard.components.scheduler (top-level)
missing module named bokeh.models.ContinuousTicker - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.CategoricalScale - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.CategoricalAxis - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level)
missing module named bokeh.models.Range1d - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level), bokeh.plotting.gmap (top-level), distributed.dashboard.components.shared (top-level), distributed.dashboard.components.scheduler (top-level)
missing module named bokeh.models.MercatorTickFormatter - imported by bokeh.models (top-level), bokeh.plotting.gmap (top-level)
missing module named bokeh.models.MercatorTicker - imported by bokeh.models (top-level), bokeh.plotting.gmap (top-level)
missing module named bokeh.models.LinearAxis - imported by bokeh.models (top-level), bokeh.plotting._plot (top-level), bokeh.plotting.gmap (top-level)
missing module named bokeh.models.GMapPlot - imported by bokeh.models (top-level), bokeh.plotting.gmap (top-level)
missing module named bokeh.models.Scatter - imported by bokeh.models (top-level), bokeh.plotting._graph (top-level)
missing module named bokeh.models.MultiLine - imported by bokeh.models (top-level), bokeh.plotting._graph (top-level)
missing module named bokeh.models.Circle - imported by bokeh.models (top-level), bokeh.plotting._graph (top-level)
missing module named bokeh.models.Scale - imported by bokeh.models (top-level), bokeh.plotting.figure (top-level)
missing module named bokeh.models.GraphRenderer - imported by bokeh.models (top-level), bokeh.plotting.figure (top-level)
missing module named bokeh.models.CoordinateMapping - imported by bokeh.models (top-level), bokeh.plotting.figure (top-level)
missing module named 'tlz.curried' - imported by distributed.dashboard.utils (top-level), distributed.dashboard.components.scheduler (top-level), dask.array.core (top-level), dask.layers (top-level), dask.bag.core (delayed, conditional), dask.array.overlap (top-level)
missing module named pynvml - imported by distributed.diagnostics.nvml (optional)
missing module named tlz.pipe - imported by tlz (top-level), distributed.dashboard.components.scheduler (top-level)
missing module named tlz.partition_all - imported by tlz (top-level), distributed.client (top-level), distributed.dashboard.components.worker (top-level), dask.dataframe.core (top-level), dask.dataframe.categorical (top-level), dask.array.reductions (top-level), dask.bag.core (top-level)
missing module named dl - imported by setuptools.command.build_ext (conditional, optional)
missing module named pythran - imported by Cython.Build.Dependencies (optional), Cython.Compiler.Pythran (optional)
missing module named Cython.Tempita.sub - imported by Cython.Tempita (delayed), Cython.Compiler.Code (delayed)
missing module named pyximport.test - imported by pyximport (conditional), pyximport.pyxbuild (conditional)
missing module named md5 - imported by Cython.Compiler.Code (optional), Cython.Build.Inline (optional), Cython.Build.IpythonMagic (optional)
missing module named Parser - imported by Cython.Compiler.Main (delayed, conditional, optional)
missing module named tlz.topk - imported by tlz (top-level), distributed.stealing (top-level), dask.bag.core (top-level)
missing module named setproctitle - imported by distributed.proctitle (optional)
missing module named 'ucp.endpoint_reuse' - imported by distributed.comm.ucx (delayed, optional)
missing module named rmm - imported by distributed.protocol.rmm (top-level), dask.sizeof (delayed), distributed.comm.ucx (delayed, optional)
missing module named 'numba.cuda' - imported by distributed.protocol.rmm (top-level), distributed.protocol.numba (top-level), dask.sizeof (delayed), distributed.comm.ucx (delayed, conditional, optional)
missing module named ucp - imported by distributed.comm.ucx (delayed, conditional, optional)
missing module named tlz.sliding_window - imported by tlz (top-level), distributed.comm.tcp (top-level), dask.array.routines (top-level), dask.array.creation (top-level)
missing module named cupy - imported by distributed.protocol.cupy (top-level), dask.sizeof (delayed), dask.array.routines (delayed, conditional), dask.array.chunk_types (optional), dask.array.backends (delayed), xarray.core.duck_array_ops (delayed, conditional)
missing module named tlz.valmap - imported by tlz (top-level), distributed.client (top-level), distributed.diagnostics.progress_stream (top-level), distributed.scheduler (top-level), distributed.diagnostics.progress (top-level), distributed.diagnostics.progressbar (top-level), dask.bag.core (top-level)
missing module named tlz.second - imported by tlz (top-level), distributed.scheduler (top-level), dask.bag.core (top-level)
missing module named tlz.pluck - imported by tlz (top-level), distributed.worker (top-level), distributed.scheduler (top-level), dask.array.slicing (top-level), dask.array.reductions (top-level), dask.bag.core (top-level)
missing module named tlz.merge_with - imported by tlz (top-level), distributed.scheduler (top-level), dask.bag.core (top-level)
missing module named tlz.merge_sorted - imported by tlz (top-level), distributed.scheduler (top-level), dask.dataframe.multi (top-level), dask.dataframe.partitionquantiles (top-level)
missing module named tlz.groupby - imported by tlz (top-level), dask.base (top-level), distributed.client (top-level), distributed.utils_comm (top-level), distributed.scheduler (top-level), distributed.diagnostics.progress (top-level), dask.array.core (top-level), dask.bag.core (top-level)
missing module named tlz.first - imported by tlz (top-level), distributed.client (top-level), distributed.worker (top-level), distributed.scheduler (top-level), dask.array.core (top-level), dask.dataframe.core (top-level), dask.bag.core (top-level), dask.dataframe.multi (top-level)
missing module named tlz.compose - imported by tlz (top-level), distributed.scheduler (top-level), dask.array.reductions (top-level), dask.bag.core (top-level)
missing module named 'paramiko.ssh_exception' - imported by distributed.deploy.old_ssh (delayed)
missing module named 'paramiko.buffered_pipe' - imported by distributed.deploy.old_ssh (delayed)
missing module named asyncssh - imported by distributed.deploy.ssh (delayed)
missing module named crick - imported by distributed.counter (optional), dask.array.percentile (delayed)
missing module named stacktrace - imported by distributed.profile (delayed)
missing module named cuml - imported by distributed.protocol (delayed)
missing module named cudf - imported by distributed.protocol (delayed)
missing module named numba - imported by distributed.protocol.rmm (top-level)
missing module named cupyx - imported by distributed.protocol.cupy (optional)
missing module named 'cupy.cusparse' - imported by distributed.protocol.cupy (optional)
missing module named torch - imported by distributed.protocol.torch (top-level)
missing module named 'keras.models' - imported by distributed.protocol.keras (delayed)
missing module named keras - imported by distributed.protocol.keras (top-level)
missing module named 'IPython.core.ipapi' - imported by h5py.ipy_completer (optional)
missing module named mpi4py - imported by h5py._hl.files (delayed)
missing module named '__pypy__.builders' - imported by msgpack.fallback (conditional, optional)
missing module named lmdb - imported by zict.lmdb (delayed), zarr.storage (delayed)
missing module named tlz.keymap - imported by tlz (top-level), distributed.client (top-level), distributed.worker (top-level)
missing module named tlz.drop - imported by tlz (top-level), distributed.utils_comm (top-level), dask.array.reductions (top-level)
missing module named tlz.concat - imported by tlz (top-level), dask.delayed (top-level), distributed.utils_comm (top-level), dask.array.core (top-level), dask.array.slicing (top-level), dask.array.chunk (top-level), dask.array.utils (top-level), dask.array.routines (top-level), dask.bag.text (top-level), dask.array.gufunc (top-level), dask.array.overlap (top-level)
missing module named tlz.unique - imported by tlz (top-level), dask.delayed (top-level), dask.dataframe.core (top-level), dask.bag.core (top-level), dask.dataframe.multi (top-level), dask.array.gufunc (top-level)
missing module named pandas_datareader - imported by dask.dataframe.io.demo (delayed)
missing module named 'pyarrow.orc' - imported by dask.dataframe.io.orc.arrow (top-level)
missing module named 'lz4.frame' - imported by fsspec.compression (optional)
missing module named lzmaffi - imported by fsspec.compression (optional)
missing module named isal - imported by fsspec.compression (optional)
missing module named 'fastparquet.writer' - imported by dask.dataframe.io.parquet.fastparquet (optional)
missing module named 'fastparquet.util' - imported by dask.dataframe.io.parquet.fastparquet (optional)
missing module named fastparquet - imported by dask.dataframe.io.parquet.fastparquet (optional)
missing module named 'sqlalchemy.sql' - imported by dask.dataframe.io.sql (delayed)
missing module named fastavro - imported by dask.bag.avro (delayed)
missing module named tlz.take - imported by tlz (top-level), dask.bag.core (top-level), dask.dataframe.partitionquantiles (top-level)
missing module named tlz.remove - imported by tlz (top-level), dask.dataframe.core (top-level), dask.bag.core (top-level)
missing module named tlz.reduceby - imported by tlz (top-level), dask.bag.core (top-level)
missing module named tlz.peek - imported by tlz (top-level), dask.bag.core (top-level)
missing module named tlz.join - imported by tlz (top-level), dask.bag.core (top-level)
missing module named tlz.frequencies - imported by tlz (top-level), dask.array.core (top-level), dask.array.utils (top-level), dask.bag.core (top-level)
missing module named tlz.count - imported by tlz (top-level), dask.bag.core (top-level)
missing module named tlz.accumulate - imported by tlz (top-level), dask.array.core (top-level), dask.array.slicing (top-level), dask.array.reductions (top-level), dask.bag.core (top-level), dask.array.rechunk (top-level)
missing module named bcolz - imported by dask.dataframe.io.io (delayed)
missing module named tlz.memoize - imported by tlz (top-level), dask.array.slicing (top-level)
missing module named dask_cudf - imported by dask.dataframe.backends (delayed)
missing module named tlz.partition - imported by tlz (top-level), dask.array.core (top-level), dask.dataframe.methods (top-level)
missing module named tlz.curry - imported by tlz (top-level), dask.base (top-level), dask.delayed (top-level), distributed.dashboard.components.scheduler (top-level), dask.array.wrap (top-level), dask.bag.core (top-level)
missing module named tlz.partial - imported by tlz (top-level), dask.array.overlap (top-level)
missing module named tlz.get - imported by tlz (top-level), dask.array.reductions (top-level), dask.array.overlap (top-level)
missing module named tlz.interleave - imported by tlz (top-level), dask.array.routines (top-level)
missing module named 'cupyx.scipy' - imported by dask.array.utils (delayed, conditional), dask.array.chunk_types (optional), dask.array.backends (delayed, optional)
missing module named tiledb - imported by dask.array.tiledb_io (delayed)
missing module named redis - imported by zarr.storage (delayed)
missing module named pymongo - imported by zarr.storage (delayed)
missing module named _dbm - imported by dbm.ndbm (top-level)
missing module named 'azure.core' - imported by zarr._storage.absstore (delayed)
missing module named azure - imported by zarr._storage.absstore (delayed, conditional)
missing module named ipytree - imported by zarr.util (delayed, optional)
missing module named zfpy - imported by numcodecs.zfpy (optional)
missing module named dask.sharedict - imported by dask (delayed, conditional, optional), xarray.core.dataset (delayed, conditional, optional)
missing module named mimesis - imported by dask.datasets (delayed)
missing module named mmh3 - imported by dask.hashing (optional)
missing module named xxhash - imported by dask.hashing (optional)
missing module named cityhash - imported by dask.hashing (optional)
missing module named 'tlz.functoolz' - imported by dask.base (top-level)
missing module named Nio - imported by xarray.backends.pynio_ (optional)
missing module named 'pydap.client' - imported by xarray.backends.pydap_ (optional)
missing module named PseudoNetCDF - imported by xarray.backends.pseudonetcdf_ (optional)
missing module named h5netcdf - imported by xarray.backends.h5netcdf_ (optional), xarray.tutorial (delayed, conditional, optional)
missing module named cfgrib - imported by xarray.backends.cfgrib_ (optional)
missing module named 'IPython.html.widgets' - imported by seaborn.widgets (optional)
missing module named sphinx - imported by seaborn.external.docscrape (delayed, conditional)
missing module named fastcluster - imported by seaborn.matrix (delayed)
missing module named 'statsmodels.nonparametric' - imported by seaborn.regression (delayed)
missing module named 'statsmodels.robust' - imported by seaborn.regression (delayed, conditional)
missing module named 'statsmodels.genmod' - imported by seaborn.regression (delayed, conditional)
missing module named statsmodels - imported by seaborn.regression (optional)
missing module named nc_time_axis - imported by xarray.plot.utils (optional)
missing module named 'iris.exceptions' - imported by xarray.convert (delayed)
missing module named 'iris.fileformats' - imported by xarray.convert (delayed)
missing module named cf_units - imported by xarray.convert (delayed)
missing module named iris - imported by xarray.core.dataarray (conditional, optional), xarray.convert (delayed)
missing module named cdms2 - imported by xarray.core.dataarray (conditional, optional), xarray.convert (delayed)
missing module named numbagg - imported by xarray.core.rolling_exp (delayed)
missing module named swiftclient - imported by rasterio.session (delayed, conditional)
missing module named boto3 - imported by rasterio.session (optional)
missing module named pydap - imported by xarray.backends.api (delayed, optional)
missing module named pooch - imported by xarray.tutorial (delayed, optional)
missing module named compiler - imported by configobj (delayed, conditional)
missing module named 'mpl_toolkits.basemap' - imported by pyresample.plot (delayed)

View File

@ -407,7 +407,7 @@ class Orbit(Component):
"Orbit interpolation type %s, is not implemented" % method
)
interpolateOrbit = interpolate
# interpolateOrbit = interpolate
def _linearOrbitInterpolation(self,time):
"""
@ -1020,12 +1020,11 @@ class Orbit(Component):
delta = (self.maxTime - self.minTime).total_seconds() * 0.5
tguess = self.minTime + datetime.timedelta(seconds = delta)
outOfBounds = False
# Start the previous guess tracking with dummy value
t_prev_guess = tguess + datetime.timedelta(seconds=10)
for ii in range(51):
try:
sv = self.interpolateOrbit(tguess, method='hermite')
except:
except Exception as e:
print(e)
outOfBounds = True
break
@ -1044,12 +1043,9 @@ class Orbit(Component):
c2 = (fdop/rng + fdopder)
fnprime = c1 + c2 * dopfact
tguess = tguess - datetime.timedelta(seconds = fn/fnprime)
if abs(tguess - t_prev_guess).total_seconds() < 5e-9:
if abs(fn/fnprime) < 1e-6:
break
else:
t_prev_guess = tguess
if outOfBounds:
raise Exception('Interpolation time out of bounds')

View File

@ -27,9 +27,13 @@
# Author: Walter Szeliga
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from xml.etree.ElementTree import ElementTree
import datetime
import isceobj
import copy
from isceobj.Scene.Frame import Frame
from isceobj.Planet.Planet import Planet
from isceobj.Orbit.Orbit import StateVector, Orbit
@ -38,16 +42,8 @@ from isceobj.Planet.AstronomicalHandbook import Const
from iscesys.Component.Component import Component
from iscesys.DateTimeUtil.DateTimeUtil import DateTimeUtil as DTUtil
import os
import copy
import scipy.sparse as ss
from concurrent.futures._base import as_completed, wait
from concurrent.futures.thread import ThreadPoolExecutor
from multiprocessing import Pool
import math
import datetime
from math import sin,cos
from scipy.optimize import leastsq
import numpy as np
sep = "\n"
tab = " "
lookMap = { 'R': -1,
@ -59,7 +55,7 @@ TIFF = Component.Parameter(
default='',
type=str,
mandatory=True,
doc='GF3 tiff imagery file'
doc='GF3_SLC tiff imagery file'
)
XML = Component.Parameter(
@ -68,7 +64,7 @@ XML = Component.Parameter(
default='',
type=str,
mandatory=True,
doc='GF3 xml metadata file'
doc='GF3_SLC xml metadata file'
)
ORBIT_DIRECTORY = Component.Parameter(
@ -77,7 +73,7 @@ ORBIT_DIRECTORY = Component.Parameter(
default=None,
type=str,
mandatory=False,
doc='Directory with GF3 precise orbits')
doc='Directory with GF3_SLC precise orbits')
ORBIT_FILE = Component.Parameter(
'orbitFile',
@ -95,40 +91,87 @@ from .Sensor import Sensor
# 这里采用《Insar原理和应用 》刘国祥著中基于空间定位的轨道参数计算方法一章中的内容Gabriel and Goldstein
# 注意为了方便计算,采用基准时间的方法
######################################################
import math
import datetime
import time
import scipy as sp
from math import sin,cos
from scipy.optimize import leastsq
import numpy as np
def FindInfomationFromJson(HeaderFile_dom_json, node_path_list):
"""
在Json文件中按照指定路径解析出制定节点
"""
result_node = HeaderFile_dom_json
for nodename in node_path_list:
result_node = result_node[nodename]
return result_node
########
# 函数列表
########
def poly1dfunc(p,x): # 一次函数
k,b=p
return k*x+b
def poly2dfunc(p,x): # 二次函数
k1,k2,b=p
return b+k1*x+k2*x*x
def GetVectorNorm(Vecter):
"""
得到向量的模
"""
Vecter = Vecter.reshape(-1,1)
Vecter_Norm_pow = np.matmul(Vecter.T,Vecter)
return np.sqrt(Vecter_Norm_pow)
def poly3dfunc(p,x):
k1,k2,k3,b=p
return b+k1*x+k2*x*x+k3*x*x*x
def poly4dfunc(p,x):
k1,k2,k3,k4,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4
def XYZOuterM2(A, B):
"""
外积叉乘,日后版本换成可以任意维度的外积运算方程
args:
A:nx3
B:nx3
"""
cnt = A.shape[0]
C = np.zeros((cnt, 3))
C[:, 0] = A[:, 1] * B[:, 2] - A[:, 2] * B[:, 1]
C[:, 1] = A[:, 2] * B[:, 0] - A[:, 0] * B[:, 2]
C[:, 2] = A[:, 0] * B[:, 1] - A[:, 1] * B[:, 0]
return C
def poly5dfunc(p,x):
k1,k2,k3,k4,k5,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4+k5*x**5
def poly1derror(p,x,y):
return poly1dfunc(p,x)-y
def poly2derror(p,x,y):
return poly2dfunc(p,x)-y
def poly3derror(p,x,y):
return poly3dfunc(p,x)-y
def poly4derror(p,x,y):
return poly4dfunc(p,x)-y
def poly5derror(p,x,y):
return poly5dfunc(p,x)-y
class orbitVector:
def __init__(self,UTCTimes,vx,vy,vz,px,py,pz,dateformat="%Y-%m-%dT%H:%M:%S.%fZ"):
self.UTCTime=datetime.datetime.strptime(UTCTimes,dateformat) # 字符串转UTC时间
self.time_stamp=self.UTCTime.timestamp() # 时间戳
self.vx=vx
self.vy=vy
self.vz=vz
self.px=px
self.py=py
self.pz=pz
self.orbitVector2GG() # 将坐标进行变换
self.Check()
pass
def orbitVector2GG(self):
Cx=self.py*self.vz-self.pz*self.vy
Cy=self.pz*self.vx-self.px*self.vz
Cz=self.px*self.vy-self.py*self.vx
C=(Cx**2+Cy**2+Cz**2)**0.5
self.rho=(self.px**2+self.py**2+self.pz**2)**0.5
self.I=math.acos(Cz/C)
self.omega=math.asin(self.pz/(self.rho*math.sin(self.I)))
self.Omega=math.atan(-Cx/Cy)
return [self.rho,self.I,self.omega,self.Omega]
def Check(self):
rho=self.rho
I=self.I
omega=self.omega
Omega=self.Omega
Xp=-rho*(cos(omega)*cos(Omega)-sin(omega)*sin(Omega)*cos(I))
Yp=-rho*(cos(omega)*sin(Omega)+sin(omega)*cos(Omega)*cos(I))
Zp=rho*sin(omega)*sin(I)
print("计算插值:",self.UTCTime,self.px,self.py,self.pz,self.vx,self.vy,self.vz,"|",Xp-self.px,Yp-self.py,Zp-self.pz)
class SatelliteOrbit(object):
@ -260,11 +303,53 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
result_arr=np.zeros((1,7))
time_float = time_float - self.starttime
result_arr[0,0]=time_float
#time_arr[0, 4] = time_arr[0, 3] * time_float ** 4
time_float=np.array([1,time_float,time_float**2,time_float**3,time_float**4]).reshape(1,5)
result_arr=np.matmul(time_float,self.A_arr)
return [time_float,result_arr]
#
px=0
py=0
pz=0
vx=0
vy=0
vz=0
for ii in range(self.polynum):
px+=self.A_arr[ii,0]*time_float**ii
py+=self.A_arr[ii,1]*time_float**ii
pz+=self.A_arr[ii,2]*time_float**ii
vx+=self.A_arr[ii,3]*time_float**ii
vy+=self.A_arr[ii,4]*time_float**ii
vz+=self.A_arr[ii,5]*time_float**ii
return [time_float,[px,py,pz,vx,vy,vz]]
def getTimeOrbitStamp(self,UTCStartTime_float):
sv=_StateVector()
temp_sv=self.SatelliteSpaceState(UTCStartTime_float)
sv.timeStamp=datetime.datetime.fromtimestamp(UTCStartTime_float)
sv.xPosition = temp_sv[1][0,0]
sv.yPosition = temp_sv[1][0,1]
sv.zPosition = temp_sv[1][0,2]
sv.xVelocity = temp_sv[1][0,3]
sv.yVelocity = temp_sv[1][0,4]
sv.zVelocity = temp_sv[1][0,5]
return sv
def getTimeOrbits(self,UTCStartTime,UTCEndTime,orbitnum=1000):
#
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()-10
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()+10
if startTime_stamp>endTime_stamp:
raise
delta_t=(endTime_stamp-startTime_stamp)/orbitnum
extractOrbits=[]
#
temptime=startTime_stamp
while temptime<endTime_stamp:
temptime=temptime+delta_t
newOrbit=self.getTimeOrbitStamp(temptime)
extractOrbits.append(newOrbit)
newOrbit=self.getTimeOrbitStamp(endTime_stamp)
extractOrbits.append(newOrbit)
return extractOrbits # 扩展的轨道节点
def getSatelliteSpaceState(self, time_array):
'''
@ -303,97 +388,40 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
#result_arr=result_arr_
return result_arr_ # 位置矩阵
def ReconstructionSatelliteOrbit(GPSPoints_list, starttime):
def ReconstructionSatelliteOrbit(stateVectors, starttime):
'''
构建卫星轨道
args:
GPSPoints_list:卫星轨道点
starttime:起算时间
'''
# GPSPoint_list=[]
# for sv in stateVectors:
# GPSPoint=[sv.timeStamp.timestamp(),
# sv.xPosition,
# sv.yPosition,
# sv.zPosition,
# sv.xVelocity,
# sv.yVelocity,
# sv.zVelocity
# ]
# GPSPoint_list.append(GPSPoint)
SatelliteOrbitModel = SatelliteOrbitFitPoly()
if SatelliteOrbitModel.ReconstructionSatelliteOrbit(GPSPoints_list, starttime=starttime) is None:
if SatelliteOrbitModel.ReconstructionSatelliteOrbit(stateVectors, starttime=starttime) is None:
return None
print("orbit test")
distance=[]
for gpsPoint in stateVectors:
temp_sv=SatelliteOrbitModel.SatelliteSpaceState(gpsPoint[0])
sv=np.array(temp_sv[1])
temp_distance=sv-gpsPoint[1:]
distance.append(temp_distance)
distance=np.array(distance)
print("orbit max:",np.max(distance))
print("orbit min:",np.min(distance))
return SatelliteOrbitModel
########
# 函数列表
########
def poly1dfunc(p,x): # 一次函数
k,b=p
return k*x+b
def poly2dfunc(p,x): # 二次函数
k1,k2,b=p
return b+k1*x+k2*x*x
def poly3dfunc(p,x):
k1,k2,k3,b=p
return b+k1*x+k2*x*x+k3*x*x*x
def poly4dfunc(p,x):
k1,k2,k3,k4,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4
def poly5dfunc(p,x):
k1,k2,k3,k4,k5,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4+k5*x**5
def poly1derror(p,x,y):
return poly1dfunc(p,x)-y
def poly2derror(p,x,y):
return poly2dfunc(p,x)-y
def poly3derror(p,x,y):
return poly3dfunc(p,x)-y
def poly4derror(p,x,y):
return poly4dfunc(p,x)-y
def poly5derror(p,x,y):
return poly5dfunc(p,x)-y
class orbitVector:
def __init__(self,UTCTimes,vx,vy,vz,px,py,pz,dateformat="%Y-%m-%dT%H:%M:%S.%f"):
self.UTCTime=datetime.datetime.strptime(UTCTimes,dateformat) # 字符串转UTC时间
self.time_stamp=self.UTCTime.timestamp() # 时间戳
self.vx=vx
self.vy=vy
self.vz=vz
self.px=px
self.py=py
self.pz=pz
self.orbitVector2GG() # 将坐标进行变换
self.Check()
pass
def orbitVector2GG(self):
Cx=self.py*self.vz-self.pz*self.vy # 叉乘
Cy=self.pz*self.vx-self.px*self.vz
Cz=self.px*self.vy-self.py*self.vx
C=(Cx**2+Cy**2+Cz**2)**0.5
self.rho=(self.px**2+self.py**2+self.pz**2)**0.5
self.I=math.acos(Cz/C)
self.omega=math.asin(self.pz/(self.rho*math.sin(self.I)))
self.Omega=math.atan(Cx*(-1)/Cy)
return [self.rho,self.I,self.omega,self.Omega]
def Check(self):
rho=self.rho
I=self.I
omega=self.omega
Omega=self.Omega
Xp=rho*(cos(omega)*cos(Omega)-sin(omega)*sin(Omega)*cos(I))
Yp=rho*(cos(omega)*sin(Omega)+sin(omega)*cos(Omega)*cos(I))
Zp=rho*sin(Omega)*sin(I)
print("计算插值:",self.UTCTime,self.px,self.py,self.pz,self.vx,self.vy,self.vz,"|",abs(Xp)-abs(self.px),abs(Yp)-abs(self.py),abs(Zp)-abs(self.pz))
class SARorbit(object):
# 作为自定义轨道计算基类
# 定义几个基本方法addvector(),createOrbit(),getTime(),getTimes()
@ -417,13 +445,13 @@ class SARorbit(object):
return None
def getTimeOrbitStamp(self,StampTime):
utcStr=datetime.datetime.fromtimestamp(StampTime).strftime("%Y-%m-%dT%H:%M:%S.%f")
utcStr=datetime.datetime.fromtimestamp(StampTime).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
return self.getTimeOrbit(utcStr)
def getTimeOrbits(self,UTCStartTime,UTCEndTime,orbitnum=100):
#
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()-0.2
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()+0.2
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()-10
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()+10
if startTime_stamp>endTime_stamp:
raise
delta_t=(endTime_stamp-startTime_stamp)*1000/orbitnum
@ -490,7 +518,7 @@ class GGorbit(SARorbit):
# 获取计算结果
def getTimeOrbit(self,UTCTime):
staptime=datetime.datetime.strptime(UTCTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()
staptime=datetime.datetime.strptime(UTCTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()
dtime=0.0001
[Xp,Yp,Zp]=self.getXYZ(staptime)
[Xp_temp,Yp_temp,Zp_temp]=self.getXYZ(staptime+dtime)
@ -548,7 +576,7 @@ class polyorbit(SARorbit):
class GF3_SLC(Sensor):
"""
A Class representing GF3 data
A Class representing GF3_SLC data
"""
family='GF3_SLC'
@ -600,12 +628,15 @@ class GF3_SLC(Sensor):
# azimuthPixelSize = self.product.imageAttributes.rasterAttributes.sampledLineSpacing # ground spacing in meters
totalProcessedAzimuthBandwidth = self.product.imageInfo.eqvPRF
prf = self.product.imageInfo.eqvPRF # effective PRF can be double original, suggested by Piyush
prf_s = ori_prf * np.ceil(totalProcessedAzimuthBandwidth / ori_prf) # effective PRF can be double original, suggested by Piyush
# print("effective PRF %f, original PRF %f" % (prf, orig_prf) )
print('----------------------------------------------------')
print("mission",mission)
print("swath",swath)
print("frequency",frequency)
print("ori_prf",ori_prf)
print("prf",prf)
print("prf_s",prf_s)
print("rangePixelSize",rangePixelSize)
print("rangeSamplingRate",rangeSamplingRate)
print("pulseLength",pulseLength)
@ -638,7 +669,7 @@ class GF3_SLC(Sensor):
####Populate instrument
instrument = self.frame.getInstrument()
instrument.setRadarFrequency(frequency)
instrument.setPulseRepetitionFrequency(prf)
instrument.setPulseRepetitionFrequency(prf_s)
instrument.setPulseLength(pulseLength)
instrument.setChirpSlope(pulseBandwidth/pulseLength)
instrument.setIncidenceAngle(incidenceAngle)
@ -648,7 +679,6 @@ class GF3_SLC(Sensor):
instrument.setBeamNumber(swath)
instrument.setPulseLength(pulseLength)
#Populate Frame
#self.frame.setSatelliteHeight(height)
self.frame.setSensingStart(dataStartTime) # Date time object for UTC of first line
@ -667,19 +697,15 @@ class GF3_SLC(Sensor):
self.frame.getOrbit().setOrbitSource('EOF')
# self.frame.getOrbit().setOrbitSource(self.product.sourceAttributes.orbitAndAttitude.orbitInformation.orbitDataFile)
print("======= 修改轨道代码部分: =================")
if (self.orbitFile is None) and (self.orbitDirectory is None):
print('orbitFile and orbitDirectory are None')
self.extractOrbit()
elif (self.orbitDirectory is not None):
print('orbitDirectory is None')
self.orbitFile = findPreciseOrbit(self.orbitDirectory, self.frame.getOrbit().getOrbitSource(), self.frame.sensingStart.year)
if self.orbitFile is not None:
print('orbitFile is None')
self.extractPreciseOrbit(self.orbitFile, self.frame.sensingStart, self.frame.sensingStop)
@ -689,15 +715,10 @@ class GF3_SLC(Sensor):
# note that RS2 Doppler values are estimated at time dc.dopplerCentroidReferenceTime,
# so the values might need to be adjusted for ISCE usage
# added EJF 2015/08/17
# dc = self.product.imageGenerationParameters.dopplerCentroid
# poly = dc.dopplerCentroidCoefficients
poly = self.product.processInfo.DopplerCentroidCoefficients
# need to convert units
poly[1] = poly[1]/rangeSamplingRate
poly[2] = poly[2]/rangeSamplingRate**2
poly[3] = poly[3]/rangeSamplingRate**3
poly[4] = poly[4]/rangeSamplingRate**4
self.doppler_coeff = poly
# similarly save Doppler azimuth fm rate values, converting units
@ -706,22 +727,12 @@ class GF3_SLC(Sensor):
# note that RS2 Doppler values are estimated at time dc.dopplerRateReferenceTime,
# so the values might need to be adjusted for ISCE usage
# added EJF 2015/08/17
# dr = self.product.imageGenerationParameters.dopplerRateValues
# fmpoly = dr.dopplerRateValuesCoefficients
fmpoly = self.product.processInfo.DopplerRateValuesCoefficients
# need to convert units
fmpoly[1] = fmpoly[1]/rangeSamplingRate
fmpoly[2] = fmpoly[2]/rangeSamplingRate**2
fmpoly[3] = fmpoly[3]/rangeSamplingRate**3
fmpoly[4] = fmpoly[4]/rangeSamplingRate**4
self.azfmrate_coeff = fmpoly
# print("poly",poly)
# print("fmpoly",fmpoly)
# print('------------------------------------------------------')
# now calculate effective PRF from the azimuth line spacing after we have the orbit info EJF 2015/08/15
# this does not work because azimuth spacing is on ground. Instead use bandwidth ratio calculated above EJF
# SCHvelocity = self.frame.getSchVelocity()
@ -740,85 +751,46 @@ class GF3_SLC(Sensor):
print("构建新的轨道程序代码:")
tempOrbit = GGorbit()
self.frame.getOrbit().setOrbitSource('Header: ' + self.frame.getOrbit().getOrbitSource())
# stateVectors = self.product.sourceAttributes.orbitAndAttitude.orbitInformation.stateVectors
stateVectors = self.product.GPS.gpsParam
dataStartTime = self.product.imageInfo.imagingStartTime
dataStopTime = self.product.imageInfo.imagingEndTime
dataCenterTime = self.product.platform.CenterTime
startTime_s = dataStartTime.timestamp()
stopTime_s = dataStopTime.timestamp()
centerTime_s = dataCenterTime.timestamp()
num = 0
dataStartTime = self.frame.sensingStart.timestamp()
dataStopTime = self.frame.sensingStop.timestamp()
time_list = []
self.frame.getOrbit().setOrbitSource('Header: ' + self.frame.getOrbit().getOrbitSource())
stateVectors = self.product.GPS.gpsParam
for i in range(len(stateVectors)):
# print(i,stateVectors[i].timeStamp)
# tempOrbit.addvector(stateVectors[i].timeStamp.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# tempOrbit.addvector(stateVectors[i].timeStamp.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity,
# stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition)
if stateVectors[i].timeStamp>dataStartTime and stateVectors[i].timeStamp < dataStopTime:
# tempOrbit.addvector(stateVectors[i].timeStamp.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity,
# stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition)
# time_list.append(stateVectors[i].timeStamp)
time_list.append([stateVectors[i].timeStamp.timestamp(),
stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition,
stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity])
num += 1
# sv= StateVector()
# sv.setTime(stateVectors[i].timeStamp)
# sv.setPosition([stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition])
# sv.setVelocity([stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity])
# self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
# num+=1
model = ReconstructionSatelliteOrbit(time_list, starttime=centerTime_s)
time_dif = ((stopTime_s + 30) - (startTime_s - 30)) / 1000
model = ReconstructionSatelliteOrbit(time_list, starttime=dataStartTime)
time_dif = ((dataStopTime + 10) - (dataStartTime - 10)) / 1000
time = np.zeros((1000, 1))
for i in range(1000):
time[i,:]=((startTime_s - 10) + time_dif * i)
time[i,:]=((dataStartTime - 10) + time_dif * i)
t = time.reshape(-1)
statepoints = model.getSatelliteSpaceState(t)
# print("初始插值-----------------------------------------------------")
# self.frame.setSensingStart(datetime.datetime.fromtimestamp(t[2]))
# self.frame.setSensingStop(datetime.datetime.fromtimestamp(t[len(t)-3]))
self.frame.setSensingStart(dataStartTime)
self.frame.setSensingStop(dataStopTime)
diffTime = DTUtil.timeDeltaToSeconds(self.frame.sensingStop-self.frame.sensingStart)/2.0
sensingMid = self.frame.sensingStart + datetime.timedelta(microseconds=int(diffTime*1e6))
self.frame.setSensingMid(sensingMid)
# planet = self.frame.instrument.platform.planet
# orbExt = OrbitExtender(planet=planet)
# orbExt.configure()
# newOrb = orbExt.extendOrbit(tempOrbit)
# tempOrbit.createOrbit() # 构建轨道模型
# newOrb=tempOrbit.getTimeOrbits(self.frame.sensingStart.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# self.frame.sensingStop.strftime("%Y-%m-%dT%H:%M:%S.%f"),
# orbitnum=500)
# for svect in newOrb:
# sv= StateVector()
# sv.setTime(svect.UTCTime)
# sv.setPosition([svect.px,svect.py,svect.pz])
# sv.setVelocity([svect.vx,svect.vy,svect.vz])
# self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
for i, value in zip(range(len(statepoints)), statepoints):
sv= StateVector()
sv.setTime(datetime.datetime.fromtimestamp(t[i]))
sv.setPosition([value[0],value[1],value[2]])
sv.setVelocity([value[3],value[4],value[5]])
self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
# print("插值后的gps点", datetime.datetime.fromtimestamp(t[i]),value[0],value[1],value[2],value[3],value[4],value[5])
print('Orbits list len is %d' %num)
# tempOrbit.createOrbit() # 构建轨道模型
# newOrb=tempOrbit.getTimeOrbits(self.frame.sensingStart.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# self.frame.sensingStop.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# orbitnum=500)
# for svect in newOrb:
# sv= StateVector()
# sv.setTime(svect.UTCTime)
# sv.setPosition([svect.px,svect.py,svect.pz])
# sv.setVelocity([svect.vx,svect.vy,svect.vz])
# self.frame.getOrbit().addStateVector(sv)
print('Successfully read state vectors from product XML')
def extractPreciseOrbit(self, orbitfile, tstart, tend):
@ -877,7 +849,7 @@ class GF3_SLC(Sensor):
lgth = self.frame.getNumberOfLines()
# lineFlip = (self.product.imageAttributes.rasterAttributes.lineTimeOrdering.upper() == 'DECREASING')
# pixFlip = (self.product.imageAttributes.rasterAttributes.pixelTimeOrdering.upper() == 'DECREASING')
lineFlip = True
lineFlip = False
pixFlip = False
src = gdal.Open(self.tiff.strip(), gdal.GA_ReadOnly)
@ -888,7 +860,7 @@ class GF3_SLC(Sensor):
imag = src.GetRasterBand(2).ReadAsArray(0,0,width,lgth)
if (real is None) or (imag is None):
raise Exception('Input GF3 SLC seems to not be a 2 band Int16 image.')
raise Exception('Input GF3_SLC SLC seems to not be a 2 band Int16 image.')
data = real+cJ*imag
@ -938,7 +910,6 @@ class GF3_SLC(Sensor):
t0 = self.product.processInfo.DopplerParametersReferenceTime
poly = self.product.processInfo.DopplerCentroidCoefficients
fd_mid = 0.0
for kk in range(len(poly)):
fd_mid += poly[kk] * (tMid - t0)**kk
@ -952,10 +923,10 @@ class GF3_SLC(Sensor):
####For roiApp
####More accurate
from isceobj.Util import Poly1D
coeffs = poly
dr = self.frame.getInstrument().getRangePixelSize()
rref = 0.5 * Const.c * t0
# rref = Const.c * t0
r0 = self.frame.getStartingRange()
norm = 0.5*Const.c/dr
@ -963,44 +934,18 @@ class GF3_SLC(Sensor):
for ind, val in enumerate(coeffs):
dcoeffs.append( val / (norm**ind))
poly = Poly1D.Poly1D()
poly.initPoly(order=len(coeffs)-1)
poly.setMean( (rref - r0)/dr - 1.0)
poly.setCoeffs(dcoeffs)
# print("****" * 10)
# print(Const.c)
# print(rref)
# print(dr)
# print(dcoeffs)
# print(r0)
# print("****" * 10)
poly = Poly1D.Poly1D()
poly.initPoly(order=len(coeffs)-1)
poly.setMean( (rref - r0)/dr - 1.0)
poly.setCoeffs(dcoeffs)
print('getNumberOfSamples', self.frame.getNumberOfSamples())
pix = np.linspace(0, self.frame.getNumberOfSamples(), num=len(coeffs)+1)
evals = poly(pix)
fit = np.polyfit(pix,evals, len(coeffs)-1)
self.frame._dopplerVsPixel = list(fit[::-1])
# print("---- radar ------------------------------------------print")
# print("t0",t0)
# print("****" * 10)
# print('lightspeed',Const.c)
# print('rref',rref)
# print('dr',dr)
# print('dcoeff',dcoeffs)
# print('r0',r0)
# print("****" * 10)
# print('pix',pix)
# print('evals',evals)
# print('fit',fit)
# print('Doppler Fit: ', fit[::-1])
# print('---------------------------------------------------')
return quadratic

View File

@ -89,6 +89,7 @@ def saveTiff(target_data_path,xsize,ysize,gt,srs,target_arr):
driver = gdal.GetDriverByName('GTiff') # 数据类型必须有,因为要计算需要多大内存空间
tiff_geo=driver.Create(target_data_path, int(xsize)+1, int(ysize)+1, 1, gdal.GDT_Float32)
tiff_geo.GetRasterBand(1).WriteArray(target_arr)
tiff_geo.GetRasterBand(1).SetNoDataValue(-9999)
tiff_geo.SetGeoTransform(gt)
tiff_geo.SetProjection(srs.ExportToWkt())
del tiff_geo

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<Root>
<TaskID>CSAR_202107275419_0001-0</TaskID>
<WorkSpace>E:\Result_GF3\</WorkSpace>
<WorkSpace>D:\micro\WorkSpace\</WorkSpace>
<AlgCompt>
<DataTransModel>File</DataTransModel>
<Artificial>ElementAlg</Artificial>
@ -54,8 +54,8 @@
<DataType>zip</DataType>
<ParaSource>Man</ParaSource>
<ParaValue>
E:\GF3Data\AtmophericDealy\GF3_SAY_FSI_001614_E113.2_N34.5_20161129_L1A_HHHV_L10002015686.tar.gz;
E:\GF3Data\AtmophericDealy\GF3_KAS_FSI_002034_E113.4_N34.7_20161228_L1A_HHHV_L10002077539.tar.gz
D:\micro\microproduct_depdence\GF3-Deformation\download\cls\GF3_SAY_FSI_001614_E113.2_N34.5_20161129_L1A_HHHV_L10002015686.tar.gz;
D:\micro\microproduct_depdence\GF3-Deformation\download\cls\GF3_KAS_FSI_002034_E113.4_N34.7_20161228_L1A_HHHV_L10002077539.tar.gz
</ParaValue>
<EnModification>True</EnModification>
<EnMultipleChoice>False</EnMultipleChoice>
@ -84,9 +84,9 @@
<ParaChsName>高程数据路径</ParaChsName>
<Description>高程数据数据。数据来源:30米 ASTGTM2, 数据格式tif。备注数据的经纬度范围必须是整数</Description>
<ParaType>File</ParaType>
<DataType>zip</DataType>
<DataType>File</DataType>
<ParaSource>Man</ParaSource>
<ParaValue>E:\GF3Data\Dem-c-sar\CASR_dem_ASTGTM2_N34E113_dem.zip;E:\GF3Data\Dem-c-sar\CASR_dem_ASTGTM2_N34E114_dem.zip;E:\GF3Data\Dem-c-sar\CASR_dem_ASTGTM2_N35E113_dem.zip;E:\GF3Data\Dem-c-sar\CASR_dem_ASTGTM2_N35E114_dem.zip</ParaValue>
<ParaValue>D:\micro\microproduct_depdence\GF3-Deformation\dem</ParaValue>
<EnModification>True</EnModification>
<EnMultipleChoice>False</EnMultipleChoice>
<Control>File</Control>
@ -120,7 +120,7 @@
<ParaType>File</ParaType>
<DataType>tar.gz</DataType>
<ParaSource>Cal</ParaSource>
<ParaValue>E:\Result_GF3\Dem\Output\GF3_SAY_FSI_001614_E113.2_N34.5_20161129_L1A_HHHV_L10002015686-DEM.tar.gz</ParaValue>
<ParaValue>D:\micro\WorkSpace\Dem\Output\GF3_SAY_FSI_001614_E113.2_N34.5_20161129_L1A_HHHV_L10002015686-DEM.tar.gz</ParaValue>
</Parameter>
</Outputs>
</AlgCompt>

View File

@ -234,15 +234,6 @@ class Orbit(Component):
self._orbitSource = source or None
self._referenceFrame = None
self._stateVectors.configure()
""" 自定义 """
self.oribitStartTime = None
self.A_arr = None
self.polynum = None
""" 多普勒参数"""
self.refrenceTime = None
self.dopperPoly = []
""" 卫星名称"""
self.sessionMode = None
#self._stateVectors = stateVectors or []
self._cpStateVectors = []
type(self._stateVectors)
@ -269,69 +260,6 @@ class Orbit(Component):
# #pack the orbit into stateVectors
# self._packOrbit(cpStateVectors[0], cpStateVectors[1], cpStateVectors[2], cpStateVectors[3])
def setsessionMode(self, SessionMode):
self.sessionMode = SessionMode
def setPolyParams(self, polynum, orbitStartTime, A_arr):
self.polynum = polynum
self.oribitStartTime = orbitStartTime
self.A_arr = A_arr
def setDoppler(self, refrenceTime, dopperPoly):
self.refrenceTime = refrenceTime
self.dopperPoly = dopperPoly
pass
def getSatelliteSpaceState(self, time_float_datetime):
'''
逐像素求解
根据时间戳返回对应时间的卫星的轨迹状态会自动计算与起算时间之差
args:
time_float:时间戳
return
State_list:[time,Xp,Yp,Zp,Vx,Vy,Vz]
'''
time_float = time_float_datetime.timestamp()
time_float = time_float - self.oribitStartTime
#
px = 0
py = 0
pz = 0
vx = 0
vy = 0
vz = 0
for ii in range(self.polynum):
px += self.A_arr[ii][0] * time_float ** ii
py += self.A_arr[ii][1] * time_float ** ii
pz += self.A_arr[ii][2] * time_float ** ii
vx += self.A_arr[ii][3] * time_float ** ii
vy += self.A_arr[ii][4] * time_float ** ii
vz += self.A_arr[ii][5] * time_float ** ii
sv = StateVector()
sv.setTime(time_float_datetime)
sv.setPosition([px, py, pz])
sv.setVelocity([vx, vy, vz])
return sv
def getTimeOrbits(self, UTCStartTime, UTCEndTime, orbitnum=1000):
#
startTime_stamp = datetime.datetime.strptime(UTCStartTime, "%Y-%m-%dT%H:%M:%S.%f") - datetime.timedelta(
seconds=30)
endTime_stamp = datetime.datetime.strptime(UTCEndTime, "%Y-%m-%dT%H:%M:%S.%f") + datetime.timedelta(seconds=30)
if startTime_stamp > endTime_stamp:
raise
delta_t = (endTime_stamp.timestamp() - startTime_stamp.timestamp()) / orbitnum
extractOrbits = []
#
temptime = startTime_stamp
while temptime < endTime_stamp:
temptime = temptime + datetime.timedelta(seconds=delta_t)
newOrbit = self.getSatelliteSpaceState(temptime)
extractOrbits.append(newOrbit)
newOrbit = self.getSatelliteSpaceState(endTime_stamp)
extractOrbits.append(newOrbit)
return extractOrbits # 扩展的轨道节点
def adaptToRender(self):
import copy
# make a copy of the stateVectors to restore it after dumping
@ -448,11 +376,10 @@ class Orbit(Component):
@raises NotImplementedError: if the desired interpolation method
cannot be decoded
"""
if self.sessionMode is None:
if time not in self:
raise ValueError(
"Time stamp (%s) falls outside of the interpolation interval [%s:%s]" % (
time, self.minTime, self.maxTime)
"Time stamp (%s) falls outside of the interpolation interval [%s:%s]" %
(time,self.minTime,self.maxTime)
)
if method == 'linear':
@ -466,13 +393,9 @@ class Orbit(Component):
"Orbit interpolation type %s, is not implemented" % method
)
return newSV
elif self.sessionMode == "GF3" or self.sessionMode == "GF3B" or self.sessionMode == "GF3C":
print("GF3轨道插值")
return self.getSatelliteSpaceState(time)
## Isn't orbit redundant? -compute the method based on name
def interpolate(self, time, method='linear'):
if self.sessionMode is None:
if time not in self:
raise ValueError("Time stamp (%s) falls outside of the interpolation interval [%s:%s]"
% (time,self.minTime,self.maxTime))
@ -483,9 +406,6 @@ class Orbit(Component):
raise NotImplementedError(
"Orbit interpolation type %s, is not implemented" % method
)
elif self.sessionMode == "GF3" or self.sessionMode == "GF3B" or self.sessionMode == "GF3C":
print("GF3轨道插值")
return self.getSatelliteSpaceState(time)
# interpolateOrbit = interpolate
@ -1078,7 +998,7 @@ class Orbit(Component):
pointOnGround = rdr2geo
def geo2rdr(self, llh, side=-1, planet=None,
doppler=None, wvl=None, isLT1AB=True):
doppler=None, wvl=None):
'''
Takes a lat, lon, height triplet and returns azimuth time and range.
Assumes zero doppler for now.
@ -1094,79 +1014,16 @@ class Orbit(Component):
refElp = Planet(pname='Earth').ellipsoid
else:
refElp = planet.ellipsoid
# print('llh', llh)
xyz = refElp.llh_to_xyz(llh)
delta = (self.maxTime - self.minTime).total_seconds() * 0.5
tguess = self.minTime # + datetime.timedelta(seconds = delta)
# print("Orbits.py 1024-----------------------------------------------")
# print("self.maxTime", self.maxTime)
# print("self.minTime", self.minTime)
# print(delta)
# print(tguess)
LIGHTSPEED = 299792458
if wvl == 0:
isLT1AB = False
if isLT1AB and (self.sessionMode == "GF3" or self.sessionMode == "GF3B" or self.sessionMode == "GF3C"): # 专门针对 LT1AB
print("LT1AB orbit.....")
dt = 0.0001
outOfBounds = False
for ii in range(51):
try:
sv = self.getSatelliteSpaceState(tguess + datetime.timedelta(seconds=dt)) # 获取卫星的 位置、速度
except Exception as e:
print(e)
outOfBounds = True
break
pos1 = np.array(sv.getPosition()) # 卫星坐标
vel1 = np.array(sv.getVelocity()) # 卫星速度
dr1 = pos1 - xyz
rng1 = np.linalg.norm(dr1) # 斜距
# ((R_s1.array() * V_s1.array()).rowwise().sum().array() * (-2) / (R * this->lamda))[0];
FdTheory1 = -2 / (rng1 * wvl) * np.dot(dr1, vel1)
try:
sv = self.getSatelliteSpaceState(tguess)
except Exception as e:
print(e)
outOfBounds = True
break
pos2 = np.array(sv.getPosition()) # 卫星坐标
vel2 = np.array(sv.getVelocity()) # 卫星速度
dr2 = pos2 - xyz
rng = np.linalg.norm(dr2) # 斜距
FdTheory2 = -2 / (rng * wvl) * np.dot(dr2, vel2)
TSR = rng * 2 / LIGHTSPEED - self.refrenceTime # nx1
FdNumerical = 0
# FdNumerical=FdNumerical+self.dopperPoly[0]*TSR**0
# FdNumerical=FdNumerical+self.dopperPoly[1]*TSR**1
# FdNumerical=FdNumerical+self.dopperPoly[2]*TSR**2
# FdNumerical=FdNumerical+self.dopperPoly[3]*TSR**3
fdopper_grad = (FdTheory1 - FdTheory2) / dt
inc_t = (FdTheory2 - FdNumerical) / fdopper_grad
# print(inc_t,rng,FdNumerical,FdTheory2,tguess,pos2)
tguess = tguess - datetime.timedelta(seconds=inc_t)
if abs(inc_t) < 1e-6:
break
else:
t_prev_guess = tguess
# print(outOfBounds)
# print("end ------------------------------------------------------------\n")
if outOfBounds:
raise Exception('Interpolation time out of bounds')
else:
tguess = self.minTime + datetime.timedelta(seconds = delta)
outOfBounds = False
for ii in range(51):
try:
sv = self.interpolateOrbit(tguess, method='hermite')
except Exception as e:
if self.sessionMode == "LT1A" or self.sessionMode == "LT1B":
sv = self.getSatelliteSpaceState(tguess) # 获取卫星的 位置、速度
print(e)
outOfBounds = True
break
@ -1174,100 +1031,27 @@ class Orbit(Component):
pos = np.array(sv.getPosition())
vel = np.array(sv.getVelocity())
# print("xyz", xyz)
# print("pos", pos)
dr = xyz-pos
rng = np.linalg.norm(dr) # 求斜距
# print("rng", rng)
dopfact = np.dot(dr, vel) # fd 公式
# print("dopfact", dopfact)
rng = np.linalg.norm(dr)
dopfact = np.dot(dr,vel)
fdop = doppler(DTU.seconds_since_midnight(tguess),rng) * wvl * 0.5
# print("doppler", doppler(DTU.seconds_since_midnight(tguess),rng))
# print("wvl", wvl)
print("fdop", fdop)
fdopder = (0.5*wvl*doppler(DTU.seconds_since_midnight(tguess),rng+10.0) - fdop) / 10.0
# print("doppler2", doppler(DTU.seconds_since_midnight(tguess),rng+10.0))
print("fdopder", fdopder)
fn = dopfact - fdop * rng
c1 = -np.dot(vel, vel)
c2 = (fdop/rng + fdopder)
# print("c1", c1)
# print("c2", c2)
fnprime = c1 + c2 * dopfact
# print("时间为", fn/fnprime)
# if abs(fn/fnprime) > 1:
# break
tguess = tguess - datetime.timedelta(seconds = fn/fnprime)
# print("输出的tguess", tguess)
# print(outOfBounds)
print("end ------------------------------------------------------------\n")
if abs(fn/fnprime) < 1e-6:
break
if outOfBounds:
raise Exception('Interpolation time out of bounds')
return tguess, rng
# def geo2rdr(self, llh, side=-1, planet=None,
# doppler=None, wvl=None):
# '''
# Takes a lat, lon, height triplet and returns azimuth time and range.
# Assumes zero doppler for now.
# '''
# from isceobj.Planet.Planet import Planet
# from isceobj.Util.Poly2D import Poly2D
# if doppler is None:
# doppler = Poly2D()
# doppler.initPoly(azimuthOrder=0, rangeOrder=0, coeffs=[[0.]])
# wvl = 0.0
#
# if planet is None:
# refElp = Planet(pname='Earth'). ellipsoid
# else:
# refElp = planet.ellipsoid
#
# xyz = refElp.llh_to_xyz(llh)
#
# delta = (self.maxTime - self.minTime).total_seconds() * 0.5
# tguess = self.minTime + datetime.timedelta(seconds = delta)
# outOfBounds = False
# # Start the previous guess tracking with dummy value
# t_prev_guess = tguess + datetime.timedelta(seconds=10)
# for ii in range(51):
# try:
# sv = self.interpolateOrbit(tguess, method='hermite')
# except:
# outOfBounds = True
# break
#
# pos = np.array(sv.getPosition())
# vel = np.array(sv.getVelocity())
#
# dr = xyz-pos
# rng = np.linalg.norm(dr)
#
# dopfact = np.dot(dr,vel)
# fdop = doppler(DTU.seconds_since_midnight(tguess),rng) * wvl * 0.5
# fdopder = (0.5*wvl*doppler(DTU.seconds_since_midnight(tguess),rng+10.0) - fdop) / 10.0
#
# fn = dopfact - fdop * rng
# c1 = -np.dot(vel, vel)
# c2 = (fdop/rng + fdopder)
#
# fnprime = c1 + c2 * dopfact
#
# tguess = tguess - datetime.timedelta(seconds = fn/fnprime)
# if abs(tguess - t_prev_guess).total_seconds() < 5e-9:
# break
# else:
# t_prev_guess = tguess
#
# if outOfBounds:
# raise Exception('Interpolation time out of bounds')
#
# return tguess, rng
def exportToC(self, reference=None):
from isceobj.Util import combinedlibmodule

View File

@ -27,9 +27,13 @@
# Author: Walter Szeliga
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from xml.etree.ElementTree import ElementTree
import datetime
import isceobj
import copy
from isceobj.Scene.Frame import Frame
from isceobj.Planet.Planet import Planet
from isceobj.Orbit.Orbit import StateVector, Orbit
@ -38,16 +42,8 @@ from isceobj.Planet.AstronomicalHandbook import Const
from iscesys.Component.Component import Component
from iscesys.DateTimeUtil.DateTimeUtil import DateTimeUtil as DTUtil
import os
import copy
import scipy.sparse as ss
from concurrent.futures._base import as_completed, wait
from concurrent.futures.thread import ThreadPoolExecutor
from multiprocessing import Pool
import math
import datetime
from math import sin,cos
from scipy.optimize import leastsq
import numpy as np
sep = "\n"
tab = " "
lookMap = { 'R': -1,
@ -59,7 +55,7 @@ TIFF = Component.Parameter(
default='',
type=str,
mandatory=True,
doc='GF3 tiff imagery file'
doc='GF3_SLC tiff imagery file'
)
XML = Component.Parameter(
@ -68,7 +64,7 @@ XML = Component.Parameter(
default='',
type=str,
mandatory=True,
doc='GF3 xml metadata file'
doc='GF3_SLC xml metadata file'
)
ORBIT_DIRECTORY = Component.Parameter(
@ -77,7 +73,7 @@ ORBIT_DIRECTORY = Component.Parameter(
default=None,
type=str,
mandatory=False,
doc='Directory with GF3 precise orbits')
doc='Directory with GF3_SLC precise orbits')
ORBIT_FILE = Component.Parameter(
'orbitFile',
@ -95,40 +91,87 @@ from .Sensor import Sensor
# 这里采用《Insar原理和应用 》刘国祥著中基于空间定位的轨道参数计算方法一章中的内容Gabriel and Goldstein
# 注意为了方便计算,采用基准时间的方法
######################################################
import math
import datetime
import time
import scipy as sp
from math import sin,cos
from scipy.optimize import leastsq
import numpy as np
def FindInfomationFromJson(HeaderFile_dom_json, node_path_list):
"""
在Json文件中按照指定路径解析出制定节点
"""
result_node = HeaderFile_dom_json
for nodename in node_path_list:
result_node = result_node[nodename]
return result_node
########
# 函数列表
########
def poly1dfunc(p,x): # 一次函数
k,b=p
return k*x+b
def poly2dfunc(p,x): # 二次函数
k1,k2,b=p
return b+k1*x+k2*x*x
def GetVectorNorm(Vecter):
"""
得到向量的模
"""
Vecter = Vecter.reshape(-1,1)
Vecter_Norm_pow = np.matmul(Vecter.T,Vecter)
return np.sqrt(Vecter_Norm_pow)
def poly3dfunc(p,x):
k1,k2,k3,b=p
return b+k1*x+k2*x*x+k3*x*x*x
def poly4dfunc(p,x):
k1,k2,k3,k4,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4
def XYZOuterM2(A, B):
"""
外积叉乘,日后版本换成可以任意维度的外积运算方程
args:
A:nx3
B:nx3
"""
cnt = A.shape[0]
C = np.zeros((cnt, 3))
C[:, 0] = A[:, 1] * B[:, 2] - A[:, 2] * B[:, 1]
C[:, 1] = A[:, 2] * B[:, 0] - A[:, 0] * B[:, 2]
C[:, 2] = A[:, 0] * B[:, 1] - A[:, 1] * B[:, 0]
return C
def poly5dfunc(p,x):
k1,k2,k3,k4,k5,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4+k5*x**5
def poly1derror(p,x,y):
return poly1dfunc(p,x)-y
def poly2derror(p,x,y):
return poly2dfunc(p,x)-y
def poly3derror(p,x,y):
return poly3dfunc(p,x)-y
def poly4derror(p,x,y):
return poly4dfunc(p,x)-y
def poly5derror(p,x,y):
return poly5dfunc(p,x)-y
class orbitVector:
def __init__(self,UTCTimes,vx,vy,vz,px,py,pz,dateformat="%Y-%m-%dT%H:%M:%S.%fZ"):
self.UTCTime=datetime.datetime.strptime(UTCTimes,dateformat) # 字符串转UTC时间
self.time_stamp=self.UTCTime.timestamp() # 时间戳
self.vx=vx
self.vy=vy
self.vz=vz
self.px=px
self.py=py
self.pz=pz
self.orbitVector2GG() # 将坐标进行变换
self.Check()
pass
def orbitVector2GG(self):
Cx=self.py*self.vz-self.pz*self.vy
Cy=self.pz*self.vx-self.px*self.vz
Cz=self.px*self.vy-self.py*self.vx
C=(Cx**2+Cy**2+Cz**2)**0.5
self.rho=(self.px**2+self.py**2+self.pz**2)**0.5
self.I=math.acos(Cz/C)
self.omega=math.asin(self.pz/(self.rho*math.sin(self.I)))
self.Omega=math.atan(-Cx/Cy)
return [self.rho,self.I,self.omega,self.Omega]
def Check(self):
rho=self.rho
I=self.I
omega=self.omega
Omega=self.Omega
Xp=-rho*(cos(omega)*cos(Omega)-sin(omega)*sin(Omega)*cos(I))
Yp=-rho*(cos(omega)*sin(Omega)+sin(omega)*cos(Omega)*cos(I))
Zp=rho*sin(omega)*sin(I)
print("计算插值:",self.UTCTime,self.px,self.py,self.pz,self.vx,self.vy,self.vz,"|",Xp-self.px,Yp-self.py,Zp-self.pz)
class SatelliteOrbit(object):
@ -164,160 +207,6 @@ class SatelliteOrbit(object):
return None
# class SatelliteOrbitFitPoly(SatelliteOrbit):
# '''
# 继承于SatelliteOribit类为拟合多项式实现方法
# '''
#
# def __init__(self) -> None:
# super().__init__()
# self.modelName="多项式"
# self.polynum=4
#
# def ReconstructionSatelliteOrbit(self, GPSPoints_list, starttime):
# if len(GPSPoints_list)==2:
# self.polynum=1
# self.starttime = starttime
#
# record_count = len(GPSPoints_list)
# time_arr = np.zeros((record_count, 1), dtype=np.float64) # 使用np.float64只是为了精度高些如果32位也能满足需求请用32位
# state_arr = np.zeros((record_count, 6), dtype=np.float64)
# A_arr = np.zeros((self.polynum+1, 6), dtype=np.float64) # 四次项
# X=np.ones((record_count,self.polynum+1),dtype=np.float64) # 记录时间坐标
# # 将点记录转换为自变量矩阵、因变量矩阵
#
# for i in range(record_count):
# GPSPoint = GPSPoints_list[i]
# time_ = GPSPoint[0] - self.starttime # 为了保证精度,对时间进行缩放
# X[i,:]=np.array([1,time_])
# state_arr[i, :] = np.array(GPSPoint[1:],dtype=np.float64).reshape(1,6) # 空间坐标
# self.model_f=[]
# for i in range(6):
# Y = state_arr[:, i].reshape(-1,1)
# A_arr[:,i]=np.matmul(np.matmul(np.linalg.inv(np.matmul(X.T,X)),X.T),Y)[:,0]
#
# self.A_arr=copy.deepcopy(A_arr.copy())
# return self.A_arr
# elif len(GPSPoints_list) > 6:
# self.polynum=4
# # 多项式的节点数理论上是超过5个可以起算这里为了精度选择10个点起算。
# # 多项式 XA=Y ==> A=(X'X)^X'Y其中 A 为待求系数X为变量Y为因变量
# # 这里使用三次项多项式共有6组参数。
# # 声明自变量,因变量,系数矩阵
# self.starttime = starttime
#
# record_count = len(GPSPoints_list)
# time_arr = np.zeros((record_count, 1), dtype=np.float64) # 使用np.float64只是为了精度高些如果32位也能满足需求请用32位
# state_arr = np.zeros((record_count, 6), dtype=np.float64)
# A_arr = np.zeros((self.polynum+1, 6), dtype=np.float64) # 四次项
# X=np.ones((record_count,self.polynum+1),dtype=np.float64) # 记录时间坐标
# # 将点记录转换为自变量矩阵、因变量矩阵
#
# for i in range(record_count):
# GPSPoint = GPSPoints_list[i]
# time_ = GPSPoint[0] - self.starttime # 为了保证精度,对时间进行缩放
# X[i,:]=np.array([1,time_,time_**2,time_**3,time_**4])
# state_arr[i, :] = np.array(GPSPoint[1:],dtype=np.float64).reshape(1,6) # 空间坐标
# self.model_f=[]
# for i in range(6):
# Y = state_arr[:, i].reshape(-1,1)
# A_arr[:,i]=np.matmul(np.matmul(np.linalg.inv(np.matmul(X.T,X)),X.T),Y)[:,0]
#
# self.A_arr=copy.deepcopy(A_arr.copy())
# ''' 测试误差
# from matplotlib import pyplot
# label_list=['x','y','z','vx','vy','vz']
# color_list=['r','g','b','gold','gray','pink']
# pyplot.figure()
# for i in range(6):
# Y = state_arr[:, i]
# Y_predict=self.model_f[i](X)
# pyplot.subplot(int("23{}".format(i+1)))
# d=Y-Y_predict
# pyplot.plot(X,d,label=label_list[i],color=color_list[i])
# pyplot.title("max:{}".format(np.max(d)))
# #self.model_f.append(interpolate.interp1d(X,Y,kind='cubic',fill_value='extrapolate'))
# pyplot.legend()
# pyplot.show()
# '''
# return self.A_arr
# else:
# self.A_arr = None
# return None
#
# def SatelliteSpaceState(self, time_float):
# '''
# 逐像素求解
# 根据时间戳,返回对应时间的卫星的轨迹状态,会自动计算与起算时间之差
# args:
# time_float:时间戳
# return
# State_list:[time,Xp,Yp,Zp,Vx,Vy,Vz]
# '''
# if self.model_f is None:
# return None
#
# result_arr=np.zeros((1,7))
#
# time_float = time_float - self.starttime
# result_arr[0,0]=time_float
# #time_arr[0, 4] = time_arr[0, 3] * time_float ** 4
# time_float=np.array([1,time_float,time_float**2,time_float**3,time_float**4]).reshape(1,5)
# result_arr=np.matmul(time_float,self.A_arr)
# return [time_float,result_arr]
#
# def getSatelliteSpaceState(self, time_array):
# '''
# 矩阵求解
# 根据时间戳矩阵,返回对应时刻的卫星空间状态(位置,速度),且会自动计算与起算时间之差
# args:
# time_array:nparray nx1 时间戳
# return:
# SatellitSpaceStateArray:nparray nx6 状态信息
# '''
# if self.model_f is None:
# return None # 返回None,表示没有结果
# if self.polynum==4:
# n=time_array.shape[0]
# result_arr_=np.zeros((n,6),dtype=np.float64)
# time_float = time_array - self.starttime
# time_float=time_float.reshape(-1) # nx1
# time_arr=np.ones((time_float.shape[0],5)) # nx5
# time_arr[:,1]=time_float
# time_arr[:,2]=time_float**2
# time_arr[:,3]=time_float**3
# time_arr[:,4]=time_float**4
# result_arr_=np.matmul(time_arr,self.A_arr) # nx5 5x6
# #time_arr[0, 4] = time_arr[0, 3] * time_float ** 4
# #result_arr=result_arr_
# return result_arr_ # 位置矩阵
# else:
# n=time_array.shape[0]
# result_arr_=np.zeros((n,6),dtype=np.float64)
# time_float = time_array - self.starttime
# time_float=time_float.reshape(-1) # nx1
# time_arr=np.ones((time_float.shape[0],self.polynum+1)) # nx5
# time_arr[:,1]=time_float
# result_arr_=np.matmul(time_arr,self.A_arr) # nx5 5x6
# #time_arr[0, 4] = time_arr[0, 3] * time_float ** 4
# #result_arr=result_arr_
# return result_arr_ # 位置矩阵
# def ReconstructionSatelliteOrbit(GPSPoints_list, starttime):
# '''
# 构建卫星轨道
# args:
# GPSPoints_list:卫星轨道点
# starttime:起算时间
# '''
#
# SatelliteOrbitModel = SatelliteOrbitFitPoly()
# if SatelliteOrbitModel.ReconstructionSatelliteOrbit(GPSPoints_list, starttime=starttime) is None:
# return None
# return SatelliteOrbitModel
class SatelliteOrbitFitPoly(SatelliteOrbit):
'''
继承于SatelliteOribit类为拟合多项式实现方法
@ -353,6 +242,7 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
self.A_arr=copy.deepcopy(A_arr.copy())
return self.A_arr
elif len(GPSPoints_list) > 6:
self.polynum=4
# 多项式的节点数理论上是超过5个可以起算这里为了精度选择10个点起算。
# 多项式 XA=Y ==> A=(X'X)^X'Y其中 A 为待求系数X为变量Y为因变量
# 这里使用三次项多项式共有6组参数。
@ -362,21 +252,37 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
record_count = len(GPSPoints_list)
time_arr = np.zeros((record_count, 1), dtype=np.float64) # 使用np.float64只是为了精度高些如果32位也能满足需求请用32位
state_arr = np.zeros((record_count, 6), dtype=np.float64)
A_arr = np.zeros((self.polynum, 6), dtype=np.float64) # 四次项
X = np.ones((record_count, self.polynum), dtype=np.float64) # 记录时间坐标
A_arr = np.zeros((self.polynum+1, 6), dtype=np.float64) # 四次项
X=np.ones((record_count,self.polynum+1),dtype=np.float64) # 记录时间坐标
# 将点记录转换为自变量矩阵、因变量矩阵
for i in range(record_count):
GPSPoint = GPSPoints_list[i]
time_ = GPSPoint[0] - self.starttime # 为了保证精度,对时间进行缩放
X[i, :] = np.array(list(map(lambda ii: time_ ** ii, range(self.polynum))))
X[i,:]=np.array([1,time_,time_**2,time_**3,time_**4])
state_arr[i, :] = np.array(GPSPoint[1:],dtype=np.float64).reshape(1,6) # 空间坐标
self.model_f=[]
for i in range(6):
Y = state_arr[:, i].reshape(-1,1)
A_arr[:,i]=np.matmul(np.matmul(np.linalg.inv(np.matmul(X.T,X)),X.T),Y)[:,0]
self.A_arr = A_arr.copy()
self.A_arr=copy.deepcopy(A_arr.copy())
''' 测试误差
from matplotlib import pyplot
label_list=['x','y','z','vx','vy','vz']
color_list=['r','g','b','gold','gray','pink']
pyplot.figure()
for i in range(6):
Y = state_arr[:, i]
Y_predict=self.model_f[i](X)
pyplot.subplot(int("23{}".format(i+1)))
d=Y-Y_predict
pyplot.plot(X,d,label=label_list[i],color=color_list[i])
pyplot.title("max:{}".format(np.max(d)))
#self.model_f.append(interpolate.interp1d(X,Y,kind='cubic',fill_value='extrapolate'))
pyplot.legend()
pyplot.show()
'''
return self.A_arr
else:
self.A_arr = None
@ -429,8 +335,8 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
def getTimeOrbits(self,UTCStartTime,UTCEndTime,orbitnum=1000):
#
startTime_stamp = datetime.datetime.strptime(UTCStartTime, "%Y-%m-%dT%H:%M:%S.%f").timestamp() - 1
endTime_stamp = datetime.datetime.strptime(UTCEndTime, "%Y-%m-%dT%H:%M:%S.%f").timestamp() + 1
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()-10
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()+10
if startTime_stamp>endTime_stamp:
raise
delta_t=(endTime_stamp-startTime_stamp)/orbitnum
@ -445,6 +351,42 @@ class SatelliteOrbitFitPoly(SatelliteOrbit):
extractOrbits.append(newOrbit)
return extractOrbits # 扩展的轨道节点
def getSatelliteSpaceState(self, time_array):
'''
矩阵求解
根据时间戳矩阵返回对应时刻的卫星空间状态位置速度且会自动计算与起算时间之差
args:
time_array:nparray nx1 时间戳
return:
SatellitSpaceStateArray:nparray nx6 状态信息
'''
if self.model_f is None:
return None # 返回None,表示没有结果
if self.polynum==4:
n=time_array.shape[0]
result_arr_=np.zeros((n,6),dtype=np.float64)
time_float = time_array - self.starttime
time_float=time_float.reshape(-1) # nx1
time_arr=np.ones((time_float.shape[0],5)) # nx5
time_arr[:,1]=time_float
time_arr[:,2]=time_float**2
time_arr[:,3]=time_float**3
time_arr[:,4]=time_float**4
result_arr_=np.matmul(time_arr,self.A_arr) # nx5 5x6
#time_arr[0, 4] = time_arr[0, 3] * time_float ** 4
#result_arr=result_arr_
return result_arr_ # 位置矩阵
else:
n=time_array.shape[0]
result_arr_=np.zeros((n,6),dtype=np.float64)
time_float = time_array - self.starttime
time_float=time_float.reshape(-1) # nx1
time_arr=np.ones((time_float.shape[0],self.polynum+1)) # nx5
time_arr[:,1]=time_float
result_arr_=np.matmul(time_arr,self.A_arr) # nx5 5x6
#time_arr[0, 4] = time_arr[0, 3] * time_float ** 4
#result_arr=result_arr_
return result_arr_ # 位置矩阵
def ReconstructionSatelliteOrbit(stateVectors, starttime):
'''
@ -453,24 +395,24 @@ def ReconstructionSatelliteOrbit(stateVectors, starttime):
GPSPoints_list:卫星轨道点
starttime:起算时间
'''
GPSPoint_list = []
for sv in stateVectors:
GPSPoint = [sv.timeStamp.timestamp(),
sv.xPosition,
sv.yPosition,
sv.zPosition,
sv.xVelocity,
sv.yVelocity,
sv.zVelocity
]
GPSPoint_list.append(GPSPoint)
# GPSPoint_list=[]
# for sv in stateVectors:
# GPSPoint=[sv.timeStamp.timestamp(),
# sv.xPosition,
# sv.yPosition,
# sv.zPosition,
# sv.xVelocity,
# sv.yVelocity,
# sv.zVelocity
# ]
# GPSPoint_list.append(GPSPoint)
SatelliteOrbitModel = SatelliteOrbitFitPoly()
if SatelliteOrbitModel.ReconstructionSatelliteOrbit(GPSPoint_list, starttime=starttime) is None:
if SatelliteOrbitModel.ReconstructionSatelliteOrbit(stateVectors, starttime=starttime) is None:
return None
print("orbit test")
distance=[]
for gpsPoint in GPSPoint_list:
for gpsPoint in stateVectors:
temp_sv=SatelliteOrbitModel.SatelliteSpaceState(gpsPoint[0])
sv=np.array(temp_sv[1])
temp_distance=sv-gpsPoint[1:]
@ -480,82 +422,6 @@ def ReconstructionSatelliteOrbit(stateVectors, starttime):
print("orbit min:",np.min(distance))
return SatelliteOrbitModel
########
# 函数列表
########
def poly1dfunc(p,x): # 一次函数
k,b=p
return k*x+b
def poly2dfunc(p,x): # 二次函数
k1,k2,b=p
return b+k1*x+k2*x*x
def poly3dfunc(p,x):
k1,k2,k3,b=p
return b+k1*x+k2*x*x+k3*x*x*x
def poly4dfunc(p,x):
k1,k2,k3,k4,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4
def poly5dfunc(p,x):
k1,k2,k3,k4,k5,b=p
return b+k1*x+k2*x**2+k3*x**3+k4*x**4+k5*x**5
def poly1derror(p,x,y):
return poly1dfunc(p,x)-y
def poly2derror(p,x,y):
return poly2dfunc(p,x)-y
def poly3derror(p,x,y):
return poly3dfunc(p,x)-y
def poly4derror(p,x,y):
return poly4dfunc(p,x)-y
def poly5derror(p,x,y):
return poly5dfunc(p,x)-y
class orbitVector:
def __init__(self,UTCTimes,vx,vy,vz,px,py,pz,dateformat="%Y-%m-%dT%H:%M:%S.%f"):
self.UTCTime=datetime.datetime.strptime(UTCTimes,dateformat) # 字符串转UTC时间
self.time_stamp=self.UTCTime.timestamp() # 时间戳
self.vx=vx
self.vy=vy
self.vz=vz
self.px=px
self.py=py
self.pz=pz
self.orbitVector2GG() # 将坐标进行变换
self.Check()
pass
def orbitVector2GG(self):
Cx=self.py*self.vz-self.pz*self.vy # 叉乘
Cy=self.pz*self.vx-self.px*self.vz
Cz=self.px*self.vy-self.py*self.vx
C=(Cx**2+Cy**2+Cz**2)**0.5
self.rho=(self.px**2+self.py**2+self.pz**2)**0.5
self.I=math.acos(Cz/C)
self.omega=math.asin(self.pz/(self.rho*math.sin(self.I)))
self.Omega=math.atan(Cx*(-1)/Cy)
return [self.rho,self.I,self.omega,self.Omega]
def Check(self):
rho=self.rho
I=self.I
omega=self.omega
Omega=self.Omega
Xp=rho*(cos(omega)*cos(Omega)-sin(omega)*sin(Omega)*cos(I))
Yp=rho*(cos(omega)*sin(Omega)+sin(omega)*cos(Omega)*cos(I))
Zp=rho*sin(Omega)*sin(I)
print("计算插值:",self.UTCTime,self.px,self.py,self.pz,self.vx,self.vy,self.vz,"|",abs(Xp)-abs(self.px),abs(Yp)-abs(self.py),abs(Zp)-abs(self.pz))
class SARorbit(object):
# 作为自定义轨道计算基类
# 定义几个基本方法addvector(),createOrbit(),getTime(),getTimes()
@ -579,13 +445,13 @@ class SARorbit(object):
return None
def getTimeOrbitStamp(self,StampTime):
utcStr=datetime.datetime.fromtimestamp(StampTime).strftime("%Y-%m-%dT%H:%M:%S.%f")
utcStr=datetime.datetime.fromtimestamp(StampTime).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
return self.getTimeOrbit(utcStr)
def getTimeOrbits(self,UTCStartTime,UTCEndTime,orbitnum=100):
#
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()-0.2
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()+0.2
startTime_stamp=datetime.datetime.strptime(UTCStartTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()-10
endTime_stamp=datetime.datetime.strptime(UTCEndTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()+10
if startTime_stamp>endTime_stamp:
raise
delta_t=(endTime_stamp-startTime_stamp)*1000/orbitnum
@ -652,7 +518,7 @@ class GGorbit(SARorbit):
# 获取计算结果
def getTimeOrbit(self,UTCTime):
staptime=datetime.datetime.strptime(UTCTime,"%Y-%m-%dT%H:%M:%S.%f").timestamp()
staptime=datetime.datetime.strptime(UTCTime,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()
dtime=0.0001
[Xp,Yp,Zp]=self.getXYZ(staptime)
[Xp_temp,Yp_temp,Zp_temp]=self.getXYZ(staptime+dtime)
@ -710,7 +576,7 @@ class polyorbit(SARorbit):
class GF3_SLC(Sensor):
"""
A Class representing GF3 data
A Class representing GF3_SLC data
"""
family='GF3_SLC'
@ -762,12 +628,15 @@ class GF3_SLC(Sensor):
# azimuthPixelSize = self.product.imageAttributes.rasterAttributes.sampledLineSpacing # ground spacing in meters
totalProcessedAzimuthBandwidth = self.product.imageInfo.eqvPRF
prf = self.product.imageInfo.eqvPRF # effective PRF can be double original, suggested by Piyush
prf_s = ori_prf * np.ceil(totalProcessedAzimuthBandwidth / ori_prf) # effective PRF can be double original, suggested by Piyush
# print("effective PRF %f, original PRF %f" % (prf, orig_prf) )
print('----------------------------------------------------')
print("mission",mission)
print("swath",swath)
print("frequency",frequency)
print("ori_prf",ori_prf)
print("prf",prf)
print("prf_s",prf_s)
print("rangePixelSize",rangePixelSize)
print("rangeSamplingRate",rangeSamplingRate)
print("pulseLength",pulseLength)
@ -800,7 +669,7 @@ class GF3_SLC(Sensor):
####Populate instrument
instrument = self.frame.getInstrument()
instrument.setRadarFrequency(frequency)
instrument.setPulseRepetitionFrequency(prf)
instrument.setPulseRepetitionFrequency(prf_s)
instrument.setPulseLength(pulseLength)
instrument.setChirpSlope(pulseBandwidth/pulseLength)
instrument.setIncidenceAngle(incidenceAngle)
@ -810,7 +679,6 @@ class GF3_SLC(Sensor):
instrument.setBeamNumber(swath)
instrument.setPulseLength(pulseLength)
#Populate Frame
#self.frame.setSatelliteHeight(height)
self.frame.setSensingStart(dataStartTime) # Date time object for UTC of first line
@ -829,19 +697,15 @@ class GF3_SLC(Sensor):
self.frame.getOrbit().setOrbitSource('EOF')
# self.frame.getOrbit().setOrbitSource(self.product.sourceAttributes.orbitAndAttitude.orbitInformation.orbitDataFile)
print("======= 修改轨道代码部分: =================")
if (self.orbitFile is None) and (self.orbitDirectory is None):
print('orbitFile and orbitDirectory are None')
self.extractOrbit()
elif (self.orbitDirectory is not None):
print('orbitDirectory is None')
self.orbitFile = findPreciseOrbit(self.orbitDirectory, self.frame.getOrbit().getOrbitSource(), self.frame.sensingStart.year)
if self.orbitFile is not None:
print('orbitFile is None')
self.extractPreciseOrbit(self.orbitFile, self.frame.sensingStart, self.frame.sensingStop)
@ -851,15 +715,10 @@ class GF3_SLC(Sensor):
# note that RS2 Doppler values are estimated at time dc.dopplerCentroidReferenceTime,
# so the values might need to be adjusted for ISCE usage
# added EJF 2015/08/17
# dc = self.product.imageGenerationParameters.dopplerCentroid
# poly = dc.dopplerCentroidCoefficients
poly = self.product.processInfo.DopplerCentroidCoefficients
# need to convert units
poly[1] = poly[1]/rangeSamplingRate
poly[2] = poly[2]/rangeSamplingRate**2
poly[3] = poly[3]/rangeSamplingRate**3
poly[4] = poly[4]/rangeSamplingRate**4
self.doppler_coeff = poly
# similarly save Doppler azimuth fm rate values, converting units
@ -868,22 +727,12 @@ class GF3_SLC(Sensor):
# note that RS2 Doppler values are estimated at time dc.dopplerRateReferenceTime,
# so the values might need to be adjusted for ISCE usage
# added EJF 2015/08/17
# dr = self.product.imageGenerationParameters.dopplerRateValues
# fmpoly = dr.dopplerRateValuesCoefficients
fmpoly = self.product.processInfo.DopplerRateValuesCoefficients
# need to convert units
fmpoly[1] = fmpoly[1]/rangeSamplingRate
fmpoly[2] = fmpoly[2]/rangeSamplingRate**2
fmpoly[3] = fmpoly[3]/rangeSamplingRate**3
fmpoly[4] = fmpoly[4]/rangeSamplingRate**4
self.azfmrate_coeff = fmpoly
# print("poly",poly)
# print("fmpoly",fmpoly)
# print('------------------------------------------------------')
# now calculate effective PRF from the azimuth line spacing after we have the orbit info EJF 2015/08/15
# this does not work because azimuth spacing is on ground. Instead use bandwidth ratio calculated above EJF
# SCHvelocity = self.frame.getSchVelocity()
@ -902,72 +751,46 @@ class GF3_SLC(Sensor):
print("构建新的轨道程序代码:")
tempOrbit = GGorbit()
dataStartTime = self.frame.sensingStart.timestamp()
dataStopTime = self.frame.sensingStop.timestamp()
time_list = []
self.frame.getOrbit().setOrbitSource('Header: ' + self.frame.getOrbit().getOrbitSource())
# stateVectors = self.product.sourceAttributes.orbitAndAttitude.orbitInformation.stateVectors
stateVectors = self.product.GPS.gpsParam
for i in range(len(stateVectors)):
# tempOrbit.addvector(stateVectors[i].timeStamp.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity,
# stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition)
time_list.append([stateVectors[i].timeStamp.timestamp(),
stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition,
stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity])
dataStartTime = self.product.imageInfo.imagingStartTime
dataStopTime = self.product.imageInfo.imagingEndTime
dataCenterTime = self.product.platform.CenterTime
model = ReconstructionSatelliteOrbit(time_list, starttime=dataStartTime)
time_dif = ((dataStopTime + 10) - (dataStartTime - 10)) / 1000
time = np.zeros((1000, 1))
for i in range(1000):
time[i,:]=((dataStartTime - 10) + time_dif * i)
t = time.reshape(-1)
startTime_s = dataStartTime.timestamp()
stopTime_s = dataStopTime.timestamp()
centerTime_s = dataCenterTime.timestamp()
statepoints = model.getSatelliteSpaceState(t)
for i, value in zip(range(len(statepoints)), statepoints):
sv= StateVector()
sv.setTime(datetime.datetime.fromtimestamp(t[i]))
sv.setPosition([value[0],value[1],value[2]])
sv.setVelocity([value[3],value[4],value[5]])
self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
tempOrbit = ReconstructionSatelliteOrbit(stateVectors, startTime_s)
As_arr = tempOrbit.A_arr.tolist()
""" 构建轨道 """
self.frame.getOrbit().setsessionMode(self.product.satellite)
print("卫星型号")
print(self.frame.orbit.sessionMode)
self.frame.getOrbit().setPolyParams(tempOrbit.polynum, tempOrbit.starttime, As_arr)
self.frame.getOrbit().setDoppler(self.product.processInfo.DopplerParametersReferenceTime,
self.product.processInfo.DopplerRateValuesCoefficients)
""" """
newOrb = self.frame.getOrbit().getTimeOrbits(self.frame.sensingStart.strftime("%Y-%m-%dT%H:%M:%S.%f"),
self.frame.sensingStop.strftime("%Y-%m-%dT%H:%M:%S.%f"),
orbitnum=1000)
for svect in newOrb:
self.frame.getOrbit().addStateVector(svect)
# tempOrbit.createOrbit() # 构建轨道模型
# num = 0
# time_list= []
# print("插值所有轨道")
# for i in range(len(stateVectors)):
#
# time_list.append([stateVectors[i].timeStamp.timestamp(),
# stateVectors[i].xPosition, stateVectors[i].yPosition, stateVectors[i].zPosition,
# stateVectors[i].xVelocity, stateVectors[i].yVelocity, stateVectors[i].zVelocity])
# num += 1
#
# model = ReconstructionSatelliteOrbit(time_list, starttime=centerTime_s)
# time_dif = ((stopTime_s + 30) - (startTime_s - 30)) / 1000
# time = np.zeros((1000, 1))
# for i in range(1000):
# time[i,:]=((startTime_s - 30) + time_dif * i)
# t = time.reshape(-1)
#
# statepoints = model.getSatelliteSpaceState(t)
# print("初始插值-----------------------------------------------------")
# self.frame.setSensingStart(datetime.datetime.fromtimestamp(t[2]))
# self.frame.setSensingStop(datetime.datetime.fromtimestamp(t[len(t)-3]))
self.frame.setSensingStart(dataStartTime)
self.frame.setSensingStop(dataStopTime)
diffTime = DTUtil.timeDeltaToSeconds(self.frame.sensingStop-self.frame.sensingStart)/2.0
sensingMid = self.frame.sensingStart + datetime.timedelta(microseconds=int(diffTime*1e6))
self.frame.setSensingMid(sensingMid)
# for i, value in zip(range(len(statepoints)), statepoints):
# newOrb=tempOrbit.getTimeOrbits(self.frame.sensingStart.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# self.frame.sensingStop.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
# orbitnum=500)
# for svect in newOrb:
# sv= StateVector()
# sv.setTime(datetime.datetime.fromtimestamp(t[i]))
# sv.setPosition([value[0],value[1],value[2]])
# sv.setVelocity([value[3],value[4],value[5]])
# self.frame.getOrbit().addStateVector(sv) # 插值结果写进了轨道模型中
# # print("插值后的gps点", datetime.datetime.fromtimestamp(t[i]),value[0],value[1],value[2],value[3],value[4],value[5])
# print('Orbits list len is %d' %num)
# sv.setTime(svect.UTCTime)
# sv.setPosition([svect.px,svect.py,svect.pz])
# sv.setVelocity([svect.vx,svect.vy,svect.vz])
# self.frame.getOrbit().addStateVector(sv)
print('Successfully read state vectors from product XML')
def extractPreciseOrbit(self, orbitfile, tstart, tend):
@ -1026,7 +849,7 @@ class GF3_SLC(Sensor):
lgth = self.frame.getNumberOfLines()
# lineFlip = (self.product.imageAttributes.rasterAttributes.lineTimeOrdering.upper() == 'DECREASING')
# pixFlip = (self.product.imageAttributes.rasterAttributes.pixelTimeOrdering.upper() == 'DECREASING')
lineFlip = True
lineFlip = False
pixFlip = False
src = gdal.Open(self.tiff.strip(), gdal.GA_ReadOnly)
@ -1037,7 +860,7 @@ class GF3_SLC(Sensor):
imag = src.GetRasterBand(2).ReadAsArray(0,0,width,lgth)
if (real is None) or (imag is None):
raise Exception('Input GF3 SLC seems to not be a 2 band Int16 image.')
raise Exception('Input GF3_SLC SLC seems to not be a 2 band Int16 image.')
data = real+cJ*imag
@ -1087,7 +910,6 @@ class GF3_SLC(Sensor):
t0 = self.product.processInfo.DopplerParametersReferenceTime
poly = self.product.processInfo.DopplerCentroidCoefficients
fd_mid = 0.0
for kk in range(len(poly)):
fd_mid += poly[kk] * (tMid - t0)**kk
@ -1101,10 +923,10 @@ class GF3_SLC(Sensor):
####For roiApp
####More accurate
from isceobj.Util import Poly1D
coeffs = poly
dr = self.frame.getInstrument().getRangePixelSize()
rref = 0.5 * Const.c * t0
# rref = Const.c * t0
r0 = self.frame.getStartingRange()
norm = 0.5*Const.c/dr
@ -1112,44 +934,18 @@ class GF3_SLC(Sensor):
for ind, val in enumerate(coeffs):
dcoeffs.append( val / (norm**ind))
poly = Poly1D.Poly1D()
poly.initPoly(order=len(coeffs)-1)
poly.setMean( (rref - r0)/dr - 1.0)
poly.setCoeffs(dcoeffs)
# print("****" * 10)
# print(Const.c)
# print(rref)
# print(dr)
# print(dcoeffs)
# print(r0)
# print("****" * 10)
poly = Poly1D.Poly1D()
poly.initPoly(order=len(coeffs)-1)
poly.setMean( (rref - r0)/dr - 1.0)
poly.setCoeffs(dcoeffs)
print('getNumberOfSamples', self.frame.getNumberOfSamples())
pix = np.linspace(0, self.frame.getNumberOfSamples(), num=len(coeffs)+1)
evals = poly(pix)
fit = np.polyfit(pix,evals, len(coeffs)-1)
self.frame._dopplerVsPixel = list(fit[::-1])
# print("---- radar ------------------------------------------print")
# print("t0",t0)
# print("****" * 10)
# print('lightspeed',Const.c)
# print('rref',rref)
# print('dr',dr)
# print('dcoeff',dcoeffs)
# print('r0',r0)
# print("****" * 10)
# print('pix',pix)
# print('evals',evals)
# print('fit',fit)
# print('Doppler Fit: ', fit[::-1])
# print('---------------------------------------------------')
return quadratic

Binary file not shown.

View File

@ -89,6 +89,7 @@ def saveTiff(target_data_path,xsize,ysize,gt,srs,target_arr):
driver = gdal.GetDriverByName('GTiff') # 数据类型必须有,因为要计算需要多大内存空间
tiff_geo=driver.Create(target_data_path, int(xsize)+1, int(ysize)+1, 1, gdal.GDT_Float32)
tiff_geo.GetRasterBand(1).WriteArray(target_arr)
tiff_geo.GetRasterBand(1).SetNoDataValue(-9999)
tiff_geo.SetGeoTransform(gt)
tiff_geo.SetProjection(srs.ExportToWkt())
del tiff_geo

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<Root>
<TaskID>CSAR_202107275419_0001-0</TaskID>
<WorkSpace>E:\Result_GF3\</WorkSpace>
<WorkSpace>D:\micro\WorkSpace\TOP\</WorkSpace>
<AlgCompt>
<DataTransModel>File</DataTransModel>
<Artificial>ElementAlg</Artificial>
@ -36,16 +36,16 @@
<ParaType>File</ParaType>
<DataType>tar.gz</DataType>
<ParaSource>Man</ParaSource>
<ParaValue>E:\Result_GF3\BackScattering\Output\GF3B_SYC_QPSI_008316_E116.1_N43.3_20230622_L1A_AHV_L10000202892-cal.tar.gz</ParaValue>
<ParaValue>E:\202306hb\sar_img\GF3B_SYC_QPSI_008316_E116.1_N43.3_20230622_L1A_AHV_L10000202892-cal.tar.gz</ParaValue>
</Parameter>
<Parameter>
<ParaName>Covering</ParaName>
<ParaChsName>地表覆盖类型数据</ParaChsName>
<Description>经过地理定标WGS84的地表覆盖类型数据</Description>
<ParaType>File</ParaType>
<DataType>zip</DataType>
<DataType>tif</DataType>
<ParaSource>Man</ParaSource>
<ParaValue>E:\GF3Data\soilMoisture\CSAR_solim_50T_20220101-20230101.zip</ParaValue>
<ParaValue>E:\202306hb\Landcover\50T_20220101-20230101.tif</ParaValue>
</Parameter>
<Parameter>
<ParaName>CoveringIDs</ParaName>
@ -64,9 +64,9 @@
<ParaChsName>NDVI数据</ParaChsName>
<Description>经过地理定标WGS84的NDVI数据</Description>
<ParaType>File</ParaType>
<DataType>zip</DataType>
<DataType>tif</DataType>
<ParaSource>Man</ParaSource>
<ParaValue>E:\GF3Data\soilMoisture\CSAR_solim_S2_202306_NDVI.zip</ParaValue>
<ParaValue>E:\202306hb\NDVI\S2_202306_NDVI.tif</ParaValue>
</Parameter>
<Parameter>
<ParaName>NDVIScope</ParaName>
@ -98,9 +98,9 @@
<ParaChsName>NDWI数据</ParaChsName>
<Description>经过地理定标WGS84的NDWI数据</Description>
<ParaType>File</ParaType>
<DataType>zip</DataType>
<DataType>tif</DataType>
<ParaSource>Man</ParaSource>
<ParaValue>E:\GF3Data\soilMoisture\CSAR_solim_S2_202306_NDWI.zip</ParaValue>
<ParaValue>E:\202306hb\NDWI\S2_202306_NDWI.tif</ParaValue>
</Parameter>
<Parameter>
<ParaName>e1</ParaName>
@ -183,7 +183,7 @@
<ParaType>File</ParaType>
<DataType>tar.gz</DataType>
<ParaSource>Man</ParaSource>
<ParaValue>E:\Result_GF3\SoilMoisture\Output\GF3B_SYC_QPSI_008316_E116.1_N43.3_20230622_L1A_AHV_L10000202892-cal-SMC.tar.gz</ParaValue>
<ParaValue>D:\micro\WorkSpace\TOP\SoilMoisture\Output\GF3B_SYC_QPSI_008316_E116.1_N43.3_20230622_L1A_AHV_L10000202892-cal-SMC.tar.gz</ParaValue>
<MaxValue>DEFAULT</MaxValue>
<MinValue>DEFAULT</MinValue>
<OptionValue>DEFAULT</OptionValue>

View File

@ -26,11 +26,13 @@ from tool.algorithm.algtools.filter.lee_Filter import Filter
from tool.file.fileHandle import fileHandle
import logging
import os
import glob
import shutil
import datetime
import numpy as np
import sys
import multiprocessing
cover_id_list = []
threshold_of_ndvi_min = 0
threshold_of_ndvi_max = 0
@ -53,10 +55,13 @@ logger = logging.getLogger("mylog")
env_str = os.path.dirname(os.path.abspath(sys.argv[0]))
os.environ['PROJ_LIB'] = env_str
block_size_config = int(cf.get('block_size_config'))
class MoistureMain:
"""
土壤水分处理主函数
"""
def __init__(self, alg_xml_path):
self.alg_xml_path = alg_xml_path
self.imageHandler = ImageHandler()
@ -85,7 +90,8 @@ class MoistureMain:
if self.__check_handler.check_run_env() is False:
return False
input_para_names = ['box', 'CoveringIDs', 'DualPolarSAR', 'Covering', 'NDVI', 'NDWI', 'e1', 'e2', 'Chh', 'Dhh', 'Cvv', 'Dvv']#, 'T', 'Pb', 'vsand', 'vclay']
input_para_names = ['box', 'CoveringIDs', 'DualPolarSAR', 'Covering', 'NDVI', 'NDWI', 'e1', 'e2', 'Chh', 'Dhh',
'Cvv', 'Dvv'] # , 'T', 'Pb', 'vsand', 'vclay']
if self.__check_handler.check_input_paras(input_para_names) is False:
return False
self.__workspace_path = self.__alg_xml_handler.get_workspace_path()
@ -133,7 +139,8 @@ class MoistureMain:
para_dic.update({'LocalIncidenceAngle': in_tif_path})
flag_list[4] = 1
if flag_list != [1, 1, 1, 1, 1]:
raise Exception('There are not tar_gz path: HH、HV(VV)、LocalIncidenceAngle or meta.xml in path:', tar_gz_path)
raise Exception('There are not tar_gz path: HH、HV(VV)、LocalIncidenceAngle or meta.xml in path:',
tar_gz_path)
self.processinfo = flag_list
return para_dic
@ -163,8 +170,10 @@ class MoistureMain:
p = pp()
self.__preprocessed_paras = p.preprocessing(para_names, ref_img_name,
self.__processing_paras,
self.__workspace_preprocessing_path, self.__workspace_preprocessed_path)
self.__ref_img_path, self.__cols, self.__rows, self.__proj, self.__geo = p.get_ref_inf(self.__preprocessed_paras[ref_img_name])
self.__workspace_preprocessing_path,
self.__workspace_preprocessed_path)
self.__ref_img_path, self.__cols, self.__rows, self.__proj, self.__geo = p.get_ref_inf(
self.__preprocessed_paras[ref_img_name])
logger.info('progress bar: 40%')
def create_roi(self):
@ -174,7 +183,8 @@ class MoistureMain:
"""
processing_path = self.__workspace_processing_path
# 利用角度为nan生成Mask
pp.check_LocalIncidenceAngle(self.__preprocessed_paras['LocalIncidenceAngle'], self.__preprocessed_paras['LocalIncidenceAngle'])
pp.check_LocalIncidenceAngle(self.__preprocessed_paras['LocalIncidenceAngle'],
self.__preprocessed_paras['LocalIncidenceAngle'])
angle_nan_mask_path = processing_path + 'angle_nan_mask.tif'
roi.trans_tif2mask(angle_nan_mask_path, self.__preprocessed_paras['LocalIncidenceAngle'], np.nan)
@ -205,8 +215,8 @@ class MoistureMain:
ndvi_scope = list(self.__processing_paras['NDVIScope'].split(';'))
threshold_of_ndvi_min = float(ndvi_scope[0])
threshold_of_ndvi_max = float(ndvi_scope[1])
roi.trans_tif2mask(ndvi_mask_path, self.__preprocessed_paras['NDVI'], threshold_of_ndvi_min, threshold_of_ndvi_max)
roi.trans_tif2mask(ndvi_mask_path, self.__preprocessed_paras['NDVI'], threshold_of_ndvi_min,
threshold_of_ndvi_max)
logger.info('create masks success!')
# 利用覆盖范围和裸土范围 生成MASK
@ -230,7 +240,8 @@ class MoistureMain:
:return: True or False
"""
radar_center_frequency = MetaDataHandler.get_RadarCenterFrequency(self.__processing_paras['Origin_META'])
lamda = MetaDataHandler.get_lamda(self.__processing_paras['Origin_META']) # * 100 #单位转为cm -> 修改 m, 陈增辉 2023.08.29
lamda = MetaDataHandler.get_lamda(
self.__processing_paras['Origin_META']) # * 100 #单位转为cm -> 修改 m, 陈增辉 2023.08.29
k = 2 * 3.1415926 / lamda # 1/m ---
# 计算ROI区域
bare_land_mask_path = self.create_roi()
@ -239,7 +250,8 @@ class MoistureMain:
para_names = ['HH', 'VV', 'VH', 'HV']
for i in para_names:
if os.path.exists(self.__preprocessed_paras[i]):
lee_path = os.path.join(self.__workspace_preprocessed_path, os.path.basename(self.__preprocessed_paras[i]).split(".")[0] + '_lee.tif')
lee_path = os.path.join(self.__workspace_preprocessed_path,
os.path.basename(self.__preprocessed_paras[i]).split(".")[0] + '_lee.tif')
Filter().lee_process_sar(self.__preprocessed_paras[i], lee_path, 3, 0.25)
logger.info('lee process finish: ' + self.__preprocessed_paras[i])
os.remove(self.__preprocessed_paras[i])
@ -249,13 +261,22 @@ class MoistureMain:
bp = BlockProcess()
# block_size = bp.get_block_size(self.__rows, self.__cols,block_size_config)
block_size = bp.get_block_size(self.__rows, self.__cols)
bp.cut_new(self.__workspace_preprocessed_path, self.__workspace_block_tif_path, ['tif', 'tiff'], 'tif', block_size)
pre_cuts = list(glob.glob(os.path.join(self.__workspace_preprocessed_path, '*.tif')))
cut_dir = os.path.join(self.__workspace_preprocessed_path, 'cut_tif')
if not os.path.exists(cut_dir):
os.makedirs(cut_dir)
for cut_tif in pre_cuts:
tif_name = os.path.basename(cut_tif)
if 'HH' in tif_name or 'VV' in tif_name or 'NDWI' in tif_name or 'LocalIncidenceAngle' in tif_name or 'mask' in tif_name:
shutil.copy(cut_tif, os.path.join(cut_dir, tif_name))
bp.cut_new(cut_dir, self.__workspace_block_tif_path, ['tif', 'tiff'], 'tif', block_size)
logger.info('blocking tifs success!')
img_dir, img_name = bp.get_file_names(self.__workspace_block_tif_path, ['tif'])
dir_dict = bp.get_same_img(img_dir, img_name)
angle_list, hh_list, vv_list,vh_list, hv_list, ndwi_list, mask_list = None, None, None, None, None, None, None
angle_list, hh_list, vv_list, ndwi_list, mask_list = None, None, None, None, None
for key in dir_dict.keys():
tmp = key.split('_', 2)[0]
if tmp == 'LocalIncidenceAngle':
@ -264,20 +285,18 @@ class MoistureMain:
hh_list = dir_dict[key]
elif tmp == 'VV':
vv_list = dir_dict[key]
elif tmp == 'VH':
vh_list = dir_dict[key]
elif tmp == 'HV':
hv_list = dir_dict[key]
elif tmp == 'NDWI':
ndwi_list = dir_dict[key]
elif tmp == 'mask':
mask_list = dir_dict[key]
if angle_list is None or hh_list is None or vv_list is None or vh_list is None or hv_list is None or ndwi_list is None:
logger.info('angle_list is None or hh_list is None or vv_list is None or vh_list is None or hv_list is None or ndwi_list is None')
if angle_list is None or hh_list is None or vv_list is None or ndwi_list is None or mask_list is None:
logger.info(
'angle_list is None or hh_list is None or vv_list is None or vh_list is None or hv_list is None or ndwi_list is None')
return False
if not len(angle_list) == len(hh_list) == len(vv_list) == len(vh_list) == len(hv_list) == len(ndwi_list):
logger.info('[len(angle_list) == len(hh_list) == len(vv_list) == len(vh_list) == len(hv_list) == len(ndwi_list)] is False!')
if not len(angle_list) == len(hh_list) == len(vv_list) == len(ndwi_list) == len(mask_list):
logger.info(
'[len(angle_list) == len(hh_list) == len(vv_list) == len(vh_list) == len(hv_list) == len(ndwi_list)] is False!')
return False
processes_num = min([len(angle_list), multiprocessing_num, multiprocessing.cpu_count() - 1])
@ -301,11 +320,14 @@ class MoistureMain:
# vh_bare_soil_bsc_path = self.__workspace_block_tif_processed_path + 'vh_bare_soil_bsc' + suffix
# hv_bare_soil_bsc_path = self.__workspace_block_tif_processed_path + 'hv_bare_soil_bsc' + suffix
flag = alg.cal_bare_soil_bsc(hh_bare_soil_bsc_path, hh_list[i], vwc_path, angle_list[i], self.__processing_paras['Chh'], self.__processing_paras['Dhh']) # 裸土后向散射系统(线性值)
flag = alg.cal_bare_soil_bsc(hh_bare_soil_bsc_path, hh_list[i], vwc_path, angle_list[i],
self.__processing_paras['Chh'],
self.__processing_paras['Dhh']) # 裸土后向散射系统(线性值)
if flag is False:
return False
flag = alg.cal_bare_soil_bsc(vv_bare_soil_bsc_path, vv_list[i], vwc_path, angle_list[i], self.__processing_paras['Cvv'], self.__processing_paras['Dvv'])
flag = alg.cal_bare_soil_bsc(vv_bare_soil_bsc_path, vv_list[i], vwc_path, angle_list[i],
self.__processing_paras['Cvv'], self.__processing_paras['Dvv'])
if flag is False:
return False
@ -322,7 +344,8 @@ class MoistureMain:
# pl.append(pool.apply_async(alg.cal_soil_moisture, (soil_moisture_path, hh_bare_soil_bsc_path, vv_bare_soil_bsc_path,
# angle_list[i], mask_list[i], lamda, radar_center_frequency, self.__processing_paras['T'],
# self.__processing_paras['Pb'], self.__processing_paras['vsand'], self.__processing_paras['vclay'],i))) # dobsen
pl.append(pool.apply_async(alg.cal_soil_moisture, (soil_moisture_path, hh_bare_soil_bsc_path, vv_bare_soil_bsc_path,
pl.append(pool.apply_async(alg.cal_soil_moisture,
(soil_moisture_path, hh_bare_soil_bsc_path, vv_bare_soil_bsc_path,
angle_list[i], mask_list[i], lamda, radar_center_frequency, 0,
0, 0, 0, i))) # topp
# pl.append((pool.apply_async(alg.cal_soilM, (soil_moisture_path, hh_list[i], vv_list[i], hv_list[i], vh_list[i], angle_list[i], mask_list[i], lamda)))) # oh 2004
@ -352,7 +375,6 @@ class MoistureMain:
roi.cal_roi(product_path, soil_moisture_path, bare_land_mask_path, background_value=np.nan)
logger.info('cal soil_moisture success!')
proj, geos, data = self.imageHandler.read_img(product_path)
data[data < soil_moisture_value_min] = soil_moisture_value_min
data[data > soil_moisture_value_max] = soil_moisture_value_max
@ -419,6 +441,7 @@ class MoistureMain:
if os.path.exists(path):
file.del_folder(path)
if __name__ == '__main__':
multiprocessing.freeze_support()
start = datetime.datetime.now()

View File

@ -26,8 +26,12 @@ class BlockProcess:
@staticmethod
def get_block_size(rows, cols):
block_size = 512
if rows > 2048 and cols > 2048:
if (rows // 1024) <= 5 and (cols // 1024) <= 5:
block_size = 512
elif 5 < (rows // 1024) < 10 and 5 < (cols // 1024) < 10:
block_size = 1024
else:
block_size = 2048
return block_size
# def get_block_size(rows, cols, block_size_config):

View File

@ -81,5 +81,8 @@ def write_bin_to_tif_soil(out_tif_dir, bin_dir):
out_image.save(out_path)
return out_tif_path
if __name__ == '__main__':
bin_dir = r'F:\TempData\oh2004'
out_tif_dir = r'F:\TempData\oh2004tif'
write_bin_to_tif_soil(out_tif_dir, bin_dir)