Google地图API代码

时间:2016-11-07 15:08:23

标签: api google-maps joomla

您好我想让我的Google地图显示在我的Joomla网站上,但它无效。我不断收到以下错误消息:

  

糟糕!有些不对劲。此页面未加载Google地图   正确。有关技术详细信息,请参阅JavaScript控制台。

以下是我目前的代码:

<?php
/**
 * @package     Joomla.Platform
 * @subpackage  Google
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_PLATFORM') or die;

use Joomla\Registry\Registry;

/**
 * Google Maps embed class for the Joomla Platform.
 *
 * @since  12.3
 */
class JGoogleEmbedMaps extends JGoogleEmbed
{
    /**
     * @var    JHttp  The HTTP client object to use in sending HTTP requests.
     * @since  12.3
     */
    protected $http;

    /**
     * Constructor.
     *
     * @param   Registry  $options  Google options object
     * @param   JUri      $uri      URL of the page being rendered
     * @param   JHttp     $http     Http client for geocoding requests
     *
     * @since   12.3
     */
    public function __construct(Registry $options = null, JUri $uri = null, JHttp $http = null)
    {
        parent::__construct($options, $uri);
        $this->http = $http ? $http : new JHttp($this->options);
    }

    /**
     * Method to get the API key
     *
     * @return  string  The Google Maps API key
     *
     * @since   12.3
     */
    public function getKey()
    {
        return $this->getOption('key');
    }

    /**
     * Method to set the API key
     *
     * @param   string  $key  The Google Maps API key
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setKey($key)
    {
        $this->setOption('key', $key);

        return $this;
    }

    /**
     * Method to get the id of the map div
     *
     * @return  string  The ID
     *
     * @since   12.3
     */
    public function getMapId()
    {
        return $this->getOption('mapid') ? $this->getOption('mapid') : 'map_canvas';
    }

    /**
     * Method to set the map div id
     *
     * @param   string  $id  The ID
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setMapId($id)
    {
        $this->setOption('mapid', $id);

        return $this;
    }

    /**
     * Method to get the class of the map div
     *
     * @return  string  The class
     *
     * @since   12.3
     */
    public function getMapClass()
    {
        return $this->getOption('mapclass') ? $this->getOption('mapclass') : '';
    }

    /**
     * Method to set the map div class
     *
     * @param   string  $class  The class
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setMapClass($class)
    {
        $this->setOption('mapclass', $class);

        return $this;
    }

    /**
     * Method to get the style of the map div
     *
     * @return  string  The style
     *
     * @since   12.3
     */
    public function getMapStyle()
    {
        return $this->getOption('mapstyle') ? $this->getOption('mapstyle') : '';
    }

    /**
     * Method to set the map div style
     *
     * @param   string  $style  The style
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setMapStyle($style)
    {
        $this->setOption('mapstyle', $style);

        return $this;
    }

    /**
     * Method to get the map type setting
     *
     * @return  string  The class
     *
     * @since   12.3
     */
    public function getMapType()
    {
        return $this->getOption('maptype') ? $this->getOption('maptype') : 'ROADMAP';
    }

    /**
     * Method to set the map type ()
     *
     * @param   string  $type  Valid types are ROADMAP, SATELLITE, HYBRID, and TERRAIN
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setMapType($type)
    {
        $this->setOption('maptype', strtoupper($type));

        return $this;
    }

    /**
     * Method to get additional map options
     *
     * @return  string  The options
     *
     * @since   12.3
     */
    public function getAdditionalMapOptions()
    {
        return $this->getOption('mapoptions') ? $this->getOption('mapoptions') : array();
    }

    /**
     * Method to add additional map options
     *
     * @param   array  $options  Additional map options
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setAdditionalMapOptions($options)
    {
        $this->setOption('mapoptions', $options);

        return $this;
    }

    /**
     * Method to get additional map options
     *
     * @return  string  The options
     *
     * @since   12.3
     */
    public function getAdditionalJavascript()
    {
        return $this->getOption('extrascript') ? $this->getOption('extrascript') : '';
    }

    /**
     * Method to add additional javascript
     *
     * @param   array  $script  Additional javascript
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setAdditionalJavascript($script)
    {
        $this->setOption('extrascript', $script);

        return $this;
    }

    /**
     * Method to get the zoom
     *
     * @return  int  The zoom level
     *
     * @since   12.3
     */
    public function getZoom()
    {
        return $this->getOption('zoom') ? $this->getOption('zoom') : 0;
    }

