GreenTransPowerCalculate/run.py

91 lines
3.3 KiB
Python
Raw Normal View History

2025-04-27 17:25:43 +08:00
# -*-coding:utf-8-*-
import os
import json
from flask import Flask, request, make_response, jsonify
from logzero import logger
current_path = os.path.dirname(os.path.abspath(__file__)) # for local
wind_product_path = f"{current_path}/wind/wind_product.xlsx"
# current_path = "/app" # for docker
logger.info(f"{current_path}")
app = Flask(__name__)
from pv.eva_pv import calculate_pv_potential, get_slope_from_api
from wind.wind_total import wind_farm_analysis
terrain_config = {
"耕地": 1.1, "裸地": 1.1, "草地": 1.2, "灌木": 1.4,
"湿地": 1.65, "林地": 1.65, "建筑": 1.35, "水域": 1.35
}
@app.route('/pv_power/', methods=["POST"])
def get_pv_potential():
resp_info = dict()
if request.method == "POST":
logger.info(request.get_json())
latitude = request.json.get('latitude')
longitude = request.json.get('longitude')
available_area_sq_km = float(request.json.get('available_area_sq_km'))
pv_type = request.json.get('pv_type')
terrain_type = request.json.get('terrain_type')
component_name = request.json.get('component_name')
electricity_price = float(request.json.get('electricity_price'))
terrain_complexity = terrain_config.get(terrain_type)
try:
# 通过 API 获取坡度
slope_deg = get_slope_from_api(latitude, longitude)
logger.info(f"使用参数:坡度={slope_deg:.2f}°,地形复杂性因子={terrain_complexity}")
pv_potential = calculate_pv_potential(
available_area_sq_km=available_area_sq_km,
component_name=component_name,
longitude=longitude,
latitude=latitude,
slope_deg=slope_deg,
terrain_complexity=terrain_complexity,
pv_type=pv_type,
terrain_type=terrain_type,
electricity_price=electricity_price
)
resp_info["code"] = 200
resp_info["data"] = pv_potential
except Exception as e:
logger.info(e)
resp_info["code"] = 406
resp_info["data"] = str(e)
resp = make_response(json.dumps(resp_info))
resp.status_code = 200
return resp
@app.route('/wind_power/', methods=["POST"])
def get_wind_potential():
resp_info = dict()
if request.method == "POST":
area_km2 = float(request.json.get('available_area_sq_km'))
device_name = request.json.get('component_name')
electricity_price = float(request.json.get('electricity_price'))
v_avg = float(request.json.get("velocity_avg"))
t_avg = float(request.json.get("temp_avg"))
try:
wind_potential = wind_farm_analysis(
device_name=device_name,
area_km2=area_km2,
electricity_price=electricity_price,
file_path=wind_product_path,
velocity_avg=v_avg,
T_avg=t_avg
)
resp_info["code"] = 200
resp_info["data"] = wind_potential
except Exception as e:
logger.info(e)
resp_info["code"] = 406
resp_info["data"] = str(e)
resp = make_response(json.dumps(resp_info))
resp.status_code = 200
return resp
if __name__ == '__main__':
app.run(port=12123, host="0.0.0.0", debug=False)