跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端java

基于 Leaflet 和天地图实现长沙免费运动场所 WebGIS 可视化

通过 Leaflet 结合天地图服务,实现了长沙市免费运动场所的空间分布可视化。文章介绍了从本地数据源获取地址信息,利用 Java 后台调用地名解析接口将文本地址转换为经纬度坐标,再到前端使用 Leaflet 加载地图、自定义 Marker 图标及绑定 Popup 信息的完整流程。最终展示了 6 个典型运动场所的位置分布及设施详情,为市民提供便捷的户外健身查询工具,同时也为 WebGIS 应用开发提供了参考。

无尘发布于 2026/3/26更新于 2026/10/875 浏览
基于 Leaflet 和天地图实现长沙免费运动场所 WebGIS 可视化

基于 Leaflet 和天地图实现长沙免费运动场所 WebGIS 可视化

在城市建设中,如何快速找到身边的免费运动场地一直是市民关心的话题。利用 WebGIS 技术,我们可以将分散的地理信息整合到一个可视化的平台上。本案例结合轻量级的 Leaflet 框架与国产的天地图服务,构建了一个长沙市免费运动场所的查询系统。

数据准备与解析

数据来源整理

基础数据主要来源于本地生活服务平台整理的公开信息。原始数据通常只有中文地址描述,缺乏经纬度坐标,无法直接在地图上展示。我们需要将这些文本地址转换为具体的空间位置。

序号所属范围位置信息
1开福区东风路立交桥东风路与三一大道交会处
2芙蓉区花侯路浏阳河大桥芙蓉区花侯路浏阳河大桥下方
3梅溪湖街道梅园社区导航梅岭国际小区南门,进门左拐进入小区,在 8 栋后面
4湖南大学附属中学对面湖南大学附属中学对面,联丰路桥下
5洋湖街道湘府路大桥西附近
6天顶街道天源社区、雷锋大道导航静园山庄,进门左拐,或者导航科迪雅静园幼儿园

Java 后台地名解析

为了避免全国范围内地名重名导致的定位偏差,我们在调用天地图地名解析服务前,会给地址加上'长沙'等限定词。这里使用 Java 编写一个简单的测试用例来演示如何批量获取坐标。

@Test public void testGeocoder2() throws InterruptedException { 
    String [] loc_name = {"东风路立交桥运动公园","芙蓉区花侯路浏阳河大桥下方","梅岭国际小区","湖南大学附属中学对面","长沙湘府路大桥西","长沙雷锋大道静园山庄"}; 
    for(String name : loc_name) { 
        String keyWord = "%7B'keyWord':'" + name + "'%7D" ; 
        HttpResponse<String> resp = tdtOptService.getGeocoder(keyWord, TDT_SERVER_KEY); 
        System.out.println(name + "===>" +resp.getBodyResult()); 
        Thread.sleep(1500); // 注意控制请求频率,避免触发限流
    } 
}

运行上述代码后,控制台会返回包含经纬度的 JSON 响应。这一步是后续前端展示的基础,确保每个点都能准确落在地图上。

Leaflet 前端地图展示

拿到坐标数据后,接下来就是如何在网页上呈现。Leaflet 提供了丰富的 API,我们只需要准备好数据对象,然后遍历添加到地图图层即可。

数据结构组装

我们将解析后的结果整理成统一的 JSON 格式,包含经纬度、名称、交通方式、运动设施等信息。

// 待标绘的点
dataJson = [
  {
    lat: 28.232727,
    lon: 112.987638,
    c_name: "东风路立交桥运动公园",
    range: "开福区东风路立交桥",
    traffic: "可乘坐公交到达附近站点,如东风路站等;自驾周边有相应道路可抵达。",
    color: "#03a9f4",
    sports: "包括三个半场篮球场,两片多功能运动场,标准羽毛球场,儿童活动区和广场舞场地。"
  },
  {
    lat: 28.212437,
    lon: 113.034959,
    c_name: "芙蓉区花侯路浏阳河大桥下方",
    range: "芙蓉区花侯路浏阳河大桥",
    traffic: "乘坐公交可选择靠近浏阳河大桥的站点下车;自驾可通过花侯路等道路抵达。",
    color: "#ff9800",
    sports: "设置了体育健身场地,保留了龙舟文化展示区。"
  }
  // ... 其他点位数据
];

标记与交互实现

为了让地图上的标记不重叠且显示丰富信息,我们使用了 L.divIcon 自定义图标,并配合碰撞检测插件(collision layer)优化显示效果。点击标记时,会弹出包含详细信息的 HTML 内容。

var collisionLayer = L.LayerGroup.collision({ margin: 3 });

