【转载】C#调⽤国家⽓象局天⽓预报接⼝
⼀.需求
最近,刚好项⽬中有天⽓预报查询功能的需求,要求录⼊城市名称,获取该城市今⽇天⽓信息及相关⽓象⽣活辅助信息等。
例如:查询北京市天⽓
结果为:
今⽇北京天⽓:15℃~5℃阵⾬转阴,北风3-4级,天⽓冷,建议着棉服、⽻绒服、⽪夹克加⽺⽑衫等冬季服装。年⽼体弱者宜着厚棉⾐、冬⼤⾐或厚⽻绒服。洗车指数:不宜。紫外线指数:最弱。晨练指数:较不宜.舒适指数:较舒适。
还好,国家⽓象局提供相关接⼝,再此表⽰感谢,虽然个⼈觉得该api设计思路有待提⾼,但是相⽐于其他部委【如交通部】来说,⽓象局这个冷衙门有开源、开放的⼼态,相⽐⽽⾔,相当了不起。期待后期能在接⼝规范、可提供查询城市数量等⽅⾯继续提⾼。
⼆.接⼝说明
据我所知,⽓象局提供三个天⽓查询接⼝,如下:
1、实时天⽓接⼝
地址:www.weather/data/ sk/【城市代码】.html
例如:查询北京实时天⽓
结果:
{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"13","WD":"南
风","WS":"2","SD":"59%","WSE":"2","time":"10:30","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}}
2、今⽇天⽓接⼝
地址:www.weather/data/cityinfo/【城市代码】.html
例如:查询北京今⽇天⽓
结果:
{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"15","temp2":"5℃","weather":"阵⾬转
阴","img1":"d3.gif","img2":"n2.gif","ptime":"08:00"}}
3、今⽇及未来天⽓接⼝【内容最详细】
地址:m.weather/data/【城市代码】.html
例如:查询北京今⽇及未来天⽓
结果:
{"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2013年10⽉22⽇","date":"","week":"星期
⼆","fchh":"08","cityid":"101010100","temp1":"15℃~5℃","temp2":"15℃~4℃………【省略】"index_tr":"适宜","index_co":"较舒
适","st1":"11","st2":"1","st3":"13","st4":"5","st5":"14","st6":"4","index_cl":"较不宜","index_ls":"不太适宜","index_ag":"不易发"}}
字段说明:我刚好是调⽤这个接⼝,所以下⾯通过对应的实体及属性来说明上述返回结果中各字段的含
/// <summary>
/// 天⽓查询结果信息实体
/// </summary>
public class WeatherinfoModel
{
/// <summary>
/// 城市名称
/// </summary>
public String city{get;set;}
/// <summary>
/
// 城市英⽂名称==拼⾳
/// </summary>
public String city_en{get;set;}
/// <summary>
/// 今⽇时间【年-⽉-⽇】
/// </summary>
public String date_y{get;set;}
/// <summary>
/// 为空,⽆⽤
/// </summary>
public String date{get;set;}
/
// <summary>
/// 星期⼏
天气预报代码大全/// </summary>
public String week{get;set;}
/// <summary>
/// 系统更新时间
/// </summary>
public String fchh{get;set;}
/// <summary>
/// 城市代码
/// </summary>
public String cityid{get;set;}
/// <summary>
/// 今天及之后五天的摄⽒温度
/// </summary>
public String temp1{get;set;}
public String temp2{get;set;}
public String temp3{get;set;}
public String temp4{get;set;}
public String temp5{get;set;}
public String temp6{get;set;}
/// <summary>
/
// 今天及之后五天的华⽒温度
/// </summary>
public String tempF1{get;set;}
public String tempF2{get;set;}
public String tempF3{get;set;}
public String tempF4{get;set;}
public String tempF5{get;set;}
public String tempF6{get;set;}
/// <summary>
/// 今天及之后五天的天⽓描述
/// </summary>
public String weather1{get;set;}
public String weather2{get;set;}
public String weather3{get;set;}
public String weather4{get;set;}
public String weather5{get;set;}
public String weather6{get;set;}
/// <summary>
/// 天⽓描述图⽚序号
/// </summary>
public String img1{get;set;}
public String img2{get;set;}
public String img3{get;set;}
public String img4{get;set;}
public String img5{get;set;}
public String img6{get;set;}
public String img7{get;set;}
public String img8{get;set;}
public String img9{get;set;}
public String img10{get;set;}
public String img11{get;set;}
public String img12{get;set;}
public String img_single{get;set;}
/
// <summary>
/// 图⽚名称
/// </summary>
public String img_title1{get;set;}
public String img_title2{get;set;}
public String img_title3{get;set;}
public String img_title4{get;set;}
public String img_title5{get;set;}
public String img_title6{get;set;}
public String img_title7{get;set;}
public String img_title8{get;set;}
public String img_title9{get;set;}
public String img_title10{get;set;}
public String img_title11{get;set;}
public String img_title12{get;set;}
public String img_title_single{get;set;}    /// <summary>
/// 今天及之后五天的风速描述
/// </summary>
public String wind1{get;set;}
public String wind2{get;set;}
public String wind3{get;set;}
public String wind4{get;set;}
public String wind5{get;set;}
public String wind6{get;set;}
/// <summary>
/// 风速级别描述
/// </summary>
public String fx1{get;set;}
public String fx2{get;set;}
public String fl1{get;set;}
public String fl2{get;set;}
public String fl3{get;set;}
public String fl5{get;set;}
public String fl6{get;set;}
/// <summary>
/// 今天穿⾐指数
/// </summary>
public String index{get;set;}
public String index_d{get;set;}
/// <summary>
/// 48⼩时穿⾐指数
/// </summary>
public String index48{get;set;}
public String index48_d{get;set;}
/
// <summary>
/// 紫外线及48⼩时紫外线
/// </summary>
public String index_uv{get;set;}
public String index48_uv{get;set;}
/// <summary>
/// 洗车
/// </summary>
public String index_xc{get;set;}
/// <summary>
/// 旅游
/
// </summary>
public String index_tr{get;set;}
/// <summary>
/// 舒适指数
/// </summary>
public String index_co{get;set;}
/// <summary>
/// ??
/// </summary>
public String st1{get;set;}
public String st2{get;set;}
public String st3{get;set;}
public String st4{get;set;}
public String st5{get;set;}
public String st6{get;set;}
/// <summary>
/// 晨练
/// </summary>
public String index_cl{get;set;}
/// <summary>
/// 晾晒
/// </summary>
public String index_ls{ get; set; }
/// <summary>
/// 过敏
/// </summary>
public String index_ag{get;set;}
}
总结:从上⾯三个接⼝来看,调⽤的关键是获取【城市代码】,所以⽓象局⼜提供了三个查询城市代码接⼝。个⼈有个疑问?为何⽓象局不提供⼀个或三个xml⽂档或json⽂本?⽐现在省市县逐级拼接获取⽅便很多,或许已经有,只是我不知道,求补充啊!
4、省份或直辖市代码接⼝
地址:
结果:
{"10101":"北京","10102":"上海","10103":"天津","10104":"重庆","10105":"⿊龙江","10106":"吉林","10107":"辽宁","10108":"内蒙
古","10109":"河北","10110":"⼭西","10111":"陕西","10112":"⼭东","10113":"新疆","10114":"西藏","10115":"青海","10116":"⽢
肃","10117":"宁夏","10118":"河南","10119":"江苏","10120":"湖北","10121":"浙江","10122":"安徽","10123":"福建","10124":"江
西","10125":"湖南","10126":"贵州","10127":"四川","10128":"⼴东","10129":"云南","10130":"⼴西","10131":"海南","10132":"⾹
港","10133":"澳门","10134":"台湾"}
5、省会或地区市代码接⼝
地址:www.weather/data/citydata/district/【省份或直辖市代码】.html
例如:查询福建省包含的城市
结果:
{"01":"福州","02":"厦门","03":"宁德","04":"莆⽥","05":"泉州","06":"漳州","07":"龙岩","08":"三明","09":"南平"}
6、区或县代码
地址:www.weather/data/citydata/city/【省份或直辖市代码】+【省会或地区市代码】.html
例如:查询福建省南平市包含的区县
结果:
{"01":"南平","02":"顺昌","03":"光泽","04":"邵武","05":"武夷⼭","06":"浦城","07":"建阳","08":"松溪","09":"政和","10":"建瓯"}
说明:
注意该结果不仅包含区县,还包含上级的地级市或省会城市,所以我们只要获取这⼀级别的结果,再拼接就可以获取省会城市、地级市及区县的城市代码!
三. 城市代码拼接
通过上述三个接⼝,我们可以通过拼接省市县级别城市代码,来获取南平市或政和县的城市代码。
例如:南平市代码为:101230901【10123是福建省的省级代码+09南平市的市级代码+01南平市的区县级代码】,同理,政和县代码为:101230909。
知道城市代码后,要获取政和县的今⽇天⽓,调⽤下⾯的url就可以了:
注意:并不是所有的城市代码都是通过省市县来拼接,存在下⾯两个问题。个⼈建议各城市的代码完全可以==该城市的邮编,因为各省市县的邮编都是不可能重复的,
问题⼀:海南下属市及湖北荆州的沙市中区县代码包含省级代码和市级代码,如:
问题⼆:四个直辖市的城市代码不是由省+市+县代码拼接,⽽是⽤省+县+市代码拼接⽅式。
所以,城市代码的拼接⽅法如下:
//pID:省或直辖市代码
//cID:省会或地区市代码
//dID:区或县代码
int code=0;//城市代码
//name:区县名称
//如果是海南省或湖北荆州沙市【感谢luoliurong反馈,否则未对沙市特别处理,⽆法查询】,则直接获取
if (pID == 10131||name == "沙市")
{
code = int.Parse(dID);
}
//如果是直辖市
else if (pID < 10105)
{
int.TryParse(string.Format("{0}{1}{2}", pID, dID, cID), out code);
}
else
{
int.TryParse(string.Format("{0}{1}{2}", pID, cID, dID), out code);
}
通过上述说明,表明我们需要建⼀个项⽬循环请求并获取各级城市的城市代码,可以将城市代码保存在数据库中,也可以保存在xml⽂件中。我做法是保存在数据库中,同时⽣成xml⽂件,⼀周更新xml⽂件⼀次,并将该xml通过⽂件依赖缓存到内存中,使⽤该缓存的xml作为城市代码查询的数据源。
四. 省市县代码表表结构
表名:Weather_Province【省代码表实体】
表名:Weather_City【省会或地级市代码表实体】
表名:Weather_District【区或县代码表实体】
可被直接调⽤代码,即该区县的代码
源码包中的DBScript.sql为上述数据脚本
五. 获取省级代码数据
Http请求⽅法:
/// <summary>
/// Get⽅式获取url地址输出内容
/// </summary>
/// <param name="url">url</param>
/// <param name="encoding">返回内容编码⽅式,例如:Encoding.UTF8</param>
/// <returns></returns>
public static String SendRequestByGetMethod(String url,Encoding encoding)
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = "GET";
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
StreamReader sr = new StreamReader(webResponse.GetResponseStream(), encoding);
return sr.ReadToEnd();
}
/// <summary>
/// ⽣成天⽓查询省代码表
/// </summary>
private void CreateProvinceCode()
{
m_ProvinceBLL.TruncateProvince();
var responseText = HttpRequestOpt.SendRequestByGetMethod("www.weather/data/citydata/china.html",System.Text.Encoding.UTF8);    if (!String.IsNullOrEmpty(responseText))
{
m_ProvinceBLL.SaveProvinceCode(responseText);
}
}
/// <summary>
/// 添加天⽓查询省代码表
/// </summary>
/// <param name="responseText">查询结果⽂本</param>
public void SaveProvinceCode(String responseText)
{
responseText = responseText.TrimStart('{').TrimEnd('}');
List<Weather_ProvinceModel> list = new List<Weather_ProvinceModel>();
responseText.Split(',').ToList().ForEach(item =>
{
Weather_ProvinceModel provinceModel = new Weather_ProvinceModel();
if (!String.IsNullOrEmpty(item) && item.Split(':').Count() == 2 && !String.IsNullOrEmpty(item.Split(':')[0]) && !String.IsNullOrEmpty(item.Split(':')[1]))        {
int pID = 0;
int.TryParse(item.Split(':')[0].Trim('"'), out pID);
provinceModel.PID = pID;
provinceModel.Name = item.Split(':')[1].Trim('"');
list.Add(provinceModel);
}
});
if (list.Count > 0)
{
m_ProvinceDAL.SaveProvinceCode(list);
}
}
/// <summary>
/
// 批量添加天⽓查询省代码表
/// </summary>
/// <param name="list">省代码表实体集</param>
public void SaveProvinceCode(List<Weather_ProvinceModel> list)
{
SqlBulkCopy sqlBc = null;
DataTable dt = new DataTable();
try
{
sqlBc = new SqlBulkCopy(Common.WebConfig.WeatherDBConnString, SqlBulkCopyOptions.UseInternalTransaction);
sqlBc.DestinationTableName = "Weather_Province";
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(String));
dt.Columns.Add("PID", typeof(int));
if (dt.Rows.Count > 0)
{
sqlBc.WriteToServer(dt);
dt.Clear();
}
list.ForEach(entity =>
{
DataRow dr = dt.NewRow();
dr["Name"] = entity.Name;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。