You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+Folium地图多边形坐标获取及面积计算实现求助

实现Flask+Folium多边形绘制与面积计算

前端JavaScript(嵌入index.html)

先确保Folium地图启用Draw控件,再添加按钮和对应逻辑,捕获绘制的多边形坐标并发送到后端:

<!-- 地图容器后添加按钮 -->
<button id="calcBtn">Calculate Shape</button>

<script>
// 存储绘制的多边形坐标
let drawnPolygonCoords = null;

// 监听Draw控件的创建事件
map.on('draw:created', function(e) {
    const type = e.layerType;
    const layer = e.layer;
    
    // 仅处理多边形类型
    if (type === 'polygon') {
        // 移除之前绘制的多边形(可选,避免重复)
        if (drawnPolygonCoords) {
            map.removeLayer(layer);
        }
        // 获取坐标:格式为[[纬度, 经度], ...]
        drawnPolygonCoords = layer.getLatLngs()[0];
    }
});

// 绑定按钮点击事件
document.getElementById('calcBtn').addEventListener('click', async function() {
    if (!drawnPolygonCoords) {
        alert('请先绘制一个多边形!');
        return;
    }

    // 转换坐标格式为后端易处理的数组
    const coords = drawnPolygonCoords.map(coord => [coord.lat, coord.lng]);

    try {
        // 发送POST请求到后端接口
        const response = await fetch('/calculate-area', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({ polygon_coords: coords }),
        });

        const result = await response.json();
        if (result.success) {
            alert(`多边形面积:${result.area_sqkm} 平方公里 / ${result.area_hectares} 公顷`);
        } else {
            alert('计算失败:' + result.error);
        }
    } catch (error) {
        alert('请求失败:' + error.message);
    }
});
</script>

Flask后端代码(app.py)

先安装依赖:pip install flask folium shapely pyproj

from flask import Flask, render_template, request, jsonify
import folium
from shapely.geometry import Polygon
from pyproj import Transformer

app = Flask(__name__)

@app.route('/')
def index():
    # 创建基础地图,启用仅支持多边形的Draw控件
    m = folium.Map(location=[39.9042, 116.4074], zoom_start=12)
    folium.plugins.Draw(
        export=False,
        draw_options={
            'polyline': False,
            'rectangle': False,
            'circle': False,
            'marker': False,
            'circlemarker': False,
            'polygon': True
        }
    ).add_to(m)
    # 将地图转为HTML字符串传入模板
    map_html = m._repr_html_()
    return render_template('index.html', map_html=map_html)

@app.route('/calculate-area', methods=['POST'])
def calculate_area():
    try:
        data = request.get_json()
        coords = data.get('polygon_coords')
        
        if not coords or len(coords) < 3:
            return jsonify({'success': False, 'error': '无效的多边形坐标(至少需要3个点)'})
        
        # 自动匹配UTM投影带,解决经纬度计算面积的误差问题
        lon = coords[0][1]
        utm_zone = int((lon + 180) / 6) + 1
        # 根据纬度选择北半球/南半球UTM坐标系
        crs = f'EPSG:326{utm_zone}' if coords[0][0] >= 0 else f'EPSG:327{utm_zone}'
        transformer = Transformer.from_crs('EPSG:4326', crs, always_xy=True)
        
        # 转换所有坐标为UTM投影(米为单位)
        utm_coords = [transformer.transform(lon, lat) for lat, lon in coords]
        
        # 创建多边形并计算面积
        polygon = Polygon(utm_coords)
        area_sqm = polygon.area
        area_sqkm = area_sqm / 1_000_000
        area_hectares = area_sqm / 10_000
        
        return jsonify({
            'success': True,
            'area_sqm': round(area_sqm, 2),
            'area_sqkm': round(area_sqkm, 4),
            'area_hectares': round(area_hectares, 2)
        })
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})

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

index.html模板基础结构

确保正确渲染Folium地图:

<!DOCTYPE html>
<html>
<head>
    <title>Polygon Area Calculator</title>
    {{ map_html|safe }}
</head>
<body>
    <div id="map">{{ map_html|safe }}</div>
    <button id="calcBtn">Calculate Shape</button>

    <!-- 粘贴之前的JavaScript代码到这里 -->
    <script>
        // 这里放JS代码
    </script>
</body>
</html>

关键提示

  • 经纬度直接计算面积会有较大误差,转为UTM投影(米为单位)后计算更精准
  • Draw控件配置仅保留多边形工具,避免用户误操作其他绘图类型
  • 前后端都加入了基础错误处理,方便调试排查问题

内容的提问来源于stack exchange,提问作者maniacfrxxk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:42:46