На своем блоге я уже писал о том как можно изменить компонент каталога SOBI2 для Joomla, для использования Яндекс.Карт: «Изменяем компонент каталога SOBI2 для Joomla, заменяем карты Google на Яндекс.Карты»; «Изменяем компонент каталога SOBI2 для Joomla – продолжение» .
В этой заметке я познакомлю Вас с тем, как можно использовать свою карту применяя API Google Maps.
Для начала у Вас должен быть уже установлен сам компонент SOBI2 и создана необходимая структура каталога.
В поля координат забиты соответствующие координаты.
При просмотре полной информации о записи наблюдаем:
Теперь давайте заменим карту Google на свою карту.
Предварительно нужно подготовить растровое изображение своей карты для необходимых уровней масштаба и разрезать его на тайлы размером 256 на 256 пикселей.
В результате у Вас должно получиться примерно следующее
Исходный код данной страницы:
<script src="http://maps.google.com/maps?file=api&v=2&sensor=true&key=ABQIAAAACHCJdlgAEGcD_flKUFEmVhTebch7GpJ_aaTy16RbT6kCxYZZEBSjZEe9Alx52DXyusD29r0S9iN6qA" type="text/javascript"></script> <center><div id="map" style="width: 600px; height: 400px"></div></center> <script type="text/javascript"> //<![CDATA[ // ============================================================ function CustomGetTileUrl(a,b) { if ( b == 11 && a.x >= 1272 && a.x <= 1275 && a.y >= 633 && a.y <= 635 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 12 && a.x >= 2545 && a.x <= 2550 && a.y >= 1266 && a.y <= 1271 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 13 && a.x >= 5090 && a.x <= 5100 && a.y >= 2533 && a.y <= 2543 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 14 && a.x >= 10180 && a.x <= 10200 && a.y >= 5067 && a.y <= 5087 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 15 && a.x >= 20361 && a.x <= 20400 && a.y >= 10135 && a.y <= 10174 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 16 && a.x >= 40723 && a.x <= 40801 && a.y >= 20270 && a.y <= 20348 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 17 && a.x >= 81446 && a.x <= 81603 && a.y >= 40540 && a.y <= 40697 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 18 && a.x >= 162893 && a.x <= 163206 && a.y >= 81080 && a.y <= 81394 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } return G_NORMAL_MAP.getTileLayers()[0].getTileUrl(a,b); } // ============================================================ if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById('map')); // Определяем тип карты map.addMapType(G_PHYSICAL_MAP); // определяем элементы управления картой map.addControl(new GLargeMapControl()); map.addControl(new GScaleControl()); map.enableScrollWheelZoom(); map.enableContinuousZoom(); // Создаем copyright collection var copyCollection = new GCopyrightCollection('nn-map'); var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(56.1700230, 43.6816406), new GLatLng(56.4260545, 44.1430664)), 0, "Created by Ugolnikov Sergey"); copyCollection.addCopyright(copyright); //Определяем слой нашей карты var tilelayers = new Array(); tilelayers[0] = G_NORMAL_MAP.getTileLayers()[0]; tilelayers[1] = new GTileLayer(copyCollection, 11, 18 ); tilelayers[1].getTileUrl = CustomGetTileUrl tilelayers[1].getOpacity = function () {return 1.00;};//of the non transparent part tilelayers[1].isPng = function() {return false;}; // Устанавливаем параметры для нашего слоя карты var GMapTypeOptions = new Object(); GMapTypeOptions.minResolution = 11; GMapTypeOptions.maxResolution = 18; GMapTypeOptions.errorMessage = "Данные карты не доступны"; //Создаем пользовательский слой var custommap = new GMapType(tilelayers, new GMercatorProjection(22), "nn-map", GMapTypeOptions); custommap.getTextColor = function() {return "#000000";}; map.addMapType(custommap); map.setCenter( new GLatLng(56.2980387, 43.9123535), 14, custommap ); } //]]> </script> |
Сначала загружаем API Google Maps с соответствующим ключом для вашего сайта.
После этого определяем место под карту – элемент div с именем map.
Затем у нас расположена функция CustomGetTileUrl, которая обеспечивает подгрузку тайлов нашей карты поверх карты Google в зависимости от координат и уровня масштаба.
Далее идет функция для определения карты.
Задаем значение переменной map.
Тип карты и элементы управления.
После этого создается объект GCopyrightCollection и он прикрепляется к слою фрагментов, чтобы задать разрешение на использование изображений.
Определяем, как будет формироваться наш слой карты.
Задаем параметры для нашего слоя
И создаем пользовательский слой custommap, центр карты и уровень масштаба.
В паке по адресу http:/www.map.cek.ru/nnmaps – храняться тайлы нашей карты.
Для использования нашей карты в компоненте SOBI2 необходимо отредактировать файл entry.functions.php, который находится по адресу /папка установки Joomla/components/com_sobi2/includes/ .
Открываем его для редактирования.
Находим в нем функцию showGoogleMaps, предпоследняя в файле.
Она отвечает за вывод карты при просмотре полного описания информации о компании, если введены координаты центра в соответствующие поля (filds_latmap и filds_lonmap).
И заменяем весь код в функции между строчками
function showGoogleMaps($mySobi, $config)
{
и
}
function waySearchUrl( $waySearchLink ), на новый код:
if( !$config->useGoogleMaps || !isset( $config->googleMapsApiKey ) ) { return null; } $map_url = $config->key( "google_maps", "google_map_url", "http://maps.google.com"); $map_api_version = $config->key("google_maps", "google_map_apiversion", "2"); $title = $config->jsAddSlashes( $mySobi->title ); $GeoPos = $config->getGeoPosition( $mySobi->id ); if( $GeoPos['lat'] && $GeoPos['long'] && is_numeric( $GeoPos['lat'] ) && is_numeric( $GeoPos['lat'] ) ) { ?> <div style="width: <?php echo $config->googleMapsWidth; ?>px; height: <?php echo $config->googleMapsHeight; ?>px;" id="sobi2GoogleMaps"></div> <script src="<?php echo $map_url?>/maps?file=api&v=<?php echo $map_api_version?>&key=<?php echo $config->googleMapsApiKey ?>" type="text/javascript"></script> <script type="text/javascript"> //<![CDATA[ // ============================================================ function CustomGetTileUrl(a,b) { if ( b == 11 && a.x >= 1272 && a.x <= 1275 && a.y >= 633 && a.y <= 635 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 12 && a.x >= 2545 && a.x <= 2550 && a.y >= 1266 && a.y <= 1271 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 13 && a.x >= 5090 && a.x <= 5100 && a.y >= 2533 && a.y <= 2543 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 14 && a.x >= 10180 && a.x <= 10200 && a.y >= 5067 && a.y <= 5087 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 15 && a.x >= 20361 && a.x <= 20400 && a.y >= 10135 && a.y <= 10174 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 16 && a.x >= 40723 && a.x <= 40801 && a.y >= 20270 && a.y <= 20348 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 17 && a.x >= 81446 && a.x <= 81603 && a.y >= 40540 && a.y <= 40697 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } else if ( b == 18 && a.x >= 162893 && a.x <= 163206 && a.y >= 81080 && a.y <= 81394 ) { return "http://www.map.cek.ru//nnmaps//Z" + b + "/" + a.y + "/" + a.x + ".jpg"; // replace that with a "real" URL } return G_NORMAL_MAP.getTileLayers()[0].getTileUrl(a,b); } // ============================================================ if (GBrowserIsCompatible()) { var center = new GLatLng(<?php echo $GeoPos['lat']; ?>, <?php echo $GeoPos['long']; ?>); var SobiGeoMap = new GMap2(document.getElementById("sobi2GoogleMaps")); // Определяем тип карты SobiGeoMap.addMapType(G_PHYSICAL_MAP); // определяем элементы управления картой SobiGeoMap.addControl(new GLargeMapControl()); SobiGeoMap.enableScrollWheelZoom(); SobiGeoMap.enableContinuousZoom(); // Создаем copyright collection var copyCollection = new GCopyrightCollection('nn-map'); var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(56.1700230, 43.6816406), new GLatLng(56.4260545, 44.1430664)), 0, "Created by Ugolnikov Sergey"); copyCollection.addCopyright(copyright); //Определяем слой нашей карты var tilelayers = new Array(); tilelayers[0] = G_NORMAL_MAP.getTileLayers()[0]; tilelayers[1] = new GTileLayer(copyCollection, 11, 18 ); tilelayers[1].getTileUrl = CustomGetTileUrl tilelayers[1].getOpacity = function () {return 1.00;};//of the non transparent part tilelayers[1].isPng = function() {return false;}; // Устанавливаем параметры для нашего слоя карты var GMapTypeOptions = new Object(); GMapTypeOptions.minResolution = 11; GMapTypeOptions.maxResolution = 18; GMapTypeOptions.errorMessage = "No map data available"; //Создаем пользовательский слой var custommap = new GMapType(tilelayers, new GMercatorProjection(22), "nn-map", GMapTypeOptions); custommap.getTextColor = function() {return "#000000";}; SobiGeoMap.addMapType(custommap); SobiGeoMap.setCenter(center, <?php echo $config->googleMapsZoom; ?>, custommap ); //Определяем метку var marker = new GMarker(center); //Определяем обработчик события при клике на метке GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml('<div style="text-align:center; width: 200px; "><strong><?php echo $title; ?></strong></div>'); }); //Добавляем метку на карту SobiGeoMap.addOverlay (marker); } //]]> </script> <?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"); } |
Здесь код функции похож на код файла nn-map.html с двумя отличиями.
В качестве центра карты и начального уровня масштабы берутся значения полей для соответствующей записи каталога SOBI2, масштаб задается в параметрах отображения.
Мы центр карты помечаем меткой, при клике по которой открывается балун с названием соответствующей записи.
После этого сохраняем измененный файл.
Открываем запись с картой и наблюдаем нашу карту с меткой расположения, щелкнув по которой мы видим балун с надписью: «Победа, развлекательный комплекс».
Все работает нормально.
Может случиться так, что некоторые ранее введенные координаты не совпадут с новой картой, тогда необходимо их изменить.
Не много позже я расскажу, как можно сделать инструмент для определения координат на карте Google Maps, а также как можно использовать его для определения координат объектов на своей карте.
Уведомление: flu-swine.ru