На своем блоге, я уже рассматривал пример «Создание карты на сайте с адресами магазинов, с использованием API Яндекс.Карт». Но та версия была для API Яндекс.Карт 1.x.
В этой заметке я расскажу как можно реализовать данный пример, с использованием API Яндекс.Карт версии 2.х.
В начале возьмем три файла без изменений из примера в уже упомянутой заметке.
Это файлы:
mvideo_shops.sql — с исходными данными о магазинах М.Видео, который необходимо загрузить в базу данных MySQL;
searcheshop.php — файл извлекает данные о магазинах М.Видео для конкретного города;
bd.php — файл для соединения с базой данных.
Новый код файла map.html, выводящий карту будет иметь вид:
<!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>
<title>Магазины М.Видео на карте - API Яндекс.Карт версии 2.х</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<style>
#shopconteyner{
width: 100%;
}
#shops{ float:left;
width: 30%;
}
#YMapsID{
margin-left: 40%;
width: 60%;
height: 600px;
}
</style>
<script type="text/javascript">
var map;
var collection;
ymaps.ready(function () {
map = new ymaps.Map('YMapsID', {
center: [56.326944, 44.0075],
zoom: 15,
type: 'yandex#map',
behaviors: ['default', 'scrollZoom']
});
//Добавляем элементы управления
map.controls
.add('zoomControl')
.add('typeSelector')
.add('mapTools');
$("select").change(function () {
var town = $("#selecttown :selected").val();
do_search(town);
})
.change();
})
function do_search(town){
$('#shops').html('');
$.getJSON("searcheshop.php", {town: town}, function(json){
var src_res="<p><strong>результаты поиска: </strong></p>";
$.getScript('bounds-collection.js', function () {
collection = new GeoCollectionBounds();
src_res=src_res+'<p><strong>Найдено объектов: '+json.length+'</strong></p>';
collection.events.add('boundschange', function (e) {
map.setBounds(e.get('bounds'));
});
for (i = 0; i < json.length; i++) {
var sch = i+1;
var placemark = new ymaps.Placemark([json[i].lon,json[i].lat], {
iconContent: sch,
balloonContentHeader: '<div style="color:#ff0303;font-weight:bold">'+json[i].address+'</div>',
balloonContentBody: '<div style="font-size:13px;"><div><strong>Адрес:</strong> '+json[i].address+'<br>'+'<strong>Режим работы:</strong> '+json[i].rrab+'<br></div></div>'
}, {
// Опции
preset: 'twirl#nightStretchyIcon' // иконка растягивается под контент
});
collection.add(placemark);
src_res=src_res+'<p>'+sch+'. '+'<a href="#" onClick="return go_to('+json[i].lat+', '+json[i].lon+",'"+json[i].address+"');"+'">'+json[i].address+'</a></p>';
}
map.geoObjects.add(collection);
// Set center and zoom using collection bounds.
map.setBounds(collection.getBounds());
$('#shops').html(src_res);
});
});
}
function go_to(lat,lon,address){
map.setCenter([lon, lat], 16);
collection.each(function (item) {
if (item.properties.get('balloonContentHeader') == '<div style="color:#ff0303;font-weight:bold">'+address+'</div>') {
item.balloon.open();
}
});
return false;
}
</script>
</head>
<body>
<div id="searchform">
<select id="selecttown">
<option value="Екатеринбург">Екатеринбург</option>
<option value="Казань">Казань</option>
<option value="Нижний Новгород">Нижний Новгород</option>
<option value="Пермь">Пермь</option>
<option value="Самара">Самара</option>
<option value="Санкт-Петербург">Санкт-Петербург</option>
</select>
</div>
<div id="shopconteyner">
<div id="shops"></div>
<div id="YMapsID"></div>
</div>
</body>
</html> |
В самом начале мы подключаем java-script-библиотеку jQuery, т. к. она уже не включена в API Яндекс.Карт версии 2.х.
Затем подключаем API карт.
После определяем стили для отображения карты и списка магазинов.
В главной функции мы устанавливаем начальные параметры для нашей карты.
Функция do_search служит для отправки параметра о выбранном городе скрипту searcheshop.php, а ответные данные добавляются на карту и в список слева от нее.
Ее код немного отличается от того, что использоваться в для версии API Яндекс.Карт 1.x.
Порядком задания геокоординат для метки, если для API Яндекс.Карт версии 1.x координаты задавались в виде широта, долгота, то для API Яндекс.Карт версии 2.х. — долгота, широта.
Еще в API Яндекс.Карт 2.х. отсутствует метод bounds для автоматического позиционирования карты, чтобы вместить все показанные на ней объекты.
Для реализации этой возможности я использовал код класса отсюда.
Автор данного класса бабушка-бэтмен из Клуба Яндекс.Карт.
Функция go_to служит показа информации об отдельном магазине на более крупном масштабе.
При клике по ссылке с адресом магазина в функцию go_to передаются координаты метки и адрес.
А в ней происходит центрирование карты и по адресу определяется какой балун у метки необходимо открыть.
После чего этот балун открывается.
Еще мне задавали вопрос, как можно использовать ссылки вместо select для выбора городов.
Это можно легко сделать.
В начале заменяем код формы searchform на следующий:
<div id="searchform">
<a href="#" onclick="do_search('Екатеринбург')">Екатеринбург</a><br>
<a href="#" onclick="do_search('Казань')">Казань</a><br>
<a href="#" onclick="do_search('Нижний Новгород')">Нижний Новгород</a><br>
<a href="#" onclick="do_search('Пермь')">Пермь</a><br>
<a href="#" onclick="do_search('Самара')">Самара</a><br>
<a href="#" onclick="do_search('Санкт-Петербург')">Санкт-Петербург</a>
</div> |
А в главной функции инициализации карты необходимо заменить код:
$("select").change(function () {
var town = $("#selecttown :selected").val();
do_search(town);
})
.change(); |
на строку:
do_search('Екатеринбург'); |
Посмотреть, измененный пример в действии
Загрузить архив с файлами примеров
Надеюсь, что данная заметка будет полезной для Вас.



Здравствуйте. На прошлой версии при выборе нового города, метки с прошлого города удалялись. Как это реализовать на новой версии? Буду очень благодарен за ответ.
Здравствуйте, а как бороться с тем, что при наличии в городе только одной точки, боундсом автоматом ставится такой зум на котором карты не прорисовыватся.
Заранее спасибо.
хотя в принципе уже разобрался с помощью
checkZoomRange:
🙂
Присоединяюсь к вопросу Сергея.
Присоединяюсь к вопросу Сергея, но кроме это хочу сказать что значки при клики по другому городу, или этому же городу появляются снова и наслаиваются друг на друга, как этого избежать?
Смотрите новую заметку
«В самом начале мы подключаем java-script-библиотеку jQuery, т. к. она уже не включена в API Яндекс.Карт версии 2.х.
Затем подключаем API карт.»
А не подскажите, как и куда их подключать?
Все подробно написано в статье. jQuery и API Яндекс.Карт подключаются в разделе head файла map.html