for (var i = 0; i < dataJson.length; i++) {
    var html = '';
    var marker = L.marker([dataJson[i].lat, dataJson[i].lon], {
        icon: L.divIcon({
            iconSize: null,
            className: '',
            popupAnchor: [5, 5],
            shadowAnchor: [5, 5],
            html: buildHtml(dataJson[i], i)
        })
    }).addTo(collisionLayer);
}

collisionLayer.addTo(map);

function buildHtml(data, index) {
    var html = '<div style="color:' + data.color + '" class="animation-spaceInDown">';
    html += '<div><b>' + (index + 1) + '、' + data.range + '&nbsp;' + data.c_name + '</b><span></span></div>';
    html += '<div>推荐交通:' + data.traffic + '</div>';
    html += '<div>推荐运动:' + data.sports + '</div>';
    html += '</div>';
    return html;
}

这里需要注意的是,buildHtml 函数负责拼接弹窗内容,通过 CSS 类名控制动画效果,颜色则根据数据动态设置,方便区分不同区域。

成果展示

完成开发后,整个平台可以直观地展示长沙市免费运动场所的空间分布情况。

整体分布

从地图上看,这 6 个点位覆盖了长沙的主要城区。靠北的是静园山庄,最东边位于芙蓉区花侯路浏阳河大桥下方,西边则是梅溪湖一期的梅岭国际小区,南边集中在湘府路大桥西附近。

具体点位详情

  • 东风路立交桥运动公园:位于东风路与三一大道交会处。设施齐全,包含篮球场、气排球场、羽毛球场以及儿童活动区,非常适合家庭健身。
  • 芙蓉区花侯路浏阳河大桥下方:桥下空间改造的典型,除了常规健身场地,还保留了龙舟文化展示区,运动之余能感受文化氛围。
  • 梅岭国际小区:位于梅溪湖街道,背靠小山坡,环境幽静。场地较大,配有羽毛球、乒乓球桌,管理较为规范。
  • 湖南大学附属中学对面:联丰路桥下空间,新改造的场地,有三片羽毛球场和多个乒乓球桌,交通便利。
  • 湘府路大桥西:洋湖街道附近,桥下空间利用率很高,包含五人制足球场、篮球场、羽毛球场及多张乒乓球台。
  • 静园山庄:地理位置稍偏,适合雷锋大道附近的居民。原为网球场,也可打羽毛球,旁边附带篮球场。

总结

本方案通过 Java 后端调用天地图 API 进行地址解析,再结合 Leaflet 前端库实现地图可视化,成功构建了一个免费的运动场所查询平台。这种前后端分离的模式不仅便于维护,也能灵活扩展更多功能,比如搜索定位或路径规划。对于开发者而言,这是一个很好的 WebGIS 入门实战案例,既锻炼了数据处理能力,也熟悉了地图服务的集成流程。

目录

  1. 基于 Leaflet 和天地图实现长沙免费运动场所 WebGIS 可视化
  2. 数据准备与解析
  3. 数据来源整理
  4. Java 后台地名解析
  5. Leaflet 前端地图展示
  6. 数据结构组装
  7. 标记与交互实现
  8. 成果展示
  9. 整体分布
  10. 具体点位详情
  11. 总结

更多推荐文章

查看全部
  • Python 调用海康 SDK 实现工业相机实时预览全流程
  • 降低论文 AIGC 检测率的实用技巧与工具参考
  • 9款AI论文写作工具横向对比与使用指南
  • Python 处理 Excel:openpyxl 与 pandas 实战指南
  • 2025 电商客服机器人实测:乐言、店小蜜等五家主流品牌对比
  • 用 Vibe Coding 实现 AI 全自动代码生成与交付
  • Whisper.cpp 轻量级语音识别工具使用指南
  • 基于LSTM神经网络的学生成绩预测系统:Django与Python实现
  • Lumerical Python API 实战:从数据自动化到光子逆向设计
  • ChatGPT 核心功能与实战技巧指南
  • OpenClaw 开源 AI 智能体项目与部署方案指南
  • 前端 IndexedDB 实战指南
  • SeaTunnel 2.3.11 与 Web 1.0.3 Docker 部署:Kafka 同步 Hive/ES 实战
  • 树莓派 4B 连接大疆 M300 无人机开发指南
  • LLaMA 大模型 LoRA 微调实践与心得
  • Glide 加载 WebP 动画的常见问题与解决方案
  • 医疗 AI 编程与培训技能树分析报告(2025 版)
  • 立创 EDA 6 层高速 PCB 设计实战:逻辑派 FPGA-G1 开发板布局布线详解
  • Java8 ConcurrentHashMap 底层数据结构与核心方法流程
  • 阿里 RynnBrain 具身智能模型:30B MoE 时空记忆架构与机器人开发实战

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online