2020.11.24更新: 更换了天气数据源,增加了小时预报和未来6天预报。
2020.11.19更新: 由于百度的API一直有问题,所以修改了初始进入后的定位方法。
2020.11.05更新: 最近百度的API有问题,当前的日期总是返回09月16日,而且也没有了生活提示数据。


微信小程序开发:帮你查天气——基于百度地图天气API

  • 一、申请百度地图的AK
  • 二、下载SDK
  • 三、配置服务器域名
  • 四、写代码
  • 五、解析数据
  • 六、`bmap-wx.js`简单介绍

先上截图:

截图 截图

小程序二维码:

完整代码:GItHub项目地址
https://github.com/MichaelLee826/weather_forecast

一、申请百度地图的AK

在百度地图开放平台上注册账号并登录,然后在“控制台”中创建一个应用。

选择“微信小程序”,并填入创建小程序时得到的APP ID。

提交后就可以在前一个页面中看到新创建的应用的AK了。

二、下载SDK

在“开发文档”中点击“微信小程序JavaScript API”

在“相关下载”中点击“全部下载”。

压缩包里主要包括两个文件夹:demosrc,开发时主要用到src里的js文件:bmap-wx.js(为讲解方便,本文不使用.min)。

三、配置服务器域名

登录微信小程序管理后台,进入开发——开发设置

服务器域名中,填入request合法域名:https://api.map.baidu.com

PS:微信要求域名都为https,所以有些API为http的就不能用了。

四、写代码

打开微信开发者工具,并新建一个小程序项目,会自动生成一些文件(新建项目的方法、各文件的作用,网上有很多教程,不再赘述)。

1、打开index.js文件,添加对bmap-wx.js文件的引用:

//index.js
//获取应用实例
const app = getApp()
//调用百度地图天气API的js文件
var bmap = require('../../utils/bmap-wx.js');

2、在onLoad方法中,新建一个BMapWX对象,并填入AK:

var BMap = new bmap.BMapWX({ak: '你申请的百度地图AK'
});

3、在onLoad方法中,发起查询天气的请求:

BMap.weather({fail: fail,success: success
});

4、在onLoad方法中,定义查询成功和失败的方法:

var fail = function(data) {console.log('查询失败')
};
var success = function(data) {console.log('查询成功');var currentWeather = data;this.setData({currentWeather: currentWeather});
}

注意,setData中的currentWeather要与Page中的data部分对应:

data: {currentWeather: ''},

至此,就可以获得返回的天气数据了,剩下的工作就是解析返回的数据。

五、解析数据

在第三步中,查询成功获得的返回数据data包括了我们需要展示的信息,因此解析的工作也主要是针对data

data主要包括两部分内容:currentWeatheroriginalData

1、解析data.currentWeather
结构如下:

解析方式如下:

var currentWeather = data.currentWeather[0];//currentWeather.currentCity:"济南市"//currentWeather.date:"周四 01月17日 (实时:3℃)"//currentWeather.pm25:"85"//currentWeather.temperature:"7 ~ -2℃"//currentWeather.weatherDesc:"晴"//currentWeather.wind:"南风微风"

注意,data.currentWeather是一个JSON数组,关键的数据都存在data.currentWeather[0]

2、解析data.originalData
结构如下:

data.originalData也是JSON格式,我们关心的数据存在data.originalData.results数组中,结构如下:

可以看出,data.originalData.results[0]数组中关键的部分也是两块:index数组和weather_data数组:

data.originalData.results[0].index[0]是穿衣的相关信息
data.originalData.results[0].index[1]是洗车的相关信息
data.originalData.results[0].index[2]是感冒的相关信息
data.originalData.results[0].index[3]是运动的相关信息
data.originalData.results[0].index[4]是紫外线强度的相关信息

data.originalData.results[0].weather_data[0]是今天的天气情况
data.originalData.results[0].weather_data[1]是明天的天气情况
data.originalData.results[0].weather_data[2]是后天的天气情况
data.originalData.results[0].weather_data[3]是大后天的天气情况

至此,就完成了数据解析工作,通过setData可以将数据与index.wxml中的变量绑定。修改success如下:

