3

経度と緯度に応じて結果を表示する気象情報を実装したいと考えています。

私のアプリは GPS から座標を取得しているので、それらを取得することは問題ではありません。唯一のことは、私に最も近い都市の天気情報を表示したいということと、そこに天気情報があることです。

アイデアと解決策を教えてください。

Google Weather API についてどう思いますか?

最も近いものを検索する方法と、このコードに緯度と経度を与える方法。

public static void GoogleWeather(string location)  
    {  
        HttpWebRequest GoogleRequest;  
        HttpWebResponse GoogleResponse = null;  
        XmlDocument GoogleXMLdoc = null;  
        try  
        {  
            GoogleRequest = (HttpWebRequest)WebRequest.Create("http://www.google.com/ig/api?weather=" + string.Format(location));  
            GoogleResponse = (HttpWebResponse)GoogleRequest.GetResponse();  
            GoogleXMLdoc = new XmlDocument();  
            GoogleXMLdoc.Load(GoogleResponse.GetResponseStream());  

            XmlNode root = GoogleXMLdoc.DocumentElement;  

            XmlNodeList nodeList1 = root.SelectNodes("weather/forecast_information");  
            HttpContext.Current.Response.Write("<b>City : " + nodeList1.Item(0).SelectSingleNode("city").Attributes["data"].InnerText + "</b>");  

            XmlNodeList nodeList = root.SelectNodes("weather/current_conditions");  
            HttpContext.Current.Response.Write(" 
");  
            HttpContext.Current.Response.Write(" 
<table class="bordered" cellpadding="5"> 
<tbody><tr><td><b><big><nobr>" + nodeList.Item(0).SelectSingleNode("temp_c").Attributes["data"].InnerText + " °C | " + nodeList.Item(0).SelectSingleNode("temp_f").Attributes["data"].InnerText + " °F</nobr></big></b>");  
            HttpContext.Current.Response.Write("<b>Current:</b> " + nodeList.Item(0).SelectSingleNode("condition").Attributes["data"].InnerText + "");  
            HttpContext.Current.Response.Write("" + nodeList.Item(0).SelectSingleNode("wind_condition").Attributes["data"].InnerText + "");  
            HttpContext.Current.Response.Write(nodeList.Item(0).SelectSingleNode("humidity").Attributes["data"].InnerText);  
            nodeList = root.SelectNodes("descendant::weather/forecast_conditions");  
            foreach (XmlNode nod in nodeList)  
            {  
                HttpContext.Current.Response.Write("</td> 
<td align="center">" + nod.SelectSingleNode("day_of_week").Attributes["data"].InnerText+ "");  
                HttpContext.Current.Response.Write("<img src="http://www.google.com" + nod.SelectSingleNode("icon").Attributes["data"].InnerText + "" alt="" + nod.SelectSingleNode("condition").Attributes["data"].InnerText + "">");  
                HttpContext.Current.Response.Write(nod.SelectSingleNode("low").Attributes["data"].InnerText + "°F | ");  
                HttpContext.Current.Response.Write(nod.SelectSingleNode("high").Attributes["data"].InnerText + "°F");  
            }  
            HttpContext.Current.Response.Write("</td> 
</tr> 
</tbody></table> 

");  
        }  
        catch (System.Exception ex)  
        {  
            HttpContext.Current.Response.Write(ex.Message);  
        }  
        finally  
        {  
            GoogleResponse.Close();  
        }  
    }  
4

1 に答える 1

4

私は実際にしばらく前に同様の問題を抱えていました。

Google Weather に問題が多すぎたため、Wunderground を使用することにしました。*編集、ワンダーグラウンドの下に実際のGoogleの例を追加しました。Google APIには、都市名または郵便番号が必要です。

これが私の例です。ずさんなコードを許してください。これをメモリから入力します。

public static DayOfWeek Wunderground(string latlong)
    {
        //Insert your API key in the below URL
        //string latlong = "37.8,-122.4";
        string url = "http://api.wunderground.com/api/*insertyourapikeyhere*/geolookup/conditions/forecast/q/"+latlong+".xml";

        HttpWebRequest web = (HttpWebRequest)WebRequest.Create(url);
        web.UseDefaultCredentials = true;
        web.PreAuthenticate = true;
        web.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19";
        web.GetResponse();
        //Get Dopplar Image
        var dop = "http://api.wunderground.com/api/7dca468f5dd2ff1b/animatedradar/q/TX/Houston.gif?newmaps=1&timelabel=1&width=640&height=480&timelabel.y=10&num=15&delay=50";
        WebClient wc = new WebClient();
        wc.DownloadFile(dop, "dop.gif");

        //Prepare my custom property
        var d = new WeatherLib.DayOfWeek();
        d.Current = new WDay();
        WDay forecast = new WDay();
        var conditions = d;
        var xmlConditions = new XmlDocument();

        //download the api xml
        XDocument api = XDocument.Load(url);
        api.Save("api.xml");
        xmlConditions.Load(string.Format(@"api.xml"));

        XmlNodeList list = xmlConditions.SelectNodes("/response/current_observation");
        WDay current = d.Current;

        //Parse out the XML data
        foreach (XmlNode node in list)
        {
            current.WeatherText = node.SelectSingleNode("weather").InnerText;
            current.TempCurrentF = node.SelectSingleNode("temp_f").InnerText;
            current.TempCurrentC = node.SelectSingleNode("temp_c").InnerText;
            current.Humidity = node.SelectSingleNode("relative_humidity").InnerText;
            current.WindDirection = node.SelectSingleNode("wind_dir").InnerText;
            current.WindSpeedM = node.SelectSingleNode("wind_mph").InnerText;
            current.WindSpeedK = node.SelectSingleNode("wind_kph").InnerText;
            current.Barometer = node.SelectSingleNode("pressure_mb").InnerText;
            current.HeatIndexF = node.SelectSingleNode("heat_index_f").InnerText;
            current.HeatIndexC = node.SelectSingleNode("heat_index_c").InnerText;
            current.WindChill = node.SelectSingleNode("windchill_string").InnerText;
            current.UVIndex = node.SelectSingleNode("UV").InnerText;
            current.RainAmount = node.SelectSingleNode("precip_today_in").InnerText;
            current.Visibility = node.SelectSingleNode("visibility_mi").InnerText;
            current.DewPoint = node.SelectSingleNode("dewpoint_f").InnerText;


        }return d;
    }

Google の例

public static DayOfWeek Google(string zip)
    {
        string urlstring = "http://www.google.com/ig/api?weather="+zip;
        var d = new WeatherLib.DayOfWeek();
        d.Monday = new WDay();
        d.Tuesday = new WDay();
        d.Wednesday = new WDay();
        d.Thursday = new WDay();
        d.Friday = new WDay();
        d.Saturday = new WDay();
        d.Sunday = new WDay();
        d.Current = new WDay();

        WDay forecast = new WDay();
        var conditions = d;
        var xmlConditions = new XmlDocument();
        XDocument api = XDocument.Load(urlstring);
        api.Save("api.xml");
        xmlConditions.Load(string.Format(@"api.xml"));
        if (xmlConditions.SelectSingleNode("xml_api_reply/weather/problem_cause") != null)
        {
            conditions = null;
        }
        else
        {

            var singleNode = xmlConditions.SelectSingleNode("xml_api_reply/weather/current_conditions/condition");
            if (singleNode != null)
                if (singleNode.Attributes != null)
                    conditions.Current.WeatherText =
                        singleNode.Attributes[
                            "data"].InnerText;
            var node = xmlConditions.SelectSingleNode("xml_api_reply/weather/current_conditions/temp_c");
            if (node != null)
                if (node.Attributes != null)
                    conditions.Current.TempCurrentC =
                        node.Attributes["data"]
                            .InnerText;
            var selectSingleNode1 = xmlConditions.SelectSingleNode("xml_api_reply/weather/current_conditions/temp_f");
            if (selectSingleNode1 != null)
                if (selectSingleNode1.Attributes != null)
                    conditions.Current.TempCurrentF =
                        selectSingleNode1.Attributes["data"]
                            .InnerText;
            var singleNode1 = xmlConditions.SelectSingleNode("xml_api_reply/weather/current_conditions/humidity");
            if (singleNode1 != null)
                if (singleNode1.Attributes != null)
                    conditions.Current.Humidity =
                        singleNode1.Attributes[
                            "data"].InnerText;
            var xmlNode1 = xmlConditions.SelectSingleNode("xml_api_reply/weather/current_conditions/wind_condition");
            if (xmlNode1 != null)
                if (xmlNode1.Attributes != null)
                    conditions.Current.WindSpeedM =
                        xmlNode1.Attributes
                            ["data"].InnerText;

            if (xmlConditions.SelectSingleNode("xml_api_reply/weather/problem_cause") != null)
            {
                conditions = null;
            }
            else
            {
                XmlNodeList list = xmlConditions.SelectNodes("/xml_api_reply/weather");
                foreach(XmlNode node1 in list)
                {
                    XmlNodeList days = node1.SelectNodes("forecast_conditions");
                    foreach (XmlNode doo in days)
                    {
                        string dow = doo.SelectSingleNode("day_of_week").Attributes["data"].InnerText;
                        switch (dow)
                        {
                            case "Mon":
                                forecast = d.Monday;
                                break;
                            case "Tue":
                                forecast = d.Tuesday;
                                break;
                            case "Wed":
                                forecast = d.Wednesday;
                                break;
                            case "Thu":
                                forecast = d.Thursday;
                                break;
                            case "Fri":
                                forecast = d.Friday;
                                break;
                            case "Sat":
                                forecast = d.Saturday;
                                break;
                            case "Sun":
                                forecast = d.Sunday;
                                break;
                        }
                        forecast.WeatherText = doo.SelectSingleNode("condition").Attributes["data"].InnerText;
                        forecast.TempHiF = doo.SelectSingleNode("high").Attributes["data"].InnerText;                         
                    }
                }       
            }
            }
于 2012-05-23T19:14:03.037 に答える