На своем блоге я уже рассматривал тему как заменить карты 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 саму карту между . А вот если обновить через админ. панель, либо через регистрацию на сайте, то скрипт подгружает карту в блок.
В чем может быть причина???