PHP调用全国天气预报数据接口查询天气示例


Posted in PHP onFebruary 20, 2019

本文实例讲述了PHP调用全国天气预报数据接口查询天气。分享给大家供大家参考,具体如下:

基于PHP的聚合数据全国天气预报API服务请求的代码样例

本代码示例是基于PHP的聚合数据全国天气预报API服务请求的代码样例,使用前你需要:

①:通过https://www.juhe.cn/docs/api/id/39 申请一个天气预报API的appkey

样例代码包含了获取支持城市列表、根据城市获取天气预报、根据IP地址请求天气预报、根据GPS坐标请求天气、城市3小时天气预报的实现。示例代码主要是解析一些常用字段,如需要完整或其他未包含的字段,可以自行参考官方的接口,进行修改。

首先:引入封装好的天气调用类

header('Content-type:text/html;charset=utf-8');
include 'class.juhe.weather.php'; //引入天气请求类
//接口基本信息配置
$appkey = '**********'; //您申请的天气查询appkey
$weather = new weather($appkey);

一、获取支持的城市列表

由于支持的城市列表基本不会这么变化,大家可以获取到列表后内置到自己的应用中,就不用每次都去请求API。

$citysResult = $weather->getCitys();
if($citysResult['error_code'] == 0){  //以下可根据实际业务需求,自行改写
  //////////////////////////////////////////////////////////////////////
  $citys = $citysResult['result'];
  foreach($citys as $ckey =>$c){
    echo "ID:".$c['id'].",省份:".$c['province'].",城市:".$c['city'].",区域:".$c['district']."<br>";
  }
}else{  //以下可根据实际业务需求,自行改写
  //////////////////////////////////////////////////////////////////////
  echo $citysResult['error_code'].":".$citysResult['reason'];
}

二、根据城市/ID获取天气预报

通过城市的名称或城市的ID来获取天气预报,城市id就是获取城市支持列表中返回的字段ID

$cityWeatherResult = $weather->getWeather('苏州');
if($cityWeatherResult['error_code'] == 0){  //以下可根据实际业务需求,自行改写
  //////////////////////////////////////////////////////////////////////
  $data = $cityWeatherResult['result'];
  echo "=======当前天气实况=======<br>";
  echo "温度:".$data['sk']['temp']."  ";
  echo "风向:".$data['sk']['wind_direction']."  (".$data['sk']['wind_strength'].")";
  echo "湿度:".$data['sk']['humidity']."  ";
  echo "<br><br>";
  echo "=======未来几天天气预报=======<br>";
  foreach($data['future'] as $wkey =>$f){
    echo "日期:".$f['date']." ".$f['week']." ".$f['weather']." ".$f['temperature']."<br>";
  }
  echo "<br><br>";
  echo "=======相关天气指数=======<br>";
  echo "穿衣指数:".$data['today']['dressing_index']." , ".$data['today']['dressing_advice']."<br>";
  echo "紫外线强度:".$data['today']['uv_index']."<br>";
  echo "舒适指数:".$data['today']['comfort_index']."<br>";
  echo "洗车指数:".$data['today']['wash_index'];
  echo "<br><br>";
}else{
  echo $cityWeatherRe
}

三、根据用户的IP地址请求对应的天气预报

通过用户的IP地址获取用户所在地的天气预报,由于IP地址解析可能会有误差,所以有时定位到的城市不一定是用户实际的所在地。

$ipWeatherResult = $weather->getWeatherByIP('58.215.154.128');
if($ipWeatherResult['error_code'] == 0){  //以下可根据实际业务需求,自行改写
  //////////////////////////////////////////////////////////////////////
  $data = $ipWeatherResult['result'];
  echo "=======当前城市=======<br>";
  echo $data['today']['city'];
  echo "<br><br>";
  echo "=======当前天气实况=======<br>";
  echo "温度:".$data['sk']['temp']."  ";
  echo "风向:".$data['sk']['wind_direction']."  (".$data['sk']['wind_strength'].")";
  echo "湿度:".$data['sk']['humidity']."  ";
  echo "<br><br>";
  echo "=======未来几天天气预报=======<br>";
  foreach($data['future'] as $wkey =>$f){
    echo "日期:".$f['date']." ".$f['week']." ".$f['weather']." ".$f['temperature']."<br>";
  }
  echo "<br><br>";
  echo "=======相关天气指数=======<br>";
  echo "穿衣指数:".$data['today']['dressing_index']." , ".$data['today']['dressing_advice']."<br>";
  echo "紫外线强度:".$data['today']['uv_index']."<br>";
  echo "舒适指数:".$data['today']['comfort_index']."<br>";
  echo "洗车指数:".$data['today']['wash_index'];
  echo "<br><br>";
}else{
  echo $ipWeatherResult['error_code'].":".$ipWeatherResult['reason'];
}

