|
@@ -1,5 +1,8 @@
|
|
import sqlite3
|
|
import sqlite3
|
|
from flask import Blueprint, request, jsonify, current_app
|
|
from flask import Blueprint, request, jsonify, current_app
|
|
|
|
+from werkzeug.security import generate_password_hash, check_password_hash
|
|
|
|
+from werkzeug.utils import secure_filename
|
|
|
|
+from io import BytesIO
|
|
from .model import predict, train_and_save_model, calculate_model_score
|
|
from .model import predict, train_and_save_model, calculate_model_score
|
|
import pandas as pd
|
|
import pandas as pd
|
|
from . import db # 从 app 包导入 db 实例
|
|
from . import db # 从 app 包导入 db 实例
|
|
@@ -8,11 +11,13 @@ from .database_models import Models, ModelParameters, Datasets, CurrentReduce, C
|
|
import os
|
|
import os
|
|
from .utils import create_dynamic_table, allowed_file, infer_column_types, rename_columns_for_model_predict, \
|
|
from .utils import create_dynamic_table, allowed_file, infer_column_types, rename_columns_for_model_predict, \
|
|
clean_column_names, rename_columns_for_model, insert_data_into_dynamic_table, insert_data_into_existing_table, \
|
|
clean_column_names, rename_columns_for_model, insert_data_into_dynamic_table, insert_data_into_existing_table, \
|
|
- predict_to_Q, Q_to_t_ha
|
|
|
|
|
|
+ predict_to_Q, Q_to_t_ha, create_kriging
|
|
from sqlalchemy.orm import sessionmaker
|
|
from sqlalchemy.orm import sessionmaker
|
|
import logging
|
|
import logging
|
|
from sqlalchemy import text, select, MetaData, Table, func
|
|
from sqlalchemy import text, select, MetaData, Table, func
|
|
from .tasks import train_model_task
|
|
from .tasks import train_model_task
|
|
|
|
+from flask import send_file
|
|
|
|
+
|
|
|
|
|
|
# 配置日志
|
|
# 配置日志
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
@@ -28,7 +33,7 @@ def hash_password(password):
|
|
|
|
|
|
def get_db():
|
|
def get_db():
|
|
""" 获取数据库连接 """
|
|
""" 获取数据库连接 """
|
|
- return sqlite3.connect(app.config['DATABASE'])
|
|
|
|
|
|
+ return sqlite3.connect(bp.config['DATABASE'])
|
|
|
|
|
|
|
|
|
|
# 添加一个新的辅助函数来检查数据集大小并触发训练
|
|
# 添加一个新的辅助函数来检查数据集大小并触发训练
|
|
@@ -984,7 +989,7 @@ def update_user():
|
|
data = request.get_json()
|
|
data = request.get_json()
|
|
|
|
|
|
# 打印收到的请求数据
|
|
# 打印收到的请求数据
|
|
- app.logger.info(f"Received data: {data}")
|
|
|
|
|
|
+ bp.logger.info(f"Received data: {data}")
|
|
|
|
|
|
user_id = data.get('userId') # 用户ID
|
|
user_id = data.get('userId') # 用户ID
|
|
name = data.get('name') # 用户名
|
|
name = data.get('name') # 用户名
|
|
@@ -1173,7 +1178,7 @@ def import_data():
|
|
|
|
|
|
try:
|
|
try:
|
|
# 保存文件到临时路径
|
|
# 保存文件到临时路径
|
|
- temp_path = os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(file.filename))
|
|
|
|
|
|
+ temp_path = os.path.join(bp.config['UPLOAD_FOLDER'], secure_filename(file.filename))
|
|
file.save(temp_path)
|
|
file.save(temp_path)
|
|
logger.debug(f"File saved to temporary path: {temp_path}")
|
|
logger.debug(f"File saved to temporary path: {temp_path}")
|
|
|
|
|
|
@@ -1394,3 +1399,26 @@ def set_current_dataset(data_type, dataset_id):
|
|
|
|
|
|
finally:
|
|
finally:
|
|
session.close()
|
|
session.close()
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@bp.route('/kriging_interpolation', methods=['POST'])
|
|
|
|
+def kriging_interpolation():
|
|
|
|
+ try:
|
|
|
|
+ data = request.get_json()
|
|
|
|
+ required = ['file_name', 'emission_column', 'points']
|
|
|
|
+ if not all(k in data for k in required):
|
|
|
|
+ return jsonify({"error": "Missing parameters"}), 400
|
|
|
|
+
|
|
|
|
+ # 添加坐标顺序验证
|
|
|
|
+ points = data['points']
|
|
|
|
+ if not all(len(pt) == 2 and isinstance(pt[0], (int, float)) for pt in points):
|
|
|
|
+ return jsonify({"error": "Invalid points format"}), 400
|
|
|
|
+
|
|
|
|
+ result = create_kriging(
|
|
|
|
+ data['file_name'],
|
|
|
|
+ data['emission_column'],
|
|
|
|
+ data['points']
|
|
|
|
+ )
|
|
|
|
+ return jsonify(result)
|
|
|
|
+ except Exception as e:
|
|
|
|
+ return jsonify({"error": str(e)}), 500
|