Updated version number.
[philipp/winterrodeln/mediawiki_extensions/wrgeo.git] / wrgeo.body.php
1 <?php
2 class WrGeo {
3         /// \brief This function converts a string like "47.236189 N 11.301471 E" to geographical coordinates in degrees.
4         ///
5         /// Usage:
6         /// try {list($latitude, $longitude) = wrGeoStringToGeo("47.236189 N 11.301471 E");}
7         /// catch (Exception $e) {return $e->getMessage();}
8         ///
9         /// \throw exception if input is not formatted correctly with german UTF-8 error message. Don't forget to catch it!
10         /// \param UTF-8 encoded input string.
11         /// \return array($longitude, $latitude)
12         static function stringToGeo($input) {
13                 $matches = array();
14                 $result = preg_match('/\s*(\d+\.?\d*)\s*N?\s+(\d+\.?\d*)\s*E?\s*$/', $input, $matches);
15                 assert($result !== FALSE); // FALSE would mean syntax error
16
17                 // found
18                 if ($result === 1) {
19                         return array(floatval($matches[2]), floatval($matches[1]));
20                 }
21
22                 // not found
23                 if (strlen($input) == 0) throw new Exception('Keine Koordinaten angegeben.');
24                 throw new Exception('Das Koordinatenformat "' . $input . '" ist ungültig. Gültig wäre z.B. "47.236189 N 11.301471 E".');
25         }
26
27
28         static function geoToString($latitude, $longitude) {
29                 return sprintf('%.6F N %.6F E', $latitude, $longitude);
30         }
31
32
33         /// Format inside <geo>...</geo> has to be like this: <geo>47.236189 N 11.301471 E</geo>
34         public static function render($content, $args, $parser, $frame) {
35                 try {list($longitude, $latitude) = WrGeo::stringToGeo($content);}
36                 catch (Exception $e) {return '<span class="error">' . htmlspecialchars($e->getMessage()) . '</span>';}
37                 return '<a href="http://maps.google.at/maps?q=' . sprintf('%F,%F', $latitude, $longitude) . '">' . WrGeo::geoToString($latitude, $longitude) . '</a>';
38         }
39 }
40
41
42 ?>