1. 程式人生 > >【開源】分享2011-2015年全國城市歷史天氣資料庫【Sqlite+C#訪問程式】

【開源】分享2011-2015年全國城市歷史天氣資料庫【Sqlite+C#訪問程式】

    由於個人研究需要,需要採集天氣歷史資料,前一篇文章:C#+HtmlAgilityPack+XPath帶你採集資料(以採集天氣資料為例子),介紹了基本的採集思路和核心程式碼,經過1個星期的採集,歷史資料庫基本全了,現在開放該資料庫,目的是為了讓可能需要該型別做相關研究準備的,至於實時天氣的採集本專案也做了,暫時不公佈,如果有需求的,單獨好我聯絡,原因很簡單,人家小站也不容易,大家一起拖,容易搞死,主要大家都不能用。

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.關於採集預報資訊

//直接採集月份,每個城市從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.資料庫和程式下載

    C#版訪問程式,注意是Sqlite是32位的版本:天氣資料庫訪問程式.rar

 使用方法:把資料庫放在bin目錄,或者自己修改配置檔案的地址。

  資料大部分截至2015年8月30日-2015年9月2日,按照地區會有不一樣,以後會逐步同步起來。

    核心程式碼不直接開放,但完全免費對有需要的人開放。需要的人可以QQ聯絡,或者郵件聯絡我,請註明自己的一些基本個人資訊和用途。

    由於時間緊,考慮不夠全面,我將在下一個版本中對資料庫進行分庫,提高資料查詢效率。目前的資料庫對於sqlite版本來說,太大了,而且以後還會持續增加,如果有資源的朋友,可以幫忙掛一下。

相關推薦

開源分享2011-2015全國城市歷史天氣資料庫Sqlite+C#訪問程式

    由於個人研究需要,需要採集天氣歷史資料,前一篇文章:C#+HtmlAgilityPack+XPath帶你採集資料(以採集天氣資料為例子),介紹了基本的採集思路和核心程式碼,經過1個星期的採集,歷史資料庫基本全了,現在開放該資料庫,目的是為了讓可能需要該型別做相關研究準備的,至於實時天氣的採集本專案

2015全國谷歌衛星地圖離線資料儲存方案

一、概述 隨著地理資訊數字化的發展,大資料時代的到來,海量資料的傳輸和安全性給我們帶來巨大的困難。海量資料的傳輸受到網際網路技術和硬體的限制,佔用著較多的線上資源和線下儲存空間,產生了能源、空間、人力的成本浪費,而在資料傳輸和儲存過程中,不規範的操作造成的資料洩露,更是資

CSP考試 20159月第2題 日期計算 C語言實現

#include <stdio.h> int main() { //int nian=2000; //int ri=40; int nian; int ri; scanf("%d",&nian);/* if((nian<1900)|

CSP考試 201503月第2題 數字排序 C語言實現

#include <stdio.h> int main() { int NUM; scanf("%d",&NUM); int a[NUM]; int b[1001]; int i,j; for(i=0;i<NUM;i+

2015第六屆藍橋杯試題(C/C++本科B組)

1 有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(10-99),要求其中不要出現帶“4”的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。 請

最新2010全國城市GDP排行前100名

排名城市 2010年gdp 所屬省份1 上海 16872.42 上海2 北京 13777.90 北京3 廣州 10604.48 廣東14 深圳 9510.91 廣東25 蘇州 9168.91 江蘇16 天津 9108.83 天津7 重慶 7894.24 重慶8 杭州 5945

20154月第六屆藍橋杯c/c++B組省賽試題和個人解答

