/library/phooglemap.php
PHP | 385 lines | 205 code | 47 blank | 133 comment | 35 complexity | afe1d2f16e55e56838dadf9ad237dd37 MD5 | raw file
- <?php
-
- /**
- * Phoogle Maps 2.0 | Uses Google Maps API to create customizable maps
- * that can be embedded on your website
- * Copyright (C) 2005 Justin Johnson
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * Phoogle Maps 2.0
- * Uses Google Maps Mapping API to create customizable
- * Google Maps that can be embedded on your website
- *
- * @class Phoogle Maps 2.0
- * @author Justin Johnson <justinjohnson@system7designs.com>
- * @copyright 2005 system7designs
- */
-
-
-
-
- class PhoogleMap{
- /**
- * validPoints : array
- * Holds addresses and HTML Messages for points that are valid (ie: have longitude and latitutde)
- */
- var $validPoints = array();
- /**
- * invalidPoints : array
- * Holds addresses and HTML Messages for points that are invalid (ie: don't have longitude and latitutde)
- */
- var $invalidPoints = array();
- /**
- * mapWidth
- * width of the Google Map, in pixels
- */
- var $mapWidth = 300;
- /**
- * mapHeight
- * height of the Google Map, in pixels
- */
- var $mapHeight = 300;
-
- /**
- * apiKey
- * Google API Key
- */
- var $apiKey = "";
-
- /**
- * showControl
- * True/False whether to show map controls or not
- */
- var $showControl = true;
-
- /**
- * showType
- * True/False whether to show map type controls or not
- */
- var $showType = true;
- /**
- * controlType
- * string: can be 'small' or 'large'
- * display's either the large or the small controls on the map, small by default
- */
-
- var $controlType = 'small';
-
- /**
- * zoomLevel
- * int: 0-17
- * set's the initial zoom level of the map
- */
-
- var $zoomLevel = 4;
-
-
- private $icons = array();
-
- /**
- * @function addGeoPoint
- * @description Add's an address to be displayed on the Google Map using latitude/longitude
- * early version of this function, considered experimental
- */
- function addGeoPoint($lat, $long, $title, $infoHTML, $icon = null, $callback = null, $id = null) {
-
- $pointer = count($this->validPoints);
- $this->validPoints[$pointer]['lat'] = $lat;
- $this->validPoints[$pointer]['long'] = $long;
- $this->validPoints[$pointer]['title'] = $title;
- $this->validPoints[$pointer]['htmlMessage'] = $infoHTML;
- if($icon) $this->validPoints[$pointer]['icon'] = $icon;
- if($id) $this->validPoints[$pointer]['id'] = $id;
- if($callback) $this->validPoints[$pointer]['callback'] = $callback;
- return $pointer;
- }
-
-
- /**
- * @function centerMap
- * @description center's Google Map on a specific point
- * (thus eliminating the need for two different show methods from version 1.0)
- */
-
- function centerMap($lat,$long){
- $this->centerMap = "map.setCenter(new GLatLng(".$lat.",".$long."), ".$this->zoomLevel.");\n";
- }
-
-
- /**
- * @function addAddress
- * @param $address:string
- * @returns Boolean True:False (True if address has long/lat, false if it doesn't)
- * @description Add's an address to be displayed on the Google Map
- * (thus eliminating the need for two different show methods from version 1.0)
- */
- function addAddress($address,$htmlMessage = null, $icon = null){
- if (!is_string($address)){
- die("All Addresses must be passed as a string");
- }
- $apiURL = "http://maps.google.com/maps/geo?&output=xml&key=".$this->apiKey."&q=";
- $addressData = file_get_contents($apiURL.urlencode($address));
-
- $results = $this->xml2array(utf8_encode($addressData));
- if (empty($results['kml'][Response]['Placemark']['Point']['coordinates'])){
- $pointer = count($this->invalidPoints);
- $this->invalidPoints[$pointer]['lat']= $results['kml'][Response]['Placemark']['Point']['coordinates'][0];
- $this->invalidPoints[$pointer]['long']= $results['kml'][Response]['Placemark']['Point']['coordinates'][1];
- $this->invalidPoints[$pointer]['passedAddress'] = $address;
- $this->invalidPoints[$pointer]['htmlMessage'] = $htmlMessage;
- } else {
- $pointer = count($this->validPoints);
- $this->validPoints[$pointer]['lat']= $results['kml'][Response]['Placemark']['Point']['coordinates'];
- $this->validPoints[$pointer]['long']= $results['kml'][Response]['Placemark']['Point']['coordinates'];
- $this->validPoints[$pointer]['passedAddress'] = $address;
- $this->validPoints[$pointer]['htmlMessage'] = $htmlMessage;
- if($icon) $this->validPoints[$pointer]['icon'] = $icon;
- }
-
-
- }
- /**
- * @function showValidPoints
- * @param $displayType:string
- * @param $css_id:string
- * @returns nothing
- * @description Displays either a table or a list of the address points that are valid.
- * Mainly used for debugging but could be useful for showing a list of addresses
- * on the map
- */
- function showValidPoints($displayType,$css_id){
- $total = count($this->validPoints);
- if ($displayType == "table"){
- echo "<table id=\"".$css_id."\">\n<tr>\n\t<td>Address</td>\n</tr>\n";
- for ($t=0; $t<$total; $t++){
- echo"<tr>\n\t<td>".$this->validPoints[$t]['passedAddress']."</td>\n</tr>\n";
- }
- echo "</table>\n";
- }
- if ($displayType == "list"){
- echo "<ul id=\"".$css_id."\">\n";
- for ($lst=0; $lst<$total; $lst++){
- echo "<li>".$this->validPoints[$lst]['passedAddress']."</li>\n";
- }
- echo "</ul>\n";
- }
- }
- /**
- * @function showInvalidPoints
- * @param $displayType:string
- * @param $css_id:string
- * @returns nothing
- * @description Displays either a table or a list of the address points that are invalid.
- * Mainly used for debugging shows only the points that are NOT on the map
- */
- function showInvalidPoints($displayType,$css_id){
- $total = count($this->invalidPoints);
- if ($displayType == "table"){
- echo "<table id=\"".$css_id."\">\n<tr>\n\t<td>Address</td>\n</tr>\n";
- for ($t=0; $t<$total; $t++){
- echo"<tr>\n\t<td>".$this->invalidPoints[$t]['passedAddress']."</td>\n</tr>\n";
- }
- echo "</table>\n";
- }
- if ($displayType == "list"){
- echo "<ul id=\"".$css_id."\">\n";
- for ($lst=0; $lst<$total; $lst++){
- echo "<li>".$this->invalidPoints[$lst]['passedAddress']."</li>\n";
- }
- echo "</ul>\n";
- }
- }
- /**
- * @function setWidth
- * @param $width:int
- * @returns nothing
- * @description Sets the width of the map to be displayed
- */
- function setWidth($width){
- $this->mapWidth = $width;
- }
- /**
- * @function setHeight
- * @param $height:int
- * @returns nothing
- * @description Sets the height of the map to be displayed
- */
- function setHeight($height){
- $this->mapHeight = $height;
- }
- /**
- * @function setAPIkey
- * @param $key:string
- * @returns nothing
- * @description Stores the API Key acquired from Google
- */
- function setAPIkey($key){
- $this->apiKey = $key;
- }
- /**
- * @function printGoogleJS
- * @returns nothing
- * @description Adds the necessary Javascript for the Google Map to function
- * should be called in between the html <head></head> tags
- */
- function printGoogleJS(){
- echo $this->googleJS();
- }
- function googleJS(){
- return "\n<script src=\"http://maps.google.com/maps?file=api&v=2&key=".$this->apiKey."\" type=\"text/javascript\"></script>\n";
- }
- public function addCustomIcon($name, $url) {
- $icon = new GIcon($name);
- if($url) $icon->image = "\"$url\"";
- $this->icons[$name]= $icon;
- return $icon;
- }
-
- /**
- * @function showMap
- * @description Displays the Google Map on the page
- */
- public function createMap() {
- $str = "\n<div id=\"map\" style=\"width: ".$this->mapWidth."px; height: ".$this->mapHeight."px\">\n</div>\n";
- $str .= "
- <script type=\"text/javascript\">\n
- //<![CDATA[\n";
- $numPoints = count($this->validPoints);
- for ($g = 0; $g < $numPoints; $g++) {
- $str .= "var point".$g.";var marker".$g.";";
- }
- $str .="
- var map;
- function initialize_GoogleMAPS() {
- map = new GMap2(document.getElementById(\"map\"));
- if (GBrowserIsCompatible()) {\n";
- if (empty($this->centerMap)){
- $str.= "map.setCenter(new GPoint(".$this->validPoints[0]['long'].",".$this->validPoints[0]['lat']."), ".$this->zoomLevel.");\n";
- }else{
- $str.= $this->centerMap;
- }
- $str.= "}\n
- map.enableScrollWheelZoom()
- var icon = new GIcon();
- icon.image = \"http://labs.google.com/ridefinder/images/mm_20_red.png\";
- icon.shadow = \"http://labs.google.com/ridefinder/images/mm_20_shadow.png\";
- icon.iconSize = new GSize(12, 20);
- icon.shadowSize = new GSize(22, 20);
- icon.iconAnchor = new GPoint(6, 20);
- icon.infoWindowAnchor = new GPoint(5, 1);
- ";
-
- if ($this->showControl) {
- if ($this->controlType == 'small') { $str.= "map.addControl(new GSmallMapControl());\n"; }
- if ($this->controlType == 'large') { $str.= "map.addControl(new GLargeMapControl());\n"; }
- }
-
- if ($this->showType) {
- $str.= "map.addControl(new GMapTypeControl());\n";
- }
- foreach($this->icons as $name => $icon) {
- $str .= "var icon_$name = new GIcon(G_DEFAULT_ICON);\n";
- foreach(get_object_vars($icon) as $item => $value) {
- if($value) $str .= "icon_$name.$item = $value;\n";
- }
- }
- $numPoints = count($this->validPoints);
- for ($g = 0; $g < $numPoints; $g++) {
- if($this->validPoints[$g]['icon']) {
- $str .= "var options".$g." = { icon: icon_".$this->validPoints[$g]['icon']." };\n";
- } else {
- $str .= "var options".$g." = {};\n";
- }
-
- $str.= "point".$g." = new GPoint(".$this->validPoints[$g]['long'].",".$this->validPoints[$g]['lat'].");\n
- marker".$g." = new GMarker(point".$g.", options".$g.");\n
- map.addOverlay(marker".$g.")\n
- GEvent.addListener(marker".$g.", \"click\", function() {\n";
- $htmlMessage = $this->validPoints[$g]['htmlMessage']!=null ? $this->validPoints[$g]['htmlMessage'] : $this->validPoints[$g]['passedAddress'];
- if($this->validPoints[$g]['callback']) {
- $str.= "if(".$this->validPoints[$g]['callback']."(marker".$g.")) ";
- }
- $str.= "marker".$g.".openInfoWindowHtml(\"".$htmlMessage."\");\n";
-
- $str.= "});\n";
- }
-
- $str.= "}
- //]]>\n
-
- </script>\n";
- return $str;
- }
- function showMap() {
- return $this->createMap()."<script type=\"text/javascript\">initialize_GoogleMAPS();</script>";
- }
- // window.onload = showmap;
-
- ///////////THIS BLOCK OF CODE IS FROM Roger Veciana's CLASS (assoc_array2xml) OBTAINED FROM PHPCLASSES.ORG//////////////
- function xml2array($xml){
- $this->depth=-1;
- $this->xml_parser = xml_parser_create();
- xml_set_object($this->xml_parser, $this);
- xml_parser_set_option ($this->xml_parser,XML_OPTION_CASE_FOLDING,0);//Don't put tags uppercase
- xml_set_element_handler($this->xml_parser, "startElement", "endElement");
- xml_set_character_data_handler($this->xml_parser,"characterData");
- xml_parse($this->xml_parser,$xml,true);
- xml_parser_free($this->xml_parser);
- return $this->arrays[0];
-
- }
- function startElement($parser, $name, $attrs){
- $this->keys[]=$name;
- $this->node_flag=1;
- $this->depth++;
- }
- function characterData($parser,$data){
- $key=end($this->keys);
- $this->arrays[$this->depth][$key]=$data;
- $this->node_flag=0;
- }
- function endElement($parser, $name)
- {
- $key=array_pop($this->keys);
- if($this->node_flag==1){
- $this->arrays[$this->depth][$key]=$this->arrays[$this->depth+1];
- unset($this->arrays[$this->depth+1]);
- }
- $this->node_flag=1;
- $this->depth--;
- }
- //////////////////END CODE FROM Roger Veciana's CLASS (assoc_array2xml) /////////////////////////////////
-
-
- }//End Of Class
- class GIcon {
- public $image, $shadow, $iconSize, $shadowSize, $iconArchor;
- }
-
- ?>