天気について話す

最近、私は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>";

 ?> 


結論:



日の出と日の入りの時刻値(それぞれsunrisesunsetフィールド)は、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ブログに掲載されました。

関連リンク



Source: https://habr.com/ru/post/J20461/


All Articles