From 9c983c383029c9aaa7d0cf04a5fc9973d514dff7 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 22 Oct 2009 15:44:36 -0400 Subject: extract Geonames stuff to a plugin --- lib/location.php | 119 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 44 deletions(-) (limited to 'lib') diff --git a/lib/location.php b/lib/location.php index f4ce7f67a..5b7f47102 100644 --- a/lib/location.php +++ b/lib/location.php @@ -34,6 +34,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { /** * class for locations * + * These are stored in the DB as part of notice and profile records, + * but since they're about the same in both, we have a separate class + * for them. + * * @category Location * @package StatusNet * @author Evan Prodromou @@ -48,74 +52,94 @@ class Location public $location_id; public $location_ns; - var $names; + var $names = array(); - const geonames = 1; - const whereOnEarth = 2; + /** + * Constructor that makes a Location from a string name + * + * @param string $name Human-readable name (any kind) + * @param string $language Language, default = common_language() + * + * @return Location Location with that name (or null if not found) + */ - static function fromName($name, $language=null, $location_ns=null) + static function fromName($name, $language=null) { if (is_null($language)) { $language = common_language(); } - if (is_null($location_ns)) { - $location_ns = common_config('location', 'namespace'); - } $location = null; - if (Event::handle('LocationFromName', array($name, $language, $location_ns, &$location))) { + // Let a third-party handle it - switch ($location_ns) { - case Location::geonames: - return Location::fromGeonamesName($name, $language); - break; - case Location::whereOnEarth: - return Location::fromWhereOnEarthName($name, $language); - break; - } - } + Event::handle('LocationFromName', array($name, $language, &$location)); return $location; } - static function fromGeonamesName($name, $language) + /** + * Constructor that makes a Location from an ID + * + * @param integer $id Identifier ID + * @param integer $ns Namespace of the identifier + * @param string $language Language to return name in (default is common) + * + * @return Location The location with this ID (or null if none) + */ + + static function fromId($id, $ns, $language=null) { $location = null; - $client = HTTPClient::start(); - - // XXX: break down a name by commas, narrow by each - - $str = http_build_query(array('maxRows' => 1, - 'q' => $name, - 'lang' => $language, - 'type' => 'json')); - - $result = $client->get('http://ws.geonames.org/search?'.$str); - - if ($result->code == "200") { - $rj = json_decode($result->body); - if (count($rj['geonames']) > 0) { - $n = $rj['geonames'][0]; - $location = new Location(); - $location->lat = $n->lat; - $location->lon = $n->lon; - $location->name = $n->name; - $location->location_id = $n->geonameId; - $location->location_ns = Location:geonames; - } - } + + // Let a third-party handle it + + Event::handle('LocationFromId', array($id, $ns, $language, &$location)); return $location; } - static function fromId($location_id, $location_ns = null) + /** + * Constructor that finds the nearest location to a lat/lon pair + * + * @param float $lat Latitude + * @param float $lon Longitude + * @param string $language Language for results, default = current + * + * @return Location the location found, or null if none found + */ + + static function fromLatLon($lat, $lon, $language=null) { - if (is_null($location_ns)) { - $location_ns = common_config('location', 'namespace'); + if (is_null($language)) { + $language = common_language(); } + + $location = null; + + // Let a third-party handle it + + if (Event::handle('LocationFromLatLon', + array($lat, $lon, $language, &$location))) { + // Default is just the lat/lon pair + + $location = new Location(); + + $location->lat = $lat; + $location->lon = $lon; + } + + return $location; } + /** + * Get the name for this location in the given language + * + * @param string $language language to use, default = current + * + * @return string location name or null if not found + */ + function getName($language=null) { if (is_null($language)) { @@ -124,6 +148,13 @@ class Location if (array_key_exists($this->names, $language)) { return $this->names[$language]; + } else { + $name = null; + Event::handle('LocationNameLanguage', array($this, $language, &$name)); + if (!empty($name)) { + $this->names[$language] = $name; + return $name; + } } } } -- cgit v1.2.3-54-g00ecf