# 导入Flask类 from flask import Flask from flask import jsonify from flask import request from flask_cors import CORS import sys import numpy as np import pandas as pd import flopy import flopy.utils.binaryfile as bf import csv import time from openpyxl import load_workbook import os import shutil import Base as base import CalHead import Predict import json import ModelPeriod # Flask函数接收一个参数__name__,它会指向程序所在的包 app = Flask(__name__) CORS(app, supports_credentials=True, resources=r'/*') #边界cell的数量 iboundCellSize = 240 iboundCellSize2= 213 iboundCellSizeTotle= 453 #河流cell的数量 riverCellSize = 109 iboundGroupSize = 5 iboundGroup={1:[1,86],2:[87,111],3:[112,142],4:[143,170],5:[171,240]} iboundGroup3Size = 5 iboundGroup3={1:[241,282],2:[283,354],3:[355,393],4:[394,436],5:[437,453]} riverGroupSize = 4 riverGroup={1:[454,479],2:[480,505],3:[506,527],4:[528,562]} riverName=['雁翅-落坡岭','落坡岭-陇驾庄','陇驾庄-三家店','三家店-卢沟桥'] # 获取row colum layer Period 参数 def getModel(model_name): model_ws="" if not model_name: model_ws = "202001_202212" else: model_ws = base.model_dir + model_name m = flopy.modflow.Modflow.load("modflow.nam", model_ws = model_ws, exe_name="mf2005", verbose=True, version="mf2005", check=False) return m @app.route('/baseparam/', methods=['GET']) def baseparam(): model_name = request.args.get('model_name') ml= getModel(model_name) nrclp = ml.get_nrow_ncol_nlay_nper() dict = {"Row": nrclp[0], "Column": nrclp[1], "Layer": nrclp[2], "period": nrclp[3]} jsondata= CalHead.get_model_json(model_name) start_time = jsondata["start_time"] end_time = jsondata["end_time"] months = ModelPeriod.get_months_in_range_ym(start_time, end_time) dict["months"]=months return jsonify(dict) #读取wel文件 参数为 Period @app.route('/welList/', methods=['GET']) def welList(): period = request.args.get('period') model_name = request.args.get('model_name') layerparam = request.args.get('layer') ml= getModel(model_name) wel = [] wel = ml.wel.stress_period_data.__getitem__(kper=period) result = [] welarray = [] riverarray = [] iboundarray = [] for Layer, Row, Column, Q in wel: dict = {"Layer": str(Layer), "Row": str( Row), "Column": str(Column), "Q": str(Q)} result.append(dict) result_len = len(result) if layerparam == '1': #边界 for i in range(0, 240): iboundarray.append(result[i]) #河流 for i in range(453, 562): riverarray.append(result[i]) for i in range(562, result_len): r = int (result[i]['Row'])+1 c =int (result[i]['Column'])+1 name = base.getPumpWellName(str(r), str(c)) result[i]['name']=name welarray.append(result[i]) elif layerparam == '3': for i in range(240, 453): iboundarray.append(result[i]) ibounddict = {"name": "ibound", "data": iboundarray} riverdict = {"name": "river", "data": riverarray} weldict = {"name": "wel", "data": welarray} data = [] data.append(riverdict) data.append(ibounddict) data.append(weldict) return jsonify(data) #读取单个井的数据 @app.route('/wel/', methods=['GET']) def wel(): row_param = request.args.get('Row') column_param = request.args.get('Column') model_name = request.args.get('model_name') ml= getModel(model_name) result = [] periods =CalHead.get_model_period(model_name) periods_len= len(periods) for i in range(periods_len): wel = [] wel = ml.wel.stress_period_data.__getitem__(kper=i) for Layer, Row, Column, Q in wel: if str(Row) == row_param and str(Column) == column_param: start_month = periods[i] + "-01" end_month = ModelPeriod.last_day_of_month_start(periods[i]) dict = {"StartTime": start_month, "EndTime": end_month, "Layer": str(Layer+1), "Row": str(Row), "Column": str(Column), "Q": str(Q)} result.append(dict) return jsonify(result) #修改wel 文件 @app.route('/welInput', methods=['POST']) def welInput(): json = request.get_json() row_param = str(json['Row']) column_param = str(json['Column']) # model_name = request.args.get('model_name') model_name = str(json['model_name']) ml= getModel(model_name) #有序的应力周期列表 json data = json['data'] periods =CalHead.get_model_period(model_name) periods_len= len(periods) #循环设置wel文件,更新数据 # lrcq = {0:[[2, 3, 4, -100.]], 1:[[2, 3, 4, -100.]]} lrcq = {} for per in range(periods_len): wel = [] wel = ml.wel.stress_period_data.__getitem__(kper=per) #存储每个应力期的数据 array2d = [] for Layer, Row, Column, Q in wel: array = [] if str(Row) == row_param and str(Column) == column_param: array = [Layer, Row, Column, data[per]['Q']] else: array = [Layer, Row, Column, Q] array2d.append(array) lrcq[per] = array2d flopy.modflow.ModflowWel(ml,stress_period_data=lrcq) ml.write_input() return jsonify("数据更新完毕!") #读入电子表格文件生成wel 文件 @app.route('/cellFileInput', methods=['POST']) def cellFileInput(): path ='C:\\Users\\ZMK\\Desktop\\待发送\\cell文件.xlsx' data = get_cell_data(path) lrcq= get_cell_struct(data["excel1"],data["excel2"],data["excel3"]) model_name = request.args.get('model_name') ml= getModel(model_name) flopy.modflow.ModflowWel(ml,stress_period_data=lrcq) ml.write_input() return jsonify("sucess") def get_cell_struct(excel1,excel2,excel3): lrcq={} #周期数量 period = 7 start_row_index = 1 #边界数据 excel for col in range (0,period): array =[] for row in range(start_row_index, len(excel1)): arr = [excel1[row][2]-1,excel1[row][3]-1,excel1[row][4]-1,excel1[row][6+col]] array.append(arr) lrcq[col]= array #河流数据 excel for col in range (0,period): array =[] for row in range(start_row_index, len(excel2)): arr = [excel2[row][2]-1,excel2[row][3]-1,excel2[row][4]-1,excel2[row][6+col]] array.append(arr) lrcq[col].extend(array) #抽水数据 excel for col in range (0,period): array =[] for row in range(start_row_index, len(excel3)): arr = [excel3[row][1]-1,excel3[row][2]-1,excel3[row][3]-1,excel3[row][8+col]] array.append(arr) lrcq[col].extend(array) return lrcq #获取cell文件 #file_path 文件的路径 def get_cell_data(file_path): workbook = load_workbook(file_path) sheetnames = workbook.get_sheet_names() #read first sheet sheet1 = workbook[sheetnames[0]] sheet2 = workbook[sheetnames[1]] sheet3 = workbook[sheetnames[2]] excel1 =[] excel2=[] excel3=[] # 遍历读取整个工作表 for row in sheet1.iter_rows(values_only=True): array=[] for cell in row: array.append(cell) excel1.append(array) for row in sheet2.iter_rows(values_only=True): array=[] for cell in row: array.append(cell) excel2.append(array) for row in sheet3.iter_rows(values_only=True): array=[] for cell in row: array.append(cell) excel3.append(array) # 关闭Excel文件 workbook.close() data={"excel1":excel1,"excel2":excel2,"excel3":excel3} return data #读取wel文件 参数为 Period @app.route('/iboundList/', methods=['GET']) def iboundList(): return jsonify(iboundGroupSize) #边界的分组数据 @app.route('/iboundData/', methods=['GET']) def iboundData(): group_id = int(request.args.get('groupId')) model_name = request.args.get('model_name') ml= getModel(model_name) data=[] index = iboundGroup[group_id] start_index = index[0] periods =CalHead.get_model_period(model_name) periods_len= len(periods) for per in range(periods_len): wel = [] wel = ml.wel.stress_period_data.__getitem__(kper = per) result = [] for Layer, Row, Column, Q in wel: dict = {"Layer": str(Layer+1), "Row": str(Row), "Column": str(Column), "Q": str(Q)} result.append(dict) start_month = periods[per] +"-01" end_month = ModelPeriod.last_day_of_month_start(periods[per]) dict = {"StartTime": start_month, "EndTime": end_month, "Layer": str(result[start_index]['Layer']), "Q": str(result[start_index]['Q'])} data.append(dict) return jsonify(data) #边界数据修改 @app.route('/iboundInput', methods=['POST']) def iboundInput(): json = request.get_json() no = int(json['No']) #有序的应力周期列表 json data = json['data'] model_name = json['model_name'] ml= getModel(model_name) index = iboundGroup[no] start_index = index[0] end_index = index[1] periods =CalHead.get_model_period(model_name) periods_len= len(periods) #循环设置wel文件,更新数据 # lrcq = {0:[[2, 3, 4, -100.]], 1:[[2, 3, 4, -100.]]} lrcq = {} for per in range(periods_len): wel = [] wel = ml.wel.stress_period_data.__getitem__(kper=per) #存储每个应力期的数据 array2d = [] count = 1 for Layer, Row, Column, Q in wel: array = [] if count>= start_index and count <= end_index: array = [Layer, Row, Column, data[per]['Q']] else: array = [Layer, Row, Column, Q] array2d.append(array) count +=1 lrcq[per] = array2d flopy.modflow.ModflowWel(ml,stress_period_data=lrcq) ml.write_input() return jsonify("数据更新完毕!") #读取wel文件 参数为 Period @app.route('/riverList/', methods=['GET']) def riverList(): riverResult=[] for i in range(len(riverName)): item ={"id":i+1,"name":riverName[i]} riverResult.append(item) return jsonify(riverResult) #河流的数据 @app.route('/riverData/', methods=['GET']) def riverData(): group_id = int(request.args.get('groupId')) data=[] index = riverGroup[group_id] start_index = index[0] model_name = request.args.get('model_name') ml= getModel(model_name) periods =CalHead.get_model_period(model_name) periods_len= len(periods) for per in range(periods_len): wel = [] wel = ml.wel.stress_period_data.__getitem__(kper = per) result = [] for Layer, Row, Column, Q in wel: dict = {"Layer": str(Layer+1), "Row": str( Row), "Column": str(Column), "Q": str(Q)} result.append(dict) start_month = periods[per] +"-01" end_month = ModelPeriod.last_day_of_month_start(periods[per]) dict = {"StartTime": start_month, "EndTime": end_month, "Layer": str(result[start_index]['Layer']), "Q": str(result[start_index]['Q'])} data.append(dict) return jsonify(data) #河流数据修改 @app.route('/riverInput', methods=['POST']) def riverInput(): json = request.get_json() no = int(json['No']) #有序的应力周期列表 json data = json['data'] index = riverGroup[no] start_index = index[0] end_index = index[1] model_name = json['model_name'] ml= getModel(model_name) periods =CalHead.get_model_period(model_name) periods_len= len(periods) #循环设置wel文件,更新数据 # lrcq = {0:[[2, 3, 4, -100.]], 1:[[2, 3, 4, -100.]]} lrcq = {} for per in range(periods_len): wel = [] wel = ml.wel.stress_period_data.__getitem__(kper=per) #存储每个应力期的数据 array2d = [] count = 1 for Layer, Row, Column, Q in wel: array = [] if count>= start_index and count <= end_index: array = [Layer, Row, Column, data[per]['Q']] else: array = [Layer, Row, Column, Q] array2d.append(array) count +=1 lrcq[per] = array2d flopy.modflow.ModflowWel(ml,stress_period_data=lrcq) ml.write_input() return jsonify("数据更新完毕!") #读取面 区域 @app.route('/precipitation/', methods=['GET']) def precipitation(): model_name = request.args.get('model_name') ml= getModel(model_name) period = request.args.get('period') per = int(period) item = ml.rch.rech.__getitem__(kper=per) value = item.get_value() item_data = np.array(value).tolist() #分组的字典下标值{"1":[(i,j)]} areadict1= base.getAreaDictFirstIndex() #分组的字典下标值{"1":[a,b,c,d]} areadict = base.getAreaDictIndexArray() #分组的字典下标值{"1":data} areadatadict={} for key in areadict1: index1 = areadict1[key] i = index1[0][0] j= index1[0][1] data= item_data[i][j] areadatadict[str(key)]= format(data,'.8f') result =[] result.append(areadatadict) result.append(areadict) return jsonify(result) #降水数据修改 # @app.route('/precipitationInput', methods=['POST']) # def precipitationInput(): # json = request.get_json() # model_name= str(json['model_name']) # period = int(json['period']) # #有序的应力周期列表 json # data = json['data'] # dict = {} # for i in range(len(data)): # q1 = data[i]['Q1'] # q2 = data[i]['Q2'] # dict[q1] = q2 # ml= getModel(model_name) # item = ml.rch.rech.__getitem__(kper=period) # array2d = item.get_value() # count = 0 # array2d_len = len(array2d) # for i in range(array2d_len): # array_len = len(array2d[i]) # for j in range(array_len): # va = str(array2d[i][j]) # if va in dict: # count += 1 # array2d[i][j] = float(dict[va]) # ml.rch.rech.__setitem__(key=period, value=array2d) # rch = flopy.modflow.ModflowRch(ml, rech=ml.rch.rech) # rch.write_file(check=False) # #ml.write_input() # return jsonify("降水参数修改完毕!") @app.route('/precipitationInput', methods=['POST']) def precipitationInput(): json = request.get_json() model_name= str(json['model_name']) period = int(json['period']) #有序的应力周期列表 json data = json['data'] dict = {} for i in range(len(data)): q1 = data[i]['Q1'] No = data[i]['No'] dict[No] = q1 ml= getModel(model_name) item = ml.rch.rech.__getitem__(kper=period) array2d = item.get_value() areas= base.getAreas() for key in areas: tuples= areas[key] zblen= len(tuples) values = float(dict[key]) for i in range(zblen): x = tuples[i][0] y = tuples[i][1] array2d[x][y]= values ml.rch.rech.__setitem__(key=period, value=array2d) rch = flopy.modflow.ModflowRch(ml, rech = ml.rch.rech) rch.write_file(check=False) # ml.write_input() return jsonify("降水参数修改完毕!") #导入csv文件 @app.route('/precipitationInputFile', methods=['POST']) def precipitationInputFile(): model_name = request.args.get('model_name') ml= getModel(model_name) save_path = 'C:/Users/ZMK/Desktop/test1/' + "1111.xlsx" file = request.files.get('file') if file: file.save(save_path) #获取读取的excel 表格数据 stations = get_station_struct(save_path) #循环周期 #perd周期变量 #array2d 每个周期的二维数组 for perd in range(0,36): period = perd item = ml.rch.rech.__getitem__(kper=period) array2d = item.get_value() array2d_len = len(array2d) count = 0 #循环站点将一个period的所有stations进行字典存储 dict = {} for k in range(0,len(stations)): row = stations[k]["row"] column = stations[k]["column"] data_old = array2d[row][column] data_new = stations[k]["data"][perd] dict[data_old]= data_new #循环设置每个period 的值 for i in range(array2d_len): array_len = len(array2d[i]) for j in range(array_len): va = str(array2d[i][j]) if va in dict: array2d[i][j] = float(dict[va]) #将array2d重新set 对应的 item 周期内 ml.rch.rech.__setitem__(key=period, value=array2d) rch = flopy.modflow.ModflowRch(ml, rech=ml.rch.rech) rch.write_file(check=False) # ml.write_input() return '文件上传成功' else: return '上传失败,未选择文件' #获取站点的数据,构造数据结构 #file_path 文件的路径 def get_station_struct(file_path): workbook = load_workbook(file_path) sheetnames = workbook.get_sheet_names() #read first sheet sheet = workbook[sheetnames[0]] array2d_excel=[] # 遍历读取整个工作表 for row in sheet.iter_rows(values_only=True): array=[] for cell in row: array.append(cell) array2d_excel.append(array) # 关闭Excel文件 workbook.close() #数据的开始下标 data_start_index=6 #信息的开始行号 start_row_index = 1 #存储站点信息 stations = [] for i in range (start_row_index,len(array2d_excel)): st={"name":array2d_excel[i][1],"row":array2d_excel[i][4],"column":array2d_excel[i][5]} data=[] for j in range(data_start_index,len(array2d_excel[i])): cell_data = array2d_excel[i][j] cell_data= cell_data/100/30*0.15 data.append(round(cell_data, 6)) st["data"]= data stations.append(st) return stations #运行模型 @app.route('/runModel/', methods=['GET']) def runModel(): model_name = request.args.get('model_name') msg= Predict.run_model_predict(model_name) #导出csv文件 csvpath = CalHead.exportCsV(model_name) #更新模型三维网格配置 base.updateModelConfig(model_name) #创建模型的三维网格 filedir = base.model3d_path + model_name print(filedir) if not os.path.exists(filedir): os.makedirs(filedir, exist_ok=True) base.callModelexe() return jsonify(msg) #生成模型csv 文件 @app.route('/runModelCsv/', methods=['GET']) def runModelCsv(): model_name = request.args.get('model_name') outpath = CalHead.exportCsV(model_name) result={"code":200,"msg":"生成计算结果CSV文件完毕!","output_path":outpath} return jsonify(result) #初始水位信息 @app.route('/initWater/', methods=['GET']) def initWater(): period = request.args.get('period') per = int(period) model_name = request.args.get('model_name') ml= getModel(model_name) item = ml.rch.rech.__getitem__(kper=per) value = item.get_value() t = np.array(value).tolist() return jsonify(t) #创建新模型 @app.route('/saveModel/', methods=['GET']) def saveModel(): modelname = request.args.get('name') startTime = request.args.get('startTime') endTime = request.args.get('endTime') file_list = os.listdir(base.model_dir) for name in file_list: if name == modelname: return jsonify("模型名称已经存在,不允许重复创建!") dir = base.model_dir + modelname shutil.copytree(base.predictModel,dir) jsondata={"model_name":modelname,"start_time":startTime,"end_time":endTime} predictionJson = base.model_dir + modelname +"\\prediction.json" with open(predictionJson, "w",encoding='utf-8') as outfile: json.dump(jsondata, outfile,ensure_ascii=False) return jsonify("创建新模型完毕!") #创建新模型 @app.route('/ModelList/', methods=['GET']) def ModelList(): file_list = os.listdir(base.model_dir) return jsonify(file_list) #预测场景参数 @app.route('/prediction', methods=['POST']) def prediction(): jsondata = request.get_json() model_name = str(jsondata['model_name']) file_list = os.listdir(base.model_dir) if model_name not in file_list: return jsonify("模型不存在,保存失败!") predictionJson = base.model_dir + model_name +"\\prediction.json" with open(predictionJson, "w",encoding='utf-8') as outfile: json.dump(jsondata, outfile,ensure_ascii=False) return jsonify("保存预测场景参数完毕!") #预测场景参数 @app.route('/predictionparam', methods=['GET']) def predictionparam(): model_name = request.args.get('model_name') file_list = os.listdir(base.model_dir) if model_name not in file_list: return jsonify("模型不存在!") predictiondata="" prediction_path = base.model_dir + model_name +"\\prediction.json" if os.path.exists(prediction_path): with open(prediction_path,encoding='utf-8') as f: predictiondata = json.load(f) welldata="" well_path = base.model_dir + model_name +"\\pump_well.json" if os.path.exists(well_path): with open(well_path,encoding='utf-8') as f: welldata = json.load(f) if not welldata and not predictiondata: return jsonify([]) if not predictiondata: return jsonify(welldata) if not welldata: return jsonify(predictiondata) merged_dict = {**predictiondata, **welldata} return jsonify(merged_dict) #预测场景--保存井 @app.route('/pumpsavewell', methods=['POST']) def pump_savewell(): jsondata = request.get_json() model_name = str(jsondata['model_name']) file_list = os.listdir(base.model_dir) if model_name not in file_list: return jsonify("模型不存在,保存失败!") pump_json = base.model_dir + model_name +"\\pump_well.json" with open(pump_json, "w") as outfile: json.dump(jsondata, outfile) return jsonify("保存井参数完毕!") #预测场景--导入井数据 @app.route('/pumpimportdata', methods=['POST']) def pump_importdata(): model_name = request.form.get('model_name') # ml= getModel(model_name) file = request.files.get('file') save_path = base.model_dir + model_name +"\\extra_cell.xlsx" if file: file.save(save_path) resultDict={"code":200,"msg":"保存数据完毕!"} return jsonify(resultDict) #观测井列表 @app.route('/obsWellList', methods=['GET']) def obsWellList(): obswell= base.obs_well dict =[] for name , row ,column in obswell: obj ={"name":name,"row":row,"column":column,"Layer":1} dict.append(obj) return jsonify(dict) #观测井chart数据接口 @app.route('/obsWellChart', methods=['GET']) def obsWellChart(): model_name = request.args.get('model_name') row = request.args.get('row') column = request.args.get('column') result = CalHead.obsChartdata(model_name, row, column) return jsonify(result) #预测页面 永定河图表 @app.route('/predictRiverChart', methods=['GET']) def predictRiverChart(): base_year = request.args.get('base_year') start_time = request.args.get('start_time') end_time = request.args.get('end_time') return jsonify(Predict.predict_river_chart(base_year, start_time, end_time)) #预测页面 降水图表 @app.route('/predictWaterChart', methods=['GET']) def predictWaterChart(): base_year = request.args.get('base_year') start_time = request.args.get('start_time') end_time = request.args.get('end_time') return jsonify(Predict.predict_water_chart(base_year, start_time, end_time)) @app.route('/heatmap', methods=['GET']) def heatmap(): model_name = request.args.get('model_name') period = request.args.get('period') data = CalHead.heatmapdata(model_name,period) maximum_value = np.max(data) return jsonify(np.array(data).tolist()) #降水均衡 @app.route('/waterEqu', methods=['GET']) def waterEqu(): model_name = request.args.get('model_name') data = CalHead.waterEqu(model_name) return jsonify(data) #地球页面数据 @app.route('/earthWaterChart', methods=['GET']) def earthWaterChart(): indexId = int(request.args.get('index_id')) data = CalHead.earthWaterChart("202001_202212",indexId) return jsonify(data) if __name__ == '__main__': #app.run() # 可以指定运行的主机IP地址,端口,是否开启调试模式 app.run(host="192.168.0.122", port=5000)