2010最新php应用谷歌地图api

秦新立
2023-12-01
<?php


class simpleGMapAPI {

/**
* mapMarkers : array
* Holds data (coords etc.) of Markers
*/
private $mapMarkers = array();

/**
* mapCircles : array
* Holds data (coords etc.) of Circles
*/
private $mapCircles = array();

/**
* mapRectangles : array
* Holds data (coords etc.) of Rectangles
*/
private $mapRectangles = array();

/**
* mapWidth
* width of the Google Map, in pixels
*/
private $mapWidth = 400;

/**
* mapHeight
* height of the Google Map, in pixels
*/
private $mapHeight = 400;

/**
* mapBackgroundColor
* string : color for the map background
*/
private $mapBackgroundColor = "";

/**
* apiSensor : boolean
* True/False wether the device has a sensor or not
*/
private $apiSensor = false;

/**
* mapDraggable : boolean
* True/False wether the map is draggable or not
*/
private $mapDraggable = true;

/**
* mapType
* string : can be 'ROADMAP', 'SATELLITE', 'HYBRID' or 'TERRAIN'
* display's either a (road)map, satellite, hybrid or terrain view, (road)map by default
*/
private $mapType = 'ROADMAP';

/**
* zoomLevel
* int : 0 - 19
* set's the initial zoom level of the map (0 is fully zoomed out and 19 is fully zoomed in)
*/
private $zoomLevel = 6;

/**
* showDefaultUI
* True/False whether to show the deault UI controls or not
*/
private $showDefaultUI = true;

/**
* showMapTypeControl
* True/False whether to show map type control or not
*/
private $showMapTypeControl = true;

/**
* mapTypeControlStyle
* string : can be 'HORIZONTAL_BAR', 'DROPDOWN_MENU' or 'DEFAULT'
* Style of the map type control
*/
private $mapTypeControlStyle = 'DEFAULT';

/**
* showNavigationControl
* True/False whether to show navigation control or not
*/
private $showNavigationControl = true;

/**
* navigationControlStyle
* string : can be 'ANDROID', 'DEFAULT', 'SMALL' or 'ZOOM_PAN'
* Style of the navigation control
*/
private $navigationControlStyle = 'DEFAULT';

/**
* showScaleControl
* True/False whether to show scale control or not
*/
private $showScaleControl = true;

/**
* showStreetViewControl
* True/False whether to show StreetView control or not
*/
private $showStreetViewControl = true;

/**
* enableScrollwheelZoom
* True/False whether the scrollwhell zoom is enabled or not
*/
private $enableScrollwheelZoom = true;

/**
* enableDoubleClickZoom
* True/False whether doubleclick zoom zoom is enabled or not
*/
private $enableDoubleClickZoom = true;

/**
* infoWindowBehaviour
* string : can be 'MULTIPLE', 'SINGLE', 'CLOSE_ON_MAPCLICK' or 'SINGLE_CLOSE_ON_MAPCLICK'
* Behavious of InfoWindow overlays
*/
private $infoWindowBehaviour = 'MULTIPLE';

/**
* infoWindowTrigger
* string : can be 'CLICK' OR 'MOUSEOVER'
* Determines if InfoWindow is shown with a click or by mouseover
*/
private $infoWindowTrigger = 'CLICK';

/**
 * maximum longitude of all markers
 *
 * @var float
 */
private $maxLng = -1000000;

/**
 * minimum longitude of all markers
 *
 * @var float
 */
private $minLng = 1000000;

/**
 * max latitude
 *
 * @var float
 */
private $maxLat = -1000000;

/**
 * min latitude
 *
 * @var float
 */
private $minLat = 1000000;

/**
 * map center latitude (horizontal)
 * calculated automatically as markers
 * are added to the map.
 *
 * @var float
 */
private $centerLat = null;

/**
 * map center longitude (vertical)
 * calculated automatically as markers
 * are added to the map.
 *
 * @var float
 */
private $centerLng = null;


/**********
 *** START OF FUNCTION BLOCK
 **********/

/**
* @function     __construct
* @description  constructor
* @param $sensor : boolean
*/
function __construct($sensor = false)
{
    $this->setSensor($sensor);
}

/**
* @function     setSensor
* @param        $sensor : boolean
* @returns      nothing
* @description  Tells the v3 API wether the device has a sensor or not
*/
function setSensor($sensor = false)
{
    $this->apiSensor = $sensor;
}

/**
* @function     setWidth
* @param        $width : int
* @returns      nothing
* @description  Sets the width of the map to be displayed
*/
function setWidth($width)
{
    if ($width <= 0) { $width = $this->mapWidth; }
    $this->mapWidth = $width;
}

/**
* @function     setHeight
* @param        $height : int
* @returns      nothing
* @description  Sets the height of the map to be displayed
*/
function setHeight($height)
{
    if ($height <= 0) { $height = $this->mapHeight; }
    $this->mapHeight = $height;
}

/**
* @function     setBackgroundColor
* @param        $color : string
* @returns      nothing
* @description  Sets the background color of the map
*/
function setBackgroundColor($color = "")
{
    $this->mapBackgroundColor = $color;
}

/**
* @function     setZoomLevel
* @param        $zoom : int (0 - 19)
* @returns      nothing
* @description  Sets the zoom level of the map (0 is fully zoomed out and 19 is fully zoomed in)
*/
function setZoomLevel($zoom)
{
    if (($zoom <= 0) OR ($zoom > 19)) { $zoom = $this->zoomLevel; }
    $this->zoomLevel = $zoom;
}

/**
* @function     setMapType
* @param        $mapType : string (can be 'ROADMAP', 'SATELLITE', 'HYBRID' or 'TERRAIN')
* @returns      nothing
* @description  Sets the type of the map to be displayed, either a (road)map, satellite, hybrid or terrain view; (road)map by default
*/
function setMapType($mapType)
{
    switch ($mapType)
    {
        case 'SATELLITE' :
        case 'HYBRID' :
        case 'TERRAIN' :
            $this->mapType = $mapType;
            break;
        default :
            $this->mapType = 'ROADMAP';
            break;       
    }
}

/**
* @function     setMapDraggable
* @param        $draggable : boolean
* @returns      nothing
* @description  Sets wether the map is draggable or not
*/
function setMapDraggable($draggable = true)
{
    $this->mapDraggable = $draggable;
}

/**
* @function     setInfoWindowBehaviour
* @param        $infoWindowBehaviour : string (can be 'MULTIPLE', 'SINGLE' or 'CLOSE_ON_MAPCLICK')
* @returns      nothing
* @description  Sets the behaviour of InfoWindow overlays, either multiple or single windows are displayed
*/
function setInfoWindowBehaviour($infoWindowBehaviour)
{
    switch ($infoWindowBehaviour)
    {
        case 'MULTIPLE' :
        case 'SINGLE' :
        case 'CLOSE_ON_MAPCLICK' :
        case 'SINGLE_CLOSE_ON_MAPCLICK' :
            $this->infoWindowBehaviour = $infoWindowBehaviour;
            break;
        default :
            $this->infoWindowBehaviour = 'MULTIPLE'; // default behaviour of Google Maps V3
            break;       
    }
}

/**
* @function     setInfoWindowTrigger
* @param        $infoWindowTrigger : string : can be 'CLICK' OR 'ONMOUSEOVER'
* @returns      nothing
* @description  Determines if InfoWindow is shown with a click or by mouseover
*/
function setInfoWindowTrigger($infoWindowTrigger)
{
    switch ($infoWindowTrigger)
    {
        case 'MOUSEOVER' :
            $this->infoWindowTrigger = $infoWindowTrigger;
            break;
        default :
            $this->infoWindowTrigger = 'CLICK';
            break;       
    }
}

/**
* @function     showDefaultUI
* @param        $control : boolean
* @returns      nothing
* @description  Tells the v3 API wether to show the default UI (its behaviour) or not
*/
function showDefaultUI($control = true)
{
    $this->showDefaultUI = $control;
}

/**
* @function     showMapTypeControl
* @param        $control : boolean
* @param        $style : string (can be 'HORIZONTAL_BAR', 'DROPDOWN_MENU' or 'DEFAULT')
* @returns      nothing
* @description  Tells the v3 API wether to show the map type control or not
*/
function showMapTypeControl($control = true, $style )
{
    $this->showMapTypeControl = $control;
   
    switch ( $style )
    {
        case 'HORIZONTAL_BAR' :
        case 'DROPDOWN_MENU' :
            $this->mapTypeControlStyle = $style;
            break;
        default :
            $this->mapTypeControlStyle = 'DEFAULT';
            break;   
    }
}

/**
* @function     showNavigationControl
* @param        $control : boolean
* @param        $style : string (can be 'ANDROID', 'DEFAULT', 'SMALL' or 'ZOOM_PAN')
* @returns      nothing
* @description  Tells the v3 API wether to show the navigation control or not
*/
function showNavigationControl($control = true, $style)
{
    $this->showNavigationControl = $control;
    switch ( $style )
    {
        case 'ANDROID' :
        case 'SMALL' :
        case 'ZOOM_PAN' :
            $this->navigationControlStyle = $style;
            break;
        default :
            $this->navigationTypeControlStyle = 'DEFAULT';
            break;   
    }
}

/**
* @function     showScaleControl
* @param        $control : boolean
* @returns      nothing
* @description  Tells the v3 API wether to show the scale control or not
*/
function showScaleControl($control = true)
{
    $this->showScaleControl = $control;
}

/**
* @function     showStreetViewControl
* @param        $control : boolean
* @returns      nothing
* @description  Tells the v3 API wether to show the StreetView control or not
*/
function showStreetViewControl($control = true)
{
    $this->showStreetViewControl = $control;
}

/**
* @function     setScrollwheelZoom
* @param        $swzoom : boolean
* @returns      nothing
* @description  Sets wether scrollwheel zoom is enabled or not
*/
function setScrollwheelZoom($swzoom = true)
{
    $this->enableScrollwheelZoom = $swzoom;
}

/**
* @function     setDoubleClickZoom
* @param        $dczoom : boolean
* @returns      nothing
* @description  Sets wether doubleclick zoom is enabled or not
*/
function setDoubleclickZoom($dczoom = true)
{
    $this->enableDoubleClickZoom = $dczoom;
}

/**
* @function     printGMapJS
* @returns      nothing
* @description  Adds the necessary Javascript for the Google Map API v3
*               (should be called in between the html <head></head> tags)
*/
function printGMapsJS()
{
    $this->apiSensor ? $_sensor = "true" : $_sensor = "false";
   
    echo "\n<!-- Include Google Maps JS -->";
    echo "\n<script src=\"http://maps.google.com/maps/api/js?sensor=$_sensor\" type=\"text/javascript\"></script>\n";
}

/**
 * @function     adjustCenterCoords
 *
 * @param        $lng the map longitude : string
 * @param        $lat the map latitude  : string
 * @description  adjust map center coordinates by the given lat/lon point
 */
private function adjustCenterCoords($lat, $lng)
{
    if ( (strlen((string)$lat) != 0) AND (strlen((string)$lng) != 0) )
    {
        $this->maxLat = (float) max($lat, $this->maxLat);
        $this->minLat = (float) min($lat, $this->minLat);
        $this->maxLng = (float) max($lng, $this->maxLng);
        $this->minLng = (float) min($lng, $this->minLng);
   
        $this->centerLng = (float) ($this->minLng + $this->maxLng) / 2;
        $this->centerLat = (float) ($this->minLat + $this->maxLat) / 2;
    }
}

/**
* @function     addMarker
* @param        $lat : string (latitude)
*               $lng : string (longitude)
*               $tooltip : string (tooltip text)
*               $info : Message to be displayed in an InfoWindow
*               $iconURL : URL to an icon to be displayed instead of the default icon
*               (see for example http://code.google.com/p/google-maps-icons/)
*               $clickable : boolean (true if the marker should be clickable)
* @description  Add's a Marker to be displayed on the Google Map using latitude/longitude
*/
function addMarker($lat, $lng, $tooltip="", $info="", $iconURL="", $clickable=true)
{
    $count = count($this->mapMarkers);
    $this->mapMarkers[$count]['lat']     = $lat;
    $this->mapMarkers[$count]['lng']     = $lng;
    $this->mapMarkers[$count]['tooltip'] = $tooltip;
    $this->mapMarkers[$count]['info']    = $info;
    $this->mapMarkers[$count]['iconURL'] = $iconURL;
    $this->mapMarkers[$count]['clickable'] = $clickable;
   
    $this->adjustCenterCoords($lat, $lng);
}

/**
* @function     addMarkerByAddress
* @param        $lat : string (latitude)
*               $lng : string (longitude)
*               $tooltip : string (tooltip text)
*               $info : Message to be displayed in an InfoWindow
*               $iconURL : URL to an icon to be displayed instead of the default icon
*               (see for example http://code.google.com/p/google-maps-icons/)
*               $clickable : boolean (true if the marker should be clickable)
*               @description  Add's a Marker to be displayed on the Google Map using latitude/longitude
*/
function addMarkerByAddress($address, $tooltip="", $info="", $iconURL="", $clickable=true)
{
    $geoCoder = new simpleGMapGeocoder();
    $result = array();
   
    if (!is_string($address))
    {
 die("All Addresses must be passed as a string");
    }
   
    $result = $geoCoder->getGeoCoords($address);
   
    if ( $result['status'] == "OK" )
    {
        $count = count($this->mapMarkers);
        $this->mapMarkers[$count]['lat']     = $result['lat'];
        $this->mapMarkers[$count]['lng']     = $result['lng'];
        $this->mapMarkers[$count]['tooltip'] = $tooltip;
        $this->mapMarkers[$count]['info']    = $info;
        $this->mapMarkers[$count]['iconURL'] = $iconURL;
        $this->mapMarkers[$count]['clickable'] = $clickable;       

        $this->adjustCenterCoords($result['lat'], $result['lng']);
    }
}

/**
* @function     addCircle
* @param        $lat : string (latitude)
*               $lng : string (longitude)
*               $rad : string (radius of circle in meters)
*               $info : Message to be displayed in an InfoWindow
*               $options : array (options like stroke color etc. for the circle)
* @description  Add's an circle to be displayed on the Google Map using latitude/longitude and radius
*/
function addCircle($lat, $lng, $rad, $info="", $options=array())
{
    $count = count($this->mapCircles);
    $this->mapCircles[$count]['lat']  = $lat;
    $this->mapCircles[$count]['lng']  = $lng;
    $this->mapCircles[$count]['rad']  = $rad;
    $this->mapCircles[$count]['info'] = $info;
   
    /* set options */
    if ( sizeof($options) != 0 )
    {
        $this->mapCircles[$count]['fillColor']     = $options['fillColor'];
        $this->mapCircles[$count]['fillOpacity']   = $options['fillOpacity'];
        $this->mapCircles[$count]['strokeColor']   = $options['strokeColor'];
        $this->mapCircles[$count]['strokeOpacity'] = $options['strokeOpacity'];
        $this->mapCircles[$count]['strokeWeight']  = $options['strokeWeight'];
       
        if ( $options['clickable'] == "" OR $options['clickable'] == false )
        {
            $this->mapCircles[$count]['clickable'] = false;
        }
        else
        {
            $this->mapCircles[$count]['clickable'] = true;
        }
    }
    $this->adjustCenterCoords($lat, $lng);
}

/**
* @function     addRectangle
* @param        $lat1 : string (latitude sw corner)
*               $lng1 : string (longitude sw corner)
*               $lat2 : string (latitude ne corner)
*               $lng2 : string (longitude ne corner)
*               $info : Message to be displayed in an InfoWindow
*               $options : array (options like stroke color etc. for the rectangle)
* @description  Add's a rectangle to be displayed on the Google Map using latitude/longitude for soutwest and northeast corner
*/
function addRectangle($lat1, $lng1, $lat2, $lng2, $info="", $options=array())
{
    $count = count($this->mapRectangles);
    $this->mapRectangles[$count]['lat1'] = $lat1;
    $this->mapRectangles[$count]['lng1'] = $lng1;
    $this->mapRectangles[$count]['lat2'] = $lat2;
    $this->mapRectangles[$count]['lng2'] = $lng2;
    $this->mapRectangles[$count]['info'] = $info;
   
    /* set options */
    if ( sizeof($options) != 0 )
    {
        $this->mapRectangles[$count]['fillColor']     = $options['fillColor'];
        $this->mapRectangles[$count]['fillOpacity']   = $options['fillOpacity'];
        $this->mapRectangles[$count]['strokeColor']   = $options['strokeColor'];
        $this->mapRectangles[$count]['strokeOpacity'] = $options['strokeOpacity'];
        $this->mapRectangles[$count]['strokeWeight']  = $options['strokeWeight'];
       
        if ( $options['clickable'] == "" OR $options['clickable'] == false )
        {
            $this->mapRectangles[$count]['clickable'] = false;
        }
        else
        {
            $this->mapRectangles[$count]['clickable'] = true;
        }
    }
    $this->adjustCenterCoords($lat1, $lng1);
    $this->adjustCenterCoords($lat2, $lng2);   
}

/**
* @function     calculateDistance
* @param        $lat1 : string (latitude location 1)
*               $lng1: string (longitude location 1)
*               $lat2 : string (latitude location 2)
*               $lng2: string (longitude location 2)
*               $unit : km (killometers), m (miles), n (nautical miles), i (inch)
* @description  calculates distance between two locations in given unit (default kilometers)
*/
function calculateDistance($lat1, $lng1, $lat2, $lng2, $unit="km")
{
    $radius = 6371; // mean radius of the earth in kilometers
    $lat1 = (float)$lat1;
    $lat2 = (float)$lat2;
    $lng1 = (float)$lng1;
    $lng2 = (float)$lng2;
   
   
    // calculation of distance in km using Great Circle Distance Formula
    $dist = $radius *
            acos( sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +
                  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lng2) - deg2rad($lng1)) );
   
    switch ( strtolower($unit) )
    {
        case 'm' :     // miles
            $dist = $dist / 1.609;
            break;
        case 'n' :     // nautical miles
            $dist = $dist / 1.852;
            break;
        case 'i' :     // inch
            $dist = $dist * 39370;
            break;
    }
   
    return $dist;
}

