На страницах своего блога, я уже рассказывал на примере, об использовании связки jQuery, JSON и API Google Maps v3, смотрите заметку: «Пример совместного использования Google Maps API, JSON и jQuery».
Но, тот пример слишком сложный для понимания, особенно новичкам.
В этой заметке я покажу, как можно использовать jQuery и JSON в месте с Google Maps API v3 на более простом примере.
Для начала мы подготовим файл map.json с данными, которые мы будем отображать на карту.
Он представляет из-себя обычный текстовый файл со структурой в формате JSON следующего содержания:
{ "places": [ { "title": "Кинотеатр КАРО ФИЛЬМ в ТЦ Шоколад", "description": "<div style="text-align:center; width: 250px;">ул. Белинского, 124<br><a rel="nofollow" href="http://www.map.cek.ru/index.php?option=com_content&view=article&id=33&Itemid=145" target="blank">Информация о кинотеатре КАРО ФИЛЬМ в ТЦ Шоколад с афишой фильмов</a></div>", "lat": 56.31927, "lng": 44.026297 }, { "title": "Кинотеатр Октябрь", "description": "<div style="text-align:center">ул. Большая Покровская, 51а<br><a rel="nofollow" href="http://www.map.cek.ru/index.php?option=com_content&view=article&id=27&Itemid=139" target="blank">Информация о кинотеатре Октябрь с афишой фильмов</a></div>", "lat": 56.31721300000001, "lng": 43.993976 }, { "title": "Кинотеатр Синема Парк", "description": "<div style="text-align:center">ул. Родионова, 187<br><a rel="nofollow" href="http://www.map.cek.ru/index.php?option=com_content&view=article&id=24&Itemid=143" target="blank"><img src="http://www.map.cek.ru/images/stories/afisha/cinema/sinemapark.jpg" width="100" height="62"></a></div>", "lat": 56.308056, "lng": 44.073827 } ] } |
Здесь представлены данные о трех местах Нижнего Новгорода, кинотеатрах, в виде данных для меток и описанием в балуне, а также географическими координтатами.
Запись для каждой метки имеет следующую структуру:
— название (title);
— описание (description) — оно будет отображаться в балуне;
— значения координат (lat и lng)
Все три метки объединены в одну группу places.
Т. к. JSON формат представляет из себя набор пар ключ/значение каждый элемент которой заключен в кавычки, то нам необходимо проводить экранирование остальных кавычек с помощью символа (обратный слеш).
Теперь напишим код, который выводит данные из файла map.json на Google Maps в месте с меню.
Код файла:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Используем jQuery и JSON в месте с Google Maps API v3 - пример 1</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> var map; var arrMarkers = []; var arrInfoWindows = []; function mapInit(){ var centerCoord = new google.maps.LatLng(56.316667, 44); var mapOptions = { zoom: 13, center: centerCoord, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("map"), mapOptions); //Загружаем данные в формате JSON из файла map.json $.getJSON("map.json", {}, function(data){ $.each(data.places, function(i, item){ $("#markers").append('<li><a href="#" rel="' + i + '">' + item.title + '</a></li>'); var marker = new google.maps.Marker({ position: new google.maps.LatLng(item.lat, item.lng), map: map, title: item.title }); arrMarkers[i] = marker; var infowindow = new google.maps.InfoWindow({ content: "<h3>"+ item.title +"</h3><p>"+ item.description +"</p>" }); arrInfoWindows[i] = infowindow; google.maps.event.addListener(marker, 'click', function() { infowindow.open(map, marker); }); }); }); } $(function(){ //Определяем карту (добавляем маркеры, балуны и список со ссылками) mapInit(); // "live" отслеживает событие клика по ссылке $("#markers a").live("click", function(){ var i = $(this).attr("rel"); arrInfoWindows[i].open(map, arrMarkers[i]); }); }); </script> <style type="text/css" media="screen"> img { border: 0; } #map{ width: 800px; height: 500px; } #content { position: fixed; top: 10px; left: 800px; margin: 30px; } </style> </head> <body> <div id="container"> <div id="header"></div> <div id="map"></div> <div id="content"> <ul id="markers"></ul> </div> </div> </body> </html> |
В самом начале перед подключением API Google Maps v3, мы подключаем JavaScript-библиотеку jQuery, с помощью ее мы будем загружать и обрабатывать данные из файла map.json.
Далее определяем глобальные переменные: map – карту, массив для хранения данных для маркеров — arrMarkers и массив с данными для балунов — arrInfoWindows.
После этого в функции mapInit определяем начальные параметры карты, а с помощью метода getJSON библиотеки jQuery, мы загружаем данные из файла map.json.
В цикле формируем массивы данных для меток и балунов.
Тут же формируем меню для перехода к отдельным меткам.
Функция без названия вызывается сразу после полной загрузки кода страницы, из нее происходит вызов функции mapInit, а также обрабатывается событие клика по ссылке из меню меток.
На карте расставляются метки, а с права формируется меню.
Если щелкнуть по какой-либо ссылке из меню, то на карте откроется балун с информацией об этой метке.
Из примера, мы видим, что одну метку не видно на карте после загрузки.
Для того, чтобы все метки были сразу видны, необходимо задать область видимости и предать ей координаты всех меток.
Для этого добавляем три строчки кода.
перед строкой $.getJSON("map.json", {}, function(data){
Добавляем строчку
var latlngbounds = new google.maps.LatLngBounds();
В цикле перед строкой arrMarkers[i] = marker;
Добавляем строчку
latlngbounds.extend(new google.maps.LatLng(item.lat, item.lng));
И в конце функции mapInit перед скобками });
добавляем строку для центрирования и масштабирования области с метками
map.setCenter( latlngbounds.getCenter(), map.fitBounds(latlngbounds));
Код измененого файла:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Используем jQuery и JSON в месте с Google Maps API v3 - пример 2</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> var map; var arrMarkers = []; var arrInfoWindows = []; function mapInit(){ var centerCoord = new google.maps.LatLng(56.316667, 44); // Puerto Rico var mapOptions = { zoom: 13, center: centerCoord, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("map"), mapOptions); //Определяем область отображения меток на карте var latlngbounds = new google.maps.LatLngBounds(); //Загружаем данные в формате JSON из файла map.json $.getJSON("map.json", {}, function(data){ $.each(data.places, function(i, item){ $("#markers").append('<li><a href="#" rel="' + i + '">' + item.title + '</a></li>'); var marker = new google.maps.Marker({ position: new google.maps.LatLng(item.lat, item.lng), map: map, title: item.title }); //Добавляем координаты меток latlngbounds.extend(new google.maps.LatLng(item.lat, item.lng)); arrMarkers[i] = marker; var infowindow = new google.maps.InfoWindow({ content: "<h3>"+ item.title +"</h3><p>"+ item.description +"</p>" }); arrInfoWindows[i] = infowindow; google.maps.event.addListener(marker, 'click', function() { infowindow.open(map, marker); }); }); //Центрируем и масштабируем карту так, чтобы были видны все метки map.setCenter( latlngbounds.getCenter(), map.fitBounds(latlngbounds)); }); } $(function(){ //Определяем карту (добавляем маркеры, балуны и список со ссылками) mapInit(); // "live" отслеживает событие клика по ссылке $("#markers a").live("click", function(){ var i = $(this).attr("rel"); arrInfoWindows[i].open(map, arrMarkers[i]); }); }); </script> <style type="text/css" media="screen"> img { border: 0; } #map{ width: 800px; height: 500px; } #content { position: fixed; top: 10px; left: 800px; margin: 30px; } </style> </head> <body> <div id="container"> <div id="header"></div> <div id="map"></div> <div id="content"> <ul id="markers"></ul> </div> </div> </body> </html> |
И еще одно замечание.
Если нажимать по ссылкам в меню, то открываются новые балуны, а старые не закрываются
Чтобы этого не происходило, нужно добавить еще немного кода перед строкой:
arrInfoWindows[i].open(map, arrMarkers[i]);
Строку:
for(x=0; x < arrInfoWindows.length; x++){ arrInfoWindows[x].close(); }
Код измененого примера:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Используем jQuery и JSON в месте с Google Maps API v3 - пример 3</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> var map; var arrMarkers = []; var arrInfoWindows = []; function mapInit(){ var centerCoord = new google.maps.LatLng(56.316667, 44); var mapOptions = { zoom: 13, center: centerCoord, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("map"), mapOptions); //Определяем область отображения меток на карте var latlngbounds = new google.maps.LatLngBounds(); //Загружаем данные в формате JSON из файла map.json $.getJSON("map.json", {}, function(data){ $.each(data.places, function(i, item){ $("#markers").append('<li><a href="#" rel="' + i + '">' + item.title + '</a></li>'); var marker = new google.maps.Marker({ position: new google.maps.LatLng(item.lat, item.lng), map: map, title: item.title }); //Добавляем координаты меток latlngbounds.extend(new google.maps.LatLng(item.lat, item.lng)); arrMarkers[i] = marker; var infowindow = new google.maps.InfoWindow({ content: "<h3>"+ item.title +"</h3><p>"+ item.description +"</p>" }); arrInfoWindows[i] = infowindow; google.maps.event.addListener(marker, 'click', function() { infowindow.open(map, marker); }); }); //Центрируем и масштабируем карту так, чтобы были видны все метки map.setCenter( latlngbounds.getCenter(), map.fitBounds(latlngbounds)); }); } $(function(){ //Определяем карту (добавляем маркеры, балуны и список со ссылками) mapInit(); // "live" отслеживает событие клика по ссылке $("#markers a").live("click", function(){ var i = $(this).attr("rel"); // Эта строка кода, закрывает все открытые балуны, для открытия выбранного for(x=0; x < arrInfoWindows.length; x++){ arrInfoWindows[x].close(); } arrInfoWindows[i].open(map, arrMarkers[i]); }); }); </script> <style type="text/css" media="screen"> img { border: 0; } #map{ width: 800px; height: 500px; } #content { position: fixed; top: 10px; left: 800px; margin: 30px; } </style> </head> <body> <div id="container"> <div id="header"></div> <div id="map"></div> <div id="content"> <ul id="markers"></ul> </div> </div> </body> </html> |
Скачать архив с файлами примеров.
В заключении заметки я хочу поблагодарить всех тех читателей, кто присылает мне различные вопросы и предложения.
Мне они очень помогают при выборе тем для написания новых материалов для блога.
К сожалению, у меня не хватает времени ответить на них каждому из написавших персонально, помочь выполнить ту или иную работу.
Я буду стараться максимально полно отвечать на них на страницах блога, а также в новом проекте, где по этапам, подробно на конкретном примере рассказывать о реализации интерактивных картографических проектов.
Сергей, добрый день. Напишите мне пожалуйста на почту.
Писал Вам в FaceBook и по почте, Вы наверно не видели.
Спасибо, жду.
Здравствуйте.
Блог понравился, очень интересный.
Но вот есть вопрос.
Сейчас стоит задача написать динамическую карту, где будет отображаться ОЧЕНЬ много объектов.
Как лучше сделать понимаю в двух словах не объяснить, но может есть где почитать?