116 lines
3.1 KiB
Python
116 lines
3.1 KiB
Python
import io
|
|
import base64
|
|
import matplotlib
|
|
matplotlib.use('Agg')
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
from flask import Blueprint, jsonify
|
|
|
|
bp = Blueprint('vulnerability', __name__, url_prefix='/api/vulnerability')
|
|
|
|
|
|
def generate_drought_index_chart():
|
|
"""월별 가뭄 지수 차트 생성"""
|
|
fig, ax = plt.subplots(figsize=(6, 3))
|
|
|
|
np.random.seed(2025)
|
|
months = list(range(1, 21))
|
|
values_2025 = np.random.uniform(20, 35, 20)
|
|
values_2024 = np.random.uniform(15, 30, 20)
|
|
|
|
ax.plot(months, values_2025, 'b-', linewidth=2, label='2025')
|
|
ax.plot(months, values_2024, 'g-', linewidth=2, label='2024')
|
|
ax.set_xlim(1, 20)
|
|
ax.set_ylim(10, 40)
|
|
ax.set_xlabel('')
|
|
ax.set_ylabel('')
|
|
ax.legend(loc='lower right', fontsize=8)
|
|
ax.grid(True, alpha=0.3)
|
|
|
|
plt.tight_layout()
|
|
buf = io.BytesIO()
|
|
fig.savefig(buf, format='png', dpi=100, bbox_inches='tight', transparent=True)
|
|
buf.seek(0)
|
|
image_base64 = base64.b64encode(buf.getvalue()).decode('utf-8')
|
|
plt.close(fig)
|
|
|
|
return image_base64
|
|
|
|
|
|
def generate_rainfall_chart():
|
|
"""강우량 차트 생성"""
|
|
fig, ax = plt.subplots(figsize=(6, 3))
|
|
|
|
categories = ['누적강우', '평년누적', '평년대비']
|
|
values = [75, 60, 85]
|
|
colors = ['#3498db', '#2ecc71', '#9b59b6']
|
|
|
|
bars = ax.barh(categories, values, color=colors, height=0.5)
|
|
ax.set_xlim(0, 100)
|
|
ax.set_xlabel('')
|
|
|
|
for bar, val in zip(bars, values):
|
|
ax.text(val + 2, bar.get_y() + bar.get_height()/2, f'{val}%',
|
|
va='center', fontsize=9)
|
|
|
|
ax.spines['top'].set_visible(False)
|
|
ax.spines['right'].set_visible(False)
|
|
|
|
plt.tight_layout()
|
|
buf = io.BytesIO()
|
|
fig.savefig(buf, format='png', dpi=100, bbox_inches='tight', transparent=True)
|
|
buf.seek(0)
|
|
image_base64 = base64.b64encode(buf.getvalue()).decode('utf-8')
|
|
plt.close(fig)
|
|
|
|
return image_base64
|
|
|
|
|
|
@bp.route('/drought-index', methods=['GET'])
|
|
def drought_index():
|
|
"""월별 가뭄 지수 차트 반환"""
|
|
try:
|
|
image = generate_drought_index_chart()
|
|
return jsonify({
|
|
'status': 'success',
|
|
'image': image
|
|
})
|
|
except Exception as e:
|
|
return jsonify({
|
|
'status': 'error',
|
|
'message': str(e),
|
|
'image': None
|
|
})
|
|
|
|
|
|
@bp.route('/rainfall', methods=['GET'])
|
|
def rainfall():
|
|
"""강우량 차트 반환"""
|
|
try:
|
|
image = generate_rainfall_chart()
|
|
return jsonify({
|
|
'status': 'success',
|
|
'image': image
|
|
})
|
|
except Exception as e:
|
|
return jsonify({
|
|
'status': 'error',
|
|
'message': str(e),
|
|
'image': None
|
|
})
|
|
|
|
|
|
@bp.route('/summary', methods=['GET'])
|
|
def summary():
|
|
"""취약성 요약 데이터 반환"""
|
|
return jsonify({
|
|
'status': 'success',
|
|
'data': {
|
|
'risk_level': '심각',
|
|
'risk_score': 72,
|
|
'drought': {'value': 72, 'risk': 'High'},
|
|
'soil_moisture': {'value': 45, 'risk': 'Moderate'},
|
|
'reservoir': {'value': 27, 'risk': 'Low'}
|
|
}
|
|
})
|