Geocoding with PHP and the Google Maps API

Original author: Quentin Zervaas
  • Translation
Большинство приложений в интернете сейчас начинает встраивать карты местности.
Работе с картами, используя Google Map API, посвящена данная статья.

Далее описываются принципы работы с Google API, реализованы наипростейшие классы используя SimpleXML (многим может показаться, что код чрезвычайно прост). Термины geocoding и geocoder в статье оставлены на английском языке.


Введение

Geocoding — это процесс нахождения широты и долготы по введенному адресу. Google предоставляет бесплатный доступ к разработанному инструментарию, доступ к которому можно получить используя как JavaScript API, так и вебсервис… В этой статье показывается как получить доступ к вебсервису geocoder, использую PHP.
Существует большое количество приложений для определения широты и долготы, многие из них бесплатны. Вот некоторые примеры как можно их использовать:
  • Отрисовка адреса, введенного пользователем на карте
  • Использование широты и долготы для вычислений (например нахождения расстояния)
  • Проверка адреса при заказе в интернет-магазине

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

Начало работы с Google Maps

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

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

Когда вы осуществляете запрос к geocoder, вы можете указать в каком формате вы желаете получить ответ. Возможные варианты форматов: JSON, XML, KML и CSV. В данной статье описаны манипуляции с ответами в XML.
KML (расшифровка Keyhole Markup Data) это XML формат, разработанный для использования программой Google Earth. Данные ответов в KML и XML от geocoder идентичны.
Несмотря на то, что JSON используется обычно с JavaScript, мы можем также использовать его в своем приложении. Для работы с JSOM, используя PHP, посмотрите следующие функции (начиная с PHP 5.2.0). В данной статье для обработки XML данных от geocoder используется расширение SimpleXML
Для осуществления запроса к geocoder должен быть послан HTTP-запрос по адресу maps.google.com/maps/geo. Ниже описаны параметры запроса:
  • q – адрес, координаты которого надо определить
  • key – ключ Google Maps API
  • output – формат результата (json, xml, kml или csv)

Например, для того чтобы получить координаты Белого дома (расположенного по адресу 1600 Pennsylvania Avenue, Washington, DC), необходимо составить следующий запрос: maps.google.com/maps/geo?q=1600+pennsylvania+ave+washington+dc&output=xml&key=123456
Замените 123456 на свой ключ
Строгость формата строки, которую вы посылаете в запросе, не критична, однако не должно быть двусмысленности

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

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



В данном ответе выделим 3 важных элемента:
  • 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: Сделано слишком много запросов, используя данный ключ
  • Placemark: Если поле Status равно 200, в возвращенном XML присутствует хотя бы один элемент Placemark, который содержит информацию о переданной строке.

Первый полезный элемент, который включается в каждый элемент placemark это отформатированный адрес address. Это очень важно, так как пользователи по разному могут вводить одинаковые адреса. Если посмотреть на пример выше, то можно увидеть, что была введена для поиска строка «1600 pennsylvania ave washington dc», а в качестве ответа получена «1600 Pennsylvania Ave NW, Washington, DC 20006, USA».
Следующий элемент это AddressDetails, который использует Extensible Address Language (xAL) для предоставления информации. У данного элемента есть атрибут Accuracy, который указывает степень точности определения местоположения. Возможные значения атрибута Accuracy:
  • 0: Unknown
  • 1: Country
  • 2: Region
  • 3: Sub-region
  • 4: Town
  • 5: Postcode
  • 6: Street
  • 7: Intersection
  • 8: Address

В примере выше значение атрибута равно 8, что указывает на самый высокий уровень точности.
Другие элементы внутри элемента AddressDetails описывают части найденного места в соответствии со спецификацией языка xAL.
Каждый элемент placemark содержит элемент Point. Этот элемент содержит данные разделенные запятой. Первый элемент — долгота; второй — широта; третий аргумент – высота над уровнем моря (не используется).

Доступ к данным Geocoder используя SimpleXML
Для разбора полученного XML мы будем использовать SimpleXML, расширение которое делает работу с XML в PHP достаточно легкой. SimpleXML встроен в PHP, начиная с PHP 5.
Для прочтения данных XML, необходимо инициализировать объект SimpleXMLElement, передав в его конструктор строку XML, которую мы хотим разобрать.
$str = «XML-строка»; // sample XML file
$xml = new SimpleXMLElement($str);

