91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
# -*-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)
|