又一年的藍橋杯,好久沒那麼爽快的做題了,昨天上午剛考完藍橋杯,我把題帶出來了。不廢話,上題。      一、 獎券數目 有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。 雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(

開源分享:入門到精通ASP.NET MVC+EF6+Bootstrap從這裏開始,一起搭框架(1)開篇介紹

strong src 擁有 ckeditor 開發 技術分享 mdi 控制 https 框架簡介 這幾年一直在做ASP.NET開發,幾年前做項目都是老老實實一行行的寫代碼,後來發現那些高手基本都會有自己積累起來的代碼庫,現在稱之為開發框架,基礎代碼不用再去堆,

2018全國多校算法寒假訓練營練習比賽(第三場)

upload 線段 fall 警鐘 預處理 數學 tex sqrt -- 之前題目比較水,今天的還可以。 【A 不凡的大夫】 方法一:答案是log8(n!),解決方案是預處理,將需要的答案記錄下來以免超內存; 方法二:用公式,斯特林公式: 【B 一個小問

2018全國多校算法寒假訓練營練習比賽(第四場)-A石油采集(匈牙利算法)

sca scanf tor 代碼 contest bit span 比賽 targe 試題鏈接:https://www.nowcoder.com/acm/contest/76/A 【思路】 每個‘#’的右邊和下邊如果也是‘#&r

2018全國多校算法寒假訓練營練習比賽(第四場)-D小明的挖礦之旅

scanf n) name targe () 鏈接 算法 || 挖礦 題目鏈接:https://www.nowcoder.com/acm/contest/76/D做題時沒註意到“無論出現在哪個格子”。。題中也沒說明一個格子只能經過一次,其實沒有想象的

2018全國多校算法寒假訓練營練習比賽(第五場)-E情人節的電燈泡(二維樹狀數組單點更新+區間查詢)

string 整數 改變 sin microsoft 題目 全國 次數 ros 試題鏈接:https://www.nowcoder.com/acm/contest/77/E 題目描述 情人節到了,小芳和小明手牽手,打算過一個完美的情人節,但是小剛偏偏也來了,當了一個

2018全國多校算法寒假訓練營練習比賽(第五場)-C字符串問題(KMP)

長度 str lan sca include leg www tps bsp 題目鏈接:https://www.nowcoder.com/acm/contest/77/C 【題意】 求一個字符串中最長的子串,要求子串既是原串的前綴又是後綴,除前後綴還在中間出現過。

大資料InfoWorld的2018最佳開源資料平臺獎公佈

目錄 TiDB Neo4j Apache Spark 儘管新的產品層出不窮,Apache Spark在資料分析領域仍然佔據著舉足輕重的地位。如果你需要從事分散式計算、資料科學或者機器學習相關的工作,就使用Apache

結構之法 演算法之道2015起和團隊創業做七月線上,專注AI教育。希望一直不斷幫助天下最多人

博主簡介 July,湖南婁底人,於2010年10月11日開始在CSDN上寫博(搜尋:結構之法,進入本部落格),部落格專注面試、演算法、機器學習。2011年畢業於東華理工,2015年正式創業,任:七月線上創始人兼CEO,公司官網:七月線上(https://www.july

題目2016全國研究生數學建模競賽B題 具有遺傳性疾病和性狀的遺傳位點分析

同學給我看了她參加競賽的題目,我一看,這不巧了嗎,我也就看看題目...... 人體的每條染色體攜帶一個DNA分子。在這條雙螺旋的長鏈中,共有約30億個鹼基對,而基因則是DNA長鏈中有遺傳效應的一些片段。在組成DNA的數量浩瀚的鹼基對(或對應的脫氧核苷酸)中,有一些特定位置

今日薦文三十五經驗分享程式設計師進階八法

如果你的目標僅僅是提高自己,那麼很容易實現,但是如果你的目標是成為一個偉大的程式設計師,那麼這就不簡單了。 很多人都願意說,我想變得更好,但是更好是什麼卻很模糊,而且人們也不知道該怎麼樣去做。 時間到了,提高你的程式設計技能,認真+嚴肅,走起! 我在這裡分享八法

Bugly乾貨分享那些我們用過的顯示效能指標

注:Google 在自己文章中用了 Display Performance 來描述我們常說的流暢度,為了顯得有文化,本文主要用“顯示效能”一詞來代指“流暢度”(雖然兩者在概念上有細微差別)。 從 Android 誕生的那一刻起,流暢度就為眾人所關注。一

讀書精華分享《分散式實時處理系統 原理、架構與實現》盧譽聲著/2016

【分享說明】: 我會花很多時間或淺或深的研讀一本書,然後總結一些提煉出來的精華,用簡短的語言,讓其他人能夠用很少的時間大致知道這本書能帶給自己的價值,如果適用自己,鼓勵買一本正本實體書細讀

ZSTU4213 201512月浙理工校賽 D雙連通分量tarjan演算法One-Way Roads 無向連通圖確定邊的方向使得全圖任意兩點間可達

4213: One-Way Roads Time Limit:1 Sec  Memory Limit:128 MB  Special JudgeSubmit:133  Solved:45 Description In the ACM kingdom, there a