} } } $d['station'] = $stations[$i]; array_push($data, $d); } date_default_timezone_set('UTC'); $t = ''; // assume same time for all obs $o = array(); foreach ($data as $d) { foreach ($d as $k => $v) { if ($k != 'DateTimeStamp' && $k != 'station') { $dEnd = date('m/d/Y H:i'); $dBegin = date('m/d/Y H:i', time() - 60 * 60 * (24 * 1 + 1)); $a = convertUnits($v, nerrsUnits($k), $_REQUEST['uom'] == 'english'); $u = $a[0]["uom"]; $v = $a[0]["val"]; $uEscape = str_replace('"', '\\"', "graph.php?name={$k}&tz=" . $_REQUEST['tz'] . '&uom=' . $_REQUEST['uom'] . '&lon=' . $_REQUEST['lon'] . '&lat=' . $_REQUEST['lat'] . '&cat=' . $a[0]['cat'] . "&NERRS=" . $d['station'] . "&startDt={$dBegin}&endDt={$dEnd}"); $extra = ''; if (count($a) == 2) { $extra = "<br><a href='javascript:showObsTimeseries([\"" . str_replace('graph.php?', 'graph.php?uomB&', $uEscape) . "\"])'><img src='img/graph.png' width=10 height=10></a> " . $a[1]["val"] . ' ' . $a[1]["uom"]; } array_push($o, sprintf("<tr><td><b>%s</b></td><td><a href='javascript:showObsTimeseries([\"{$uEscape}\"])'><img src='img/graph.png' width=10 height=10></a> {$v} {$u}{$extra}</td></tr>", $k)); } } } if (count($data) > 0) { $t = $data[0]['DateTimeStamp']; } if ($t == '') {
$u = ''; $v = ''; while (($data = fgetcsv($f)) !== FALSE) { if (count($col2idx) == 0) { foreach ($data as $k => $v) { $col2idx[$v] = count($col2idx); if (preg_match("/^{$p} \\((.*)\\)\$/", $v, $matches)) { $u = $matches[1]; } } } else { $v = $data[$col2idx["{$p} ({$u})"]]; } } fclose($f); $a = convertUnits($v, $u, $_REQUEST['uom'] == 'english'); $u = $a[0]["uom"]; $v = $a[0]["val"]; $cat = $a[0]["cat"]; if ($cat == 'velocity' && preg_match('/wind/i', $n)) { $cat = 'windsVelocity'; } else { if ($cat == 'elevation' && preg_match('/wave|swell/i', $n)) { $cat = 'wavesElevation'; } } $dEnd = date('Y-m-d\\TH:i\\Z'); $dBegin = date('Y-m-d\\TH:i\\Z', time() - 60 * 60 * (24 * 1 + 1)); if ($v != '') { $n = underscoreCaps($p); $uEscape = str_replace('"', '\\"', "graph.php?{$base}&observedProperty={$p}" . '&responseFormat=text/xml;schema="ioos/0.6.1"' . "&name={$n}&eventTime={$dBegin}/{$dEnd}&tz=" . $_REQUEST['tz'] . '&uom=' . $_REQUEST['uom'] . '&lon=' . $_REQUEST['lon'] . '&lat=' . $_REQUEST['lat'] . '&cat=' . $cat);
} } else { $p = $_REQUEST['observedProperty']; $f = fopen(str_replace('uomB&', '', substr($_SERVER["REQUEST_URI"], strpos($_SERVER["REQUEST_URI"], '?') + 1)), 'r'); $col2idx = array(); while (($csvData = fgetcsv($f)) !== FALSE) { if (count($col2idx) == 0) { foreach ($csvData as $k => $v) { $col2idx[$v] = count($col2idx); if (preg_match("/^{$p} \\((.*)\\)\$/", $v, $matches)) { $uomOrig = $matches[1]; } } } else { $v = $csvData[$col2idx["{$p} ({$uomOrig})"]]; $newVal = convertUnits($v, $uomOrig, $_REQUEST['uom'] == 'english'); $v = $newVal[0]['val']; $uom = $newVal[0]['uom']; if (count($newVal) == 2 && isset($_REQUEST['uomB'])) { $v = $newVal[1]['val']; $uom = $newVal[1]['uom']; } $data[$csvData[$col2idx['date_time']]] = $v; } } fclose($f); } } } $dataChart = array(); $dataChart['t'] = array();
$o = array(); // find max time foreach ($xml->{'record'} as $r) { $a = $r->attributes(); if (sprintf("%s", $a->{'shef_id'}) == $_REQUEST['id']) { if ($t == '' || strtotime(sprintf("%s", $a->{'ObTime'})) > $t) { $t = strtotime(sprintf("%s", $a->{'ObTime'})); } } } foreach ($xml->{'record'} as $r) { $a = $r->attributes(); if (sprintf("%s", $a->{'shef_id'}) == $_REQUEST['id'] && $t == strtotime(sprintf("%s", $a->{'ObTime'}))) { $n = sprintf("%s", $a->{'var'}); $info = varInfo(sprintf("%s", $a->{'var'})); $a = convertUnits(sprintf("%s", $a->{'data_value'}), $info[1], $_REQUEST['uom'] == 'english'); $u = $a[0]["uom"]; $v = sprintf("%.02f", $a[0]["val"]); array_push($o, sprintf("<tr><td><b>%s</b></td><td>{$v} {$u}</td></tr>", $info[0])); } } if (count($o) == 0) { echo json_encode(array('html' => '<table class="obsDetails"><tr><th style="text-align:center">No recent observations</th></tr></table>')); } else { array_unshift($o, sprintf("<tr><td colspan=2 style='text-align:center'><b>%s-%02d</b></td></tr>", date('M d G:i e', $t - $_REQUEST['tz'] * 60), $_REQUEST['tz'] / 60)); array_push($o, "<tr><td colspan=2 style='text-align:center'><a target=_blank href='http://www.sailwx.info/shiptrack/shipposition.phtml?call=" . $_REQUEST['id'] . "'>Ship status report</a></td></tr>"); array_push($o, "<tr><td colspan=2 style='text-align:center'><a target=_blank href='http://madis.noaa.gov/madis_sfc.html'>Provider information</a></td></tr>"); echo json_encode(array('html' => '<table class="obsDetails">' . implode('', $o) . '</table>')); } function varInfo($s) {
$proc = str_replace(':sensor', ':station', $_REQUEST['procedure']); $proc = substr($proc, 0, strrpos($proc, ':')); $base = "{$getObs['0']}//{$getObs['1']}{$getObs['2']}/sos/{$getObs['3']}" . '?request=GetObservation&service=SOS&version=1.0.0' . '&offering=' . $proc . '&procedure=' . $proc; date_default_timezone_set('UTC'); $t = ''; // assume same time for all obs $o = array(); // ignore the properties param and override it w/ 'Winds' foreach (explode(',', $_REQUEST['properties']) as $p) { // sheesh! Weatherflow likes observedproperty instead of observedProperty $xml = @simplexml_load_file("{$base}&observedproperty={$p}" . '&responseFormat=text/xml;schema="ioos/0.6.1"'); if ($xml->children('http://www.opengis.net/om/1.0')->{'result'}) { $t = sprintf("%s", $xml->children('http://www.opengis.net/om/1.0')->{'result'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Composite'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Array'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Composite'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Array'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Composite'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'CompositeContext'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.opengis.net/gml/3.2')->{'TimeInstant'}[0]->children('http://www.opengis.net/gml/3.2')->{'timePosition'}[0]); foreach ($xml->children('http://www.opengis.net/om/1.0')->{'result'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Composite'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Array'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Composite'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Array'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Composite'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'CompositeValue'}[0]->children('http://www.opengis.net/gml/3.2')->{'valueComponents'}[0]->children('http://www.noaa.gov/ioos/0.6.1')->{'Quantity'} as $q) { $n = sprintf("%s", $q->attributes()->name); $a = convertUnits(sprintf("%s", $q), sprintf("%s", $q->attributes()->uom), $_REQUEST['uom'] == 'english'); $u = $a[0]["uom"]; $v = $a[0]["val"]; $extra = ''; if (count($a) == 2) { $extra = '<br/>' . $a[1]["val"] . ' ' . $a[1]["uom"]; } $dEnd = date('Y-m-d\\TH:i\\Z'); $dBegin = date('Y-m-d\\TH:i\\Z', time() - 60 * 60 * (24 * 1 + 1)); if ($v != '') { array_push($o, sprintf("<tr><td><b>%s</b></td><td>{$v} {$u}{$extra}</td></tr>", $n)); } } } } if (count($o) == 0) {
$u = sprintf("http://opendap.co-ops.nos.noaa.gov/axis/webservices/highlowtidepred/plain/response.jsp?stationId=%s&beginDate=%s&endDate=%s&datum=0&unit=1&timeZone=1", $_REQUEST['id'], date('Ymd', $tNow - 60 * 60 * 24 * 1), date('Ymd', $tNow + 60 * 60 * 24 * 1)); $tideData = array(); $marked = false; $tideUom = ''; foreach (explode("\n", @file_get_contents($u)) as $l) { if (preg_match('/\\d\\d/', $l)) { $p = preg_split('/ +/', $l); for ($i = 1; $i < count($p) - 3; $i += 3) { $tideT = strtotime(sprintf("%sT%sZ", $p[0], $p[$i])); if ($tideT > $tNow - 60 * 60 * 6) { $nextTide = false; if ($tideT >= $tNow && $marked == false) { $nextTide = true; $marked = true; } $a = convertUnits($p[$i + 1], 'm', $_REQUEST['uom'] == 'english'); $tideUom = $a[0]["uom"]; $v = $a[0]["val"]; $tideData[$tideT] = array('val' => sprintf("%.02f", $v), 'hiLo' => $p[$i + 2], 'next' => $nextTide); } } } } // format tide data $tidesTr = array(); foreach (array_keys($tideData) as $tideT) { $cls = ''; if ($tideData[$tideT]['next']) { $cls = "class='hilite'"; } array_push($tidesTr, sprintf("<td {$cls}>%s</td><td {$cls}>%s</td><td {$cls}>%s</td><td {$cls}>%s %s</td><td {$cls}>%s</td>", date('m/d', $tideT - $_REQUEST['tz'] * 60), date('D', $tideT - $_REQUEST['tz'] * 60), date('g:i a', $tideT - $_REQUEST['tz'] * 60), $tideData[$tideT]['val'], $tideUom, $tideData[$tideT]['hiLo']));