[Python] GAMP结果文件批量统计与绘图
处理逻辑
通过tkinter库点选文件夹,遍历GAMP结果文件夹内所有 .pos 或 .pdop 文件,依次进行绘图操作,pos文件另外计算PPP定位精度RMS与收敛时间,pdop则计算卫星数和pdop均值,并将结果输出至csv文件,方便后续统一进行站点结果数据统计。
pos文件批量统计与绘图
# gamp_pos.py
# Author:LZ-CUMT
# 2021-04-27 v1.0
# 2021-10-06 v1.1 fix the bug of accuracy statistics
import os
import csv
import math
import numpy as np
import matplotlib.pyplot as plt
from tkinter import filedialog
F=[]
foldername = filedialog.askdirectory()
f_list = os.listdir(foldername)
for filename in f_list:
if os.path.splitext(filename)[1] == '.pos':
F.append(filename)
filepath = foldername.split('/')
csvfilename=filepath[-2]+'-'+filepath[-1]+'-'+'ppp.csv'
fs = open(foldername + '/'+csvfilename,'w',newline="")
csv_write=csv.writer(fs)
csv_write.writerow(['SAT_NAME','DAY','E','N','U','3D','E','N','U','3D','Use_Rate'])
fs.close()
covgetime = np.zeros([4], dtype=np.float32)
ylib = np.linspace(-1, 1, 11)
Num=0
for filename in F:
Num=Num+1
print('*************** Processing the '+str(Num)+'th file ***************')
print(foldername+'/'+filename)
f = open(foldername + '/' + filename,'r')
list1 = f.readlines()
num = len(list1)
epoch = np.arange(0, num).reshape((num, 1))
pos = np.zeros([num, 15], dtype=np.float32)
for i in range(0, len(list1)):
list1[i] = list1[i].rstrip('\n')
if len(list1[i])>0:
pos[i] = list1[i].split()
else:
pos[i] = None
Square = np.zeros([4])
N = np.zeros([4])
RMS = np.zeros([4])
EPON = np.zeros([4])
for j in range(0,4):
for i in range(0, len(pos)):
if pos[i,j+11]!=None:
if math.isnan(pos[i,j+11])!= True :
EPON[j] = EPON[j] + 1
if (abs(pos[i, j + 11])<0.1):
Square[j] = Square[j] + pos[i, j + 11] ** 2
N[j] = N[j] + 1
if N[j]!=0:
RMS[j]=math.sqrt(Square[j]/N[j])
for j in range(0,4):
for i in range(0, len(pos)-20):
nannp=np.isnan(pos[i:i+20,j+11])
if (np.all(nannp== False)):
if (np.all(abs(pos[i:i+20,j+11]) <0.1)):
covgetime[j] = (i)/2
break
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(epoch,pos[:,11:14])
ax.grid(True, linestyle='--')
ax.axis([0, num, -1, 1])
ax.set_yticks(ylib)
plt.title(filename[0:4].upper())
plt.ylabel('Error[m]')
plt.xlabel('Epoch')
plt.text(1000, -0.55, ' Covengence Time', fontsize=12)
plt.text(1000, -0.65,'E: '+ str(covgetime[0])+'min', fontsize=12)
plt.text(1000, -0.75,'N: '+ str(covgetime[1])+'min', fontsize=12)
plt.text(1000, -0.85,'U: '+ str(covgetime[2])+'min', fontsize=12)
plt.text(1000, -0.95,'3D:'+ str(covgetime[3])+'min', fontsize=12)
plt.text(2000, -0.55, 'Positioning RMS', fontsize=12)
plt.text(2000, -0.65, 'E :'+ str(RMS[0])[0:5]+'m', fontsize=12)
plt.text(2000, -0.75, 'N :'+ str(RMS[1])[0:5]+'m', fontsize=12)
plt.text(2000, -0.85, 'U :'+ str(RMS[2])[0:5]+'m', fontsize=12)
plt.text(2000, -0.95, '3D:'+ str(RMS[3])[0:5]+'m', fontsize=12)
plt.legend(['E','N','U'])
plt.savefig(foldername + '/' + filename+'.png',dpi=400)
plt.close()
plt.show()
f.close()
fs = open(foldername + '/'+csvfilename,'a',newline="")
csv_write=csv.writer(fs)
csv_write.writerow([filename[0:4],int(filename[4:7]),covgetime[0],covgetime[1],covgetime[2],covgetime[3],\
RMS[0],RMS[1],RMS[2],RMS[3],EPON[0]/2880])
fs.close()
pdop文件批量统计与绘图
# gamp_pdop.py
# Author:LZ-CUMT
import os
import csv
import numpy as np
import matplotlib.pyplot as plt
from tkinter import filedialog
F=[]
foldername = filedialog.askdirectory()
f_list = os.listdir(foldername)
for filename in f_list:
if os.path.splitext(filename)[1] == '.pdop':
print(foldername+'/'+filename)
F.append(filename)
filepath = foldername.split('/')
csvfilename=filepath[-2]+'-'+filepath[-1]+'-'+'PDOP.csv'
fs = open(foldername + '/'+csvfilename,'w',newline="")
csv_write=csv.writer(fs)
csv_write.writerow(['STA_NAME','DOY','SUM','G','R','C','E','J','PDOP'])
fs.close()
for filename in F:
f = open(foldername + '/' + filename,'r')
list1 = f.readlines()
num = len(list1)
epoch = np.arange(0, num).reshape((num, 1))
pdop = np.zeros([num, 15], dtype=np.float32)
covgetime = np.arange(0, 4)
for i in range(0, len(list1)):
list1[i] = list1[i].rstrip('\n')
if len(list1[i])>0:
pdop[i] = list1[i].split()
else:
pdop[i] = None
meansat=np.mean(pdop,0)
legendindex=['ALL','G','R','C','E','J','PDOP']
legendadd=[]
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
for i in range(8,15):
if meansat[i]!=0 :
ax.plot(epoch,pdop[:,i])
legendadd.append(legendindex[i-8])
ax.grid(True, linestyle='--')
ax.axis([0, num, 0, max(pdop[:,8])+2])
plt.title(filename[0:4].upper())
plt.ylabel('Value')
plt.xlabel('Epoch')
plt.legend(legendadd)
plt.savefig(foldername + '/' + filename+'.png',dpi=400)
plt.close()
plt.show()
f.close()
fs = open(foldername + '/'+csvfilename,'a',newline="")
csv_write=csv.writer(fs)
csv_write.writerow([filename[0:4],int(filename[4:7]),meansat[8],meansat[9],meansat[10],meansat[11],meansat[12],meansat[13],meansat[14]])
fs.close()
结果示例
GAMP处理后的原始结果文件:
统计后:
pos文件绘图:
pdop文件绘图:
pos文件统计表csv:
pdop文件统计表csv: