Изменяем компонент каталога SOBI2 для Joomla 1.5, заменяем карты Google на Яндекс.Карты и используем гекодер для определения координат по адресу.

На своем блоге я уже рассматривал тему как заменить карты Google на Яндекс.Карты в заметке: «Изменяем компонент каталога SOBI2 для Joomla, заменяем карты Google на Яндекс.Карты».

Все было бы хорошо, но для отображения расположения фирм в справочнике на карте необходимо в начале определить географические координаты для всех записей.

Это можно сделать несколькими способами:

  1. Использовать инструмент для определения координат по адресу http://api.yandex.ru/maps/tools/getlonglat/
  2. Воспользоваться примером «Получение координат для списка адресов»
  3. Использовать возможность сервиса геокодирования 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 саму карту между . А вот если обновить через админ. панель, либо через регистрацию на сайте, то скрипт подгружает карту в блок. В чем может быть причина???