四、根据GPS坐标来获取对应地区的天气

无论通过二、三、四获取的天气预报,因为聚合格式都是统一的,所以解析的流程是一致的,所以没有额外的操作,只是传参上有点的差异。

$geoWeatherResult = $weather->getWeatherByGeo(116.401394,39.916042);
if($geoWeatherResult['error_code'] == 0){  //以下可根据实际业务需求,自行改写
  //////////////////////////////////////////////////////////////////////
  $data = $geoWeatherResult['result'];
  echo "=======当前城市=======<br>";
  echo $data['today']['city'];
  echo "<br><br>";
  echo "=======当前天气实况=======<br>";
  echo "温度:".$data['sk']['temp']."  ";
  echo "风向:".$data['sk']['wind_direction']."  (".$data['sk']['wind_strength'].")";
  echo "湿度:".$data['sk']['humidity']."  ";
  echo "<br><br>";
  echo "=======未来几天天气预报=======<br>";
  foreach($data['future'] as $wkey =>$f){
    echo "日期:".$f['date']." ".$f['week']." ".$f['weather']." ".$f['temperature']."<br>";
  }
  echo "<br><br>";
  echo "=======相关天气指数=======<br>";
  echo "穿衣指数:".$data['today']['dressing_index']." , ".$data['today']['dressing_advice']."<br>";
  echo "紫外线强度:".$data['today']['uv_index']."<br>";
  echo "舒适指数:".$data['today']['comfort_index']."<br>";
  echo "洗车指数:".$data['today']['wash_index'];
  echo "<br><br>";
}else{
  echo $geoWeatherResult['error_code'].":".$geoWeatherResult['reason'];
}

五、获取城市三小时预报

就是城市每3小时的天气情况

$forecastResult = $weather->getForecast("苏州");
if($forecastResult['error_code'] == 0){  //以下可根据实际业务需求,自行改写
  //////////////////////////////////////////////////////////////////////
  $data = $forecastResult['result'];
  foreach($data as $key => $d){
    echo "日期:".$d['date']." (".$d['sh']."点-".$d['eh']."点) ".$d['weather']." ".$d['temp1']."~".$d["temp2"]."<br>";
  }
}else{  //以下可根据实际业务需求,自行改写
  //////////////////////////////////////////////////////////////////////
  echo $forecastResult['error_code'].":".$forecastResult['reason'];
}

通过上面的示例代码,大家应该对如果调用聚合数据天气预报API有了一个大体的了解。

最后放上class.juhe.weather.php完整代码:

