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

基于百度天气 API 与 Leaflet 的 WebGIS 天气预报系统构建

介绍如何使用 Java 后端结合百度天气 API 获取省会城市天气数据,并通过 WebGIS 技术(Leaflet)在前端展示。主要步骤包括:通过 SQL 查询获取全国省会城市空间信息及经纬度;在 Java 中封装 Mapper 和 Service 调用百度接口获取实时及预报天气;前端使用 HTML5、CSS3 和 JavaScript 集成背景音乐,利用 Leaflet 在地图上标记城市并轮播展示天气实况。系统实现了复古风格与现代数据的结合。

人间过客发布于 2026/4/6更新于 2026/10/18104 浏览
基于百度天气 API 与 Leaflet 的 WebGIS 天气预报系统构建

前言

在数字技术飞速发展的今天,现代技术手段可以重现老式天气预报的风格。WebGIS 技术的出现,为我们提供了将地理信息与网络技术相结合的机会,实现地图的可视化展示和数据的动态交互。整合百度天气提供的实时数据,确保天气信息的准确性和及时性。通过 WebGIS 技术,可以在地图上直观地展示不同地区的天气情况。

文章配图

我们的目标是构建一个能够唤醒 80 年代记忆的老式天气预报系统。这个播报系统需要播放熟悉的背景音乐。在播报形式上,播报内容将涵盖基本的天气信息,如温度、时间和明日天气等。尽管界面和播报形式是 80 年代的风格,但数据来源却是现代的。我们将整合百度天气提供的实时数据,确保天气信息的准确性和及时性。通过 WebGIS 技术,我们可以在地图上直观地展示不同地区的天气情况,用户可以通过简单的操作查看全国各地的天气预报。

在构建这样一个系统的过程中,我们面临着诸多技术挑战。为此,我们将采用现代的前端开发技术,如 HTML5、CSS3 和 JavaScript,结合 WebGIS 框架,实现一个既复古又现代的界面。此外,我们还需要编写一套符合当时风格的播报脚本,确保播报内容的准确性和趣味性。最后,整合百度天气数据并将其与 WebGIS 地图相结合,需要解决数据格式转换、地图渲染优化等问题。

一、省会城市信息构建

在进行省会城市天气预报的 WebGIS 可视化开发之前,首先我们需要对全国的省会城市信息进行查询。在后面调用百度天气接口时也需要使用省会城市名称。因此这里首先介绍如何查询省会城市空间信息以及如何在 Java 中进行后台的城市信息查询。

1、省会城市空间查询

在之前的博文中,我们介绍了城市点位信息和省份信息,在进行省会城市信息查询时,也同样需要使用这几张表。查询语句如下:

SELECT T.NAME cityName, T.pinYin, T.bz, T.slx, tc.code provinceCode, tc.NAME provinceName, st_x(T.geom) cityLon, st_y(T.geom) cityLat, dict.dict_label provinceAbbreviations, st_asgeojson(tc.geom) geomJson 
FROM biz_geographic_name T, biz_province tc, sys_dict_data dict 
WHERE T.bz IN ('省会城市', '直辖市', '首都') AND st_contains(tc.geom, T.geom) AND dict.dict_value = tc.code 
ORDER BY tc.code

在 Navicat 客户端中执行以上语句后,可以在客户端看到以下查询结果:

文章配图

在后面的操作中,我们就需要使用这个返回结果中的省会城市的中心点经纬度的位置来进行天气的查询,最后返回给前台进行使用。

2、Java 后台查询

在 SQL 中实现上述的查询之后,接下来我们就可以将相关的查询逻辑封装成 Java 接口,来供前端调用。在 Java 中的 Mapper 类来实现以上的查询服务,Mapper.java 的核心代码如下:

static      +  +  +  +  +  +  + ;