Создав объект класса SimpleXMLElement, мы можем получить доступ ко всем элементам XML-строки, как будто это обыкновенные свойства объекта. Например, можно получить досуп к статусу ответа, используя следующий код:
$xml = new SimpleXMLElement($geocoderResponse);
echo $xml->Response->Status->code;

Надо отметить, что тип $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

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

Приступим к реализации класса Geocoder. Этот класс будет содержать метод lookup(), входными данными которого будет являтся адрес для поиска, в качестве результат возвращаться будет массив из элементов класса Placecmark с найденными местами.
Код ниже показывает часть реализации класса. Сначала определяется адрес geocoder. Мы определяем необходимое количество констант, соответствующих статусу возврата. Использование констант делает код более читаемым и поддерживаемым. Для консистентности мы используем те же константы, что определены для JavaScript API
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

Сейчас мы реализуем класс Placemark, который будет использован для хранения информации о местоположении. Предпочтительно конечно сохранять все части адреса возвращенные от geocoder, мы ограничимся сохранением трех элементов:
  • Широта и долгота места (используя класс Point)
  • Форматированный адрес, возвращенный от geocoder
  • Точность определения места

Для реализации этого класса мы напишем функции установки и получения значений (функции setPoint(), getPoint(), setAddress(), getAddress(), setAccuracy() и getAccuracy()). Мы также реализуем статический метод FromSimpleXml(), который используется в классе Geocoder.
В классе Placemark мы определим константы отвечающие за точность определения местоположения. Например, для определения определена ли только страна необходимо использовать следующее
if ($placemark->getAccuracy() == Placemark::ACCURACY_COUNTRY) {… }

Реализация.
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 позволит вам снизить нагрузку и увеличить производительность в будущем.

