# -*- coding: utf-8 -*- import warnings warnings.filterwarnings('ignore') import argparse, json def _argparse(): parser = argparse.ArgumentParser(description='剖面分析工具, 根据标准化剖面,得到声道, 跃层分析结果') parser.add_argument('-a', '--argfile', action='store', dest='argfile', required=True, help='name of arguments file') return parser.parse_args() def main(): parser = _argparse() argfile = parser.argfile if argfile[-5:] != '.json': print('输入的参数文件名有误') return with open(argfile,'r') as jsonFile: paramData = json.load(jsonFile) if ("realtime" not in paramData): print(f'{argfile}中的参数有误,请核实!') return realtime = paramData["realtime"] if not realtime: if ("ETOPO1Path" not in paramData) or ("STPath" not in paramData) or\ ("lat" not in paramData) or ("lon" not in paramData) or\ ("timeType" not in paramData) or ("png" not in paramData) or\ ("outParam" not in paramData): print(f'{argfile}中的参数有误,请核实!') return ETOPO1Path = paramData["ETOPO1Path"] STPath = paramData["STPath"] lat = float(paramData["lat"]) lon = float(paramData["lon"]) timeType = paramData["timeType"] png = paramData["png"] outParam = paramData["outParam"] if "outPath" not in outParam: outParam["outPath"] = "" from pyat.DataBase import DataBase import matplotlib.pyplot as plt from pyat.ProfileTool import ProfileTool import numpy as np # 定义时间段 timeIndex = timeType # 创建类 data = DataBase(ETOPO1Path, STPath) # 设置时间段 data.set_timePeriod(timeIndex) # 设置坐标 data.set_coord(lat, lon) # 全海深速度剖面 velPf = data.get_velFullProfile() # 设置剖面分析工具 velPfTool = ProfileTool() velPfTool.set_profile(velPf) # 计算表面声道 surfCh = velPfTool.get_surfaceChannel() # 计算深海声道 deepCh = velPfTool.get_deepChannel() # 计算跃层信息 surfSL, mainSL = velPfTool.get_springLayer() # 导出结果文件 velPfTool.export_profileParm('velPfParam.txt') # 导出剖面文件 # data.export_velFullProfile_txt('velFullProfile.txt') data.export_velFullProfile_nc('velFullProfile.nc') # 打印结果 f = open('velPfParam.txt') lines=f.readlines() for line in lines: print(line) f.close() #输出json文件 outData = {} outData["param"] = paramData outData["lat"] = f'{round(velPf.lat,4)}' outData["lon"] = f'{round(velPf.lon,4)}' outData["botDep"] = f'{round(velPf.botDep)}' properties = { "表面声道轴深度": f'{round(surfCh.depAxis,2)}' if surfCh.exist else "NONE", "表面声道声速": f'{round(surfCh.velAxis,4)}' if surfCh.exist else "NONE", "深海声道轴深度": f'{round(deepCh.depAxis,2)}' if deepCh.exist else "NONE", "深海声道声速": f'{round(deepCh.velAxis,4)}' if deepCh.exist else "NONE", "表面跃层区间": f'{round(surfSL.limit[0],2)}, {round(surfSL.limit[1],2)}' if surfSL.exist else "NONE", "表面跃层强度": f'{round(surfSL.intensity,4)}' if surfSL.exist else "NONE", "主跃层区间": f'{round(mainSL.limit[0],2)}, {round(mainSL.limit[1],2)}' if mainSL.exist else "NONE", "主跃层强度": f'{round(mainSL.intensity,4)}' if mainSL.exist else "NONE", } velPf.x = np.around(velPf.x, decimals=0) velPf.y = np.around(velPf.y, decimals=4) outData["out"] = { "properties": properties, "声剖面列表": list(zip(velPf.x,velPf.y)) } with open(("" if outParam["outPath"]=="" else outParam["outPath"] + "/")+"profileOut.json", 'w') as jsonFile: json.dump(outData, jsonFile, indent=4, ensure_ascii=False) if png: # 绘图 fig, ax = plt.subplots() # 声速剖面 ax.plot(velPf.y, velPf.x) if surfCh.exist: ax.axhline(surfCh.depAxis, linestyle='--', color='r', label='surface channel axis') if deepCh.exist: ax.axhline(deepCh.depAxis, linestyle='--', color='g', label='deep channel axis') if surfSL.exist: ax.fill_between([1480, 1550], surfSL.limit[0], surfSL.limit[1], alpha=0.2, color='r') if mainSL.exist: ax.fill_between([1480, 1550], mainSL.limit[0], mainSL.limit[1], alpha=0.2, color='g') ax.set_xlim(1480, 1550) ax.invert_yaxis() ax.set_xlabel('velocity') ax.set_ylabel('depth') ax.legend(loc=4) # 显示绘图 plt.show() else: if ("ETOPO1Path" not in paramData) or ("STPath" not in paramData) or\ ("profileFile" not in paramData) or ("png" not in paramData) or\ ("outParam" not in paramData): print(f'{argfile}中的参数有误,请核实!') return ETOPO1Path = paramData["ETOPO1Path"] STPath = paramData["STPath"] profileFile = paramData["profileFile"] png = paramData["png"] outParam = paramData["outParam"] if "outPath" not in outParam: outParam["outPath"] = "" import matplotlib.pyplot as plt from pyat.ProfileTool import ProfileTool from pyat.ProfileRead import readRawProfile, processProfile import numpy as np # 读取实测声速剖面 velRawPf = readRawProfile(profileFile) # 对剖面进行后处理 velPf = processProfile(velRawPf, ETOPO1Path, STPath) # 设置剖面分析工具 velPfTool = ProfileTool() velPfTool.set_profile(velPf) # 计算表面声道 surfCh = velPfTool.get_surfaceChannel() # 计算深海声道 deepCh = velPfTool.get_deepChannel() # 计算跃层信息 surfSL, mainSL = velPfTool.get_springLayer() # 导出结果文件 velPfTool.export_profileParm('velPfParam.txt') # 打印结果 f = open('velPfParam.txt') lines=f.readlines() for line in lines: print(line) f.close() #输出json文件 outData = {} outData["param"] = paramData outData["lat"] = f'{round(velPf.lat,4)}' outData["lon"] = f'{round(velPf.lon,4)}' outData["botDep"] = f'{round(velPf.botDep)}' properties = { "表面声道轴深度": f'{round(surfCh.depAxis,2)}' if surfCh.exist else "NONE", "表面声道声速": f'{round(surfCh.velAxis,4)}' if surfCh.exist else "NONE", "深海声道轴深度": f'{round(deepCh.depAxis,2)}' if deepCh.exist else "NONE", "深海声道声速": f'{round(deepCh.velAxis,4)}' if deepCh.exist else "NONE", "表面跃层区间": f'{round(surfSL.limit[0],2)}, {round(surfSL.limit[1],2)}' if surfSL.exist else "NONE", "表面跃层强度": f'{round(surfSL.intensity,4)}' if surfSL.exist else "NONE", "主跃层区间": f'{round(mainSL.limit[0],2)}, {round(mainSL.limit[1],2)}' if mainSL.exist else "NONE", "主跃层强度": f'{round(mainSL.intensity,4)}' if mainSL.exist else "NONE", } velPf.x = np.around(velPf.x, decimals=0) velPf.y = np.around(velPf.y, decimals=4) profileList = list(zip(velPf.x,velPf.y)) outData["out"] = { "properties": properties, "声剖面列表": profileList } with open(("" if outParam["outPath"]=="" else outParam["outPath"] + "/")+"profileOut.json", 'w') as jsonFile: json.dump(outData, jsonFile, indent=4, ensure_ascii=False) if png: # 绘图 fig, ax = plt.subplots() # 声速剖面 ax.plot(velPf.y, velPf.x) if surfCh.exist: ax.axhline(surfCh.depAxis, linestyle='--', color='r', label='surface channel axis') if deepCh.exist: ax.axhline(deepCh.depAxis, linestyle='--', color='g', label='deep channel axis') if surfSL.exist: ax.fill_between([1480, 1550], surfSL.limit[0], surfSL.limit[1], alpha=0.2, color='r') if mainSL.exist: ax.fill_between([1480, 1550], mainSL.limit[0], mainSL.limit[1], alpha=0.2, color='g') ax.set_xlim(1480, 1550) ax.invert_yaxis() ax.set_xlabel('velocity') ax.set_ylabel('depth') ax.legend(loc=4) # 显示绘图 plt.show() if __name__ == '__main__': main()