List<ProvinceAbbreviationsVo> ;
final
String
FIND_PROVINCEABBREVIATIONS_LIST
=
"<script>"
" SELECT T.name cityName,T.pinYin,T.bz,T.slx,tc.code provinceCode,tc.NAME provinceName, "
" st_x(T.geom) cityLon,st_y(T.geom) cityLat,dict.dict_label provinceAbbreviations, "
" st_asgeojson(tc.geom) geomJson "
" FROM biz_geographic_name T,biz_province tc,sys_dict_data dict "
" WHERE T.bz IN ('省会城市', '直辖市', '首都') AND st_contains(tc.geom, T.geom) AND dict.dict_value = tc.code "
" order by tc.code "
"</script>"
@Select(FIND_PROVINCEABBREVIATIONS_LIST)
findProvinceAbbreviations
()

当然,为了方便方法的复用,这里我们将 Mapper 的查询能力封装成一个通用的方法,在 Service 中进行实现,通过提供对外方法,供第三方服务进行调用。Service 的调用比较简单,代码如下:

@Override
public List<ProvinceAbbreviationsVo> findProvinceAbbreviations() {
    return this.baseMapper.findProvinceAbbreviations();
}

最后实现一个 Controller 来将 Service 的服务接口对外提供出来。

二、Java 省会城市天气查询

有了这个查询省会天气的服务之后,接下来我们就可以根据不同省会城市的经纬度,利用百度天气接口的国内经纬度查询能力,直接返回对应城市的天气以及未来的天气预报。本节就来深入介绍一下如何使用经纬度来进行查询天气,并且对相应对象的属性进行一个简单的介绍。

1、与百度开放平台集成天气

为了实现根据省会城市的经纬度来查询所在城市的天气信息,首先我们需要定义百度天气接口的方法,定义方法如下:

/**
 * - 根据经纬度和坐标类型查询指定地点的天气信息
 * @param location 经纬度,经度在前纬度在后,逗号分隔。支持类型:bd09mc/bd09ll/wgs84/gcj02
 * @param data_type 请求数据类型。数据类型有:now/fc/index/alert/fc_hour/all,控制返回内容,默认值无
 * @param coordtype 支持类型:wgs84/bd09ll/bd09mc/gcj02 默认值:wgs84
 * @return
 */
@GetHttpInterface("/")
public HttpResponse<String> getByLocation(@QueryPar("location") String location, @QueryPar("data_type") String data_type, @QueryPar("coordtype") String coordtype);

有了这个接口之后,接下来我们就可以从前面获取的省会城市列表中来进行循环调用,传入省会城市的经纬度位置就可以实现天气情况的查询。调用实例代码如下:

/**
 * 获取省会城市天气预报信息
 * @throws InterruptedException
 */
@Test
public void testGetProvinceWeather() throws InterruptedException {
    Random random = new Random();
    List<LinkedHashMap<String, Object>> provinceWeatherData = new ArrayList<LinkedHashMap<String,Object>>(34);
    List<ProvinceAbbreviationsVo> provinceList = geographicNameService.findProvinceAbbreviations();
    Gson gson = new Gson();
    for (ProvinceAbbreviationsVo vo : provinceList) {
        //经纬度,经度在前纬度在后,逗号分隔。
        String location = vo.getCityLon() + "," + vo.getCityLat();
        //lat:39.066114,lon:117.213135,w_name:"晴",city:"天津",temp:"3-14",color:"#03a9f4",two:"11/22 3-12"
        HttpResponse<String> result = baiduWeatherApiService.getByLocation(location, DATA_TYPE, "wgs84");
        if(StringUtils.isNotEmpty(result.getBodyResult())) {
            LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
            map.put("lat", vo.getCityLat());
            map.put("lon", vo.getCityLon());
            map.put("city", vo.getCityName());
            BdWeatherDTO bdWeatherInfo = gson.fromJson(result.getBodyResult(), BdWeatherDTO.class);
            WeatherInfoDTO weatherInfoDTO = bdWeatherInfo.getResult();
            map.put("w_name", weatherInfoDTO.getWeatherNow().getText());
            List<WeatherForecasts> forecasts =weatherInfoDTO.getForecasts();
            if(StringUtils.isNotEmpty(forecasts)) {
                WeatherForecasts today = forecasts.get(0);
                map.put("temp", today.getLow() + "-" + today.getHigh());
                WeatherForecasts tomorrow = forecasts.get(1);
                Date tempDate = tomorrow.getDate();
                String two = (tempDate.getMonth() + 1) + "-" + tempDate.getDate() + " "+ tomorrow.getLow() + "-" + tomorrow.getHigh();
                map.put("two", two);
            }
            provinceWeatherData.add(map);
        }
        Thread.sleep(1500 + random.nextInt(1000));
    }
    String weatherStr = gson.toJson(provinceWeatherData);
    System.out.println(provinceWeatherData);
    System.out.println(weatherStr);
}

