Google map developer php

Geocoding with PHP and the Google Maps API

Вся документация по использованию Google Maps API находится по этому адресу
Первое что необходимо сделать для использования Google Maps API это создать API ключ для вашего сайта. По данному ключу будут идентифицированы все ваши запросы к этому API. Вы можете получить данный ключ, согласившись с правилами использования и введя адрес сайта на странице
В настоящее время максимальное количество запросов к geocoder ограничено и составляет 15000 в день. Но вы можете кэшировать ответы geocoder.
Получив ключ, вы можете обращаться к geocoder. Документацию по использованию geocoder можно найти по адресу

Осуществление запросов к Geocoder

  • q – адрес, координаты которого надо определить
  • key – ключ Google Maps API
  • output – формат результата (json, xml, kml или csv)

Разбор ответа Geocoder

После отправки запроса к geocoder, вы получаете ответ в том формате, который указали. Например, если указанный адрес это адрес Белового Дома, то мы получим в ответ следующий XML-документ:

  • name: Строка адреса, которую мы передаем geocoder
  • Status: Статус ответа, по которому мы можем легко понять что произошло. Далее описание различных возможных состояний:
    • 200: Successful request (хотя бы одно место по введенной строке найдено)
    • 400: Bad request (сервер не понял запрос)
    • 500: Server error (Внутренняя ошибка)
    • 601: Missing query. Отсутствует параметр q или передана пустая строка
    • 602: Unknown address. Ничего не найдено по введенной строке
    • 603: Unavailable address. Переданный адрес отсутствует или не может быть показан из-за юридических или контрактных соображений
    • 610: Неверный ключ Google Maps API
    • 620: Сделано слишком много запросов, используя данный ключ
    • 0: Unknown
    • 1: Country
    • 2: Region
    • 3: Sub-region
    • 4: Town
    • 5: Postcode
    • 6: Street
    • 7: Intersection
    • 8: Address

    Доступ к данным Geocoder используя SimpleXML
    Для разбора полученного XML мы будем использовать SimpleXML, расширение которое делает работу с XML в PHP достаточно легкой. SimpleXML встроен в PHP, начиная с PHP 5.
    Для прочтения данных XML, необходимо инициализировать объект SimpleXMLElement, передав в его конструктор строку XML, которую мы хотим разобрать.

    Создав объект класса SimpleXMLElement, мы можем получить доступ ко всем элементам XML-строки, как будто это обыкновенные свойства объекта. Например, можно получить досуп к статусу ответа, используя следующий код:

    Надо отметить, что тип $xml->Response->Status->code — SimpleXMLElement. Поэтому, необходимо для использования выполнить приведение типов к строке или числу.

    $xml = new SimpleXMLElement($geocoderResponse);
    $status = (int) $xml->Response->Status->code;
    if ($status == 200)

    Сейчас мы знает как читать данные XML, но некоторые элементы содержат атрибуты. Следующий пример показывает как получить доступ к таким атрибутам.

    $xml = new SimpleXMLElement($geocoderResponse);
    foreach ($xml->Response->Placemark as $placemark) $accuracy = (int) $placemark->AddressDetails[‘Accuracy’];
    ($accuracy == 8) <. >
    >

    • Geocoder: Этот класс будет сипользован для работы с geocoder (направления запросов, получения и разбора ответов).
    • Placemark: Этот класс будет содержать места, возвращенные geocoder.
    • Point: В данном классе будут находится координаты найденных мест.

    class Geocoder
    public static $url = ‘http://maps.google.com/maps/geo’;
    const G_GEO_SUCCESS = 200;
    const G_GEO_BAD_REQUEST = 400;
    const G_GEO_SERVER_ERROR = 500;
    const G_GEO_MISSING_QUERY = 601;
    const G_GEO_MISSING_ADDRESS = 601;
    const G_GEO_UNKNOWN_ADDRESS = 602;
    const G_GEO_UNAVAILABLE_ADDRESS = 603;
    const G_GEO_UNKNOWN_DIRECTIONS = 604;
    const G_GEO_BAD_KEY = 610;
    const G_GEO_TOO_MANY_QUERIES = 620;
    protected $_apiKey;
    public function __construct($key)
    $this->_apiKey = $key;
    >
    >

    Как было описано выше, мы реализуем метод lookup(), возвращающий массив объектов типа Placemark. Для получения ответа от geocoder мы напишем метод под названием performRequest().
    Метод performRequest() будет принимать строку адреса в качестве первого аргумента и тип возвращаемых данных в качестве второго аргумента.
    Этот метод используем функции Curl для осуществления HTTP-запросов. Для получения ответов от сервера параметр CURLOPT_RETURNTRANSFER должен быть установлен в true.

    class Geocoder
    public function performRequest($search, $output = ‘xml’)
    $url = sprintf(«%s?q=%s&output=%s&key=%s&oe=utf-8», self::$url, urlencode($search), $output,$this->_apiKey);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
    >
    >

    Сейчас мы вплотную займемся реализацией метода lookup() В начале мы получим ответ от сервера используя метод performRequest(), создадим объект класса SimpleXMLELement. Далее мы прочитаем возвращенный сервером статус запроса. Сингналом о нормальном запросе будет являться статус G_GEO_SUCCESS, G_GEO_UNKNOWN_ADDRESS или G_GEO_UNAVAILABLE_ADDRESS. Последние два значения покажут что не найдено указанных мест, в данном случае будет возвращен пустой массив.
    Если код статуса G_GEO_SUCCESS, мы в цикле будем обрабатывать найденные места и создадим для каждого объекты типа Placemark… Мы напишем метод FromSimpleXml() для создания объекта класса Placemark.
    Для всех других кодов статуса мы будем создавать исключение.

    class Geocoder
    public function lookup($search)
    $response = $this->performRequest($search, «xml»);
    $xml=new SimpleXMLElement($response);
    $status = (int) $xml->Response->Status->code;

    switch ($status)
    case self::G_GEO_SUCCESS:
    require_once(«Placemark.php»);
    $placemarks = array();
    foreach ($xml->Response->Placemark as $placemark)
    $placemarks[] = Placemark::FromSimpleXml($placemark);
    return $placemarks;
    case self::G_GEO_UNKNOWN_ADDRESS:
    case self::G_GEO_UNAVAILABLE_ADDRESS:
    return array();
    default:
    throw new Exception(sprintf(«Google Geo error %d occurred”, $status));
    >
    >
    >

    Это полный код класса Geocoder. Если вы хотите использовать функцию performRequest(), вы можете это сделать, однако сейчас необходимо реализовать класс Placemark до использования метода lookup().

    require_once(«Geocoder.php»);
    $address = «1600 Pennsylvania Ave Washington DC»;
    $geocoder = new Geocoder(‘your key’);
    $xml = $geocoder->performRequest($address, «xml»);
    $json = $geocoder->performRequest($address, «json»);
    $csv = $geocoder->performRequest($address, «csv»);

    Создание класса Placemark

    • Широта и долгота места (используя класс Point)
    • Форматированный адрес, возвращенный от geocoder
    • Точность определения места

    class Placemark
    const ACCURACY_UNKNOWN = 0;
    const ACCURACY_COUNTRY = 1;
    const ACCURACY_REGION = 2;
    const ACCURACY_SUBREGION = 3;
    const ACCURACY_TOWN = 4;
    const ACCURACY_POSTCODE = 5;
    const ACCURACY_STREET = 6;
    const ACCURACY_INTERSECTION = 7;
    const ACCURACY_ADDRESS = 8;
    protected $_point;
    protected $_address;
    protected $_accuracy;
    >

    Google Maps API не определяет именованные константы для точности определения.
    Далее идет определение так называемых сеттеров и геттеров, я пропускаю комментарии автора.

    class Placemark
    // other code
    public function setAddress($address)
    $this->_address = (string) $address;
    >
    public function getAddress()
    return $this->_address;
    >
    public function __toString()
    return $this->getAddress();
    >
    public function setPoint(Point $point)
    $this->_point = $point;
    >
    public function getPoint()
    return $this->_point;
    >
    public function setAccuracy($accuracy)
    $this->_accuracy = (int) $accuracy;
    >
    public function getAccuracy()
    return $this->_accuracy;
    >
    // other code
    >

    В конце мы реализуем метод FromSimpleXml(), который является методом-фабрикой для создания объектов типа Placemark на основе объекта SimpleXMLElement.
    В примере, описанном ниже используется класс Point и его метод Create(), они будут описаны ниже.

    class Placemark
    // other code
    public static function FromSimpleXml($xml)
    require_once(‘Point.php’);
    $point = Point::Create($xml->Point->coordinates);
    $placemark = new self;
    $placemark->setPoint($point);
    $placemark->setAddress($xml->address);
    $placemark->setAccuracy($xml->AddressDetails[‘Accuracy’]);
    return $placemark;
    >
    >

    Создание класса Point

    Последний класс, который должен быть реализован для полноценного использования, — это класс Point. Этот класс хранит широту и долготу. Эти данные передаются в конструкторе, также присутствуют методы получения значений широты и долготы.

    class Point
    protected $_lat;
    protected $_lng;
    public function __construct($latitude, $longitude)
    $this->_lat = $latitude;
    $this->_lng = $longitude;
    >
    public function getLatitude()
    return $this->_lat;
    >
    public function getLongitude()
    return $this->_lng;
    >
    public static function Create($str)
    list($longitude, $latitude, $elevation) = explode(‘,’, $str, 3);
    return new self($latitude, $longitude);
    >
    >

    В данной статье рассмотрен простейший алгоритм работы с geocoder, используя Google Maps. Также вы можете использовать указанные класса вместе с JavaScript, но надо также не забывать, что не у всех может быть включен JavaScript.
    Также не забывайте, что кэширование ответов geocoder позволит вам снизить нагрузку и увеличить производительность в будущем.

    Источник

    Читайте также:  Require php в tpl
Оцените статью