美文网首页freeCodeCamp
FCC项目之 show the local weather

FCC项目之 show the local weather

作者: 董懂同学 | 来源:发表于2017-04-21 13:06 被阅读394次

    前言

    这是一个要使用API的项目,第一次独立使用API,所以非常懵逼,就在YouTube上找了一个视频,看了一下怎么调用API,再把jQuery对应的文档看了一下就开始了。

    然而,调出来的数据气温居然是快300度了,这是什么鬼?就Google了一下,在stackoverflow上找到了答案,原来默认是开式温度,需要加一个参数,把温度变成摄氏度,答案里说看官方文档,但是没看见具体在哪啊,就搜了一下unit关键字,找到了关键的信息。

    把自己这一发现,写到了那个问题的答案后面。嗯,这是我在stackoverflow上的第一次答题,结果是,3分钟之后就被鄙视了。一个哥们修改了我的答案,还踩了一脚,fixed bad grammar,好吧,我的烂英语。不过很开心,终于从一个索取信息的人开始变成一个提供信息的人。

    废话到此,以下进入正题。

    1.调用 openweathermap API

    如果你没调过 API ,这里科普一下,要调API的话需要一个** appkey **或者叫
    appid ,这个你所调用的 API 网站在你注册要创建应用的时候都会给你提供,找到它。比如我的,登录 openweathermap ,进去直接就进入我的主页了,点击 API keys 选项卡,就可以看到我们要用的 appkey 了。

    openweathermap appkey

    在你得到Appkey之后,仔细查看网站上的官方文档,理解如何使用 API。

    为了方便使用 json 数据,这里我们需要引入 jQuery 库,下载到本地引用或是 CDN 方式引用,任选一种。

    以上做完,就可以愉快地写代码了。

    1. 建一个HTML页面,引入 jQuery 和自己的 js文件
    2. 使用 getJSON 方法得到 API 数据,在控制台打印查看得到的数据(这一步非必选,不过是我习惯每做完一步,都打印确认一下结果。)
    $.getJSON('http://api.openweathermap.org/data/2.5/weather?id=2172797&appid=86e8744e87c5dc3b51370144a2d7df8b', function(data) {
        console.log(data.wind.deg);  //风的等级
    });```
    
    
    ### 2. 获取API数据,填充至HTML中
    #### 2.1 获取用户位置
    上面得到的 API 数据是用城市 ID 做参数指定了城市,然而我们想让每个登录这个App的人获取的都是他们所在城市的天气,有2种办法,
    1. 用BOM对象获取经纬度——这种方式的好处是获得的定位比较准,但缺点是有弹窗,用户体验不好。
    

    var lat, lon;
    var arr = [];
    if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
    lat = Math.round(position.coords.latitude);
    lon = Math.round(position.coords.longitude);
    var api = 'http://api.openweathermap.org/data/2.5/weather?' + "lat=" + lat + "&lon=" + lon + "&units=metric&appid=86e8744e87c5dc3b51370144a2d7df8b";
    // console.log(api); //API 字符串
    $.getJSON(api, function(data) {
    console.log(data.name); //城市名
    });
    });
    }

    2. 用 IP API 获取经纬度——这种方式的好处是悄悄通过 IP 地址就获取到了用户位置,但对于我们这种长期使用 VPN 和 SS 的人来说,获取的都是代理服务器的地址,比如我目前使用的代理服务器是韩国的,一直显示的是韩国松山这个地方。不过,这个项目,我还是采用这种方式,因为不用弹窗。
    

    $.getJSON('http://ipinfo.io', function(location) {
    var locArr = location.loc.split(','); //获取经纬度字符串并将其分割成数组
    // console.log(locArr);
    var lat = locArr[0];
    var lon = locArr[1];
    var api = 'http://api.openweathermap.org/data/2.5/weather?' + "lat=" + lat + "&lon=" + lon + "&units=metric&appid=86e8744e87c5dc3b51370144a2d7df8b";
    // console.log(api);
    $.getJSON(api, function(data) {
    console.log(data.name); //城市名
    });
    });

    #### 2.2 将获取的数据填充到HTML中
    

    $.getJSON('http://ipinfo.io', function(location) {
    var locArr = location.loc.split(',');
    // console.log(locArr);
    var lat = locArr[0];
    var lon = locArr[1];
    var api = 'http://api.openweathermap.org/data/2.5/weather?' + "lat=" + lat + "&lon=" + lon + "&units=metric&appid=86e8744e87c5dc3b51370144a2d7df8b";
    // console.log(api);
    $.getJSON(api, function(data) {
    $('#loc').text(location.city); //填充城市
    $('#temp').text(data.main.temp); //填充温度
    $('#wind').text(data.wind.speed); //填充风速
    $('#windDir').text(getWindDir(data.wind.deg)); // 填充风向
    // console.log(data.wind.deg);
    // console.log(getWindDir(data.wind.deg));
    $('#desc').text(data.weather[0].description); //填充天气描述,比如light rain
    $('#humidity').text(data.main.humidity); // 填充湿度
    $weather = data.weather[0].main; // 获取天气的主要描述
    // $weather = 'Additional';
    // console.log($weather);

            $icon = $('#icon');  //获取放天气图标的元素
            $body = $('body');  // 获取 body 元素
          /*当主要的天气描述变化时候,天气图标与背景图片改变*/
            switch ($weather) {
                case 'Clear':
                    $icon.addClass('wi-day-sunny');
                    $body.css('background', 'url(https://images.pexels.com/photos/28121/pexels-photo-28121.jpg)');
                    break;
    
                case 'Thunderstorm':
                    $icon.addClass('wi-thunderstorm');
                    $body.css('background', 'url(https://images.pexels.com/photos/29550/pexels-photo-29550.jpg)');
                    break;
    
                case 'Clouds':
                    $icon.addClass('wi-day-cloudy');
                    $body.css('background', 'url(https://upload.wikimedia.org/wikipedia/commons/8/83/Sky_cloudy.JPG)');
                    break;
    
                case 'Mist':
                    $icon.addClass('wi-sprinkle');
                    $body.css('background', 'url(https://images.pexels.com/photos/603/sky-clouds-sun.jpg)');
                    break;
    
                case 'Extreme':
                    $icon.addClass('wi-cloudy');
                    $body.css('background', 'url(https://images.pexels.com/photos/325288/pexels-photo-325288.jpeg)');
                    break;
    
                case 'Atmosphere':
                    $icon.addClass('wi-windy');
                    $body.css('background', 'url(https://images.pexels.com/photos/314726/pexels-photo-314726.jpeg)');
                    break;
    
                case 'Snow':
                    $icon.addClass('wi-snow');
                    $body.css('background', 'url(https://images.pexels.com/photos/4022/cold-snow-forest-trees.jpeg)');
                    break;
    
                case 'Rain':
                    $icon.addClass('wi-rain');
                    $body.css('background', 'url()');
                    $body.css('background', 'url(http://www.publicdomainpictures.net/pictures/30000/velka/rain.jpg)');
                    break;
    
                case 'Drizzle':
                    $icon.addClass('wi-night-rain');
                    $body.css('background', 'url(https://c1.staticflickr.com/7/6028/6009378383_a002798f38_b.jpg)');
                    break;
    
                case 'Additional':
                    $icon.addClass('wi-cloud');
                    $body.css('background', 'url(https://upload.wikimedia.org/wikipedia/commons/d/d9/Wind_Power_at_Guanting_Resevoir.jpg)');
                    break;
    
                default:
                    $body.css('background', 'url(https://images.pexels.com/photos/2969/climate-cold-glacier-iceberg.jpg)');
                    break;
            }
            $body.css('background-repeat', 'no-repeat');
            $body.css('background-size', '100% 100%');
        });
      //将风向的度数转化为方向
        function getWindDir(dir) {
            var windDir = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'];
            var windIndex = Math.floor(dir / 45);//共有8个方向总共360度,每个方向45度
            return windDir[windIndex];   //返回风向对应的字符串
        }
    });```
    

    完整代码和演示,详见这个项目的codepen地址

    相关文章

      网友评论

      • 一书文集:这文章建议加以改进 毕竟都是newbie
        一书文集: 不知道为什么你的天气显示失效了,我换了那个天气api才变好的。这是我修改你api之后的https://codepen.io/ArinWu/pen/KvOOoa?editors=1010
        顺便问下,我做了一个和你差不多的,最多我只能换换图片及其摆设,感觉就是在抄作业,但自己做起来无比难,十分纠结。想得到一些你的意见。
        一书文集:嗯,希望你的文章越写越好。赞!
        董懂同学:特意查了一下newbie什么意思,我写这篇文章时候刚学前端一个来月,文章是按照我写代码的思路写的,所以可能没考虑那么多。
      • 爱吃的根号三:你好,请问你在youtube找个那个视频,能麻烦说下名称吗?十分感谢
        董懂同学:其实YouTube上一搜一大堆:https://www.youtube.com/results?search_query=openweathermap+api
        董懂同学:https://www.youtube.com/watch?v=ecT42O6I_WI

      本文标题:FCC项目之 show the local weather

      本文链接:https://www.haomeiwen.com/subject/svdkzttx.html