需要说明的是,这里采用线程休眠的原因是为了避免造成并发调用。当然,如果您的账号权限比较高,不受并发的限制就无所谓了。

2、响应对象属性介绍

为了方便标注,实现省会城市的实时天气信息展示以及未来一天的天气情况展示,需要定义一个标准的响应对象,通过上述代码可以看出我们使用一个 hashmap 来进行实现。示例如下:

{
 "lat":"39.903162481",
 "lon":"116.401006456",
 "city":"北京市",
 "w_name":"晴",
 "temp":"-2-10",
 "two":"12-8 -4-5"
}
序号参数名称说明
1lat纬度
2lon经度
3city城市名称
4w_name天气说明
5temp气温
6two明日天气

3、省会天气实况展示

这里以 12 月 7 日为例,使用上述程序查询出来 12 月 7 日到 12 月 8 日两天的省会城市天气预报数据如下:

[{"lat":"39.903162481","lon":"116.401006456","city":"北京市","w_name":"晴","temp":"-2-10","two":"12-8 -4-5"}, {"lat":"39.083383854","lon":"117.193764008","city":"天津市","w_name":"晴","temp":"-2-11","two":"12-8 -2-5"}, ... ]

三、WebGIS 应用构建

本节将重点介绍如何在 WebGIS 中进行应用的构建,在使用百度天气创建好相应的省会城市列表的天气信息后,接下来要做的就是要集成经典的天气预报北京音乐,同时使用 Leaflet 来标注所有的省会城市位置,并且要展示天气信息,最后要根据位置来实现城市的轮播展示。

1、背景音乐集成

背景音乐这里我们找了一个很经典的,是我们小时候百听不厌的背景音乐。当然,大家也可以根据自己的喜好来调整。在 html 中增加一个在线视频,然后需要我们隐藏画面,只保留音乐,核心代码如下:

<!-- 视频标签,设置为循环播放,但初始时不自动播放 -->
<video loop muted>
 <source src="./weather/music.mp4" type="video/mp4">
 您的浏览器不支持 HTML5 视频。
</video>

为了隐藏画面,这里我们使用 CSS 样式的方式进行控制,代码如下:

/* 隐藏视频画面 */
video { display: none; }

为了演示的效果,我们将设置网页进行延迟播放,设置方法如下:

// 获取视频元素和按钮
var video = document.getElementById('backgroundVideo');
// 设置音量为 20%
video.volume = 0.2;
var button = document.getElementById('playButton');
// 页面加载后延迟 2 秒自动播放
window.onload = function() {
    initWeather();
    setTimeout(function() {
        video.play(); // 开始播放
        video.muted = false; // 取消静音
        preview();//城市天气进行轮播
    }, 5000); // 2000 毫秒(2 秒)后执行
};

2、城市标记及天气展示

城市标记及天气展示比较简单,使用 Leaflet 来进行位置的标注即可,这里给出示例代码:

