由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库基本全了,现在开放该数据库,目的是为了让可能需要该类型做相关研究准备的,至于实时天气的采集本项目也做了,暂时不公布,如果有需求的,单独好我联系,原因很简单,人家小站也不容易,大家一起拖,容易搞死,主要大家都不能用。

.NET开源项目:【目录】本博客其他.NET开源项目文章目录

本文原文地址:分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

1.天气数据库介绍

该数据的基本情况如下:

  • 该数据库目前覆盖了全国34个省、直辖市、自治区以及特别行政区的所有县级市区。

  • 该数据库的历史天气时间范围是2011年1月至2015年8月底的数据,实时天气预报的更新接口暂时不开放,但我们会对核心采集进行简单的介绍,请看第3节内容。

  • 包括的天气数据有:天气情况,气温情况,风力情况。

  • 目前总的天气记录条数为390万,,大小为570M,压缩后的版本大小为60M,后续还会增加,考虑每2-3个月更新一次。目前为一个总库

  • 考虑到实际的城市等级,我对省份和城市进行了大概分级,具体研究分析的时候可以自己单独提取城市,单独处理。

  1.省、直辖市、自治区,特别行政区,等级:1

  2.地级市,或者同等州 ,等级:2

  3.县市区,等级:3

  4.省会中心城市:5

本文使用C#+XCode进行开发,大部分查询方法都在实体类中写好了。下面我们将会简单介绍一些。

2.数据库设计

该数据库设计比较简单,第一个表是基础城市信息表,存储城市的名称,等级,代码,所属省份以及地区等基本信息;第二个表是原始天气数据表,存储采集过来的原始天气信息,主要信息是名称,天气状况,考虑到数据小,对一些字段进行了冗余,避免重复查找。第三个表是处理后的天气数据表,如何处理看个人情况进行,我自己还没想好,只是先采集了原始数据。数据库的结构如下图:

上述3个表的基本结构看上面,比较简单,有的表字段进行了冗余,没必要为了所谓的范式把自己搞死。看看下面Gif动态演示图:

3.关于采集预报信息

  我们在前面一篇文章中介绍了基本的页面采集方法。页面分析过程就不介绍了,有空的朋友看前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),这里直接贴出核心代码:

//直接采集月份,每个城市从2011 01 开始的数据至今都有
String url = String.Format("http://www.tianqihoubao.com/yubao/{0}.html", cityName);
//先要拼接链接,根据名称                
var docText = HtmlHelper.GetWebClient(url);
var doc = new HtmlDocument(); doc.LoadHtml(docText);
var res = doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/div[2]/div[6]/div[1]/div[1]/table[1]");
if (res != null)
{
var dd = res.SelectNodes(@"tr");
if (dd.Count < 3) return;//3或者4个以上子节点tr
if ((dd.Count - 1) % 2 == 0) //tr成对出现
{
Int32 N = (dd.Count - 1) / 2;
for (int i = 0; i < N; i++)
{
//日期 - 天气状况 - 气温 - 风力风向
//白天
var td = dd[2 * i + 1].SelectNodes(@"td");
var date = td[0].InnerText.Replace("&nbsp;", "").Trim();
var btq = td[2].InnerText.Replace("&nbsp;", "").Trim();
var bqw = td[3].InnerText.Replace("&nbsp;", "").Trim();
var bfx = td[4].InnerText.Replace("&nbsp;", "").Trim();
//晚上
var tdw = dd[2 * i + 2].SelectNodes(@"td");
var wtq = tdw[1].InnerText.Replace("&nbsp;", "").Trim();
var wqw = tdw[2].InnerText.Replace("&nbsp;", "").Trim();
var wfx = tdw[3].InnerText.Replace("&nbsp;", "").Trim();
Console.WriteLine("{0}/{1},{2}/{3},{4}/{5},{6}", wtq, btq, wqw, bqw, wfx, bfx,date);
}
}
}

4.基本使用方法