var success = function(data) {console.log('查询成功');//实时天气var currentWeather = data.currentWeather[0];//感冒信息var flu = data.originalData.results[0].index[2];//未来三天的天气var forecast = new Array(3);for (var i = 0; i < 3; i++) {forecast[i] = data.originalData.results[0].weather_data[i + 1];}//配置数据this.setData({currentWeather: currentWeather,flu: flu,forecast: forecast});
}

index.wxml文件中调用:

<!--当前定位的城市-->
<view class='cityName'>{{currentWeather.currentCity}}</view><!--未来3天的天气情况,包括日期、天气描述、温度范围、风力--><view class='forecast'><view class='next-day' wx:key="{{index}}" wx:for="{{forecast}}"> <view class='detail date'>{{item.date}}</view><view class='detail'>{{item.weather}}</view><view class='detail'>{{item.temperature}}</view><view class='detail'>{{item.wind}}</view></view></view><!--感冒信息-->
<view class='tips'>   <view class='index'>感冒指数:{{flu.zs}}</view><view class='description'>{{flu.des}}</view>
</view>

六、bmap-wx.js简单介绍

打开bmap-wx.js文件,可以看到只有一个类BMapWX。该类包含了四个方法,而我们需要用到的是weather(param)方法:

/**
* 天气检索
*
* @param {Object} param 检索配置
*/
weather(param) {var that = this;param = param || {};let weatherparam = {coord_type: param["coord_type"] || 'gcj02',output: param["output"] || 'json',ak: that.ak,sn: param["sn"] || '',timestamp: param["timestamp"] || ''};let otherparam = {success: param["success"] || function () {},fail: param["fail"] || function () {}};let type = 'gcj02';let locationsuccess = function (result) {weatherparam["location"] = result["longitude"] + ',' + result["latitude"];wx.request({url: 'https://api.map.baidu.com/telematics/v3/weather',data: weatherparam,header: {"content-type": "application/json"},method: 'GET',success(data) {let res = data["data"];if (res["error"] === 0 && res["status"] === 'success') {let weatherArr = res["results"];// outputRes 包含两个对象,// originalData为百度接口返回的原始数据// wxMarkerData为小程序规范的marker格式let outputRes = {};outputRes["originalData"] = res;outputRes["currentWeather"] = [];    outputRes["currentWeather"][0] = {currentCity: weatherArr[0]["currentCity"],pm25: weatherArr[0]["pm25"],date: weatherArr[0]["weather_data"][0]["date"],temperature: weatherArr[0]["weather_data"][0]["temperature"],weatherDesc: weatherArr[0]["weather_data"][0]["weather"],wind: weatherArr[0]["weather_data"][0]["wind"]};otherparam.success(outputRes);} else {otherparam.fail({errMsg: res["message"],statusCode: res["status"]});}},fail(data) {otherparam.fail(data);}});}let locationfail = function (result) {otherparam.fail(result);}let locationcomplete = function (result) {}if (!param["location"]) {that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);} else {let longitude = param.location.split(',')[0];let latitude = param.location.split(',')[1];let errMsg = 'input location';let res = {errMsg: errMsg,latitude: latitude,longitude: longitude};locationsuccess(res);}
}

可以看出,成功返回的数据为data,通过解析,封装成了我们在前面得到的data.currentWeatherdata.originalData两个数组。

另外,程序中默认查询的城市是当前定位的城市,依据的参数是经纬度坐标。

weatherparam["location"] = result["longitude"] + ',' + result["latitude"];

如果想查询其它城市,例如北京,可以修改为:

weatherparam["location"] = param["北京"];

其中param就是weather()函数的参数。


欢迎关注我的微信公众号:

利用百度地图天气API开发微信小程序相关推荐

  1. 利用WordPress REST API 开发微信小程序从入门到放弃

    自从我发布并开源WordPress版微信小程序以来,很多WordPress网站的站长问有关程序开发的问题,其实在文章:<用微信小程序连接WordPress网站>讲述过一些基本的要点,不过仍 ...

  2. 【小程序地图】uniapp开发微信小程序,显示地图功能,且点击后打开高德或腾讯地图。

    最开始遇到地图这块的时候,想的比较复杂.想到是不是需要引用高德或者百度地图api 之类的. 其实完全没必要,使用uniapp自带的方法 uni.openLocation 即可. 话不多说,完整代码.注 ...

  3. 百度通用翻译api在微信小程序中的使用

    关于百度通用翻译api,详细的信息可以参考通用翻译API技术文档 var q = 'count' var from = 'en'var to = 'zh'//注册获得appid和密匙var appid ...

  4. taro开发微信小程序-播放轨迹(十一)

    taro集成了地图后如何实现轨迹播放,暂停,停止呢?本身地图并不具备轨迹播放的能力,但是基于地图api可以实现轨迹播放的效果 思路如下: 1.获取所有的轨迹坐标点-最好是数组格式的json 2.定义一 ...

  5. taro开发微信小程序-添加开发者预览,上传测试版本(十四)

    taro开发微信小程序,上传测试版本,如果需要访问网络需要打开调试模式,如果配置了https协议的服务,提示对应的服务器证书无效,那么必须正确配置ssl证书,可以在阿里云或者腾讯云申请. 添加开发者预 ...

  6. 从0到一开发微信小程序(6)—小程序常用API

    文章目录 其他相关文章 1.小程序API 1.1.路由 1.1.1.navigateTo(保留当前页面,跳转到应用内的某个页面,可以带参数) 1.1.2.redirectTo(关闭当前页面,跳转到应用 ...

  7. uni-app开发微信小程序使用腾讯地图选点和城市选择器插件

    文章目录 前言 效果图 第一步.登录腾讯地图申请属于自己小程序的key 第二步.登录微信公众平台添加插件 第三步.引入插件包,配置定位允许授权 第四步.通过点击事件使用插件 第五步.拿到插件接口返回的 ...

  8. 小白开发微信小程序20--web api文档制作

    1.什么是Swagger Swagger 项目已于 2015 年捐赠给 OpenAPI 计划,自此它被称为 OpenAPI. 这两个名称可互换使用. 不过,"OpenAPI"指的是 ...

  9. uniapp开发微信小程序,从构建到上线

    前言: 本文主要介绍 uniapp 的基础使用,以及使用 uniapp 在企业开发的过程中的一个详细流程,比较适合第一次使用uniapp 开发微信小程序的伙伴,或者没有过实战经验的小伙伴参考:使用 H ...

最新文章

  1. rsync - 远程同步工具
  2. 将redis当做使用LRU算法的缓存来使用
  3. QT快速入门、三点求圆心实现详解
  4. 几种排序算法性能的比较
  5. 操作系统(2) -- 进程管理
  6. vue history模式Nginx配置
  7. 系统架构设计师考试999999999999
  8. LDAP命令介绍---dsreplication--initialize
  9. xlwt表格的对齐样式
  10. Android小知识-了解下Android系统的显示原理
  11. ssm radis mysql_SSM完美整合Redis
  12. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...
  13. 309. 最佳买卖股票时机含冷冻期
  14. 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 instance 重启后又会差 8 个小时...
  15. 2020高压电工考试及高压电工复审模拟考试
  16. 竞争型神经网络:自组织映射神经网络(SOM)
  17. windows资源管理器已停止工作解决方案
  18. Intel CPU型号解读以及如何粗略判断Intel CPU的性能(i3、i5、i7以及CPU的代数)
  19. python布尔系列_python-布尔运算
  20. redis分布式代理工具选型与功能验证

热门文章

  1. [VPN]华为SecoClient客户端Linux使用
  2. PS黑作坊lab调色扩展面板
  3. 【有共鸣转载一下】毕业后,读这么一篇——《那些事,大学才读懂》,或许才懂大学
  4. 论if(i),if(!i)和while(i),while(!i)的理解
  5. 传说中的让理科生沉默,让文科生落泪的文理综合体
  6. Vue get传参和post传参 细微差别 (插眼传送)
  7. ssy JAVA SE
  8. L1-058 6翻了 (15分)(简洁)
  9. [LBM方法学习笔记1】格子玻尔兹曼方法介绍
  10. 计算机专业英语课程标准,计算机专业英语作文中英文