/**
* @function     showMap
* @description  Displays the Google Map on the page
*/
function showMap($zoomToBounds = true)
{
    $this->showDefaultUI ? $_disableDefaultUI = "false" : $_disableDefaultUI = "true";
    $this->showMapTypeControl ? $_mapTypeControl = "true" : $_mapTypeControl = "false";
    $this->showNavigationControl ? $_navigationControl = "true" : $_navigationControl = "false";
    $this->showScaleControl ? $_scaleControl = "true" : $_scaleControl = "false";
    $this->showStreetViewControl ? $_streetViewControl = "true" : $_streetViewControl = "false";
    $this->mapDraggable ? $_mapDraggable = "true" : $_mapDraggable = "false";
    $this->enableScrollwheelZoom ? $_scrollwheelZoom = "true" : $_scrollwheelZoom = "false";
    $this->enableDoubleClickZoom ? $_disableDoubleClickZoom = "false" : $_disableDoubleClickZoom = "true";

    // just set the infoWindowTrigger to lower case so we can use it direct as a string
    $_infowindowtrigger = strtolower($this->infoWindowTrigger);
   
    // create div for the map canvas
    echo "\n<!-- DIV container for the map -->";
    echo "\n<div id=\"gmap_canvas\" style=\"width: ".$this->mapWidth."px; height: ".$this->mapHeight."px;\">\n</div>\n";
       
    // create JS to display the map
    echo "\n<!-- Display the Google Map -->";
    echo "\n<script type=\"text/javascript\">\n".
         "var currentInfoWindow = null;\n".
         "var bounds = new google.maps.LatLngBounds();\n".
  "var latlng = new google.maps.LatLng(".$this->centerLat.", ".$this->centerLng.");\n".
  "var options = {\n".
  "\tzoom: ".$this->zoomLevel.",\n".
  "\tcenter: latlng,\n".
  "\tmapTypeId: google.maps.MapTypeId.".$this->mapType.",\n";
    if ( $this->mapBackgroundColor != "" ) { echo "backgroundColor: '".$this->mapBackgroundColor."',\n"; }
    echo "\tdisableDefaultUI: ".$_disableDefaultUI.",\n".
         "\tmapTypeControl: ".$_mapTypeControl.",\n".
         "\tmapTypeControlOptions: { style: google.maps.MapTypeControlStyle.".$this->mapTypeControlStyle." },\n".
         "\tnavigationControl: ".$_navigationControl.",\n".
         "\tnavigationControlOptions: { style: google.maps.NavigationControlStyle.".$this->navigationControlStyle." },\n".
         "\tscaleControl: ".$_scaleControl.",\n".
         "\tstreetViewControl: ".$_streetViewControl.",\n".
         "\tdraggable: ".$_mapDraggable.",\n".
         "\tscrollwheel: ".$_scrollwheelZoom.",\n".
         "\tdisableDoubleClickZoom: ".$_disableDoubleClickZoom."\n".
         "};\n\n".
         "function showmap() {\n".
         "\tvar map = new google.maps.Map(document.getElementById('gmap_canvas'), options);\n\n";
   
    // infoWindowBehaviour    
    if ( ($this->infoWindowBehaviour == 'CLOSE_ON_MAPCLICK') OR ($this->infoWindowBehaviour == 'SINGLE_CLOSE_ON_MAPCLICK') )
    {
        echo "\tgoogle.maps.event.addListener(map, 'click', function() { if (currentInfoWindow != null) { currentInfoWindow.close(); } });\n";
    }

    /*
     * Run through the mapMarkers array to display markers on the map
     */
    for ( $count = 0; $count < sizeof($this->mapMarkers); $count++ )
    {
        // place the marker on the map
        echo "\tvar markerLatLng = new google.maps.LatLng(".$this->mapMarkers[$count]['lat'].", ".$this->mapMarkers[$count]['lng'].");\n".
             "\tvar marker$count = new google.maps.Marker({\n".
             "\t position: markerLatLng,\n".
             "\t title: '".$this->mapMarkers[$count]['tooltip']."',\n";
        if ( $this->mapMarkers[$count]['iconURL'] != "" )
        {
             echo "\t icon: '".$this->mapMarkers[$count]['iconURL']."',\n";
        }
        if ( $this->mapMarkers[$count]['clickable'] == false )
        {
             echo "\t clickable: false,\n";
        }
        echo "\t map: map\n".
             "\t});\n";
            
        // add an InfoWindow if there is a text to be displayed
        if ( $this->mapMarkers[$count]['info'] != "")
        {
            // create InfoWindow
            echo "\tvar infowindowM$count = new google.maps.InfoWindow({\n".
                 "\t content: '".$this->mapMarkers[$count]['info']."'\n".
                
                 "\t});\n";
            // add an event to the marker
            echo "\tgoogle.maps.event.addListener (marker$count, '$_infowindowtrigger', function() {\n";
            // infoWindowBehaviour    
            if ( ($this->infoWindowBehaviour == 'SINGLE') OR ($this->infoWindowBehaviour == 'SINGLE_CLOSE_ON_MAPCLICK') )
            {
                echo "\t if (currentInfoWindow != null) { currentInfoWindow.close(); } \n";
            }
            echo "\t infowindowM$count.open(map, marker$count);\n".
                 "\t currentInfoWindow = infowindowM$count;\n".
                 "\t});\n";
        }
        echo "\tbounds.extend(markerLatLng);\n\n";
    }

    /*
     * Run through the mapCircles array to display circles on the map
     */
    for ( $count = 0; $count < sizeof($this->mapCircles); $count++ )
    {
        // place the circle on the map
        echo "\tvar circleLatLng = new google.maps.LatLng(".$this->mapCircles[$count]['lat'].", ".$this->mapCircles[$count]['lng'].");\n".
             "\tvar circle$count = new google.maps.Circle({\n".
             "\t center: circleLatLng,\n".
             "\t radius: ".$this->mapCircles[$count]['rad'].",\n";
        // check if there are options set for the circle    
        if ( $this->mapCircles[$count]['fillColor'] != "" )     { echo "\t fillColor: '".$this->mapCircles[$count]['fillColor']."',\n"; }
        if ( $this->mapCircles[$count]['fillOpacity'] != "" )   { echo "\t fillOpacity: ".$this->mapCircles[$count]['fillOpacity'].",\n"; }
        if ( $this->mapCircles[$count]['strokeColor'] != "" )   { echo "\t strokeColor: '".$this->mapCircles[$count]['strokeColor']."',\n"; }
        if ( $this->mapCircles[$count]['strokeOpacity'] != "" ) { echo "\t strokeOpacity: ".$this->mapCircles[$count]['strokeOpacity'].",\n"; }
        if ( $this->mapCircles[$count]['strokeWeight'] != "" )  { echo "\t strokeWeight: ".$this->mapCircles[$count]['strokeWeight'].",\n"; }
        if ( $this->mapCircles[$count]['clickable'] == false )  { echo "\t clickable: false,\n"; }
        echo "\t map: map\n".
             "\t});\n";
            
        // add an InfoWindow if there is a text to be displayed and circle is clickable
        if ( ($this->mapCircles[$count]['info'] != "") AND ($this->mapCircles[$count]['clickable'] != false) )
        {
            // create InfoWindow
            echo "\tvar infowindowC$count = new google.maps.InfoWindow({\n".
                 "\t content: '".$this->mapCircles[$count]['info']."',\n".
                 "\t position: circleLatLng,\n".
                 "\t});\n";
            // add an event to the marker
            echo "\tgoogle.maps.event.addListener (circle$count, '$_infowindowtrigger', function() {\n";
            // infoWindowBehaviour    
            if ( ($this->infoWindowBehaviour == 'SINGLE') OR ($this->infoWindowBehaviour == 'SINGLE_CLOSE_ON_MAPCLICK') )
            {
                echo "\t if (currentInfoWindow != null) { currentInfoWindow.close(); } \n";
            }
            echo "\t var tmplat1 = circle$count.getCenter().lat()+(circle$count.getBounds().getNorthEast().lat() - circle$count.getCenter().lat())/2;\n";
            echo "\t var tmplng1 = circle$count.getCenter().lng()+(circle$count.getBounds().getNorthEast().lng() - circle$count.getCenter().lng())/2;\n";
            echo "\t var newpos = new google.maps.LatLng(tmplat1, tmplng1);\n";
            echo "\t infowindowC$count.open(map);\n".
                 "\t infowindowC$count.setPosition(newpos);\n".
                 "\t currentInfoWindow = infowindowC$count;\n".
                 "\t});\n";
        }

        echo "\tbounds.extend(circle$count.getBounds().getNorthEast());\n";
        echo "\tbounds.extend(circle$count.getBounds().getSouthWest());\n\n";
    }

    /*
     * Run through the mapRectangles array to display circles on the map
     */
    for ( $count = 0; $count < sizeof($this->mapRectangles); $count++ )
    {
        // place the rectangle on the map
        echo "\tvar rectangleSW = new google.maps.LatLng(".$this->mapRectangles[$count]['lat1'].", ".$this->mapRectangles[$count]['lng1'].");\n".
             "\tvar rectangleNE = new google.maps.LatLng(".$this->mapRectangles[$count]['lat2'].", ".$this->mapRectangles[$count]['lng2'].");\n".
             "\tvar rectangleBounds = new google.maps.LatLngBounds(rectangleSW,rectangleNE);\n".
             "\tvar rectangle$count = new google.maps.Rectangle({\n".
             "\t bounds: rectangleBounds,\n";
        // check if there are options set for the rectangle    
        if ( $this->mapRectangles[$count]['fillColor'] != "" )     { echo "\t fillColor: '".$this->mapRectangles[$count]['fillColor']."',\n"; }
        if ( $this->mapRectangles[$count]['fillOpacity'] != "" )   { echo "\t fillOpacity: ".$this->mapRectangles[$count]['fillOpacity'].",\n"; }
        if ( $this->mapRectangles[$count]['strokeColor'] != "" )   { echo "\t strokeColor: '".$this->mapRectangles[$count]['strokeColor']."',\n"; }
        if ( $this->mapRectangles[$count]['strokeOpacity'] != "" ) { echo "\t strokeOpacity: ".$this->mapRectangles[$count]['strokeOpacity'].",\n"; }
        if ( $this->mapRectangles[$count]['strokeWeight'] != "" )  { echo "\t strokeWeight: ".$this->mapRectangles[$count]['strokeWeight'].",\n"; }
        if ( $this->mapRectangles[$count]['clickable'] == false )  { echo "\t clickable: false,\n"; }
        echo "\t map: map\n".
             "\t});\n";
            
        // add an InfoWindow if there is a text to be displayed and rectangle is clickable
        if ( ($this->mapRectangles[$count]['info'] != "") AND ($this->mapRectangles[$count]['clickable'] != false) )
        {
            // create InfoWindow
            echo "\tvar infowindowR$count = new google.maps.InfoWindow({\n".
                 "\t content: '".$this->mapRectangles[$count]['info']."',\n".
                 "\t position: rectangleNE,\n".
                 "\t});\n";
            // add an event to the marker
            echo "\tgoogle.maps.event.addListener (rectangle$count, '$_infowindowtrigger', function() {\n";
            // infoWindowBehaviour    
            if ( ($this->infoWindowBehaviour == 'SINGLE') OR ($this->infoWindowBehaviour == 'SINGLE_CLOSE_ON_MAPCLICK') )
            {
                echo "\t if (currentInfoWindow != null) { currentInfoWindow.close(); } \n";
            }
            echo "\t infowindowR$count.open(map);\n".
                 "\t currentInfoWindow = infowindowR$count;\n".
                 "\t});\n";
        }

        echo "\tbounds.extend(rectangleNE);\n";
        echo "\tbounds.extend(rectangleSW);\n\n";
    }

    if ( $zoomToBounds )
    {
        echo "\tmap.fitBounds(bounds);\n";
    }
    echo "}\n\n".
         "window.onload = showmap;\n".
  "</script>\n";
}

}

