调用高德API不间断监测天气数据(C#)

天气查询是一个简单的HTTP接口,根据用户输入的adcode,查询目标区域当前/未来的天气情况

为了完成某项任务,我们需要不间断获取每小时的天气。这里我们使用C#,调用高德的API简单做一个实时获取天气信息的小程序,高德的天气API是每小时更新一次数据的,全国大部分地方都有数据

  1. 首先需要在高德开放平台去注册,申请一个key,我们将它保存在一个字符串中
string key = 你的key;  //高德key
  1. 写一个获取天气的类,里面主要有两个方法,分别是得到天气信息和计算下一级行政区。计算下一级行政区可以先用于返回当前城市的下一级行政区,然后依次调用Weather方法返回当前的城市的天气信息
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Net;
using System.Text;
using System.Windows.Forms;

namespace Weater
{
    class OWeather
    {
        // 获取当前城市的天气信息
        public static string GetWeather(string city, string key, ref string[] re)
        {
            string weatherjson = ",";

            try
            {
                WebClient client = new WebClient();
                client.Encoding = Encoding.UTF8;
                string url = String.Format("https://restapi.amap.com/v3/weather/weatherInfo?key={0}&city={1}", key, city);

                //将返回的json数据转为JSON对象
                JObject jo = ((JObject)JsonConvert.DeserializeObject(client.DownloadString(url)));
                weatherjson = jo["lives"].ToString();
                re = weatherjson .Split('\"', ',');

                weatherjson = re[3] + "," + re[8] + "," + re[18] + "," + re[23] + "," + re[28] + "," + re[33] + "," + re[38] + "," + re[43];
            }
            catch
            {
                weatherjson = "NoData";
            }
            return weatherjson;
        }

        // 计算当前城市的下一级行政区,可用于大范围获取天气
        public static string GetPlace(string city, string key)
        {
            string placejson = ",";

            try
            {
                WebClient client = new WebClient();
                client.Encoding = Encoding.UTF8;
                string url = String.Format("https://restapi.amap.com/v3/config/district?key={0}&keywords={1}", key, city);

                //将返回的json数据转为JSON对象
                JObject jo = ((JObject)JsonConvert.DeserializeObject(client.DownloadString(url)));
                placejson = jo["districts"].ToString();
            }
            catch
            {
                //异常处理 
            }
            return placejson;
        }
    }
}
  1. 在Form1的代码中调用GetWeather就可以得到天气信息
 private void weatherm_Click(object sender, EventArgs e)
        {
            weatherTbx.Text += OWeather.Weather(cityTbx.Text, key, ref re) + "\r\n";
        }
  1. 如果需要获取大范围城市的可以先使用GetPlace,在使用getplaceBtn_Click时返回的下一级行政区带有城市的经纬度(这里高德的坐标是GCJ-02的),可以在保存在数据中,方便最后可以将数据在GIS平台展出来
        private void getplacem_Click(object sender, EventArgs e)
        {
            string[] enf = OWeather.GetPlace(getplaceTbx.Text, key).Split('{', '}');
            for (int i = 0; i < enf.Length; i++)
            {
                if (enf[i].Length < 30)
                {
                    enf[i] = "*";
                }
                if (enf[i] != "*")
                {
                    string[] enf2 = enf[i].Split(':', ',');
                    subcityTbx.Text += enf2[5].Split('\"')[1] + "," + enf2[7].Split('\"')[1] + "," + enf2[8].Split('\"')[0] + "\r\n";
                }
            }
        }

        private void mul_getplacem_Click(object sender, EventArgs e)
        {
            string[] str = new string[subcityTbx.Lines.Length];
            for (int i = 0; i < subcityTbx.Lines.Length; i++)
            {
                str[i] = subcityTbx.Lines[i];
            }
            for (int i = 2; i < subcityTbx.Lines.Length - 1; i++)
            {
                cityTbx.Text = str[i].Split(',')[0];
                weatherTbx.Text += OWeather.Weather(cityTbx.Text, key, ref re) + "\r\n";
            }
            cityTbx.Text = "";
        }
  1. 这基本就好了,中间省略了一些没写,可以试一下。如果需要一直获取下去可以加个Timer,设定时间为1h执行一次获取天气,一段时间保存为一个txt/csv/xls。最后把这个打包成exe一直挂着就行了(Windows下,Linux要怎么弄不懂)
    在这里插入图片描述
发布了39 篇原创文章 · 获赞 48 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39798423/article/details/86747985