    /**
     * Method to set the map zoom
     *
     * @param   int  $zoom  Zoom level (0 is whole world)
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setZoom($zoom)
    {
        $this->setOption('zoom', $zoom);

        return $this;
    }

    /**
     * Method to set the center of the map
     *
     * @return  mixed  A latitude longitude array or an address string
     *
     * @since   12.3
     */
    public function getCenter()
    {
        return $this->getOption('mapcenter') ? $this->getOption('mapcenter') : array(0, 0);
    }

    /**
     * Method to set the center of the map
     *
     * @param   mixed  $location       A latitude/longitude array or an address string
     * @param   mixed  $title          Title of marker or false for no marker
     * @param   array  $markeroptions  Options for marker
     * @param   array  $markerevents   Events for marker
     *
     * @example with events call:
     *      $map->setCenter(
     *          array(0, 0),
     *          'Map Center',
     *          array(),
     *          array(
     *              'click' => 'function() { // code goes here }
     *          )
     *      )
     *
     * @return  JGoogleEmbedMaps  The latitude/longitude of the center or false on failure
     *
     * @since   12.3
     */
    public function setCenter($location, $title = true, $markeroptions = array(), $markerevents = array())
    {
        if ($title)
        {
            $title = is_string($title) ? $title : null;

            if (!$marker = $this->addMarker($location, $title, $markeroptions, $markerevents))
            {
                return false;
            }

            $location = $marker['loc'];
        }
        elseif (is_string($location))
        {
            $geocode = $this->geocodeAddress($location);

            if (!$geocode)
            {
                return false;
            }

            $location = $geocode['geometry']['location'];
            $location = array_values($location);
        }

        $this->setOption('mapcenter', $location);

        return $this;
    }

    /**
     * Method to add an event handler to the map.
     * Event handlers must be passed in either as callback name or fully qualified function declaration
     *
     * @param   string  $type      The event name
     * @param   string  $function  The event handling function body
     *
     * @example to add an event call:
     *      $map->addEventHandler('click', 'function(){ alert("map click event"); }');
     *
     * @return  JGoogleEmbedMaps   The object for method chaining
     *
     * @since   12.3
     */
    public function addEventHandler($type, $function)
    {
        $events = $this->listEventHandlers();

        $events[$type] = $function;

        $this->setOption('events', $events);

        return $this;
    }

    /**
     * Method to remove an event handler from the map
     *
     * @param   string  $type  The event name
     *
     * @example to delete an event call:
     *      $map->deleteEventHandler('click');
     *
     * @return  string  The event handler content
     *
     * @since   12.3
     */
    public function deleteEventHandler($type = null)
    {
        $events = $this->listEventHandlers();

        if ($type === null || !isset($events[$type]))
        {
            return;
        }

        $event = $events[$type];
        unset($events[$type]);
        $this->setOption('events', $events);

        return $event;
    }

    /**
     * List the events added to the map
     *
     * @return  array  A list of events
     *
     * @since   12.3
     */
    public function listEventHandlers()
    {
        return $this->getOption('events') ? $this->getOption('events') : array();
    }

    /**
     * Add a marker to the map
     *
     * @param   mixed  $location  A latitude/longitude array or an address string
     * @param   mixed  $title     The hover-text for the marker
     * @param   array  $options   Options for marker
     * @param   array  $events    Events for marker
     *
     * @example with events call:
     *      $map->addMarker(
     *          array(0, 0),
     *          'My Marker',
     *          array(),
     *          array(
     *              'click' => 'function() { // code goes here }
     *          )
     *      )
     *
     * @return  mixed  The marker or false on failure
     *
     * @since   12.3
     */
    public function addMarker($location, $title = null, $options = array(), $events = array())
    {
        if (is_string($location))
        {
            if (!$title)
            {
                $title = $location;
            }

            $geocode = $this->geocodeAddress($location);

            if (!$geocode)
            {
                return false;
            }

            $location = $geocode['geometry']['location'];
        }
        elseif (!$title)
        {
            $title = implode(', ', $location);
        }

        $location = array_values($location);
        $marker = array('loc' => $location, 'title' => $title, 'options' => $options, 'events' => $events);

        $markers = $this->listMarkers();
        $markers[] = $marker;
        $this->setOption('markers', $markers);

        return $marker;
    }

