#!/usr/bin/perl use strict; use LWP::Simple; use CGI; use Geo::METAR; use Time::Local; #my $sfo_url = "http://www.wrh.noaa.gov/cgi-bin/wrhq/GetMetar.cgi?SFO+Metar"; my $sfo_url = "http://www.wrh.noaa.gov/mesowest/getobext.php?wfo=mtr&sid=sfo&num=48&raw=0&banner=off"; # http://www.wrh.noaa.gov/mesonet/getobext.php?wfo=mtr&sid=sfo&num=48&raw=0 #my $sfo_url = "http://weather.noaa.gov/cgi-bin/mgetmetar.pl?cccc=ksfo"; #my $sancarlos_url = "http://www.wrh.noaa.gov/cgi-bin/wrhq/GetMetar.cgi?SQL+Metar"; my $sancarlos_url = "http://www.wrh.noaa.gov/mesowest/getobext.php?wfo=mtr&sid=sql&num=48&raw=0&banner=off"; #my $sfports_url = "http://sfports.wr.usgs.gov/cgi-bin/WindTide.cgi"; my $sfports_url = "http://sfports.wr.usgs.gov/cgi-bin/SFPORTS/WindTide.cgi"; #my $sfmfcast_url ="http://www.wrh.noaa.gov/cgi-bin/wrhq/TotalForecast.csh?TotalForecast+WR+PZ+530"; my $sfmfcast_url ="http://www.wrh.noaa.gov/mtr/getcwfzone.php?sid=MTR&zone=PZ530"; my $wind_url = "http://sfports.wr.usgs.gov/wind/"; #my $tide_img_url = "http://co-ops.nos.noaa.gov/cgi-bin/co-ops_qry_direct2.cgi?stn=9414449+COYOTE+POINT+MARINA%2CS.F.BAY+%2C+CA&unit=1&shift=1&mins=60&dcp=1&ssid=PR&pc=W1&datum=MLLW&format=View+Plot"; #&bdate=20020714&edate=20020715 #my $tide_img_url = "http://co-ops.nos.noaa.gov/cgi-bin/co-ops_qry_direct2.cgi?stn=9414458+SAN+MATEO+BRIDGE%2C+WEST+SIDE+%2C+CA&unit=1&shift=1&mins=6&dcp=1&ssid=PR&pc=W1&datum=MLLW&format=View+Plot"; #&bdate=20020714&edate=20020715 #my $tide_img_url = "http://co-ops.nos.noaa.gov/cgi-bin/co-ops_qry_wlpred.cgi?stn=9414458+SAN+MATEO+BRIDGE%2C+WEST+SIDE+%2C+CA&unit=1&shift=1&mins=6&dcp=1&ssid=PR&pc=W1&datum=MLLW&format=View+Plot"; my $tide_img_url = "http://co-ops.nos.noaa.gov/cgi-bin/co-ops_qry_wlpred.cgi?stn=9414449+COYOTE+POINT+MARINA%2CS.F.BAY+%2C+CA&unit=1&shift=1&mins=6&dcp=1&ssid=PR&pc=W1&datum=MLLW&format=View+Plot"; my $w = new CGI; print $w->header; print $w->title('Bay Area Marine Forecast Summary'); print $w->start_html; print $w->h2('SF Bay Area Marine Forecast Summary'); #print "", "\n"; print "\n\n"; print "\n"; get_xml_obs ("KSFO", $sfo_url, "SFO Airport"); #print_metar_observations ($sfo_url, "SFO Airport"); print "\n"; print_ports_observations ($sfports_url, "Redwood City"); print "\n"; #print_metar_observations ($sancarlos_url, "San Carlos"); get_xml_obs ("KSAN", $sancarlos_url, "San Carlos"); print "\n"; print_ports_observations ($sfports_url, "Alameda"); print "\n"; print_ports_observations ($sfports_url, "Golden Gate"); print "\n
SiteWind (kts)Gust (kts)DirectionTime (PDT)
\n"; print "

