mike dfsu 处理
.dsfu
文件处理
- 读取指定数据[单个]
from mikeio import Dfsu
ps: 文件路径内不能有中文
filename = "xxx.dfsu"
item = 'Current speed'
step = -1
df = Dfus(filename)
all_data = df.read()
#获取 item 的step 数据,格式为 narray
data = all_data[item][step]
- 读取指定数据[多个]
# 实例化 dfsu 文件对象
df = Dfsu(filename)
# 根据指定类型获取
all_data = df.read(['U velocity','V velocity'])
# 获取指定时间序列
u_data = all_data[0][step][:]
v_data = all_data[1][step][:]
- 保存数据为xls、xlsx
import pandas as pd
xls_data = { "u":u_data, "v":v_data }
pd_data = pd.DataFrame(xls_data) # 转换数据为 DataFrame
writer = pd.ExcelWriter(filename) # 创建文件对象
pd_data.to_excel(writer, index=False) # 不添加索引
writer.save() 保存文件
- 获取mesh的网点
df = Dfsu(filename)
mesh = df.element_coordinates
X = mesh[:,0]
Y = mesh[:,1]
# Z = mesh[:,2] # 如果有
- 导出为shp
from mikeio import Dfsu,Dfs0,Mesh
import pandas as pd
import geopandas as gpd
filename = "xxx.dfsu"
item = 'Current speed'
step = -1
df = Dfsu(filename)
data = dfsu.read()
# 需要导出的数据
item_data = data[item][setp]
item_dataframe = pd.DataFrame({'speed': item_data})
# 获取shp格式
shp = dfsu.to_shapely()
poly_list = [e for e in shp] #???
# 转换为地理数据格式
gdf = gpd.GeoDataFrame(item_dataframe, geometry=poly_list)
# 导出shp
gdf.to_file("xxx.shp")
- 流速计算
- 流向计算
.xyz
文件导出为.shp
import os
import mikeio as mio
import geopandas as gpd
def xyz_to_shp(input_file: str, output_file: str = None, overwrite: bool = True) -> str:
"""
将.xyz文件导出为.shp文件
参数:
input_file: str - 输入的.xyz文件路径
output_file: str - 输出的.shp文件路径(可选)
overwrite: bool - 是否覆盖现有导出文件(默认为True)
返回值:
str - 成功导出时返回导出文件的绝对路径,失败时返回空字符串
"""
try:
# 读取.xyz文件
data = mio.read_xyz(input_file)
# 重命名列名称为小写的"x"、"y"和"z"
data = data.rename(columns={"X": "x", "Y": "y", "Z": "z"})
# 创建包含点数据的GeoDataFrame
geometry = gpd.points_from_xy(data["x"], data["y"], data["z"])
gdf = gpd.GeoDataFrame(data, geometry=geometry)
# 导出为.shp文件
if output_file is None:
# 原地导出
file_name, _ = os.path.splitext(input_file)
output_file = file_name + ".shp"
if os.path.exists(output_file):
if not overwrite:
print(f"输出文件 '{output_file}' 已存在,设置 overwrite 参数为 True 可以覆盖现有文件。")
return os.path.abspath(output_file)
# else:
# os.remove(output_file)
gdf.to_file(output_file, driver="ESRI Shapefile")
# 返回导出文件的绝对路径
return os.path.abspath(output_file)
except Exception as e:
print("导出错误:", str(e))
return ""
if __name__ == "__main__":
shp_file = r"W:\CPS\MyProject\python-tools\py-tool\test\data\01_be_10.shp"
xyz_files = [r"./流速流向采样点 .xyz", r"./水位采样点 .xyz"]
for e in xyz_files:
res = xyz_to_shp(e)
print("res: ", res)