    /**
     * List the markers added to the map
     *
     * @return  array  A list of markers
     *
     * @since   12.3
     */
    public function listMarkers()
    {
        return $this->getOption('markers') ? $this->getOption('markers') : array();
    }

    /**
     * Delete a marker from the map
     *
     * @param   int  $index  Index of marker to delete (defaults to last added marker)
     *
     * @return  array The latitude/longitude of the deleted marker
     *
     * @since   12.3
     */
    public function deleteMarker($index = null)
    {
        $markers = $this->listMarkers();

        if ($index === null)
        {
            $index = count($markers) - 1;
        }

        if ($index >= count($markers) || $index < 0)
        {
            throw new OutOfBoundsException('Marker index out of bounds.');
        }

        $marker = $markers[$index];
        unset($markers[$index]);
        $markers = array_values($markers);
        $this->setOption('markers', $markers);

        return $marker;
    }

    /**
     * Checks if the javascript is set to be asynchronous
     *
     * @return  boolean  True if asynchronous
     *
     * @since   12.3
     */
    public function isAsync()
    {
        return $this->getOption('async') === null ? true : $this->getOption('async');
    }

    /**
     * Load javascript asynchronously
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function useAsync()
    {
        $this->setOption('async', true);

        return $this;
    }

    /**
     * Load javascript synchronously
     *
     * @return  JGoogleEmbedAMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function useSync()
    {
        $this->setOption('async', false);

        return $this;
    }

    /**
     * Method to get callback function for async javascript loading
     *
     * @return  string  The ID
     *
     * @since   12.3
     */
    public function getAsyncCallback()
    {
        return $this->getOption('callback') ? $this->getOption('callback') : 'initialize';
    }

    /**
     * Method to set the callback function for async javascript loading
     *
     * @param   string  $callback  The callback function name
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setAsyncCallback($callback)
    {
        $this->setOption('callback', $callback);

        return $this;
    }

    /**
     * Checks if a sensor is set to be required
     *
     * @return  boolean  True if asynchronous
     *
     * @since   12.3
     */
    public function hasSensor()
    {
        return $this->getOption('sensor') === null ? false : $this->getOption('sensor');
    }

    /**
     * Require access to sensor data
     *
     * @return  JGoogleEmbedMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function useSensor()
    {
        $this->setOption('sensor', true);

        return $this;
    }

    /**
     * Don't require access to sensor data
     *
     * @return  JGoogleEmbedAMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function noSensor()
    {
        $this->setOption('sensor', false);

        return $this;
    }

    /**
     * Checks how the script should be loaded
     *
     * @return  string  Autoload type (onload, jquery, mootools, or false)
     *
     * @since   12.3
     */
    public function getAutoload()
    {
        return $this->getOption('autoload') ? $this->getOption('autoload') : 'false';
    }

    /**
     * Automatically add the callback to the window
     *
     * @param   string  $type  The method to add the callback (options are onload, jquery, mootools, and false)
     *
     * @return  JGoogleEmbedAMaps  The object for method chaining
     *
     * @since   12.3
     */
    public function setAutoload($type = 'onload')
    {
        $this->setOption('autoload', $type);

        return $this;
    }

