天气查询是一个简单的HTTP接口,根据用户输入的adcode,查询目标区域当前/未来的天气情况
为了完成某项任务,我们需要不间断获取每小时的天气。这里我们使用C#,调用高德的API简单做一个实时获取天气信息的小程序,高德的天气API是每小时更新一次数据的,全国大部分地方都有数据
- 首先需要在高德开放平台去注册,申请一个key,我们将它保存在一个字符串中
string key = 你的key; //高德key
- 写一个获取天气的类,里面主要有两个方法,分别是得到天气信息和计算下一级行政区。计算下一级行政区可以先用于返回当前城市的下一级行政区,然后依次调用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;
}
}
}
- 在Form1的代码中调用
GetWeather
就可以得到天气信息
private void weatherm_Click(object sender, EventArgs e)
{
weatherTbx.Text += OWeather.Weather(cityTbx.Text, key, ref re) + "\r\n";
}
- 如果需要获取大范围城市的可以先使用
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 = "";
}
- 这基本就好了,中间省略了一些没写,可以试一下。如果需要一直获取下去可以加个Timer,设定时间为1h执行一次获取天气,一段时间保存为一个txt/csv/xls。最后把这个打包成exe一直挂着就行了(Windows下,Linux要怎么弄不懂)