class simpleGMapGeocoder {
   
/**
* @function     getGeoCoords
* @param        $address : string
* @returns      -
* @description  Gets GeoCoords by calling the Google Maps geoencoding API
*/
function getGeoCoords($address)
{
    $coords = array();
   
    /*
      OBSOLETE, now using utf8_encode
     
      // replace special characters (eg. German "Umlaute")
      $address = str_replace("?", "ae", $address);
      $address = str_replace("?", "oe", $address);
      $address = str_replace("?", "ue", $address);
      $address = str_replace("?", "Ae", $address);
      $address = str_replace("?", "Oe", $address);
      $address = str_replace("?", "Ue", $address);
      $address = str_replace("?", "ss", $address);
    */
   
    $address = utf8_encode($address);
   
    // call geoencoding api with param json for output
    $geoCodeURL = "http://maps.google.com/maps/api/geocode/json?address=".
                  urlencode($address)."&sensor=false";
   
    $result = json_decode(file_get_contents($geoCodeURL), true);
               
    $coords['status'] = $result["status"];
    $coords['lat'] = $result["results"][0]["geometry"]["location"]["lat"];
    $coords['lng'] = $result["results"][0]["geometry"]["location"]["lng"];
   
    return $coords;
}

/**
* WORK IN PROGRESS...
*
* @function     reverseGeoCode
* @param        $lat : string
* @param        $lng : string
* @returns      -
* @description  Gets Address for the given LatLng by calling the Google Maps geoencoding API
*/
function reverseGeoCode($lat,$lng)
{
    $address = array();
   
    // call geoencoding api with param json for output
    $geoCodeURL = "http://maps.google.com/maps/api/geocode/json?address=$lat,$lng&sensor=false";
   
    $result = json_decode(file_get_contents($geoCodeURL), true);
               
    $address['status'] = $result["status"];
   
    echo $geoCodeURL."<br />";
    print_r($result);
   
    return $address;
}

/**
* @function     getOSMGeoCoords
* @param        $address : string
* @returns      -
* @description  Gets GeoCoords by calling the OpenStreetMap geoencoding API
*/
function getOSMGeoCoords($address)
{
    $coords = array();
       
    $address = utf8_encode($address);
   
    // call OSM geoencoding api
    // limit to one result (limit=1) without address details (addressdetails=0)
    // output in JSON
    $geoCodeURL = "http://nominatim.openstreetmap.org/search?format=json&limit=1&addressdetails=0&q=".
                  urlencode($address);
   
    $result = json_decode(file_get_contents($geoCodeURL), true);
   
    $coords['lat'] = $result[0]["lat"];
    $coords['lng'] = $result[0]["lon"];

    return $coords;
}

}

