}
        }
    }
    $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);
Example #3
0
            }
        } 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']));