地震采集需要编制束线编排表,根据炮检点的增量,依靠关系文件,编制了束线编排表。该脚本只针对同一束接收线相同,并且炮检点要网格化编排。
###############适用于同一束线接收线相同的工区,同时要求炮检点编排网格化,##############
#######################适用于sps1.0及2.1格式,需要执行打开格式,见第29行##################
import pandas as pd
import time
import copy
from tkinter import filedialog, Tk
time_start=time.time()
################################观测系统参数############################
shotinter = 5 ###每束线炮点编号增量
rlineinter = 5 ##检波线编号间隔
#########################读取关系文件##############
root = Tk()
root.withdraw()
file_shot = (filedialog.askopenfilename(title='选择关系文件', filetypes=[('All Files', '.xps')]))##选择一个文件
print('读取关系文件......')
data = []
for line in open(file_shot,'r'):
data.append(line)
############计算头卡行数########
i = 0
while data[i][0]=='H':
i = i+1
ii=i ##计算头卡行数
###########读取关系文件####
v = data[ii:]
xlenth = len(v)
temp=[]
for i in range(0,xlenth):
###sps1.0格式#####
# sline=int(v[i][13:20])
# spoint= int(v[i][33:37])
# rline = int(v[i][47:54])
# rpointfrom = int(v[i][67:73])
# rpointo = int(v[i][75:79])
#####sps2.1格式#############
sline=int(float(v[i][17:24]))
spoint= int(v[i][28:34])
rline = int(v[i][49:54])
rpointfrom = int(v[i][62:66])
rpointo = int(v[i][72:76])
#######################
sw =0
temp.append([sw,sline,spoint,rline,rpointfrom,rpointo])
datall = pd.DataFrame(temp)
datall.columns=['sw','sline','spoint','rline','rpointfrom','rpointo']
################计算束线###################
spointmin = datall['spoint'] .min() ########计算束线用最小炮点号
datall['sw']=((datall['spoint']-spointmin)/shotinter+1).astype('int') #计算束线
##################计算束线分组##################
print('束线分组处理中......')
swfenzu=[]
swmax = datall['sw'].max()
swmin = datall['sw'].min()
for i in range(swmin-1,swmax):
tempdd = datall.loc[datall['sw']==i+1] #按束线抽取数据
swnum = i+1 #当前束线
minsline = tempdd['sline'].min() #当前束线起炮线
maxsline = tempdd['sline'].max() #当前束线止炮线
minspoint= tempdd['spoint'].min() #当前束线起炮点
maxspoint = tempdd['spoint'].max()#当前束线止炮点
minrline = tempdd['rline'].min() #当前束线起检波线
maxrline = tempdd['rline'].max() #当前束线止检波线
minrpoint = tempdd['rpointfrom'].min() #当前束线起检波点
maxrpoint = tempdd['rpointo'].max() #当前束线止检波点
tempdd2 = copy.deepcopy(tempdd) #按束线抽取数据用于计算炮排
tempdd2.drop_duplicates(subset='sline',keep='first',inplace=True)##去重复炮线
shotlines = len(tempdd2)###计算当前束线炮排
rlines = (maxrline-minrline)/rlineinter+1 ##当前束线检波线数
stotal = int(len(tempdd)/rlines) ##计算当前束线炮点数量
rtotal= rlines*(maxrpoint-minrpoint+1) ##计算当前束线检波点数量
rpointintersw=maxrpoint-minrpoint+1
swfenzu.append([swnum,minsline,maxsline,minspoint,maxspoint,shotlines,
stotal,minrline,maxrline,minrpoint,maxrpoint,rtotal,rpointintersw])
swinfo = pd.DataFrame(swfenzu)
swinfo.columns=['束号','起炮线','止炮线','起炮点','止炮点','炮排','炮数',
'起检波线','止检波线','起检波点','止检波点','检波点数','束内单条检波线道数']
swinfo.to_excel(file_shot[:-4]+'.xlsx',index=None,encoding='utf_8_sig')
time_end=time.time()
print('totally cost',str(round(time_end-time_start,4)))