function initWeather(){
    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(dataJson,index){
    var html = '';
    html += "<div style='color:"+getRandomColor()+"' class='animation-spaceInDown'><div ><b>"+dataJson.city + "&nbsp;" + dataJson.w_name + "&nbsp;"+ dataJson.temp +"℃</b><span></span></div>";
    html += "<div>" + ""+ dataJson.two+ " ℃</div>";
    html += "</div>";
    return html;
}

最后还有一个随机颜色的生成,使用随机颜色是为了保证生成的页面的颜色能够更加区别明显。

function getRandomColor() {
    var letters = '0123456789ABCDEF';
    var color = '#';
    for (var i = 0; i < 6; i++) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}

3、城市轮播

为了实现每个省会城市都可以进行轮播,这里我们根据位置将地图的视图中心点进行重绘。最终的效果看起来就是一个会跳动的地图。这里我们使用定时器的方式来进行切换不同城市。核心代码如下:

function preview(){
    // 设置定时器,每隔 2 秒执行一次
    const intervalId = setInterval(() => {
        // 如果索引超出了数组范围,清除定时器并停止执行
        if (currentIndex >= dataJson.length) {
            currentIndex = 0;
        }
        // 获取当前索引对应的元素
        const currentElement = dataJson[currentIndex];
        //如果不为空,先移除 marker
        if(dymicMarker != null){
            map.removeLayer(dymicMarker);
        }
        dymicMarker = L.marker([currentElement.lat, currentElement.lon]).addTo(map);
        setTargetSelect(dymicMarker);
        console.log(`当前元素:${currentElement}`);
        map.setView([currentElement.lat, currentElement.lon],8);
        // 索引加 1,准备获取下一个元素
        currentIndex++;
    }, 3000);
}
function setTargetSelect(e){
    var i = 1
    var int = setInterval(() => {
        if(!e._map) clearInterval(int)
        if (i < -1) { i = 1 }
        i = i - 0.08
        if (i < 0) e.setOpacity(i * -1)
        else e.setOpacity(i)
    },60)
}

4、成果展示

经过以上的步骤,基本就可以实现带音乐播放的天气小应用。页面效果如下:

文章配图

四、总结

以上就是本文的主要内容,本文构建了一个能够唤醒 80 年代记忆的老式天气预报系统。这不仅仅是一个技术项目,更是一次情感的探索和文化的传承。通过构建这样一个 80 年代风格的天气预报系统,我们希望能够唤起更多人对那个时代的美好回忆,同时也展示现代技术在文化传承方面的巨大潜力。在未来的工作中,我们还将继续优化系统功能,增加更多互动元素,如用户自定义播报内容、分享功能等,让这个系统不仅仅是一个展示平台,更是一个能够与用户产生情感共鸣的互动空间。这是一次穿越时空的构建之旅,也是一次对过去的致敬和对未来的探索。让我们一起踏上这段旅程,用现代的技术手段,唤醒那些沉睡在记忆深处的 80 年代天气预报,让旧时光在新技术的助力下重新焕发生机。

目录

  1. 前言
  2. 一、省会城市信息构建
  3. 1、省会城市空间查询
  4. 2、Java 后台查询
  5. 二、Java 省会城市天气查询
  6. 1、与百度开放平台集成天气
  7. 2、响应对象属性介绍
  8. 3、省会天气实况展示
  9. 三、WebGIS 应用构建
  10. 1、背景音乐集成
  11. 2、城市标记及天气展示
  12. 3、城市轮播
  13. 4、成果展示
  14. 四、总结

更多推荐文章

查看全部
  • Open WebUI 基于 Docker 本地部署与远程 Ollama 集成指南
  • C++ 输入输出操作详解:从基础流到文件处理
  • 腾讯混元图像 3.0 图生图模型开源,LMArena 评测跻身全球第一梯队
  • AI 图生图与视频生成完整工作流及提示词参数表
  • 大模型应用开发极简入门:基于 GPT-4 和 ChatGPT 实战指南
  • Whisper-Large-V3-Turbo:语音识别技术架构与性能分析
  • 三道滑动窗口与子串题的 Python 写法
  • Qwen3-4B-Instruct 本地部署与 AI 写作实战指南
  • ViewModel 中 StateFlow 与 SharedFlow 的选择策略及单元测试实践
  • 多机器人多 Agent 模式:构建 AI 助手团队
  • 网络安全十大热门岗位详解与职业发展路径分析
  • 植物大战僵尸网页版前端页面结构与样式解析
  • SQL 注入详解:从原理到实战
  • Ubuntu 24.04 下使用 Waydroid 运行 Android 应用指南
  • Java RESTful 接口开发最佳实践
  • 10 款 AI 降重工具实测对比与选择指南
  • 基于 Vue 的 Qwen-Image-Edit-F2P 前端交互界面实现
  • GitHub 十大 Claude Skills 推荐与效率提升指南
  • 知网与维普 AIGC 检测差异对比及应对策略
  • OpenClaw 多 Agent 与飞书机器人配置实战

相关免费在线工具

  • 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