from flask import Flask, request, jsonify
import pandas as pd
import numpy as np

app = Flask(__name__)

@app.route('/process-data', methods=['POST'])
def process_data():
    # 从请求中获取参数
    data = request.json
    num_rows = data['numRows']
    num_cols = data['numCols']
    attribute = data['attribute']
    openfile = data['openfile']  # 确保服务器有对该文件的访问权限

    # 读取CSV数据，没有头部信息
    df = pd.read_csv(openfile, header=None)
    
    # 提取坐标和所选属性
    lats = df.iloc[:, 3].values
    lons = df.iloc[:, 4].values
    values = df.iloc[:, attribute + 1].values

    # 计算矩阵维度和单元格大小
    max_latitude = np.max(lats)
    min_latitude = np.min(lats)
    max_longitude = np.max(lons)
    min_longitude = np.min(lons)

    step_latlen = (max_latitude - min_latitude) / num_rows
    step_lonlen = (max_longitude - min_longitude) / num_cols

    # 初始化矩阵
    matrix = np.zeros((num_rows, num_cols, 2))

    # 填充矩阵
    for lat, lon, value in zip(lats, lons, values):
        i = int((lat - min_latitude) / step_latlen)
        j = int((lon - min_longitude) / step_lonlen)
        i = min(i, num_rows - 1)
        j = min(j, num_cols - 1)
        matrix[i, j, 0] += value
        matrix[i, j, 1] += 1

    # 计算平均值并替换原有矩阵值
    with np.errstate(divide='ignore', invalid='ignore'):
        averaged_matrix = np.true_divide(matrix[:, :, 0], matrix[:, :, 1])
        averaged_matrix[~np.isfinite(averaged_matrix)] = 0  # 替换NaN和inf为0

    # 计算颜色步长
    min_value = np.min(averaged_matrix[averaged_matrix > 0])
    max_value = np.max(averaged_matrix)
    color_step = (max_value - min_value) / 100

    # 标准化矩阵值
    normalized_matrix = (averaged_matrix - min_value) / color_step
    normalized_matrix[averaged_matrix == 0] = 0  # 保持原有0值

    # 转换为列表以便于json化
    result = normalized_matrix.tolist()

    # 返回处理后的结果
    return jsonify({
        'result': result,
        'minValue': min_value,
        'maxValue': max_value,
        'colorStep': color_step
    })

if __name__ == '__main__':
    app.run(debug=True)
