我想实施天气信息,这些信息会显示取决于我的经度和纬度的结果。
我的应用程序正在从GPS获取坐标,因此获取它们不是问题。唯一的问题是,我想显示离我最近的城市的一些天气信息,并且它有天气信息。
你能给我一些想法和解决方案。
您如何看待Google天气API?
如何使其搜索最近的以及如何为此代码提供lat和long。
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();
}
}
答案 0 :(得分:3)
我实际上有一段时间有类似的问题。
我决定选择Wunderground,因为我在Google Weather上遇到了太多问题。 *编辑,我在wunderground下面添加了一个正在运行的谷歌示例。谷歌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;
}
}
}
}