Source for file Globalweather.php
Documentation is available at Globalweather.php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
* PEAR::Services_Weather_Globalweather
* Copyright (c) 2005-2011, Alexander Wirtz
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 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.
* @package Services_Weather
* @author Alexander Wirtz <alex@pc4p.net>
* @copyright 2005-2011 Alexander Wirtz
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @link http://pear.php.net/package/Services_Weather
* @link http://www.capescience.com/webservices/globalweather/index.shtml
* @example examples/globalweather-basic.php globalweather-basic.php
require_once "Services/Weather/Common.php";
// {{{ class Services_Weather_Globalweather
* This class acts as an interface to the soap service of capescience.com.
* It searches for given locations and retrieves current weather data.
* GlobalWeather is a SOAP frontend for METAR data, provided by CapeScience.
* If you want to use METAR, you should try this class first, as it is much
* more comfortable (and also a bit faster) than the native METAR-class
* provided by this package. On the other hand, this service won't supply
* TAFs, the forecast system accompanying METAR, so you have to make
* For a working example, please take a look at
* docs/Services_Weather/examples/globalweather-basic.php
* @package Services_Weather
* @author Alexander Wirtz <alex@pc4p.net>
* @copyright 2005-2011 Alexander Wirtz
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version Release: 1.4.7
* @link http://pear.php.net/package/Services_Weather
* @link http://www.capescience.com/webservices/globalweather/index.shtml
* @example examples/globalweather-basic.php globalweather-basic.php
* WSDL object, provided by CapeScience
* SOAP object to access station data, provided by CapeScience
* @var object $_stationSoap
* SOAP object to access weather data, provided by CapeScience
* @var object $_weatherSoap
* Requires SOAP to be installed
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA
function Services_Weather_Globalweather ($options, &$error)
$this->Services_Weather_Common ($options, $perror);
* Connects to the SOAP server and retrieves the WSDL data
* @return PEAR_Error|bool
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA
function _connectServer ()
include_once "SOAP/Client.php";
$this->_wsdl = new SOAP_WSDL ("http://live.capeclear.com/ccx/GlobalWeather?wsdl", $this->_httpOptions);
eval ($this->_wsdl->generateAllProxies ());
$this->_stationSoap = &new WebService_GlobalWeather_StationInfo;
$this->_weatherSoap = &new WebService_GlobalWeather_GlobalWeather;
// {{{ _checkLocationID()
* Checks the id for valid values and thus prevents silly requests to
* @return PEAR_Error|bool
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_NO_LOCATION
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_INVALID_LOCATION
function _checkLocationID ($id)
// Check, if the stationSoap-Object is present. If not, connect to the Server and retrieve the WDSL data
if (!$this->_stationSoap) {
$status = $this->_connectServer ();
} elseif ($this->_stationSoap->isValidCode ($id) === false ) {
* Searches IDs for given location, returns array of possible locations
* @param string $location
* @param bool $useFirst If set, first ID of result-array is returned
* @return PEAR_Error|array|string
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION
// Check, if the stationSoap-Object is present. If not, connect to the Server and retrieve the WDSL data
if (!$this->_stationSoap) {
$status = $this->_connectServer ();
// Get search data from server and unserialize
$search = $this->_stationSoap->searchByName ($location);
if (!$useFirst && (sizeof($search) > 1 )) {
for ($i = 0; $i < sizeof($search); $i++ ) {
$searchReturn[$search[$i]->icao ] = $search[$i]->name. ", ". $search[$i]->country;
} elseif ($useFirst || (sizeof($search) == 1 )) {
$searchReturn = $search[0 ]->icao;
// {{{ searchLocationByCountry()
* Returns IDs with location-name for a given country or all available
* countries, if no value was given
* @return PEAR_Error|array
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA
* @throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION
// Check, if the stationSoap-Object is present. If not, connect to the Server and retrieve the WDSL data
if (!$this->_stationSoap) {
$status = $this->_connectServer ();
// Return the available countries as no country was given
$countries = $this->_stationSoap->listCountries ("");
// Now for the real search
$countryLocs = $this->_stationSoap->searchByCountry ($country);
// Check result for validity
foreach ($countryLocs as $location) {
$locations[$location->icao ] = $location->name. ", ". $location->country;
* Returns the data for the location belonging to the ID
* @return PEAR_Error|array
$status = $this->_checkLocationID ($id);
$locationReturn = array ();
if ($this->_cacheEnabled && ($location = $this->_getCache ("GW-". $id, "location"))) {
$this->_location = $location;
$locationReturn["cache"] = "HIT";
// Check, if the stationSoap-Object is present. If not, connect to the Server and retrieve the WDSL data
if (!$this->_stationSoap) {
$status = $this->_connectServer ();
$location = $this->_stationSoap->getStation ($id);
$this->_location = $location;
if ($this->_cacheEnabled) {
$this->_saveCache ("GW-". $id, $this->_location, "", "location");
$locationReturn["cache"] = "MISS";
if (strlen($this->_location->region ) && strlen($this->_location->country )) {
$locname = $this->_location->name. ", ". $this->_location->region. ", ". $this->_location->country;
} elseif (strlen($this->_location->country )) {
$locname = $this->_location->name. ", ". $this->_location->country;
$locname = $this->_location->name;
$locationReturn["name"] = $locname;
$locationReturn["latitude"] = $this->_location->latitude;
$locationReturn["longitude"] = $this->_location->longitude;
$locationReturn["elevation"] = $this->_location->elevation;
* Returns the weather-data for the supplied location
* @param string $unitsFormat
* @return PEAR_Error|array
$status = $this->_checkLocationID ($id);
$weatherReturn = array ();
if ($this->_cacheEnabled && ($weather = $this->_getCache ("GW-". $id, "weather"))) {
$this->_weather = $weather;
$weatherReturn["cache"] = "HIT";
// Check, if the weatherSoap-Object is present. If not, connect to the Server and retrieve the WDSL data
if (!$this->_weatherSoap) {
$status = $this->_connectServer ();
$weather = $this->_weatherSoap->getWeatherReport ($id);
$this->_weather = $weather;
if ($this->_cacheEnabled) {
$this->_saveCache ("GW-". $id, $this->_weather, "", "weather");
$weatherReturn["cache"] = "MISS";
$update = trim(str_replace(array ("T", "Z"), " ", $this->_weather->timestamp )). " GMT";
$weatherReturn["update"] = gmdate(trim($this->_dateFormat. " ". $this->_timeFormat), strtotime($update));
$weatherReturn["updateRaw"] = $this->_weather->timestamp;
if (strlen($this->_weather->station ->region ) && strlen($this->_weather->station ->country )) {
$locname = $this->_weather->station ->name. ", ". $this->_weather->station ->region. ", ". $this->_weather->station ->country;
} elseif (strlen($this->_weather->station ->country )) {
$locname = $this->_weather->station ->name. ", ". $this->_weather->station ->country;
$locname = $this->_weather->station ->name;
$weatherReturn["station"] = $locname;
$weatherReturn["wind"] = $this->convertSpeed($this->_weather->wind ->prevailing_speed , "mps", $units["wind"]);
$weatherReturn["windDegrees"] = $this->_weather->wind ->prevailing_direction ->degrees;
$weatherReturn["windDirection"] = $this->_weather->wind ->prevailing_direction ->compass;
if ($this->_weather->wind ->prevailing_speed != $this->_weather->wind ->gust_speed ) {
$weatherReturn["windGust"] = $this->convertSpeed($this->_weather->wind ->gust_speed , "mps", $units["wind"]);
if ($this->_weather->wind ->varying_from_direction != "" && $this->_weather->wind ->varying_to_direction != "") {
$weatherReturn["windVar"] = array (
"from" => $this->_weather->wind ->varying_from_direction ,
"to" => $this->_weather->wind ->varying_to_direction
$weatherReturn["visibility"] = $this->convertDistance($this->_weather->visibility ->distance / 1000 , "km", $units["vis"]);
$weatherReturn["visQualifier"] = $this->_weather->visibility ->qualifier;
for ($i = 0; $i < sizeof($this->_weather->phenomena ); $i++ ) {
$condition[] = $this->_weather->phenomena [$i]->string;
$weatherReturn["condition"] = implode(", ", $condition);
if (is_array($this->_weather->sky ->layers )) {
for ($i = 0; $i < sizeof($this->_weather->sky ->layers ); $i++ ) {
if (strtoupper($this->_weather->sky ->layers [$i]->type ) != "CLEAR") {
$layers[$i]["amount"] = $clouds[$this->_weather->sky ->layers [$i]->extent ];
$layers[$i]["height"] = $this->convertDistance($this->_weather->sky ->layers [$i]->altitude , "m", $units["height"]);
if (strtoupper($this->_weather->sky ->layers [$i]->type ) != "CLOUD") {
$layers[$i]["type"] = ucwords(str_replace("_", "", $this->_weather->sky ->layers [$i]->type ));
$weatherReturn["clouds"] = $layers;
$weatherReturn["temperature"] = $this->convertTemperature($this->_weather->temperature ->ambient , "c", $units["temp"]);
$weatherReturn["feltTemperature"] = $this->convertTemperature($feltTemperature, "f", $units["temp"]);
$weatherReturn["dewPoint"] = $this->convertTemperature($this->_weather->temperature ->dewpoint , "c", $units["temp"]);
$weatherReturn["humidity"] = $this->_weather->temperature ->relative_humidity;
$weatherReturn["pressure"] = $this->convertPressure($this->_weather->pressure ->altimeter , "hpa", $units["pres"]);
* GlobalWeather has no forecast per se, so this function is just for
* compatibility purposes.
* @param string $unitsFormat
function getForecast($id = null , $days = null , $unitsFormat = null )
Documentation generated on Mon, 11 Mar 2019 15:50:58 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|