본문 바로가기

programming/Open API

[WPF] 구글 날씨 OpenApi

 
 다들 아시다시피 구글 날씨 OpenApi입니다. OpenAPI는 XML로 이루어져 있습니다. 그래서 XML document로 읽어들이면 됩니다. XML의 각 속성은 날씨에 대한 정보가 들어있어서 읽어와 화면으로 출력하면 됩니다. 간단쓰~+ㅇ+
 < WPF로 개발하였습니다 >

구글 XML 주소(?) : http://www.google.co.kr/ig/api?weather=suwon%20 
이 주소를 읽어들이면 됩니다.


                     < XML 주소 실행화면 >

 - 위에서 말했다시피, 각 속성에 날씨정보들이 들어있죠? 이걸 한번 간지(?)나게 바꾸도록 하겠습니다 ㅋㅋ




                             
                                    <프로그램 실행화면 - 저 단순한 XML이 요렇게 변함!!! >
l  초기 로드시에 지역을 area[] 로 선언 후 각 지역(경기도_가평군", "경기도_고양시 등)을 초기값을 해준다.
   그리고, AreadComboBox에 바인딩한다.

String headerURL = @"http://www.google.co.kr/";

AreaCombo.ItemsSource = area; //area[] 배열을 바인딩 시켜준다.

String City = "gapyeong";

GetWeather(City);             //지역에 따른 날씨를 보여주는 함수

AreaCombo.Text = "경기도_가평군";

 

l  Image Url 주소를 BitmapImage로 바꿔주는 함수

public BitmapImage LoadImage(string url)   //Image URL -> Bitmap으로..

{

   try

   {

        if (string.IsNullOrEmpty(url))

          return null;

 

        WebClient wc = new WebClient();

        url = headerURL + url;

        Byte[] MyData = wc.DownloadData(url);

        wc.Dispose();

        BitmapImage bimgTemp = new BitmapImage();

        bimgTemp.BeginInit();

        bimgTemp.StreamSource = new MemoryStream(MyData);

        bimgTemp.EndInit();

        return bimgTemp;

    }

    catch

    {

        return null;

    }

}

 

l  지역에 따른 날씨를 보여주는 함수이다.

private void GetWeather(string City)

{

   WebClient wc = new WebClient();

String buffer = wc.DownloadString(String.Format("{0}ig/api?weather={1}%20", headerURL, City)); //요청URL에 따른 요청변수를 넣어준다.

   wc.Dispose();

 

   StringReader sr = new StringReader(buffer);

//String Reader 선언 후 buffer를 읽어준다.

   XmlDocument doc = new XmlDocument();

   doc.Load(sr); //sr을 로드시켜준다.

   sr.Close();  //Reader를 닫는다.

 

   XmlNode currentNode = doc.SelectSingleNode("xml_api_reply/weather/current_conditions");  //현재 날씨 Node 선언

   XmlNode forecastNode =  doc.SelectSingleNode("xml_api_reply/weather/forecast_information");  //예보 날씨

   ///각각의 항목들에 대한 속성을 선언시켜준다.

   XmlAttribute date = forecastNode.SelectSingleNode("forecast_date").Attributes["data"];//날짜

   XmlAttribute temp = currentNode.SelectSingleNode("temp_c").Attributes["data"];        //온도

   XmlAttribute wind = currentNode.SelectSingleNode("wind_condition").Attributes["data"];//바람

   XmlAttribute condition = currentNode.SelectSingleNode("condition").Attributes["data"];//날씨

  XmlAttribute humidity = currentNode.SelectSingleNode("humidity").Attributes["data"];  //습도

  XmlAttribute icon = currentNode.SelectSingleNode("icon").Attributes["data"];          //아이콘

 

  //각각의 속성들을 레이블에 대입시킴

  label13.Content = date.Value.ToString();

  label16.Content = temp.Value.ToString() + "";

  label15.Content = wind.Value.ToString();

  label14.Content = condition.Value.ToString();

  label17.Content = humidity.Value.ToString();

  CurrentImage.Source = LoadImage(icon.Value.ToString());

 

  XmlNode forecastconNode = doc.SelectSingleNode("xml_api_reply/weather");

string[] InDay = new string[4];  //현재 일(日)을 담을 배열 선언

  string[] InLow = new string[4];  //현재 최고 날씨를 담을 배열 선언

  string[] InHigh = new string[4]; //현재 최저 날씨를 담을 배열 선언

  string[] InIcon = new string[4]; //날씨 아이콘을 담을  배열 선언

  string[] InCondition = new string[4];//현재 날씨상태를 담을 배열 선언

  int cnt = 0;

foreach (XmlNode node in forecastconNode.SelectNodes("forecast_conditions"))

  {

      XmlAttribute day = node.SelectSingleNode("day_of_week").Attributes["data"];      //요일               

      XmlAttribute low = node.SelectSingleNode("low").Attributes["data"];              //최저온도

      XmlAttribute high = node.SelectSingleNode("high").Attributes["data"];            //최고온도

      XmlAttribute icons = node.SelectSingleNode("icon").Attributes["data"];           //날씨 아이콘

      XmlAttribute conditions = node.SelectSingleNode("condition").Attributes["data"]; //조건

 

     /// 각각의 항목을 배열에 담는다.

      InDay[cnt] = day.Value.ToString() + "요일";

      InLow[cnt] = "최저:" + low.Value.ToString() + "";

      InHigh[cnt] = "최고:" + high.Value.ToString() + "";

      InIcon[cnt] = icons.Value.ToString();

      InCondition[cnt] = conditions.Value.ToString();

if (cnt == 0)  //카운트가 0일 때

      {

          //LoadImage함수를 이용해 날씨 아이콘을 나타낸다.

          ForecastImage1.Source = LoadImage(InIcon[cnt].ToString());

          //각각의 배열을 레이블에 대입시킨다.

          label20.Content = InDay[cnt];

          label1.Content = InLow[cnt];

          label2.Content = InHigh[cnt];

          label3.Content = InCondition[cnt];

      }

     //else if를 이용하여 cnt 1,2,3 일때도 똑같이 해준다.

}


<소스 첨부합니다.>