//以下为应用实例

$map = new simpleGMapAPI();
$geo = new simpleGMapGeocoder();

$map->setWidth(600);
$map->setHeight(600);
$map->setBackgroundColor('#d0d0d0');
$map->setMapDraggable(true);
$map->setDoubleclickZoom(false);
$map->setScrollwheelZoom(true);

$map->showDefaultUI(false);
$map->showMapTypeControl(true, 'DROPDOWN_MENU');
$map->showNavigationControl(true, 'DEFAULT');
$map->showScaleControl(true);
$map->showStreetViewControl(true);

$map->setZoomLevel(14); // not really needed because showMap is called in this demo with auto zoom
$map->setInfoWindowBehaviour('SINGLE_CLOSE_ON_MAPCLICK');
$map->setInfoWindowTrigger('CLICK');

$map->addMarkerByAddress("Ravensberger Park 1 , Bielefeld", "Ravensberger Spinnerei", "Ravensberger Spinnerei", "http://google-maps-icons.googlecode.com/files/museum-historical.png");
$map->addMarkerByAddress("Universit鋞sstra遝 25, Bielefeld", "Universit鋞 Bielefeld", "<a href=\"http://www.uni-bielefeld.de\" target=\"_blank\">http://www.uni-bielefeld.de</a>", "http://google-maps-icons.googlecode.com/files/university.png");
$map->addMarker(52.0149436, 8.5275128, "Sparrenburg Bielefeld", "Sparrenburg, 33602 Bielefeld, Deutschland<br /><img src=\"http://www.bielefeld.de/ftp/bilder/sehenswuerdigkeiten/sehenswuerdigkeiten/sparrenburg-bielefeld-435.gif\"", "http://google-maps-icons.googlecode.com/files/museum-archeological.png");

$opts = array('fillColor'=>'#0000dd', 'fillOpacity'=>0.2, 'strokeColor'=>'#000000', 'strokeOpacity'=>1, 'strokeWeight'=>2, 'clickable'=>true);
$map->addCircle(52.0149436, 8.5275128, 1500, "1,5km Umgebung um die Sparrenburg", $opts);

$opts = array('fillColor'=>'#00dd00', 'fillOpacity'=>0.2, 'strokeColor'=>'#003300', 'strokeOpacity'=>1, 'strokeWeight'=>2, 'clickable'=>true);
$map->addRectangle(52.0338, 8.487, 52.0414, 8.502, "Campus University Bielefeld", $opts);

echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"\n'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
echo "<html xmlns=\"\n'>http://www.w3.org/1999/xhtml\">\n";
echo "<head>\n";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />\n";
echo "<title>simpleGMapAPI test</title>";

$map->printGMapsJS();

echo "</head>\n";
echo "\n\n<body>\n\n";

// showMap with auto zoom enabled
$map->showMap(true);

echo "</body>\n";
echo "</html>\n";

?

 
 类似资料: