java使用百度API天气服务制作天气预报功能

java使用百度API天气服务制作天气预报功能因为百度的天气 API 是通过行政区划代码来查询天气的 也就是说每个区域有一个对应的 code 值 我们根据这个值就能查到该区域的天气了

大家好,欢迎来到IT知识分享网。

百度API官网:https://lbsyun.baidu.com/

1.百度API创建应用

注册好账号之后,去应用管理里面创建一个自己的应用

java使用百度API天气服务制作天气预报功能

java使用百度API天气服务制作天气预报功能

java使用百度API天气服务制作天气预报功能

创建好之后会生成自己的AK,我们的调用百度api的时候需要用到这个。

2.百度天气API文档

百度API国内天气查询文档:https://lbs.baidu.com/faq/api?title=webapi/weather/base

java使用百度API天气服务制作天气预报功能

相关细节可以查看这个文档。

3.测试接口是否正常:

把刚刚创建应用的AK放进来,就会返回json格式的数据

https://api.map.baidu.com/weather/v1/?district_id=&data_type=all&ak=自己的访问应用AK

java使用百度API天气服务制作天气预报功能

java使用百度API天气服务制作天气预报功能

4.接下来就是代码部分了

因为百度的天气API是通过行政区划代码来查询天气的,也就是说每个区域有一个对应的code值,我们根据这个值就能查到该区域的天气了。每个区域的code值百度官网也给到我们了,我们先把这个csv文件通过java程序给导入到数据库中,供我们后期使用。

4.1首先去官网找到并下载导入这个csv文件:

这个文件是区县的行政区划编码,把这个文件导入方便我们查询天气的时候使用

https://mapopen-website-wiki.bj.bcebos.com/cityList/weather_district_id.csv

java使用百度API天气服务制作天气预报功能

对应的E列和F列即是我们需要用到的字段,列名分别是district_geocode,district。

接下来我们基于这个csv文件创建数据库,将这些数据保存起来。

/* Navicat Premium Data Transfer Source Server : 阿里云-47.101.128.30 Source Server Type : MySQL Source Server Version : 80036 Source Host : 47.101.128.30:3306 Source Schema : android Target Server Type : MySQL Target Server Version : 80036 File Encoding : 65001 Date: 20/03/2024 10:22:02 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for t003_baidu_city_code -- ---------------------------- DROP TABLE IF EXISTS `t003_baidu_city_code`; CREATE TABLE `t003_baidu_city_code` ( `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键', `areacode` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `districtcode` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `city_geocode` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `city` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `district_geocode` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `district` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `lon` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `lat` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `sta_fc` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `sta_rt` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `province` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `fc_lon` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `fc_lat` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `rt_lon` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `rt_lat` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `origin_areacode` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `exclude` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NULL DEFAULT NULL, `updated_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `created_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 

导入依赖包:

 <!-- csv --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.8</version> </dependency>

csv工具类:

 import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.net.URL; import java.util.ArrayList; import java.util.List; public class CsvUtils { public static List<CSVRecord> parseCSVFile(MultipartFile file) { List<CSVRecord> records = new ArrayList<>(); try (Reader reader = new BufferedReader(new InputStreamReader(file.getInputStream())); CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withFirstRecordAsHeader())) { records = csvParser.getRecords(); } catch (Exception e) { e.printStackTrace(); } return records; } } 

bean:

 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.wq.backend.common.po.BasePo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serial; @Data @Accessors(chain = true) @ApiModel(value = "城市code") @TableName("t003_baidu_city_code") public class BaiduCityCode extends BasePo { private static final long serialVersionUID = -L; @ApiModelProperty("主键") @TableId(value = "id", type = IdType.ASSIGN_UUID) private String id; private String areacode; private String districtcode; private String cityGeocode; private String city; private String districtGeocode; private String district; private String lon; private String lat; private String staFc; private String staRt; private String province; private String fcLon; private String fcLat; private String rtLon; private String rtLat; private String originAreacode; private String exclude; } 

service:

@Override public Boolean importCityCode(MultipartFile file) throws IOException { List<CSVRecord> importDataList = CsvUtils.parseCSVFile(file); List<BaiduCityCode> baiduCityCodes = new ArrayList<>(); for (CSVRecord strings : importDataList) { BaiduCityCode baiduCityCode = new BaiduCityCode(); baiduCityCode.setAreacode(strings.get(0)) .setDistrictcode(strings.get(1)) .setCityGeocode(strings.get(2)) .setCity(strings.get(3)) .setDistrictGeocode(strings.get(4)) .setDistrict(strings.get(5)) .setLon(strings.get(6)) .setLat(strings.get(7)) .setStaFc(strings.get(8)) .setStaRt(strings.get(9)) .setProvince(strings.get(10)) .setFcLon(strings.get(11)) .setFcLat(strings.get(12)) .setRtLon(strings.get(13)) .setRtLat(strings.get(14)) .setOriginAreacode(strings.get(15)) .setExclude(strings.get(16)) .setCreatedBy("系统"); baiduCityCodes.add(baiduCityCode); } baiduCityCodeService.saveBatch(baiduCityCodes); return true; }

成功导入:

java使用百度API天气服务制作天气预报功能

4.2.根据区域名模糊搜索

因为可能有些区域会重名,以朝阳为例,就能搜到多个结果,所以这里我们采用模糊搜索,然后将所有包含朝阳的:省-市-县返回给前端,供用户选择。

java使用百度API天气服务制作天气预报功能

模糊查询sql:

SELECT id, concat(province,"-",city,"-",district) as name FROM t003_baidu_city_code where district like concat('%' , #{name} , '%' );

以朝阳为例,这样就能把所有包含朝阳的城市返回给用户,用户点击之后,我们根据当前的id去查找,朝阳有多个,但是id是唯一的。

java使用百度API天气服务制作天气预报功能

4.3根据id查找天气信息

上面我们拿到了唯一的id,现在我们就能根据id去查找对应的天气并返回了。对应的实体对象可以根据接口返回的数据去建立。

具体实现:

@Override public WeatherParam getWeatherById(String id) { WeatherParam result = new WeatherParam(); BaiduCityCode baiduCityCode = baiduCityCodeService.getById(id); String url = "https://api.map.baidu.com/weather/v1/?district_id=" + baiduCityCode.getDistrictGeocode() + "&data_type=all&ak=" + AK; // 发送 HTTP 请求到第三方接口 HttpClient httpClient = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .build(); try { HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); String responseBody = response.body(); // 将 JSON 字符串转为对象 result = JSON.parseObject(responseBody, WeatherParam.class); } catch (IOException | InterruptedException e) { e.printStackTrace(); } return result; }

java使用百度API天气服务制作天气预报功能

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/99035.html

(0)
上一篇 2026-03-04 16:01
下一篇 2026-03-04 18:29

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信