下面给出数据库的几个常规查询方法,如果懂XCode的朋友,更加容易理解,熟悉表结构就行了。

4.1 查询某个省份所有地级市列表

  由于地级市的等级为2或者5,所以要注意一些,而且县级市的省份属性里面也包括了Province,因此不能单独判定。

/// <summary>查询某个省份,所有地级市列表</summary>
/// <param name="provinceName">省份名称</param>
/// <returns></returns>
public static EntityList<BaseCityInfo> FindAllCityByProvince(String provinceName)
{
return BaseCityInfo.FindAll(
       BaseCityInfo._.Province == provinceName &
               BaseCityInfo._.Level>1 & //不能为省份
               BaseCityInfo._.Level !=3);//要包括省会中心城市,也就是Level=2或者5
}

4.2 查询地级市下所有县市列表

  县级市都是等级为3,所以查询地区名称以及等级就可以了。

/// <summary>查询某个地级市下面的所有县级市列表</summary>
/// <param name="areaName">市区名称</param>
/// <returns></returns>
public static EntityList<BaseCityInfo> FindAllCityByArea(String areaName)
{
return BaseCityInfo.FindAll(BaseCityInfo._.Area == areaName &
BaseCityInfo._.Level ==3);//Level=3是县级市区
}

4.3 查询某个地区某个月的天气情况

  查询某个地区,和时间范围的天气情况,直接加条件即可,地区按照名称来XCode的查询语法举一反三,应该比较好理解。

/// <summary>查询某个地区某个月的天气情况</summary>
/// <param name="cityName">城市名称</param>
/// <returns></returns>
public static EntityList<OriginWeatherData> FindCityWeatherByMonth(String cityName)
{
return OriginWeatherData.FindAll(
       OriginWeatherData._.Name == cityName &
       OriginWeatherData._.DateTime <= new DateTime(2015, 8, 31)&
       OriginWeatherData._.DateTime >=new DateTime (2015,8,1),
       OriginWeatherData._.DateTime.Asc(),null,0,0);
}

4.4 数据库Sql查询演示与XCode版代码

  为了更加直观,我们对数据库进行了简单的查询演示,390万代码实际速度并不慢,看看效果。里面的Sql语句,下面都将使用XCode代码进行重写演示,大家可以借鉴用法:

我们看看XCode的查询方法:

//获取所有的地级市+县级市区的数量
var cityCount = BaseCityInfo.FindCount(BaseCityInfo._.Level > 1, null, null, 0, 0);
//获取所有记录总数,截至时间2015-08-29和2015-09-03
var totalCount = OriginWeatherData.FindCount();
//获取从2015-08-21开始的上海地区的天气情况
var shanghaiRecords = OriginWeatherData.FindAll
(OriginWeatherData._.Name == "上海" &
 OriginWeatherData._.DateTime > new DateTime(2015, 08, 20),
 OriginWeatherData._.Id.Asc(), null, 0, 0);
//获取上海地区总的天气数目,注意只是上海地区总的,不包括下属县市区
var shCount = OriginWeatherData.FindCount(OriginWeatherData._.Name, "上海");
//获取浙江省地级市区所有的天气记录 
var zjRecords = OriginWeatherData.FindAll
(OriginWeatherData._.Province == "浙江" &
(OriginWeatherData._.Level == 2 | 
 OriginWeatherData._.Level == 5),
 null,null,0,0);
//获取2015年8月20日浙江省地级市区所有的天气记录
var zj = OriginWeatherData.FindAll
(OriginWeatherData._.Province == "浙江" &
 OriginWeatherData._.DateTime > new DateTime(2015, 08, 20) &
 (OriginWeatherData._.Level == 2 | OriginWeatherData._.Level == 5),
 null, null, 0, 0);

看看结果:

5.数据库和程序下载

Sqlite版数据库下载:http://pan.baidu.com/s/1pJ02EmR 密码:jzmt ,

 如果链接错误,请到原地址下载:分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

