天南地北客
发表于: 2018-5-5 10:00:04 | 显示全部楼层

使用ESP8266+Arduino开发板制作一个微型气象站,是一件非常酷的事情。在本论坛里面也已经有很多帖子在讨论如何制作。在这些帖子中,无一例外,都是使用Weather Underground提供的API来获取天气,该网站提供的功能非常强大,几乎可以包含全球所有城市的天气情况。如果您还不会制作气象站,那么可以参考以下几个帖子:

●   Arduino Tian开发板:一个功能强大的天气预报中心:https://www.yiboard.com/thread-716-1-1.html

●   使用ESP8266制作一个微型气象站:https://www.yiboard.com/thread-701-1-1.html

●   非常酷的ESP8266 WiFi OLED微型气象站套件:https://www.yiboard.com/thread-756-1-1.html


最近有一些网友给我发消息,说他们无法使用Weather Underground的API来获取国内城市的天气状况,我在这里整理以下解决方法,供大家参考。


首先,在Weather Underground网址注册成功后,就会获得一个免费的API密钥。通过在您的浏览器中按照下列格式输入URL,就会形成一个到Wunderground的API:

  1. http://api.wunderground.com/api/YOUR_API_KEY/conditions/q/THE_DESIRED_STATE/THE_DESIRED_CITY.json
复制代码

例如,要获得加利福尼亚旧金山的天气:

●    http://api.wunderground.com/api/ ... /San_Francisco.json

或者是悉尼的天气

●    http://api.wunderground.com/api/Your_Key/geolookup/conditions/forecast/q/Australia/Sydney.json


我们来看一下返回的响应内容。如果正确的话,就会返回一个带有current_observation标识的字段:

  1. {
  2.   "response": {
  3.   "version":"0.1",
  4.   "termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
  5.   "features": {
  6.   "conditions": 1
  7.   }
  8.         }
  9.   ,        "current_observation": {
  10.                 "image": {
  11.                 "url":"http://icons.wxug.com/graphics/wu2/logo_130x80.png",
  12.                 "title":"Weather Underground",
  13.                 "link":"http://www.wunderground.com"
  14.                 },
  15.                 "display_location": {
  16.                 "full":"Sydney, Australia",
  17.                 "city":"Sydney",
  18.                 "state":"NSW",
  19.                 "state_name":"Australia",
  20.                 "country":"AU",
  21.                 "country_iso3166":"AU",
  22.                 "zip":"00000",
  23.                 "magic":"16",
  24.                 "wmo":"94768",
  25.                 "latitude":"-33.86999893",
  26.                 "longitude":"151.21000671",
  27.                 "elevation":"3.0"
  28.                 },
  29.                 "observation_location": {
  30.                 "full":"Sydney, NEW SOUTH WALES",
  31.                 "city":"Sydney",
  32.                 "state":"NEW SOUTH WALES",
  33.                 "country":"AU",
  34.                 "country_iso3166":"AU",
  35.                 "latitude":"-33.88",
  36.                 "longitude":"151.22",
  37.                 "elevation":"79 ft"
  38.                 },
  39.                 "estimated": {
  40.                 },
  41.                 "station_id":"INEWSOUT349",
  42.                 "observation_time":"Last Updated on May 5, 11:38 AM AEST",
  43.                 "observation_time_rfc822":"Sat, 05 May 2018 11:38:24 +1000",
  44.                 "observation_epoch":"1525484304",
  45.                 "local_time_rfc822":"Sat, 05 May 2018 11:38:50 +1000",
  46.                 "local_epoch":"1525484330",
  47.                 "local_tz_short":"AEST",
  48.                 "local_tz_long":"Australia/Sydney",
  49.                 "local_tz_offset":"+1000",
  50.                 "weather":"Clear",
  51.                 "temperature_string":"68.4 F (20.2 C)",
  52.                 "temp_f":68.4,
  53.                 "temp_c":20.2,
  54.                 "relative_humidity":"39%",
  55.                 "wind_string":"From the East at 1.8 MPH Gusting to 2.5 MPH",
  56.                 "wind_dir":"East",
  57.                 "wind_degrees":98,
  58.                 "wind_mph":1.8,
  59.                 "wind_gust_mph":"2.5",
  60.                 "wind_kph":2.9,
  61.                 "wind_gust_kph":"4.0",
  62.                 "pressure_mb":"1027",
  63.                 "pressure_in":"30.33",
  64.                 "pressure_trend":"0",
  65.                 "dewpoint_string":"42 F (6 C)",
  66.                 "dewpoint_f":42,
  67.                 "dewpoint_c":6,
  68.                 "heat_index_string":"NA",
  69.                 "heat_index_f":"NA",
  70.                 "heat_index_c":"NA",
  71.                 "windchill_string":"NA",
  72.                 "windchill_f":"NA",
  73.                 "windchill_c":"NA",
  74.                 "feelslike_string":"68.4 F (20.2 C)",
  75.                 "feelslike_f":"68.4",
  76.                 "feelslike_c":"20.2",
  77.                 "visibility_mi":"N/A",
  78.                 "visibility_km":"N/A",
  79.                 "solarradiation":"470",
  80.                 "UV":"-1","precip_1hr_string":"0.00 in ( 0 mm)",
  81.                 "precip_1hr_in":"0.00",
  82.                 "precip_1hr_metric":" 0",
  83.                 "precip_today_string":"0.00 in (0 mm)",
  84.                 "precip_today_in":"0.00",
  85.                 "precip_today_metric":"0",
  86.                 "icon":"clear",
  87.                 "icon_url":"http://icons.wxug.com/i/c/k/clear.gif",
  88.                 "forecast_url":"http://www.wunderground.com/global/stations/94768.html",
  89.                 "history_url":"http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=INEWSOUT349",
  90.                 "ob_url":"http://www.wunderground.com/cgi-bin/findweather/getForecast?query=-33.876339,151.216187",
  91.                 "nowcast":""
  92.         }
  93. }
