Vb.net – How to get hourly weather forecast in VB.net


I've seen some questions similar to this on here, but none of them seem to help me. I don't really care what API is used, be it Google, Yahoo!, The Weather Channel, or any other. I've got code that will get the high and low of the current day, based on the location given by the user, but I can't seem to get the hourly predictions for temperature or weather condition, which is what I'm really looking for. I don't really care for wind speeds, humidity, or the "feels like" temperature, though I'll add them if I can figure out how to. I'm trying to get data that will look something like what is here. (www.weather.com/…)

I'm pretty new to parsing XML so that may be part of my problem, too. Thanks in advance for any help. I greatly appreciate it.

Best Solution

I have something you might enjoy:

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

Public Function Grab_Weather(ByVal Location As String) As WeatherInfo_Typed
  Dim GrabWeather As New WeatherInfo_Typed
  With GrabWeather
  .Failed = True
    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
Related Question