可以通过读取已处理的断面数据,通过python,计算出每一层的宽度。
######断面的数据格式下所示
import numpy as np
from scipy.interpolate import interp1d
import pandas as pd
import openpyxl
#计算 0的排列
# def calc_numb_zero():
# workbook = openpyxl.Workbook()
# sheet = workbook.active
# for x in range(1,len(list_zmin_diff)+1):
# for i in range(1,list_zmin_diff[x-1]+1):
# cell = sheet.cell(row=i, column=x)
# cell.value = 0
# #保存excel文件
# workbook.save('填充zero1.xlsx')
# calc_numb_zero()
df = pd.read_excel('cross-section.xlsx')
#断面最大最小值
z_min = df['z'].min()
z_max = df['z'].max()
#各断面最低点与所有断面的最低点的差列表
list_zmin_diff = []
workbook = openpyxl.Workbook()
acive_sheet = workbook.active
for i in range(160,0,-1):
#读取 RS值不同的断面
df_rs = df[df['rs']==i]
#各断面最低点与所有断面的最低点的差
z_diff = np.ceil(df_rs['z'].min()-z_min).astype(int)
#找到当前断面的最低点值的索引及对应最低点的x坐标
min_z_loc = df_rs['z'].idxmin()
x_min = df_rs.loc[min_z_loc, 'x']
# x值最小值左侧列表
list_x_l=np.array(df_rs.loc[:min_z_loc,'x'])
# # x值最小值右侧列表
list_x_r=np.array(df_rs.loc[min_z_loc+1:,'x'])
# # z值最小值左侧列表
list_z_l=np.array(df_rs.loc[:min_z_loc,'z'])
# # z值最小值右侧列表
list_z_r=np.array(df_rs.loc[min_z_loc+1:,'z'])
# list_zmin_diff.append(z_diff)
#左右端点索引
left_point = df_rs.index[0]
right_point = df_rs.index[-1]
# 每个断面的活动层数
active_seg = 191-z_diff
print(active_seg)
for j in range(1,active_seg+1):
#初始两个 x点 用于后续计算 width
width = 0
x1 = 0
x2 = 0
#创建插值对象
x1_interp = interp1d(list_z_l, list_x_l)
x2_interp = interp1d(list_z_r, list_x_r)
#判断是否超出左端点
try:
x1 = x1_interp(df_rs['z'].min() + j)
if x1 >= df_rs.loc[left_point, 'x']:
x1 = df_rs.loc[left_point, 'x']
except ValueError:
x1 = df_rs.loc[left_point, 'x']
#判断是否超出右端点
try:
x2 = x2_interp(df_rs['z'].min() + j)
if x2 >= df_rs.loc[right_point, 'x']:
x2 = df_rs.loc[right_point, 'x']
except ValueError:
x2 = df_rs.loc[right_point, 'x']
width = x2 - x1
cell = acive_sheet.cell(row=j,column=160-i+1)
cell.value=width
#
# workbook.save('width.xlsx')
我现在的代码如上所示,但是部分Layer(SEGMENT的层)会出现下层宽度大于上层宽度。并且还会出现部分的最底层几层宽度按为断面的左右端点之差的绝对值,不符合最初的计算想法。
在使用Python读取地形断面数据并将其转换为CE-QUAL-W2模odel的bth.csv格式时,首先需要了解bth.csv的格式要求。CE-QUAL-W2模型的bth.csv文件应该具有以下格式:
Branch, Distance, Layer, Elevation, Area
这里,Branch
是分支或流段的编号,Distance
是从分支的开始处到给定断面的距离,Layer
是从湖底向上的层次编号(湖底是1,然后递增),Elevation
是每层的底部海拔高度,Area
是每层在该断面的面积。
以下是一个Python脚本的例子,用于读取你给出的断面数据并将其转换为bth.csv格式。这个脚本假设断面数据已经按照从湖/河流的上游到下游的顺序进行了排序。由于没有给出每一层的面积,这个脚本假设每个断面的面积是1平方米。
请注意,这个脚本可能需要根据你的具体需求进行调整。
import pandas as pd
# 读取地形断面数据
df = pd.read_csv('断面数据.txt', sep=' ', header=None, names=['rs', 'x', 'z'])
# 创建一个新的DataFrame来保存bth数据
bth = pd.DataFrame(columns=['Branch', 'Distance', 'Layer', 'Elevation', 'Area'])
# 对于每一个不同的分支
for branch in df['rs'].unique():
# 提取该分支的数据
branch_df = df[df['rs'] == branch].copy()
branch_df.sort_values('x', inplace=True)
# 对于每一个断面
for distance in branch_df['x'].unique():
# 提取该断面的数据并按深度进行排序
segment_df = branch_df[branch_df['x'] == distance].copy()
segment_df.sort_values('z', inplace=True)
# 从湖底开始,为每一层添加一行bth数据
for i, row in enumerate(segment_df.itertuples()):
bth = bth.append({
'Branch': branch,
'Distance': distance,
'Layer': i + 1,
'Elevation': row.z,
'Area': 1 # 假设面积为1
}, ignore_index=True)
# 保存bth数据到CSV文件
bth.to_csv('bth.csv', index=False)
这个脚本会为每个断面的每一层创建一行bth数据,其中Layer
从1开始并逐层递增,Elevation
是该层的底部高度,Area
被假设为1平方米。所有的bth数据最后被保存为一个CSV文件。
我将为你提供处理地形断面数据并转化为CE-QUAL-W2模型可用的bth.csv数据格式的解决方案。
首先,你需要读取地形断面数据,可以使用Python的pandas库来读取csv文件。请确保你已经安装了pandas库。
import pandas as pd
data = pd.read_csv("地形断面数据.csv")
接下来,我们可以从读取的数据中提取我们需要的列,并对这些数据进行处理。
x = data["x"] # 提取x列
z = data["z"] # 提取z列
然后,我们需要计算每一层的宽度。我们可以通过计算每一层上下两个z值的差值得到宽度,同时可以应用我们提到的最低断面高程高度的功能。
widths = []
for i in range(len(z)-1):
width = z[i] - z[i+1]
if width > 0:
widths.append(width)
else:
widths.append(0)
接下来,我们需要将计算得到的宽度写入到bth.csv文件中。我们可以使用Python的csv库来实现。
import csv
with open("bth.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerow(["width"])
for width in widths:
writer.writerow([width])
以上就是整个处理过程的一个简单示例。你可以根据你的实际需求进行修改和优化代码。请注意,这里只提供了一种解决方案,可能还会有其他更好的方法来处理地形断面数据。
如果你有任何其他问题或者对以上解决方案有疑问,请随时向我提问。