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中看实例学正则表达式
Dec 25 PHP
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
Nov 07 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
May 04 PHP
php列出mysql表所有行和列的方法
Mar 13 PHP
php身份证号码检查类实例
Jun 18 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
php 查找数组元素提高效率的方法详解
May 05 PHP
laravel自定义分页效果
Jul 23 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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
ftp类(example.php)
2006/10/09 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
学习ExtJS Column布局
2009/10/08 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
理解javascript正则表达式
2016/03/08 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
python实现斗地主分牌洗牌
2020/06/22 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
教你怎样写好自我评价
2013/10/05 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
大专生求职信
2014/06/29 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
2014年教学工作总结
2014/11/13 职场文书
拾金不昧感谢信
2015/01/21 职场文书
世界名著读书笔记
2015/06/25 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书