/usr/share/doc/cpanel-php84-services-weather/examples
Edit: /usr/share/doc/cpanel-php84-services-weather/examples/metar-extensive.php (28227B)
* Copyright (c) 2005-2011, Alexander Wirtz
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* o Neither the name of the software nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*
* @category Web Services
* @package Services_Weather
* @author Alexander Wirtz
* @copyright 2005-2011 Alexander Wirtz
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version SVN: $Id$
* @link http://pear.php.net/package/Services_Weather
* @filesource
*/
//-------------------------------------------------------------------------
// This is the area, where you can customize the script
//-------------------------------------------------------------------------
$location = "Bonn, Germany"; // The city we want to fetch the data for.
// Where the search function will look for
// the ICAO database (generated with the
// buildMetarDB.php script)
$dsn = "sqlite://localhost//usr/local/lib/php/data/Services_Weather/servicesWeatherDB";
$sourceMetar = "http"; // This script will pull the METAR data via http
$sourceTaf = "http"; // TAF
$sourcePathMetar = ""; // Only needed when non-standard access is used
$sourcePathTaf = ""; //
$cacheType = ""; // Set a type (file, db, mdb, ...) to
// enable caching.
$cacheOpt = array(); // Cache needs various options, depending
// on the container-type - please consult
// the Cache manual / sourcecode!
$unitsFormat = "metric"; // The format the units are displayed in -
// metric, standard or some customization.
$dateFormat = "j. M Y"; // Set the format the date is displayed in
$timeFormat = "H:i"; // time
//-------------------------------------------------------------------------
// Load the Weather class
require_once "Services/Weather.php";
// Object initialization - error checking is important, because of
// handling exceptions such as missing PEAR modules
$metar = &Services_Weather::service("Metar");
if (Services_Weather::isError($metar)) {
die("Error: ".$metar->getMessage()."\n");
}
// Set parameters for DB access, needed for location searches
$metar->setMetarDB($dsn);
if (Services_Weather::isError($metar)) {
echo "Error: ".$metar->getMessage()."\n";
}
// Initialize caching
if (strlen($cacheType)) {
$status = $metar->setCache($cacheType, $cacheOpt);
if (Services_Weather::isError($status)) {
echo "Error: ".$status->getMessage()."\n";
}
}
// Define the units format, bring the retrieved format into
// something more common...
$metar->setUnitsFormat($unitsFormat);
$units = $metar->getUnitsFormat();
$units["temp"] = "°".strtoupper($units["temp"]);
$units["wind"] = " ".str_replace("kmh", "km/h", $units["wind"]);
$units["vis"] = " ".$units["vis"];
$units["height"] = " ".$units["height"];
$units["pres"] = " ".$units["pres"];
$units["rain"] = " ".$units["rain"];
$metar->setMetarSource($sourceMetar, $sourcePathMetar, $sourceTaf, $sourcePathTaf);
// Set date-/time-format
$metar->setDateTimeFormat($dateFormat, $timeFormat);
// Search for defined location and fetch the first item found.
// Bail out if something bad happens...
$search = $metar->searchLocation($location, true);
if (Services_Weather::isError($search)) {
die("Error: ".$search->getMessage()."\n");
}
// Retrieve data, store in variables, bail out on error
$fetch = array(
"location" => "getLocation",
"weather" => "getWeather",
"forecast" => "getForecast"
);
foreach ($fetch as $variable => $function) {
$$variable = $metar->$function($search);
if (Services_Weather::isError($$variable)) {
echo "Error: ".$$variable->getMessage()."\n";
continue;
}
}
// Now we output all the data, please don't expect extensive comments here, this is basic
// HTML/CSS stuff. Also this isn't a very fancy design, it's just to show you, what
// the script is able to do (and more ;-))...
?>
Services_Weather::METAR/TAF
\n";
var_dump($location, $weather, $forecast);
echo "\n";
}
?>
Weather Forecast created with PEARs Services_Weather
| =$location["name"]?> (=$search?>) |
Sunrise: =$location["sunrise"]?> |
Sunset: =$location["sunset"]?> |
|
|
| Temperature: =round($weather["temperature"], 1).$units["temp"]?> |
Dew point: =round($weather["dewPoint"], 1).$units["temp"]?> |
Felt temperature: =round($weather["feltTemperature"], 1).$units["temp"]?> |
Trend:
$val) {
switch ($key) {
case "type":
switch ($val) {
case "NOSIG":
$string = "No Significant Weather";
break;
case "TEMPO":
$string = "Temporary Weather";
break;
case "BECMG":
$string = "Weather Becoming";
break;
}
$value = "";
foreach (array("from", "to", "at") as $time) {
if (isset($trend[$time])) {
$value .= " ".$time." ".$trend[$time];
}
}
($value != "") ? $value = trim($value).":":"";
$string = ''.$string.'';
$value = ''.$value.'';
break;
case "wind":
$string = "Wind:";
$value = (strtolower($trend["windDirection"]) == "calm") ? "Calm" : "From the ".$trend["windDirection"]." (".$trend["windDegrees"]."°) at ".round($trend["wind"], 1).$units["wind"];
if (isset($trend["windVariability"])) {
$value .= ", variable from ".$trend["windVariability"]["from"]."° to ".$trend["windVariability"]["to"]."°";
}
if (isset($trend["windGust"])) {
$value .= ", with gusts up to ".round($trend["windGust"], 1).$units["wind"];
}
break;
case "visibility":
$string = "Visibility:";
$value = strtolower($trend["visQualifier"])." ".round($trend["visibility"], 1).$units["vis"];
break;
case "clouds":
$string = "Clouds:";
$value = "";
for ($i = 0; $i < sizeof($val); $i++) {
$cloud = ucwords($val[$i]["amount"]);
if (isset($val[$i]["type"])) {
$cloud .= " ".$val[$i]["type"];
}
if (isset($val[$i]["height"])) {
$cloud .= " at ".$val[$i]["height"].$units["height"];
}
$value .= $cloud." ";
}
break;
case "condition":
$string = "Condition:";
$value = ucwords($val);
break;
case "pressure":
$string = "Pressure:";
$value = round($val, 1).$units["pres"];
break;
case "from":
case "to":
case "at":
case "windDirection":
case "windDegrees":
case "windVariability":
case "windGust":
case "visQualifier":
continue 2;
default:
$string = ""; $value = "";
var_dump($key, $val);
break;
}
?>
=$string?> =$value?>
none
Remarks:
$val) {
switch ($key) {
case "autostation":
case "presschg":
case "nospeci":
case "sunduration":
case "maintain":
$string = "";
$value = $val;
break;
case "seapressure":
$string = "Pressure at sealevel:";
$value = round($val, 1).$units["pres"];
break;
case "1htemp":
$string = "Temperature for last hour:";
$value = round($val, 1).$units["temp"];
break;
case "1hdew":
$string = "Dew Point for last hour:";
$value = round($val, 1).$units["temp"];
break;
case "6hmaxtemp":
case "6hmintemp":
if (!isset($weather["remark"]["6hmaxtemp"]) && !isset($weather["remark"]["6hmintemp"])) {
continue(2);
}
$string = "Max/Min Temp for last 6 hours:";
$value = (isset($weather["remark"]["6hmaxtemp"])) ? round($weather["remark"]["6hmaxtemp"], 1).$units["temp"] : "-";
$value .= "/";
$value .= (isset($weather["remark"]["6hmintemp"])) ? round($weather["remark"]["6hmintemp"], 1).$units["temp"] : "-";
unset($weather["remark"]["6hmaxtemp"]); unset($weather["remark"]["6hmintemp"]);
break;
case "24hmaxtemp":
case "24hmintemp":
if (!isset($weather["remark"]["24hmaxtemp"]) && !isset($weather["remark"]["24hmintemp"])) {
continue(2);
}
$string = "Max/Min Temp for last 24 hours:";
$value = (isset($weather["remark"]["24hmaxtemp"])) ? round($weather["remark"]["24hmaxtemp"], 1).$units["temp"] : "-";
$value .= "/";
$value .= (isset($weather["remark"]["24hmintemp"])) ? round($weather["remark"]["24hmintemp"], 1).$units["temp"] : "-";
unset($weather["remark"]["24hmaxtemp"]); unset($weather["remark"]["24hmintemp"]);
break;
case "snowdepth":
$string = "Snow depth:";
$value = $val.$units["rain"];
break;
case "snowequiv":
$string = "Water equivalent of snow:";
$value = $val.$units["rain"];
break;
case "sensors":
$string = "";
$value = implode(" ", $val);
break;
default:
$string = ""; $value = "";
var_dump($key, $val);
break;
}
?>
=$string?> =$value?>
none
|
| Pressure: =round($weather["pressure"], 1).$units["pres"]?> |
Humidity: =round($weather["humidity"], 2)?>% |
Wind: =strtolower($weather["windDirection"]) == "calm" ? "Calm" : "From the ".$weather["windDirection"]." (".$weather["windDegrees"]."°) at ".round($weather["wind"], 1).$units["wind"]?>
=isset($weather["windVariability"]) ? " variable from ".$weather["windVariability"]["from"]."° to ".$weather["windVariability"]["to"]."°" : ""?>
=isset($weather["windGust"]) ? " with gusts up to ".round($weather["windGust"], 1).$units["wind"] : ""?>
|
Visibility: =strtolower($weather["visQualifier"])?> =round($weather["visibility"], 1).$units["vis"]?> |
Current condition: =isset($weather["condition"]) ? ucwords($weather["condition"]) : "No Significant Weather"?> |
" src="images/32x32/=$weather["conditionIcon"]?>.png"> |
Precipitation:
=$precip?>
Clouds:
=$cloud?>
Clear Below =$metar->convertDistance(12000, "ft", $units["height"]).$units["height"]?>
|
|
Forecast (TAF) valid from =$forecast["validFrom"]?> to =$forecast["validTo"]?> |
| |
Meteorological Conditions |
Wind |
Visibility |
Clouds |
Condition |
0, "vis" => 0, "clouds" => 0, "cond" => 0);
// Ok, the forecast is a bit more interesting, as I'm taking a few
// precautions here so that the table isn't filled up to the max.
// o If a value is repeated in the next major timeslot (not when
// significant weather changes are processed), it's not printed
// o Significant weather gets its own rows, with times printed normal
// as in opposition to bold print for major timeslots
// o The while($row)-construct below is for handling the significant
// weather, as I point $row to $row["fmc"] afterwards, where the
// smaller changes are mentioned
for ($i = 0; $i < sizeof($forecast["time"]); $i++) {
$row = $forecast["time"][$times[$i]];
// Create timestamp
$start = $times[$i];
if ($i + 1 < sizeof($forecast["time"])) {
$end = $times[$i + 1];
} else {
$end = substr($forecast["validRaw"], -2).":00";
$end = ($end == "24:00") ? "00:00" : $end;
}
$time = $start." - ".$end;
$class = ' class="bold"';
// This is for outputting "Becoming", "Temporary" and such
$fmc = isset($row["fmc"]) ? $row["fmc"] : false;
$fmctype = "";
$fmccnt = 0;
while ($row) {
?>
|
|
| >=$time?> |
=$fmctype?> |
at ".round($row["wind"], 1).$units["wind"];
if (isset($row["windProb"])) {
$string .= " (".$row["windProb"]."% Prob.)";
}
if ($string === $pre["wind"]) {
$string = " ";
} else {
$pre["wind"] = $string;
}
}
$class = ' class="bggrey"';
break;
case "vis":
if (!isset($row["visibility"])) {
$string = " ";
} else {
$string = strtolower($row["visQualifier"])." ".round($row["visibility"], 1).$units["vis"];
if (isset($row["visProb"])) {
$string .= " (".$row["visProb"]."% Prob.)";
}
if ($string === $pre["vis"]) {
$string = " ";
} else {
$pre["vis"] = $string;
}
}
$class = '';
break;
case "clouds":
if (!isset($row["clouds"])) {
$string = " ";
} else {
$clouds = "";
for ($j = 0; $j < sizeof($row["clouds"]); $j++) {
$cloud = ucwords($row["clouds"][$j]["amount"]);
if (isset($row["clouds"][$j]["type"])) {
$cloud .= " ".$row["clouds"][$j]["type"];
}
if (isset($row["clouds"][$j]["height"])) {
$cloud .= " at ".$row["clouds"][$j]["height"].$units["height"];
}
if (isset($row["clouds"][$j]["prob"])) {
$cloud .= " (".$row["clouds"][$j]["prob"]."% Prob.)";
}
$clouds .= $cloud." ";
}
if ($clouds === $pre["clouds"]) {
$string = " ";
} else {
$string = $clouds;
$pre["clouds"] = $clouds;
}
}
$class = ' class="bggrey"';
break;
case "cond":
if (!isset($row["condition"]) || (isset($prerow) && $prerow["condition"] == $row["condition"])) {
$string = " ";
} else {
$string = ucwords($row["condition"]);
}
$class = '';
}
?>
>=$string?> |
|
|
|
| |
Updated: (=substr($weather["update"], -5)?> / =substr($forecast["update"], -5)?>) |
All times UTC |
|
back