\n"; get_marine_forecast ($sfmfcast_url); print "SF Bay Area Weather Discussion | \n"; print "Small Screen Version
\n"; print "To Weather Links
\n"; print "Data Bouy Summary
\n"; print "


"; print ""; print "\n

\n"; # Pring out the Wunderground Flash Objects print "

\n"; print "\n"; print "\n"; print "

\n"; print "\n"; print "\n"; #print "\n"; print "

Various Tide Times

\n"; ############ #Tide lookup table #glen= is days from now shown print " Georgiana Slough/Mokelumne River
\n"; print " Clarksburg at Sacramento River
\n"; print " San Joaquin River/False River
\n"; print " Paradise Point Marina
\n"; print " Little Connection Slough/San Joaquin River - .65M south of Herman & Helen's
\n"; print " Disappointment Slough and Bishop Cut - Paradise Point
\n"; print " Sand Mound Slough/Holland Cut - SE Corner Frank's Tract
\n"; print " Carquinez Bridge
\n"; print " Benicia Bridge
\n"; print " Golden Gate Bridge
\n"; print " Jack London Square
\n"; print " Coyote Point Marina
\n"; print " Redwood City Wharf
\n"; #print "\n

\n"; #get_xml_obs("KSFO"); print $w->end_html; exit(0); ####################### sub print_metar_observations {my $url = shift; my $eng_url; my $sitename = shift; my ($obs_time, $obs_dir, $obs_speed, $obs_gust); ($obs_time, $obs_dir, $obs_speed, $obs_gust) = &get_metar_page ($url); # print "$sitename wind at $obs_time is $obs_speed", "kts "; # if ($obs_gust) {print "gusts to $obs_gust", "kts ";} # print "from $obs_dir\n"; $url =~ m/(.*)raw=3.*/; $eng_url = $1."raw=0"; print "$sitename$obs_speed"; if ($obs_gust) {print "$obs_gust";} else {print "N/A";} print "$obs_dir$obs_time"; } sub print_ports_observations {my $url = shift; my $sitename = shift; my ($obs_speed, $obs_dir, $obs_gust, $obs_time); ($obs_speed, $obs_dir, $obs_gust, $obs_time) = &get_ports_page ($url, $sitename); # print "$sitename wind at $obs_time is $obs_speed", "kts "; # if ($obs_gust) {print "gusts to $obs_gust", "kts ";} # print "from $obs_dir\n"; if (!$obs_speed) { $obs_speed = "***"; $obs_dir = "***"; $obs_time = "No Data"; } print "$sitename$obs_speed"; #print "-->", $obs_gust, "<--"; if ($obs_gust) {print "$obs_gust";} else {print "N/A";} # else {print "N/A";} print "$obs_dir$obs_time"; } sub get_metar_page { my $url = shift; my $metar_input; my ($time, $speed, $direction, $gust); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday); my $meridian; my $w = new Geo::METAR; my $page = get ($url); #$page =~ m/<\/title>(.*?).*/; $page =~ m/^<\/td>(.*?)<\/td><\/tr>/s; # #$metar_input = $1." ".$2; $metar_input = $1; #print "mi:", $metar_input, "\n"; if (!$1) { return ("METAR Not Available", "N/A", "N/A", "N/A"); } $w->metar("$metar_input"); #print $w->dump; #print "\n$2\n"; $time = $w->TIME; #Convert Date and Time from UTC to local $time =~ m/(\d{1,2}):(\d{2}) UTC/; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time); $min = $2; $hour = $1; $mday = $w->DATE; $time = timegm($sec,$min,$hour,$mday,$mon,$year,$wday,$yday); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime ($time); $mon++; $year = sprintf ("%02d", ($year - 100)); #Y3K bug... yah yah.. if ($hour > 12){$hour = $hour - 12; $meridian = "PM";} else {$meridian = "AM";} $time = "$hour:$min $meridian $mon/$mday/$year"; $direction = $w->WIND_DIR_DEG; $speed = $w->WIND_KTS; $gust = $w->WIND_GUST_KTS; return ($time, $direction, $speed, $gust); } sub get_ports_page { my $url = shift; my $site = shift; my ($speed, $direction, $gust, $time); my ($hour, $min, $meridian, $date); my $page = get ($url); #Wow --> Site 12.5 WNW 18.3 1:54 $5 12/31/01 $page =~ m#$site.*\s+(\d{1,2}.\d)\skts from ([A-Z]{1,3}).*, gusts to\s{1,2}(\d{1,2}.\d)\s{2,3}(\d{1,2}):(\d{2})\s{1,3}(\d{1,2}/\d{1,2}/\d{2})#; #print "\n$site Speed is $1, Dir is $2, Gust is $3, hours is $4, mins is $5 and date is $6<--\n"; ($speed, $direction, $gust, $hour, $min, $date) = ($1, $2, $3, $4, $5, $6); if ($hour > 12){$meridian = "PM"; $hour = $hour -12;} elsif ($hour == 0){$meridian = "AM"; $hour = 12;} else {$meridian = "AM";} $time = "$hour:$min $meridian $date"; return ($speed, $direction, $gust, $time); } sub get_marine_forecast { my $url = shift; my ($time, $forecast); my $page = get ($url); # $page =~ m/DELTA-
(\d{3,4} [A-Z]2 [A-Z]{3,4} [A-Z]3 [A-Z]3 \d{1,2} \d4)