C#版访问程序,注意是Sqlite是32位的版本:天气数据库访问程序.rar

 使用方法:把数据库放在bin目录,或者自己修改配置文件的地址。

  数据大部分截至2015年8月30日-2015年9月2日,按照地区会有不一样,以后会逐步同步起来。

核心代码不直接开放,但完全免费对有需要的人开放。需要的人可以QQ联系,或者邮件联系我,请注明自己的一些基本个人信息和用途。

由于时间紧,考虑不够全面,我将在下一个版本中对数据库进行分库,提高数据查询效率。目前的数据库对于sqlite版本来说,太大了,而且以后还会持续增加,如果有资源的朋友,可以帮忙挂一下。

【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】的更多相关文章

  1. PHP爬取历史天气

    PHP爬取历史天气 PHP作为宇宙第一语言,爬虫也是非常方便,这里爬取的是从天气网获得中国城市历史天气统计结果. 程序架构 main.php <?php include_once(". ...

  2. Python 爬虫+tkinter界面 实现历史天气查询

    文章目录 一.实现效果 1. python代码 2. 运行效果 二.基本思路 1. 爬虫部分 2. tkinter界面 一.实现效果 很多人学习python,不知道从何学起.很多人学习python,掌 ...

  3. [转]Android 学习资料分享(2015 版)

    转 Android 学习资料分享(2015 版) 原文地址:http://www.jianshu.com/p/874ff12a4c01 目录[-] 我是如何自学Android,资料分享(2015 版) ...

  4. 基于WeChat的消息存储备份、远程控制、小功能项目开源分享计划

    WeChat+ 关于该项目 起源 该项目的起因是一个比较程(老)序(油)猿(条)的理由,有一天我发现我下班时间比较早,有点尴尬,但是又不想没事干还坐在公司,那么如何解决我的问题呢,初步想法是远程控制电 ...

  5. 全国城市三级联动 html+js

    全国城市三级联动,没有css,所以屏幕的自适应必须自己想办法,手机端慎用(最好不要用,因为有些我也说不出的展示问题). html页面 <!DOCTYPE html> <html> ...

  6. 转: javascript实现全国城市三级联动菜单代码

    <html> <head> <title>js全国城市三级联动菜单代码_B5教程网</title> <meta http-equiv=" ...

  7. Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组

    1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...

  8. 基于Python使用SVM识别简单的字符验证码的完整代码开源分享

    关键字:Python,SVM,字符验证码,机器学习,验证码识别 1   概述 基于Python使用SVM识别简单的验证字符串的完整代码开源分享. 因为目前有了更厉害的新技术来解决这类问题了,但是本文作 ...

  9. 全国城市一卡通一级TSM平台业务架构及意义

    [导读]TSM平台是一种具有鲜明行业属性的平台,因此,各行业都建立了本行业的TSM平台.为促进城市一卡通行业移动支付的快速发展,住房和城乡建设部也建立了全国城市一卡通行业一级TSM平台. 作为住建部标 ...

随机推荐

  1. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  2. 探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  3. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  4. javaScript生成二维码(支持中文,生成logo)

    资料搜索 选择star最多的两个 第一个就是用的比较多的jquery.qrcode.js(但不支持中文,不能带logo)啦,第二个支持ie6+,支持中文,根据第二个源代码,使得,jquery.qrco ...

  5. Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)

    之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...

  6. ios label 自动计算行高详解

    在OC当中自动计算行高主要调用系统的 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } span ...

  7. SQLite学习笔记(十)&&加密

    随着移动互联网的发展,手机使用越来越广泛,sqlite作为手机端存储的一种解决方案,使用也非常普遍.但是sqlite本身安全特性却比较弱,比如不支持用户权限,只要能获取到数据库文件就能进行访问:另外也 ...

  8. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  9. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  10. .Net程序在linux mono环境和WindowsServer上执行测试对比

    最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...