天気について話す

最近、私はYahoo!のいくつかのサービスとかなり徹底的に話さなければなりませんでした。 この記事では、そのうちの1つについて説明します。 これはYahoo!です 天気



約2年前、私はそのようなデータの便利でオープンソースをウェブで検索しましたが、何も見つかりませんでした。 国内のすべてのサービスは金銭のためにデータをエクスポートしました(むしろ、それは私を怖がらせる価格ではなく、支払いをいじっていました)が、西洋のサービスは自動処理に便利な形式でデータを提供しなかったか、私が住んでいる都市の存在を知りませんでした



Yahoo! 天気はこれらの欠点の欠如に満足しています。 現在の天気に関する情報と今後5日間の予報は、RSS形式でサーバーからエクスポートされます。 私の意見では、この形式の選択は非常に難しいです。 天気RSSフィードには1つのアイテムのみが含まれます。 同じデータをより簡潔な形式でエクスポートすることもできますが、ヤフーは標準のRSS処理方法に依存しているようです。これはかなり重要な議論でもあります。 標準は依然として標準です。



関心のある都市のRSSフィードアドレスは、 weather.yahoo.comで見つけることができます。







一般に、URLは次のとおりです。



xml.weather.yahoo.com/forecastrss?p=_&u=_







最初のパラメーターは、対象の都市の識別子です。 2番目のパラメーターは、温度を表示する単位を決定します。 値「c」は摂氏温度、「f」は華氏温度に対応します。

いくつかの例:







これを自動化する





以下で説明するYahooWeather



クラス(PHP5)は、HTTP経由でRSSをダウンロードし、データを前処理するように設計されています。



  <?php

クラスYahooWeather {
	 //風
	 public $ wind_chill;
	 public $ wind_direction;
	 public $ wind_speed;
	
	 //大気インジケーター
	パブリック$湿度;
	パブリック$可視性;
	公的圧力;
	
	 //日の出と日の入りの時刻をUNIXの時刻形式に変換します
	パブリック$日の出;
	パブリック$サンセット;
	
	 //現在の気温と天気
	 public $ temp;
	 public $ condition_text;
	 public $ condition_code;
	
	 // 5日間の天気予報
	パブリック$予測。
	
	パブリック$ユニット;
	
	関数__construct($コード、$単位= 'c'、$ lang = 'en'){
		 $ this-> units =($ units == 'c')? 'c': 'f';
		
		 $ url = 'http://xml.weather.yahoo.com/forecastrss?p='。
			 $ code。 '&u ='。$ this-> units;
		
		 $ xml_contents = file_get_contents($ url);
		 if($ xml_contents === false) 
			新しい例外をスロー(「エラー読み込み」。$ url);
		
		 $ xml = new SimpleXMLElement($ xml_contents);
		
		 //風
		 $ tmp = $ xml-> xpath( '/ rss / channel / yweather:wind');
		 if($ tmp === false)throw new Exception( "Error parsing XML。");
		 $ tmp = $ tmp [0];
		
		 $ this-> wind_chill =(int)$ tmp ['chill'];
		 $ this-> wind_direction =(int)$ tmp ['direction'];
		 $ this-> wind_speed =(int)$ tmp ['speed'];
		
		 //大気インジケーター
		 $ tmp = $ xml-> xpath( '/ rss / channel / yweather:atmosphere');
		 if($ tmp === false)throw new Exception( "Error parsing XML。");
		 $ tmp = $ tmp [0];
		
		 $ this->湿度=(int)$ tmp ['湿度'];
		 $ this-> visibility =(int)$ tmp ['visibility'];
		 $ this-> pressure =(int)$ tmp ['pressure'];
		
		 //日の出と日の入りの時刻をUNIXの時刻形式に変換します
		 $ tmp = $ xml-> xpath( '/ rss / channel / yweather:astronomy');
		 if($ tmp === false)throw new Exception( "Error parsing XML。");
		 $ tmp = $ tmp [0];
		
		 $ this-> sunrise = strtotime($ tmp ['sunrise']);
		 $ this-> sunset = strtotime($ tmp ['sunset']);
		
		 //現在の気温と天気
		 $ tmp = $ xml-> xpath( '/ rss / channel / item / yweather:condition');
		 if($ tmp === false)throw new Exception( "Error parsing XML。");
		 $ tmp = $ tmp [0];
		
		 $ this-> temp =(int)$ tmp ['temp'];
		 $ this-> condition_text = strtolower((string)$ tmp ['text']);
		 $ this-> condition_code =(int)$ tmp ['code'];
		
		 // 5日間の天気予報
		 $予測=配列();
		 $ tmp = $ xml-> xpath( '/ rss / channel / item / yweather:予測');
		 if($ tmp === false)throw new Exception( "Error parsing XML。");
		
		 foreach($ tmpを$日として){
			 $ this->予測[] =配列(
				 'date' => strtotime((string)$ day ['date'])、
				 'low' =>(int)$ day ['low']、
				 'high' =>(int)$ day ['high']、
				 'text' =>(文字列)$ day ['text']、
				 'code' =>(int)$ day ['code']
			 );
		 }
	 }
	
	パブリック関数__toString(){
		 $ u = "°"。(($ this-> units == 'c')? 'C': 'F');
		 return $ this-> temp。 '  '。$ u。'、 '。$ this-> condition_text;
	 }
 }

 ?> 




使用例:



  <?php

 {
	 $ weather =新しいYahooWeather( 'RSXX0091');
 } catch(例外$ e){
	 echo "キャッチされた例外:" $ e-> getMessage();
	 exit();
 }

 echo '<h1>'。$ weather。 '</ h1>';

 echo "<pre>";
 print_r($天気);
 echo "</ pre>";

 ?> 




結論:







日の出と日の入りの時刻値(それぞれsunrise



sunset



フィールド)は、Unixの時刻形式に自動的に変換されます。 何らかの理由でYahoo! 明らかに不正確な大気圧値(0)を生成します。 ただし、XMLに対応する属性が存在することから、遅かれ早かれこのデータのエクスポートが修復される可能性が多少あります。



condition_code



フィールドは、天気コードを格納するために使用されます。 現在の値のテキスト解釈はcondition_text



フィールドに保存され、可能なオプションの完全なリストが次の表に示されています。



コード 説明
0 竜巻
1 熱帯嵐
2 ハリケーン
3 激しい雷雨
4 雷雨
5 混じった雨と雪
6 雨とみぞれが混ざった
7 雪とみぞれの混合
8 凍結霧雨
9 霧雨
10 にわか雨
11 にわか雨
12 にわか雨
13 にわか雪
14 にわか雪
15 吹雪
16
17 あられ
18 みぞれ
19 ほこり
20 霧深い
21 もや
22 スモーキー
23 吹き荒れ
24 風が強い
25 寒い
26 曇った
27 だいたい曇(夜)
28 おおむね曇り(日)
29日 所により曇り(夜)
30 曇り時々晴れ
31 晴れ(夜)
32 晴れ
33 フェア(夜)
34 フェア(日)
35 にわか雨
36 暑い
37 孤立した雷雨
38 散在する雷雨
39 散在する雷雨
40 にわか雨
41 大雪
42 にわか雪
43 大雪
44 部分的に曇り
45 雷雨
46 にわか雨
47 孤立した雷雨
3200 利用できません




この記事はparadigm.ruブログに掲載されました。



関連リンク








All Articles