复制代码

这对于大多数城市来说是可以实现的。那么国内的城市怎么获取呢?以楼主所在的城市为例,将上述API的城市修改为中国石家庄。于是API网址变成如下:

  1. http://api.wunderground.com/api/0def10027afaebb7/conditions/q/China/Shijiazhuang.json
复制代码

让我们来看一下返回的内容:


  1. {
  2.   "response": {
  3.   "version":"0.1",
  4.   "termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
  5.   "features": {
  6.   "conditions": 1
  7.   }
  8.                 , "results": [
  9.                 {
  10.                 "name": "Shijiazhuang",
  11.                 "city": "Shijiazhuang",
  12.                 "state": "13",
  13.                 "country": "CI",
  14.                 "country_iso3166":"CN",
  15.                 "country_name":"China",
  16.                 "zmw": "00000.137.53698",
  17.                 "l": "/q/zmw:00000.137.53698"
  18.                 }
  19.                 ,
  20.                 {
  21.                 "name": "Shijiazhuang",
  22.                 "city": "Shijiazhuang",
  23.                 "state": "14",
  24.                 "country": "CI",
  25.                 "country_iso3166":"CN",
  26.                 "country_name":"China",
  27.                 "zmw": "00000.481.WZBYC",
  28.                 "l": "/q/zmw:00000.481.WZBYC"
  29.                 }
  30.                 ,
  31.                 {
  32.                 "name": "Shijiazhuang",
  33.                 "city": "Shijiazhuang",
  34.                 "state": "32",
  35.                 "country": "CI",
  36.                 "country_iso3166":"CN",
  37.                 "country_name":"China",
  38.                 "zmw": "00000.414.58144",
  39.                 "l": "/q/zmw:00000.414.58144"
  40.                 }
  41.                 ,
  42.                 {
  43.                 "name": "Shijiazhuang",
  44.                 "city": "Shijiazhuang",
  45.                 "state": "33",
  46.                 "country": "CI",
  47.                 "country_iso3166":"CN",
  48.                 "country_name":"China",
  49.                 "zmw": "00000.311.58660",
  50.                 "l": "/q/zmw:00000.311.58660"
  51.                 }
  52.                 ,
  53.                 {
  54.                 "name": "Shijiazhuang",
  55.                 "city": "Shijiazhuang",
  56.                 "state": "36",
  57.                 "country": "CI",
  58.                 "country_iso3166":"CN",
  59.                 "country_name":"China",
  60.                 "zmw": "00000.450.58527",
  61.                 "l": "/q/zmw:00000.450.58527"
  62.                 }
  63.                 ,
  64.                 {
  65.                 "name": "Shijiazhuang",
  66.                 "city": "Shijiazhuang",
  67.                 "state": "41",
  68.                 "country": "CI",
  69.                 "country_iso3166":"CN",
  70.                 "country_name":"China",
  71.                 "zmw": "00000.420.57181",
  72.                 "l": "/q/zmw:00000.420.57181"
  73.                 }
  74.                 ,
  75.                 {
  76.                 "name": "Shijiazhuang",
  77.                 "city": "Shijiazhuang",
  78.                 "state": "42",
  79.                 "country": "CI",
  80.                 "country_iso3166":"CN",
  81.                 "country_name":"China",
  82.                 "zmw": "00000.251.58402",
  83.                 "l": "/q/zmw:00000.251.58402"
  84.                 }
  85.                 ,
  86.                 {
  87.                 "name": "Shijiazhuang",
  88.                 "city": "Shijiazhuang",
  89.                 "state": "62",
  90.                 "country": "CI",
  91.                 "country_iso3166":"CN",
  92.                 "country_name":"China",
  93.                 "zmw": "00000.335.52996",
  94.                 "l": "/q/zmw:00000.335.52996"
  95.                 }
  96.                 ,
  97.                 {
  98.                 "name": "Shijiazhuang",
  99.                 "city": "Shijiazhuang",
  100.                 "state": "64",
  101.                 "country": "CI",
  102.                 "country_iso3166":"CN",
  103.                 "country_name":"China",
  104.                 "zmw": "00000.405.53810",
  105.                 "l": "/q/zmw:00000.405.53810"
  106.                 }
  107.                 ]
  108.         }
  109. }