<?php
// +----------------------------------------------------------------------
// | JuhePHP [ NO ZUO NO DIE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2010-2015 http://juhe.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: Juhedata <info@juhe.cn-->
// +----------------------------------------------------------------------
//----------------------------------
// 聚合数据天气预报接口请求类
//----------------------------------
class weather{
  private $appkey = false; //申请的聚合天气预报APPKEY
  private $cityUrl = 'http://v.juhe.cn/weather/citys'; //城市列表API URL
  private $weatherUrl = 'http://v.juhe.cn/weather/index'; //根据城市请求天气API URL
  private $weatherIPUrl = 'http://v.juhe.cn/weather/ip'; //根据IP地址请求天气API URL
  private $weatherGeoUrl = 'http://v.juhe.cn/weather/geo'; //根据GPS坐标获取天气API URL
  private $forecast3hUrl = 'http://v.juhe.cn/weather/forecast3h'; //获取城市天气3小时预报API URL
  public function __construct($appkey){
    $this->appkey = $appkey;
  }
  /**
   * 获取天气预报支持城市列表
   * @return array
   */
  public function getCitys(){
    $params = 'key='.$this->appkey;
    $content = $this->juhecurl($this->cityUrl,$params);
    return $this->_returnArray($content);
  }
  /**
   * 根据城市名称/ID获取详细天气预报
   * @param string $city [城市名称/ID]
   * @return array
   */
  public function getWeather($city){
    $paramsArray = array(
      'key'  => $this->appkey,
      'cityname' => $city,
      'format'  => 2
    );
    $params = http_build_query($paramsArray);
    $content = $this->juhecurl($this->weatherUrl,$params);
    return $this->_returnArray($content);
  }
  /**
   * 根据IP地址获取当地天气预报
   * @param string $ip [IP地址]
   * @return array
   */
  public function getWeatherByIP($ip){
     $paramsArray = array(
      'key'  => $this->appkey,
      'ip' => $ip,
      'format'  => 2
    );
    $params = http_build_query($paramsArray);
    $content = $this->juhecurl($this->weatherIPUrl,$params);
    return $this->_returnArray($content);
  }
  /**
   * 根据GPS坐标获取当地的天气预报
   * @param string $lon [经度]
   * @param string $lat [纬度]
   * @return array
   */
  public function getWeatherByGeo($lon,$lat){
    $paramsArray = array(
      'key'  => $this->appkey,
      'lon' => $lon,
      'lat'  => $lat,
      'format'  => 2
    );
    $params = http_build_query($paramsArray);
    $content = $this->juhecurl($this->weatherGeoUrl,$params);
    return $this->_returnArray($content);
  }
  /**
   * 获取城市三小时预报
   * @param string $city [城市名称]
   * @return array
   */
  public function getForecast($city){
    $paramsArray = array(
      'key'  => $this->appkey,
      'cityname' => $city,
      'format'  => 2
    );
    $params = http_build_query($paramsArray);
    $content = $this->juhecurl($this->forecast3hUrl,$params);
    return $this->_returnArray($content);
  }
  /**
   * 将JSON内容转为数据,并返回
   * @param string $content [内容]
   * @return array
   */
  public function _returnArray($content){
    return json_decode($content,true);
  }
  /**
   * 请求接口返回内容
   * @param string $url [请求的URL地址]
   * @param string $params [请求的参数]
   * @param int $ipost [是否采用POST形式]
   * @return string
   */
  public function juhecurl($url,$params=false,$ispost=0){
    $httpInfo = array();
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
    curl_setopt( $ch, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36' );
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 30 );
    curl_setopt( $ch, CURLOPT_TIMEOUT , 30);
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
    if( $ispost )
    {
      curl_setopt( $ch , CURLOPT_POST , true );
      curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
      curl_setopt( $ch , CURLOPT_URL , $url );
    }
    else
    {
      if($params){
        curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
      }else{
        curl_setopt( $ch , CURLOPT_URL , $url);
      }
    }
    $response = curl_exec( $ch );
    if ($response === FALSE) {
      //echo "cURL Error: " . curl_error($ch);
      return false;
    }
    $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
    $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
    curl_close( $ch );
    return $response;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php zlib压缩和解压缩swf文件的代码
Dec 30 PHP
php对数组排序的简单实例
Dec 25 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
destoon官方标签大全
Jun 20 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
Laravel中10个有用的用法小结
May 06 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
TP5框架实现的数据库备份功能示例
Apr 05 PHP
Laravel框架FormRequest中重写错误处理的方法
Feb 18 #PHP
php原生数据库分页的代码实例
Feb 18 #PHP
PHP实现文字写入图片功能
Feb 18 #PHP
php分享朋友圈的实现代码
Feb 18 #PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 #PHP
php实现微信分享朋友链接功能
Feb 18 #PHP
PHP实现唤起微信支付功能
Feb 18 #PHP
You might like
php三种实现多线程类似的方法
2015/10/30 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
PHP与以太坊交互详解
2018/08/24 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
复习Python中的字符串知识点
2015/04/14 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
PyTorch中permute的用法详解
2019/12/30 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
初中政治教学反思
2014/01/17 职场文书
农民致富事迹材料
2014/01/23 职场文书
《都江堰》教学反思
2014/02/07 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
三八妇女节新闻稿
2015/07/17 职场文书
军事理论课感想
2015/08/11 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
python实现的人脸识别打卡系统
2021/05/08 Python
Python基本数据类型之字符串str
2021/07/21 Python
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python