На своем блоге я уже рассматривал тему как заменить карты Google на Яндекс.Карты в заметке: «Изменяем компонент каталога SOBI2 для Joomla, заменяем карты Google на Яндекс.Карты».
Все было бы хорошо, но для отображения расположения фирм в справочнике на карте необходимо в начале определить географические координаты для всех записей.
Это можно сделать несколькими способами:
- Использовать инструмент для определения координат по адресу http://api.yandex.ru/maps/tools/getlonglat/
- Воспользоваться примером «Получение координат для списка адресов»
- Использовать возможность сервиса геокодирования API Яндекс.Карт
Как это сделать я и рассмотрю в данной заметке.
Для определения значений географических координат нам понадобится данные полей карточки для организации: город (field_city) и адрес — улица и дом (field_street).
Нам необходимо изменить код в файле entry.functions.php по адресу: /пака установки Joomla/components/com_sobi2/includes/ .
Нам необходимо заменить код функции showGoogleMaps на следующий:
function showGoogleMaps($mySobi, $config) { if( !$config->useGoogleMaps || !isset( $config->googleMapsApiKey ) ) { return null; } $map_url = "http://api-maps.yandex.ru"; $map_api_version = "1.1"; $title = $config->jsAddSlashes( $mySobi->title ); $GeoPos = $config->getGeoPosition( $mySobi->id ); //if( $GeoPos['lat'] && $GeoPos['long'] && is_numeric( $GeoPos['lat'] ) && is_numeric( $GeoPos['lat'] ) ) { //Добавленная строка $fieldsObjects =& $mySobi->myFields; ?> <script src="<?php echo $map_url?>/<?php echo $map_api_version?>/?key=<?php echo $config->googleMapsApiKey ?>" type="text/javascript"></script> <script type="text/javascript"> //<![CDATA[ YMaps.jQuery(function () { // Создание экземпляра карты и его привязка к созданному контейнеру var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]); //Добавляем элементы управления. map.addControl(new YMaps.TypeControl());//Тип карты, кнопочки Схема, Гибрид, Спутник map.addControl(new YMaps.ToolBar());//Тулбар, кнопки Рука, Лупа, Линейка map.addControl(new YMaps.Zoom());//Увеличение // Создание объекта геокодера var geocoder = new YMaps.Geocoder("<?php echo $fieldsObjects['field_city']->data; ?> <?php echo $fieldsObjects['field_street']->data; ?>"); // По завершению геокодирования инициализируем карту первым результатом YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) { if (geocoder.length()) { map.setBounds(geocoder.get(0).getBounds()); // Создание метки с всплывающей подсказкой var placemark = new YMaps.Placemark(map.getCenter(), {hasHint: 1}); // Добавление метки на карту map.addOverlay(placemark); placemark.openBalloon('<div style="text-align:center; width: 200px; "><strong><?php echo $mySobi->title; ?></strong></div>'); } }); }); //]]> </script> <div style="width: <?php echo $config->googleMapsWidth; ?>px; height: <?php echo $config->googleMapsHeight; ?>px;" id="YMapsID"></div> <?php //} //elseif ( ( strlen( trim($GeoPos['lat'] ) ) && strlen( trim( $GeoPos['long'] ) ) ) && !is_numeric( $GeoPos['lat'] ) || !is_numeric( $GeoPos['lat'] ) ) { // trigger_error("HTML_SOBI::showGoogleMaps(): Given cooordinates ({$GeoPos['lat']}, {$GeoPos['long']}) are not correct. Please enter float values"); //} } |
Пояснение:
Необходимо закомментировать строчки для проверки существования полей с координатами на карте или изменить на новое условие: проверить существуют и заполнены поля field_city и field_street.
Я не делаю данную проверку, т.к. эти поля у меня являются обязательными для заполнения.
Переменной $fieldsObjects мы передаем значение полей карточки организации.
$fieldsObjects =& $mySobi->myFields;
После добавления элементов управления определяем функцию для геокодирования адреса и добавления на карту с открытием балуна:
// Создание объекта геокодера var geocoder = new YMaps.Geocoder("<?php echo $fieldsObjects['field_city']->data; ?> <?php echo $fieldsObjects['field_street']->data; ?>"); // По завершению геокодирования инициализируем карту первым результатом YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) { if (geocoder.length()) { map.setBounds(geocoder.get(0).getBounds()); // Создание метки с всплывающей подсказкой var placemark = new YMaps.Placemark(map.getCenter(), {hasHint: 1}); // Добавление метки на карту map.addOverlay(placemark); placemark.openBalloon('<div style="text-align:center; width: 200px; "><strong><?php echo $mySobi->title; ?></strong></div>'); } }); |
Посмотреть пример работы можно здесь
Скачать новую версию файла entry.functions.php
В заключении несколько замечаний.
Конечно этот вариант кода предпочтительней рассмотренного ранее в заметке «Изменяем компонент каталога SOBI2 для Joomla, заменяем карты Google на Яндекс.Карты», но нужно учитывать некоторые особенности.
Это накладываемые ограничения на операцию геокодирования — количество обращений к сервису геокодирования ограничено 25000 запросов для одного API-Ключа в сутки.
Существует возможность неверного определения координат из-за ошибок в базе геокодера или новых адресов.
Если адрес пользователем при добавлении в справочник введен с ошибками, будут неверно определены координаты.
Крайне любопытная у вас идея проскальзывает — интегрировать CMS с API карт. Я тоже вдохновился подобным и решил попробовать сделать свой примерчик: то бишь, интегрировать WordPress (версии 3.0, которая позволяет добавлять юзерские поля к записям) и Карты Google.
http://giksapiens.ru/wordpress/2010/10/08/wordpress-on-google-map/
Вообще, подобную идею вполне можно развить в неплохой стартап — когда записи блога, новости и прочее динамически появляются в виде меток поверх карт. Как считаете?
(впрочем, есть проблема — записи блога и дневник нужно синхронизировать, а как синхронизировать, если в API карт гугла мне не попались поля для размещения каких-то собственных идентификаторов — только по строке адреса выходит, ну либо по координатам, хотя для этого уже два поля нужно заводить в блоге).
помогите с Joomla Estate Agency 1.0
Подскажите, может кто-то уже делал или знает как в компоненте Joomla Estate Agency 1.0 поменять google map на yandex map.
Карты от google криво отображают адреса, в отличии от yandex.
Пробовал в комментариях добавлять ссылку на yandex map, но она не выходит из компонента. Если просто в статье то все работает.
Может есть другие модули которые напрямую работают с Yandex map???
Буду благодарен за любую подсказку.
Поставил все по инструкции. В Мозиле все нормально, а вот в Опере и Эксплоире не отображается, в чем может быть косяк, и в какую сторону копать?
Вопрос: Если посмотреть на код несохраненной страницы,т.е. которая была добавлена в базу данных, но через админ.панель не была сохранена или не обновлена, то скрипт в файле entry.functions.php, где должен выводит карту не подгружает с yandex саму карту между . А вот если обновить через админ. панель, либо через регистрацию на сайте, то скрипт подгружает карту в блок.
В чем может быть причина???