(.*)

<\/pre>/s; $page =~ m/DELTA-
(.*?)

(.*?)

<\/font><\/pre>/; $time = $1; $forecast = $2; $forecast =~ s/
/
\n/g; print "

As of $time
\nThe National Weather Service San Francisco Marine Forecast:
\n $forecast

\n"; } sub grab_wind_img {my $url = shift; my $img_tag; my $page; $page = get($url); $page =~ m/\s\n.*src="(.*)"\swidth/s; #$img_tag = ""; $img_tag = $1; #print "\****\n$1******\n"; return ($img_tag); } sub grab_tide_img { my $url = shift; my ($img_url, $stub, $uri); my $page; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(time); $year = $year + 1900; $mon++; $mon = sprintf ("%02d", $mon); $mday = sprintf ("%02d", $mday); #&bdate=20020714&edate=20020715 # ($img_url, $stub) = split(/ /,$url); $img_url = $url . "&bdate=" . $year . $mon . $mday; $mday++; $img_url .= "&edate=" . $year . $mon . $mday; # $img_url .= $stub; $page = get ($img_url); $page =~ m/

"; }
<\/td><\/tr><\/table><\/p>/; $uri = $1; ($img_url, $stub) = split(/cgi-bin/, $url); $img_url .= $uri; # print "\nImg URL is:", $img_url; return ($img_url); } sub parse_stored_tides { my $filename=shift; my $page; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday); my ($day1, $day2); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(time); $year = $year + 1900; $mon++; $day1 = "$mon/$mday/$year"; $mday++; $day2 = "$mon/$mday/$year"; # open (TIDEFILE, "$filename"); # $page = ; # $page =~ m/(
$day1 } sub get_xml_obs { my $station_name=shift; my $eng_url=shift; my $sitename=shift; my $wind_kts; my $gust_kts; # use LWP::Simple; use XML::Simple; my $page = get("http://www.nws.noaa.gov/data/current_obs/$station_name.xml"); #print "\n"; my $metar = XMLin($page); # print "Wind speed: $metar->{'wind_mph'}\n"; # print "$station_name: $metar->{'wind_mph'}-\n"; $wind_kts = sprintf ("%.1f", $metar->{'wind_mph'}/1.15078); $gust_kts = sprintf ("%.1f", $metar->{'wind_gust_mph'}/1.15078); print "$sitename$wind_kts"; if ($metar->{'wind_gust_mph'}) {print $gust_kts;} else {print "N/A";} print "$metar->{'wind_degrees'}$metar->{'observation_time'}