我怎样才能在VB.net中获得每小时天气预报?

时间:2013-05-04 17:55:29

标签: vb.net weather-api

我在这里看到了一些与此类似的问题,但它们似乎都没有帮助我。我真的不在乎使用什么API,无论是Google,Yahoo!,The Weather Channel还是其他任何API。根据用户给出的位置,我有代码可以获得当天的高低,但我似乎无法获得温度或天气状况的每小时预测,这就是我真的寻找。我真的不关心风速,湿度或“感觉”温度,但如果我能弄清楚如何,我会添加它们。我正在尝试获取看起来像这里的数据。 (www.weather.com/...)

我很擅长解析XML,这也可能是我问题的一部分。在此先感谢您的帮助。我非常感激。

2 个答案:

答案 0 :(得分:3)

我有一些你可能喜欢的东西:

<Runtime.CompilerServices.Extension()>
Module Weather

Public Structure WeatherInfo_Forecast
  Dim DayOfWeek As String
  Dim low As Double
  Dim high As Double
  Dim icon As String
End Structure

Public Structure WeatherInfo_Wind
  Dim direction As String
  Dim speed As Double
  Dim unit As String
End Structure

Public Structure WeatherInfo_Typed
  Dim Failed As Boolean
  Dim errormessage As Exception
  Dim location As String
  Dim forcast_date As DateTime
  Dim checked_time_date As DateTime
  Dim humidity As Double
  Dim highf As Double
  Dim lowf As Double
  Dim highc As Double
  Dim lowc As Double
  Dim currenttempC As Double
  Dim currenttempF As Double
  Dim predicted_icon As String
  Dim current_icon As String
  Dim current_condition As String
  Dim predicted_condition As IEnumerable(Of WeatherInfo_Forecast)
  Dim wind_condition As WeatherInfo_Wind
  Dim day As String
End Structure

<Runtime.CompilerServices.Extension()> _
Public Function ToC(ByVal F As Double) As Double
  Return ((F - 32) / 9) * 5
End Function

<Runtime.CompilerServices.Extension()> _
Public Function TryParseAsDouble(ByVal s As String) As Double
  Dim rv As Double
  If Double.TryParse(s, rv) = False Then rv = Double.NaN
  Return rv
End Function

<Runtime.CompilerServices.Extension()> _
Public Function TryParseAsDate(ByVal s As String) As DateTime
  Dim rv As DateTime
  If DateTime.TryParse(s, rv) = False Then rv = Nothing
  Return rv
End Function

Private Function ParseHumidity(ByVal s As String) As Double
  If Not s Is Nothing Then
  Dim humRegEx As New System.Text.RegularExpressions.Regex("Humidity: (?<Value>\d+)\w*\%")
  Dim m = humRegEx.Match(s)
  If m.Length = 0 Then Return Double.NaN
    Return Double.Parse(m.Groups("Value").Value)
  End If
End Function

Private Function ParseWind(ByVal s As String) As WeatherInfo_Wind
  Dim rv As New WeatherInfo_Wind
  If Not s Is Nothing Then
    Dim humRegEx As New System.Text.RegularExpressions.Regex("Wind\:\s+(?<Direction>[NEWSnews]{1,2})\s+at\s+(?<speed>(?<value>\d+)\s(?<units>\w+)){1}")
    Dim m = humRegEx.Match(s)
    rv.speed = Double.NaN
    If m.Length = 0 Then Return rv
    With rv
     .direction = m.Groups("Direction").Value
     If Double.TryParse(m.Groups("value").Value, .speed) = False Then .speed = Double.NaN
     .unit = m.Groups("units").Value
    End With
  End If
  Return rv
End Function

<DebuggerHidden()>
Public Function Grab_Weather(ByVal Location As String) As WeatherInfo_Typed
  Dim GrabWeather As New WeatherInfo_Typed
  With GrabWeather
  .Failed = True
  Try
    Dim xml As XDocument = XDocument.Load("http://www.google.com/ig/api?weather=" & Location)
    Dim xp = xml.<problem_cause>
    If xp.Any Then Return GrabWeather
    .location = xml...<city>.@data
    .forcast_date = xml...<forecast_date>.@data.TryParseAsDate
    .checked_time_date = xml...<current_date_time>.@data.TryParseAsDate
    .humidity = ParseHumidity(xml...<humidity>.@data)
    .highf = xml...<high>.@data.TryParseAsDouble
    .lowf = xml...<low>.@data.TryParseAsDouble
    .highc = GrabWeather.highf.ToC
    .lowc = GrabWeather.highc.ToC
    .currenttempC = xml...<temp_c>.@data.TryParseAsDouble
    .currenttempF = xml...<temp_f>.@data.TryParseAsDouble
    '.current_icon = "http://www.google.com" & xml...<icon>.@data
    '.predicted_icon = "http://www.google.com" & xml...<high>.@data
    .current_condition = xml...<condition>.@data
    .predicted_condition = From f In xml...<forecast_conditions> _
                        Select New WeatherInfo_Forecast With { _
                          .DayOfWeek = f.<day_of_week>.Value, _
                          .high = f.<high>.@data.TryParseAsDouble, _
                          .low = f.<low>.@data.TryParseAsDouble}
    '.icon = "http://www.google.com" & f.<icon>.@data}
    .wind_condition = ParseWind(xml...<wind_condition>.@data)
    .day = xml...<day_of_week>.@data
    .Failed = False
    Return GrabWeather
  Catch ex As Exception
    .errormessage = ex
    Return GrabWeather
  End Try
  End With
End Function
End Module

答案 1 :(得分:0)

我终于从Weather Underground找到了我想要的东西。他们有三个API,从中间的API开始,给出36小时的每小时预测。您可以获得英制和公制预测的温度统计数据,“感觉就像”温度,露点,风速和风向。还有风寒和热量指数,但英语和公制的每个结果都是-9998,所以我很确定这些结果有点偏差!还有qpf,snow,pop和mslp。不幸的是qpf和雪没有结果,我不确定pop和mslp是什么。所有结果都以JSON和XML提供。他们也有一些图像请求,但我还没有调查它们。

<强>更新
链接已更新