    /**
     * Get code to load Google Maps javascript
     *
     * @return  string  Javascript code
     *
     * @since   12.3
     */
    public function getHeader()
    {
        $zoom = $this->getZoom();
        $center = $this->getCenter();
        $maptype = $this->getMapType();
        $id = $this->getMapId();
        $scheme = $this->isSecure() ? 'https' : 'http';
        $key = $this->getKey();
        $sensor = $this->hasSensor() ? 'true' : 'false';

        $setup = 'var mapOptions = {';
        $setup .= "zoom: {$zoom},";
        $setup .= "center: new google.maps.LatLng({$center[0]},{$center[1]}),";
        $setup .= "mapTypeId: google.maps.MapTypeId.{$maptype},";
        $setup .= substr(json_encode($this->getAdditionalMapOptions()), 1, -1);
        $setup .= '};';
        $setup .= "var map = new google.maps.Map(document.getElementById('{$id}'), mapOptions);";

        $events = $this->listEventHandlers();

        if (isset($events) && count($events))
        {
            foreach ($events as $type => $handler)
            {
                $setup .= "google.maps.event.addListener(map, '{$type}', {$handler});";
            }
        }

        $markers = $this->listMarkers();

        if (isset($markers) && count($markers))
        {
            $setup .= "var marker;";

            foreach ($markers as $marker)
            {
                $loc = $marker['loc'];
                $title = $marker['title'];
                $options = $marker['options'];

                $setup .= 'marker = new google.maps.Marker({';
                $setup .= "position: new google.maps.LatLng({$loc[0]},{$loc[1]}),";
                $setup .= 'map: map,';
                $setup .= "title:'{$title}',";
                $setup .= substr(json_encode($options), 1, -1);
                $setup .= '});';

                if (isset($marker['events']) && is_array($marker['events']))
                {
                    foreach ($marker['events'] as $type => $handler)
                    {
                        $setup .= 'google.maps.event.addListener(marker, "' . $type . '", ' . $handler . ');';
                    }
                }
            }
        }

        $setup .= $this->getAdditionalJavascript();

        if ($this->isAsync())
        {
            $asynccallback = $this->getAsyncCallback();

            $output = '<script type="text/javascript">';
            $output .= "function {$asynccallback}() {";
            $output .= $setup;
            $output .= '}';

            $onload = "function() {";
            $onload .= 'var script = document.createElement("script");';
            $onload .= 'script.type = "text/javascript";';
            $onload .= "script.src = '{$scheme}://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" : "")
                . "sensor={$sensor}&callback={$asynccallback}';";
            $onload .= 'document.body.appendChild(script);';
            $onload .= '}';
        }
        else
        {
            $output = "<script src='https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap'>";
            $output .= '</script>';
            $output .= '<script type="text/javascript">';

            $onload = "function() {";
            $onload .= $setup;
            $onload .= '}';
        }

        switch ($this->getAutoload())
        {
            case 'onload':
            $output .= "window.onload={$onload};";
            break;

            case 'jquery':
            $output .= "jQuery(document).ready({$onload});";
            break;

            case 'mootools':
            $output .= "window.addEvent('domready',{$onload});";
            break;
        }

        $output .= '</script>';

        return $output;
    }

    /**
     * Method to retrieve the div that the map is loaded into
     *
     * @return  string  The body
     *
     * @since   12.3
     */
    public function getBody()
    {
        $id = $this->getMapId();
        $class = $this->getMapClass();
        $style = $this->getMapStyle();

        $output = "<div id='{$id}'";

        if (!empty($class))
        {
            $output .= " class='{$class}'";
        }

        if (!empty($style))
        {
            $output .= " style='{$style}'";
        }

        $output .= '></div>';

        return $output;
    }

    /**
     * Method to get the location information back from an address
     *
     * @param   string  $address  The address to geocode
     *
     * @return  array  An array containing Google's geocode data
     *
     * @since   12.3
     */
    public function geocodeAddress($address)
    {
        $uri = JUri::getInstance('https://maps.googleapis.com/maps/api/geocode/json');

        $uri->setVar('address', urlencode($address));

        if (($key = $this->getKey()))
        {
            $uri->setVar('key', $key);
        }

        $response = $this->http->get($uri->toString());

        if ($response->code < 200 || $response->code >= 300)
        {
            throw new RuntimeException('Error code ' . $response->code . ' received geocoding address: ' . $response->body . '.');
        }

        $data = json_decode($response->body, true);

        if (!$data)
        {
            throw new RuntimeException('Invalid json received geocoding address: ' . $response->body . '.');
        }

        if ($data['status'] != 'OK')
        {
            if (!empty($data['error_message']))
            {
                throw new RuntimeException($data['error_message']);
            }

            return null;
        }

        return $data['results'][0];
    }
}

2 个答案:

答案 0 :(得分:0)

请参阅Whats the API Key for in Google Maps API V3?

截至2016年6月22日,Google地图V3不再支持无密钥访问,因此您需要为之前从未拥有过Google地图的每个(推荐人)域名获取密钥。

在此处获取您的密钥:https://developers.google.com/maps/documentation/javascript/get-api-key

答案 1 :(得分:0)

这只是Joomla谷歌地图课程 - 本身,该课程没有做任何事情。如果您要复制并粘贴代码,则应该是您遇到问题的代码。

您需要先创建一个JRegistry选项变量,然后使用api键等内容填充它。

然后,您必须使用您粘贴的类来创建新的地图对象

$ map = new JGoogleEmbedMaps($ options)...