# 导入Flask类 from flask import Flask from flask import jsonify from flask import request from flask_cors import CORS import numpy as np import flopy import time import os import shutil import json import Base as base import CalHead import Predict import ModelPeriod import AchiveReport as achiveReport import BigData import OpenExcel import DataTransf import DataTask # Flask函数接收一个参数__name__,它会指向程序所在的包 app = Flask(__name__) CORS(app, supports_credentials=True, resources=r'/*') #边界cell的数量 iboundCellSize = 240 iboundCellSize2= 213 iboundCellSizeTotle= 453 #河流cell的数量 riverCellSize = 109 iboundGroupSize = 10 iboundGroup={1:[1,86],2:[87,111],3:[112,142],4:[143,170],5:[171,240], 6:[241,282],7:[283,354],8:[355,393],9:[394,436],10:[437,453]} iboundName =["西侧流入","北部流入","东北部流入","东部流出","南部流出", "山区流入","永定河断裂流入","黄庄高丽断裂流入","八宝山断裂流入","昆明湖断裂入流"] 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 = base.not_allowed_model 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 print(jsondata) if "initHeader" in jsondata: dict["initHead"] = jsondata["initHeader"] else: dict["initHead"] = "" return jsonify(dict) #保存初始水头 @app.route('/saveInitHead', methods=['POST']) def saveInitHead(): jsondata = request.get_json() model_name = str(jsondata['model_name']) initHeader = str(jsondata['initHead']) if model_name == base.not_allowed_model or model_name in base.archive_models: return jsonify("本模型为验证模型,不允许修改!") jsondata= CalHead.get_model_json(model_name) jsondata["initHeader"] = initHeader jpath = base.model_dir + model_name +"\\prediction.json" with open(jpath, "w",encoding='utf-8') as outfile: json.dump(jsondata, outfile,ensure_ascii=False) return jsonify("保存初始水头成功!") #读取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) ibound_segment={} if layerparam == '1': #边界 ibound_segment={"1":[0,85],"2":[86,110],"3":[111,141],"4":[142,169],"5":[170,239]} 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': ibound_segment={"6":[0,41],"7":[42,113],"8":[114,152],"9":[153,195],"10":[196,212]} for i in range(240, 453): iboundarray.append(result[i]) ibounddict = {"name": "ibound", "data": iboundarray,"segment":ibound_segment} riversgement={"1":[0,25],"2":[26,51],"3":[52,73],"4":[74,108]} riverdict = {"name": "river", "data": riverarray,"segment":riversgement} 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']) if model_name == base.not_allowed_model or model_name in base.archive_models: return jsonify("本模型为验证模型,不允许修改!") 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,ipakcb= ml.wel.ipakcb,dtype=ml.wel.dtype, options=ml.wel.options, stress_period_data=lrcq) ml.write_input() return jsonify("数据更新完毕!") #读取wel文件 参数为 Period @app.route('/iboundList/', methods=['GET']) def iboundList(): return jsonify(iboundName) #边界的分组数据 @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'] if model_name == base.not_allowed_model or model_name in base.archive_models: return jsonify("本模型为验证模型,不允许修改!") 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,ipakcb= ml.wel.ipakcb, dtype=ml.wel.dtype, options=ml.wel.options, 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'] if model_name == base.not_allowed_model or model_name in base.archive_models: return jsonify("本模型为验证模型,不允许修改!") 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,ipakcb= ml.wel.ipakcb, dtype=ml.wel.dtype, options=ml.wel.options, 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']) if model_name == base.not_allowed_model or model_name in base.archive_models: return jsonify("本模型为验证模型,不允许修改!") 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 = round(float(dict[key]),8) 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,nrchop=ml.rch.nrchop, ipakcb=ml.rch.ipakcb, rech=ml.rch.rech, irch =ml.rch.irch) rch.write_file(check=False) # ml.write_input() return jsonify("降水参数修改完毕!") #运行模型 @app.route('/runModel/', methods=['GET']) def runModel(): model_name = request.args.get('model_name') if model_name == base.not_allowed_model or model_name in base.archive_models: return jsonify("本模型为验证模型,不允许修改!") dicts= Predict.run_model_predict(model_name) if dicts["code"] == 400: return dicts["msg"] #导出csv文件 CalHead.exportCsV(model_name) # #更新模型三维网格配置 base.updateModelConfig(model_name) # #创建模型的三维网格 filedir = base.model3d_path + model_name if not os.path.exists(filedir): os.makedirs(filedir, exist_ok=True) base.callModelexe() #计算水资源量和水均衡 CalHead.run_zonebudget_bal(model_name) CalHead.run_zonebudget_res(model_name) return jsonify(dicts["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('/saveModel/', methods=['GET']) def saveModel(): modelname = request.args.get('name') startTime = request.args.get('startTime') endTime = request.args.get('endTime') remark = request.args.get('remark') file_list = os.listdir(base.model_dir) for name in file_list: if name == modelname: return jsonify("模型名称已经存在,不允许重复创建!") pers = ModelPeriod.get_months_in_range_count(startTime,endTime) if pers > 60 : return jsonify("模型创建失败,最多只允许60个周期的连续预测!") dir = base.model_dir + modelname if pers==12: shutil.copytree(base.predictModel,dir) else: #如果不是一年的预测, 可能为 其他的多周期的预测 大于 12 个周期或者 小于12个周期 #首先把60个周期的当做模型clone一份, 然后修改 dis wel rch 文件 #wel 文件和 rch 文件不需要修改 shutil.copytree(base.predictModel60,dir) Predict.updateDisFile(modelname,pers) 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) CalHead.addModelJson(modelname, startTime, endTime, remark) return jsonify("创建新模型完毕!") #创建新模型 @app.route('/ModelList/', methods=['GET']) def ModelList(): file_list = os.listdir(base.model_dir) return jsonify(file_list) #模型列表2 @app.route('/ModelList2/', methods=['GET']) def ModelList2(): model_path = base.prefix +"\\model_list.json" model_lsit="" with open(model_path,encoding='utf-8') as f: model_lsit = json.load(f) return jsonify(model_lsit) #删除模型 @app.route('/deleteModel/', methods=['GET']) def deleteModel(): model_name = request.args.get('model_name') if not model_name: return jsonify({"code":400,"msg":"不允许删除空目录!"}) if model_name == base.not_allowed_model: return jsonify({"code":400,"msg":"验证模型不允许删除!"}) paths = base.model_dir + model_name shutil.rmtree(paths) CalHead.removeModelJson(model_name) return jsonify({"code":200,"msg":"模型删除完毕!"}) #预测场景参数 @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) #运行模型 dicts = Predict.run_model(model_name) return jsonify(dicts["msg"]) #预测场景参数 @app.route('/predictionparam', methods=['GET']) def predictionparam(): model_name = request.args.get('model_name') print(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') types = request.form.get('type') file = request.files.get('file') print(types) save_path = base.model_dir + model_name +"\\"+types+".xlsx" print(save_path) if file: file.save(save_path) data= DataTransf.base_excel(model_name,types) resultDict={"code":200,"msg":"保存数据完毕!","data":data} return jsonify(resultDict) #观测井列表 @app.route('/obsWellList', methods=['GET']) def obsWellList(): obswell= base.obs_well dicts =[] for wellId, name , row ,column in obswell: obj ={"wellId":wellId,"name":name,"row":row,"column":column,"Layer":1} dicts.append(obj) return jsonify(dicts) #观测井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') wellId = request.args.get('wellId') result = CalHead.obsChartdata(wellId,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') value = float(request.args.get('value')) return jsonify(Predict.predict_river_chart(base_year, start_time, end_time,value)) #预测页面 降水图表 @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') value = float(request.args.get('value')) return jsonify(Predict.predict_water_chart(base_year, start_time, end_time,value)) #开采量的折线图 @app.route('/predictWellChart', methods=['POST']) def predictWellChart(): json = request.get_json() base_year = str(json['base_year']) start_time = json['start_time'] end_time = json['end_time'] data = json['data'] return jsonify(Predict.predict_well_chart(base_year, start_time, end_time,data)) #流场图 @app.route('/flowField', methods=['GET']) def flowField(): model_name = request.args.get('model_name') flowStartTime = int(request.args.get('flowStartTime')) flowEndTime=int(request.args.get('flowEndTime')) flowType= request.args.get('flowType') # layer = int(request.args.get('layer') ) pic = str(int(time.time())) +".png" outpath = base.flow_file + pic dicts={} if flowType=="水位": dicts = achiveReport.flow_field(model_name, flowStartTime, 0,"流场信息", "online", outpath) if flowType=="变幅": dicts = achiveReport.getFlowFieldBF(model_name,flowStartTime,flowEndTime,outpath) if flowType=="埋深": dicts = achiveReport.getFlowFieldDepth(model_name,flowStartTime, 0,"流场信息", "online", outpath) dicts["path"] = "/xishan/xinshanFlow/"+pic return jsonify(dicts) #初始水位流场信息 @app.route('/initWaterFlow/', methods=['GET']) def initWater(): model_name = request.args.get('model_name') layer = int(request.args.get('layer') ) pic = str(int(time.time())) +".png" outpath = base.flow_file + pic result= achiveReport.init_flow_field(model_name, layer,"初始流场信息", "online", outpath) if result == "#": return jsonify("") return jsonify("/xishan/xinshanFlow/"+pic) #降水均衡 @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(): model_name = request.args.get('model_name') indexId = int(request.args.get('index_id')) data = CalHead.earthWaterChart(model_name,indexId) return jsonify(data) #渗透系数 @app.route('/mdLpf', methods=['GET']) def mdLpf(): lf = base.md_lpf return jsonify(np.array(lf).tolist()) #水资源量 @app.route('/water_res', methods=['GET']) def water_res(): model_name = request.args.get('model_name') #水均衡 path1=base.muiltyModel + model_name +"\\water_bal.txt" bal = CalHead.water_balance(model_name, path1) path2=base.muiltyModel + model_name +"\\water_res.txt" res = CalHead.water_res(model_name,path2) dicts = BigData.mergeWaterData(bal,res) initFlowPNG = achiveReport.getWaterResFiled(model_name,0) dicts["initFlowPNG"]= "/xishan/xinshanFlow/" + initFlowPNG FlowPNG2 = achiveReport.getWaterResFiled(model_name,11) dicts["lastFlowPNG"]= "/xishan/xinshanFlow/" + FlowPNG2 dicts["initMonth"] ="2023-01" dicts["lastMonth"] ="2023-12" #水资源量 return dicts #多模型地下水位 @app.route('/water_depth', methods=['GET']) def water_depth(): model_name = request.args.get('model_name') result = CalHead.water_depth(model_name) #水资源量 return result #小场景 单个模型水位 和变幅 @app.route('/xs_depth', methods=['GET']) def xs_depth(): model_name = request.args.get('model_name') res = CalHead.xs_depth(model_name) 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) res["months"] = months #水资源量 return res #保存监测站降雨量 @app.route('/sensor_jyl_list', methods=['GET']) def sensor_jyl_list(): model_name = request.args.get('model_name') data = OpenExcel.read_excel(model_name) return jsonify(data) #保存监测站降雨量 @app.route('/sensor_jyl_save', methods=['POST']) def sensor_jyl_save(): json = request.get_json() model_name = str(json['model_name']) data = json['data'] OpenExcel.write_excel(model_name,data) return jsonify("保存完毕") #月报内容 @app.route('/xs_month_report', methods=['GET']) def xs_month_report(): model_name = request.args.get('model_name') per = int(request.args.get('period')) res = achiveReport.archive_report_content(model_name,per) return res #实时数据 @app.route('/xs_real_data', methods=['GET']) def xs_real_data(): num = request.args.get('num') start_time = request.args.get('start_time') end_time = request.args.get('end_time') types = request.args.get('types') res = DataTask.get_data(types,num,start_time,end_time) return jsonify(res) if __name__ == '__main__': #app.run() # 可以指定运行的主机IP地址,端口,是否开启调试模式 app.run(host="localhost", port=5000)