复制代码

从回复的内容中可以看出,并没有current_observation的字段,而是带有Result的字段。那么这表示什么意思呢。在这里,我们先引用以下官网中的描述:

Ambiguous Results

When the API location query does not produce an exact location match, a results array will be present in the JSON response.
http://api.wunderground.com/api/Your_Key/geolookup/forecast/q/Allentown.json

Each result object has an l parameter (short for link) that can be used for constructing wunderground URLs:
http://api.wunderground.com/api/Your_Key/forecast/q/zmw:31003.1.99999.json

大概意思是:

  1. 不明确的结果

  2. 当API位置查询未产生精确的位置匹配时,在JSON响应中将出现一个result数组。
  3. http://api.wunderground.com/api/Your_Key/geolookup/forecast/q/Allentown.json

  4. 每个result对象都有一个l参数(链接的简写),可用于构建wunderground URL:
  5. http://api.wunderground.com/api/Your_Key/forecast/q/zmw:31003.1.99999.json
复制代码

如果没有正确获得国内城市的天气状况,是因为位置没有精确匹配,比如在石家庄的响应中,有8个result对象,我们可以使用其中的一个,重新生成链接:

  1. http://api.wunderground.com/api/0def10027afaebb7/conditions/q/zmw:00000.137.53698.json
复制代码

这样就可以了。


也可以缩小城市的范围。比如石家庄正定市。于是上面的网址变成:

  1. http://api.wunderground.com/api/0def10027afaebb7/conditions/q/China/Zhengding.json
复制代码

zhengding.png

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 716 | 回复: 1506



手机版|

GMT+8, 2025-1-22 15:43 , Processed in 0.044857 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表