Ссылки

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 53

    0
    Я где бы почитать побольше на русском о самом Google Maps как там красивые метки создавать, как там картинки на карте размещать и т.д? Спасибо заранее!
      +1
      По русский похоже не где. Да и на Google Maps API все вроде понятно, даже без знания английского.
        0
        Ну там как-то примитивно, а вот как например сделано на томже МирТесен или Автоточках? Там вообще каике-то DIV накладываются на карту или както так, вообще замудрено сделано (((
          0
          Я делал свою карту на основе google maps, узнавал все только из API, получилось не хуже чем мир тесен, с красивыми иконками для маркеров, с картинками и прочее. Там есть все что нужно поверьте...
            0
            а глянуть можно?
              0
              Гляньте на миртесен. Все открыто.
              По поводу своих "облачков" смотрите в сторону Custom Overlays
              http://code.google.com/apis/maps/documen…
              Я полностью согласен с предыдущим каментом. Справочника по АПИ от гугла достаточно чтобы реализовать любой функционал на карте.
      0
      пригодится, спасибо.
        –7
        многовато букв и кода:(
        а не проще бы было:
        -начало поста-
        Гугл апи юзать так:
        http://www.google.com/search?q=google+maps+api+php
        http://www.phpinsider.com/php/code/GoogleMapAPI/
        http://www.phpriot.com/articles/google-maps-geocoding
        http://www.coastrentals.com/tech/2006/09/20/php-geocoding-tutorial-with-the-google-maps-api-part-one/

        -конец поста-

        :)
          +2
          ну тогда большая часть всех постов должна представлять собой кучу ссылок, находящихся в неком каталоге и организована по принципу FAQ :-)
          Я вверху написал, что большинство кода можно и пропустить, написание геттеров и сеттеров - детский сад.
          Однако для тех кто изучает - это может быть полезно
            0
            peace :)
          0
          Спасибо, отличный материал! +1 к карме!
            0
            А меня вот интересует, с помощью этого можно сделать выбор адреса при регистриции, чтобы выбирать сначала страну, потом подгружался выбор области/штата, далее города, улицы?

            Возможно существуют другие сервисы, позволяющие это сделать, или какие-нибуть базы данных, которые можно скачать?
              0
              в каком-то посте проходила информация о населенных пунктах, кто-то даже собирался выкачивать ее
              список городов можно посмотреть на википедии
                0
                Посмотреть или взять скриптом, автоматически? Я вот тоже интересуюсь как получить не забивая ручками всю структуру Города-районы-страны. Вроде же часто используемые данные, должен быть где то сервис.
                  0
                  У меня есть mysql база, с такими данными.
                  ~13 mb.
                  Кому нужно стучитесь в личку!
                    0
                    привет
                    если можно, скинь пожалуйста ее на termopro сабако гугльмыло ком
                      0
                      Очень буду благодарен: enzonieri [at] gmail.com
                      0
                0
                данке шён за инфу!
                  0
                  спасибо за статью. а есть в планах написание статьи о хранении всех маркеров в базе данных и отображении их на карте? понятно что загрузить все маркеры на карту можно, но логичнее загружать только те которые рядом с местом просмотра. вот меня это озадачило в свое время.
                    0
                    Ну и как получилось реализовать?
                    Если да, то дай ссылку
                      0
                      нет, я не разобрался. я просто ковырялся и думал как такое можно реализовать если надо будет сервис делать %)
                        +1
                        Да честно говоря, я это реализовал ничего сложного... 1. Сначала подгружаются маркеры, входящие в область видимости:
                        посылаем ajax запрос с координатами окна (map.getBounds()), который возвращает javascript, который создает маркеры(берет из базы)...Причем javascript ом проверяем, поставили ли уже такой маркер.
                        2. На изменение зума и на перемещение карты (drag)
                        вешаем тот же ajax запрос.
                        Сумбурно как то ответить получилось.. Но это прекрасно работает и без тормозов.
                      0
                      Тогда нужно смотреть в сторону KML — там можно указывать области видимости
                        0
                        так если у вас есть координаты широты и долготы, то близость объектов вы можете вычислить сами
                        а поиск объектов в БД, у вас сведется к sql-запросу с хитрым условием
                        0
                        "Когда вы используете Google Maps для отображения карт на сайте, самый лёгкий путь использовать JavaScript API, однако это не всегда является оптимальным решением.
                        Например, если ваше приложение записывает координаты по адресу, который вводит пользователь, данное решение не будет работать для тех пользователей, у которых отключен JavaScript."

                        Не очень я понял. Как такое может быть? GoogleMaps работает на JS, и как в этом случае у юзера может быть выключен JS?
                          0
                          Тут от google maps используется только геокодинг, а для этого достаточно отправить запрос. Гуглу как-то все равно, кто его ответ будет обрабатывать — javascript или другой язык.
                          +1
                          В работе с google maps api я столкнулся со следующими косяками:
                          1. Не поддерживаются номера русских домов.
                          По полученному xml нельзя определить, нашли мы дом или улицу.
                          Accuracy (при поиске дома) выдает 6, хотя должен 8.
                          2. Мы можем изменять маркер (при наведении мышки), только на изображения того же размера. (нету marker.setIcon())
                          3. Запросы ajax (getLocations, getLatLng) выполняются асинхронно
                          (неизвестно в каком порядке, когда выполнится callback).
                          Все это решается с помощью костылей(кроме 2), но это отражается на скорости работы.

                          Может тут каждый напишет, какие баги у него возникают при работе с google maps?

                          Да еще было бы неплохо если бы в google был reverse geocoding (по координатам выдает адрес). Существуют отдельные системы позволяющие его делать, но с Россией работают плохо.
                            0
                            > неплохо если бы в google был reverse geocoding
                            Он есть (хотя пока и без официального релиза)-- http://solenko.blogspot.com/
                              0
                              Насколько я понимаю, это сторонняя разработка, использующая GDirections.
                              То есть по сути это костыль.
                              0
                              Reverse Geocoder for Google Maps API, правда, как выше написали это тоже «костыль» основанный на GDirections…
                                0
                                вы знаете, очень странно про номера русских домов
                                Я очень часто ищу адреса, с помощью maps.google.com, все нормально работает
                                я очень сомневаюсь, что там другой алгоритм и механизм работы
                                  +1
                                  Вы правы!
                                  Через maps.google.com и просто через maps google api, при поиске дома, указатель корректно на него ставится.
                                  Я же говорю про то что, полученный "placemark"(получается при запросе на google maps api) содержит в себе иерархию страна-область-город-район-улица.
                                  И в нем нет номера дома!!(который по идее должен входить в поле улица). Соответсвенно, со стороный программной логике сложно(но можно, через одно место) определить человек нашел дом или нет.
                                  0
                                  Возникла еще проблема :( Я формирую html-страницу, где записаны какие-то города (штук 20 пока) и при использование js geocoding (getLatLng, наверно вы про это написали в третьем пункте, я не очень понял) не на все запросы приходят ответы. Пришлось использовать timeinterval в 400ms для каждого запроса (подобрано опытным путем), и если ответ не success то увеличивать интервал += 10. Кто-нибудь сталкивался с этим? Как решали?
                                  0
                                  Спасибо, добавляю в избранное!
                                    0
                                    Столкнулся с проблемой, много что перерыл, так и не нашел ответа. Может здесь кто подскажет..
                                    Мне нужно поверх карты америки нарисовать штаты, и выделить их разным цветом.

                                    Я сделал так: написал скриптик на js, который грузит карту, а я просто тыкаю мышкой по ней, выделяя все штаты, а скрипт потом выдает мне координаты всех точек. Но таким образом нельзя получить точных границ, так как количество точек ограничено, иначе я просто замучаюсь с ними, да и отрисовываться будут долго :) Скрипт рисовал каждый штат с помощью GPolygon (вроде так, не помню уже точно), задавая разные цвета.

                                    Вопрос: Как нарисовать все штаты на карте, чтобы можно было каждый штат закрасить своим цветом, и границы были четкие (шли ровно по граница в google maps'e). Желательно чтобы это работало побыстрее как-нибудь :)
                                    Вариант накладывания на карту изображения рассматривал, но там ограничения которые меня не устраивают..
                                    Хэлп =)
                                      0
                                      http://www.census.gov/geo/www/cob/st2000.html - тут файлы с границами штатов.(Lat, Lon)
                                      формат файла Shapefile ArcView
                                      Если поможет скажи...
                                      потому что тоже с этим бороться предстоит
                                        0
                                        Боюсь что не поможет.. Я находил подобное... Там файлик со всеми коородинатами в Сжатом виде весит под 1.5 мб... В распакованном под 5 мб =D Мне кажется что пользователи это не потянут =)
                                        Так что скорее всего единственным решением остается накладывание картинки на карту... В принципе не такой плохой вариант, можно отключить возможность zoom'a у юзера, и никто не заметит, что границы штата, почему-то не растягиваются =) Либо взять большую тестуру, и обрабатывать zoom самому =)
                                        Надо еще с прозрачностью поэксперементировать... В общем большое поле для деятельности =) Пока заказчик вроде не требует красоты в карте, так что я еще подожду с апдейтом карты посредством своих текстур )
                                          0
                                          хттп://econym.googlepages.com/example_states2.htm
                                            0
                                            Спасибо за ссылку!
                                            140кб, уже намного лучше :) Можно было бы использовать, если бы файл кэшировался при загрузке в карту (я лично этого не заметил), поэтому видимо унивесального решения нет. Можно конечно проредить этот файлик... Но все это компромиссы ИМХО. Пока оставлю текущую версию моего скрипта, в принципе карта там нормальная. Кому интересно: http://localrealestatedeals.com . Это не реклама, сайт не мой, я просто аутсорсер :)
                                      0
                                      Кто-нибудь может подсказать сервис геокодинга почтовых кодов Великобритании?
                                        0
                                        Сразу попало в избранное. Отличная статья, огромное спасибо.)
                                          0
                                          А реально реализовать привязку к картам гугла базы клиентов?
                                          т.е. есть фирма, у неё во внутренней сети стоит сервер, на котором крутится WinServer2003, PHP и MySQL + лаз в интернет. Туда забита информация по клиентам (потенциальным и тех, с которыми уже заключены договора) и sales-менеджерам надо выезжать на встречи (в базе есть адреса, разумеется).
                                          На сколько реально сделать разбивку карты по районам (через почтовые индексы, по-видимому) для оптимизации пути менеджеров?
                                          И "адрес сайта" для для получения ггловского ключа в данном случае - это IP сервера на котором это будет всё работать?
                                            0
                                            не подскажите в чём может быть проблема. прочитав эту статью.спасибо.решил воспользовать тоже. на одном из моих хостингов нет curl - в итоге я решил делать в ручную. через обычный socket - примерно такого рода.

                                            function CallGoogleService() {
                                            $fp = fsockopen($this->googleHost, $this->googlePort);
                                            if($fp) {
                                            $this->address = urlencode($this->address);
                                            $addr = "/maps/geo?q=".$this->address."&output=xml&key=".$this->googleKey;
                                            echo $addr."";
                                            fputs($fp, "GET ".$addr."\r\n HTTP/1.1\r\n");
                                            $request = fgets($fp);
                                            fclose($fp);

                                            Почему то когдая передаю адрес на русском языке -
                                            $googlegeocode = new GeoCode();
                                            $googlegeocode->address = "город Москва улица Петрозаводская";


                                            то возращается ошибка 602. Беру полечнный резуьтат что передаю в гете и вставляю в броузер - /maps/geo?q=%E3%EE%F0%EE%E4+%CC%EE%F1%EA%E2%E0+%F3%EB%E8%F6%E0+%CF%E5%F2%F0%EE%E7%E0%E2%EE%E4%F1%EA%E0%FF&output=xml&key=/*my key*/
                                            то в броузер возращаются коррдинаты. Не могу понять в чём проблема общения через сокет. :-(
                                              0
                                              Сразу так сказать сложно, сравните какой запрос шлет curl с тем запросом который формируется у вас
                                              параметр CURLOPT_VERBOSE
                                                0
                                                проделал тоже самое через curl - аналогичная ситуация. в то время как беру строку с гет параметрами вставляю в броузер эксплорер ответ приходит - в опере тоже- а вот в файерфоксе ситуация аналогична моей проблеме. каким то образовм броузеру отсылают дополнительную информацию в сокет блягодаря чему адрес распознаётся. возможно как то указывается или прелбразуется ти кодировки...
                                                  0
                                                  проблема решена - гугл всегда принимает в кодировке utf-8 поэтому пришлось преоразовать адрес.
                                              0
                                              У меня стоит задача сделать детальную карту города, фоток на который нет в google maps. Реально нарисовать как-то самому это все используя гугловский api?
                                                0
                                                Вам возвращаются координаты.
                                                Сделайте фотки и привяжите их к их координатам. Потом посмотрите в примерах на гугле как сделаны различные маркеры
                                                0
                                                не врубаюсь..
                                                есть у меня свой сайт, на котором вставлен гугл мапс, я написал для него mapplet, каким образом и где мне в коде своего сайта указать ург этого маплета, его ессесно видно публично по урлу
                                                  0
                                                  ООП все дела, все понятно, но зачем такие сложности?

                                                  Все, что необходимо по сути для работы карты, это координаты.
                                                  Каждый раз их смысла брать нету, поэтому лучше записать сразу в БД к адресу, далее метку можно любую проставить.
                                                  и вот что получилось…

                                                  $Address = "Нужный адрес";
                                                  $XML_URL = "http://maps.google.com/maps/geo?q=".urlencode($Address)."&output=xml&oe=utf8\&sensor=true&key= ...";
                                                  $Point_XML = "";
                                                  if (!($fp = @fopen($XML_URL, "r"))) { echo "Error..."; }
                                                  while ($data = fread($fp, 4096)) {$Point_XML .= $data;}
                                                  $xml = simplexml_load_string($Point_XML);
                                                  foreach($xml->Response->Placemark->Point->coordinates as $Point)
                                                  {
                                                  	list($longitude, $latitude, $elevation) = explode(',', $Point, 3);
                                                  	$sql = "записываем в БД, чтобы не делать частых запросов";
                                                  }
                                                  

                                                  собственно говоря, на этом всё, примерно 6 функциональных строчек :)
                                                  пробегаемся по всем адресам, записываем в БД, и у нас сетка точек, готовая к выводу на карту
                                                  пример дальнейшего вывода, без лишнего запроса: Пример
                                                    0
                                                    Кто-нибудь знает как реализовать, чтобы, как у гугла, можно было менять маршрут из любой его точки?
                                                      0
                                                      Картинки пропали :( Автор, можешь ли восстановить на какой-нить хабрасторадж или хаброэффект? Полезная статья-то!

                                                      Only users with full accounts can post comments. Log in, please.