На своем блоге я уже рассказывал о том, как вывести содержимое CSV-файла на Яндекс.Карту.
В этой заметке я покажу как тоже самое сделать несколькими способами для API Яндекс.Карт 2.х.
Файл с исходными данными в формате CSV — avto_markers.csv, мы возьмем из уже упомянутой заметки.
Код файла, для вывода данных на карту, будет иметь вид:
<!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>Отображение данных из csv-афйла на Яндекс.Картах - Версия для API 2.x</title>
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
var myMap, myCollection;
ymaps.ready(function () {
myMap = new ymaps.Map('ymapid', {
center: [56.3241,44.0014],
zoom: 15,
behaviors: ["scrollZoom","drag"]
});
myCollection = new ymaps.GeoObjectCollection();
$.ajax({
url:'avto_markers.csv',
success: function(data){
var rows = data.split("n");
var src_res='';
for(var i in rows){
var colls=rows[i].split(";");//или другой символ разделитель
// Устанавливаем координаты и содержимое балуна
myPlacemark = new ymaps.Placemark([colls[5], colls[4]], {
// Свойства
balloonContentHeader: '<div style="color:#ff0303;font-weight:bold">'+colls[1]+'</div>',
balloonContentBody: '<div style="font-size:12px;"><strong>Адрес:</strong> '+colls[2]+'<br /><strong>Телефон:</strong> '+colls[3]+'</div>'
}, {
// Опции
preset: 'twirl#carIcon'
});
myCollection.add(myPlacemark);
src_res=src_res+'<li>'+'<a href="#" onClick="return go_point('+colls[5]+', '+colls[4]+",'"+colls[1]+"','"+colls[2]+"','"+colls[3]+"','"+colls[0]+"');"+'">'+colls[1]+'</a></li>';
}
$('#menu').html(src_res);
myMap.geoObjects.add(myCollection);
myMap.setBounds(myCollection.getBounds());
}
});
});
function go_point(lat,lon,name,address,telefon,id){
myMap.setCenter([lat, lon], 16);
myMap.geoObjects.remove(myCollection);
var placemark = new ymaps.Placemark([lat, lon], {
// Свойства
balloonContentHeader: '<div style="color:#ff0303;font-weight:bold">'+name+'</div>',
balloonContentBody: '<div style="font-size:12px;"><strong>Адрес:</strong> '+address+'<br /><strong>Телефон:</strong> '+telefon+'</div>'
}, {
// Опции
preset: 'twirl#carIcon'
});
// Добавляем метку на карту
myMap.geoObjects.add(placemark);
placemark.balloon.open();
return false;
}
</script>
<style type="text/css">
#menu {
list-style: none;
margin: 0;
padding: 0;
}
#menu a {
text-decoration: none;
border-bottom: dashed 1px;
}
a.active {
color: #000;
}
</style>
</head>
<body>
<table>
<tr>
<td valign="top"><div id="ymapid" style="width:800px;height:600px"></div></td>
<td valign="top"><ul id="menu"></ul></td>
</tr>
</table>
</body>
</html> |
Перечислю основные отличия данного кода от старой версии.
В самом начале мы подключаем библиотеку jQuery, так как она не входит в состав API Яндекс.Карт 2.х строкой:
<script src="http://yandex.st/jquery/1.9.1/jquery.min.js"></script> |
Далее, мы определяем начальные параметры карты: координаты центра, начальный масштаб и возможность изменения масштаба колесиком мыши.
myMap = new ymaps.Map('ymapid', {
center: [56.3241,44.0014],
zoom: 15,
behaviors: ["scrollZoom","drag"]
}); |
Затем, мы определяем коллекцию объектов myCollection.
Асинхронно, используя библиотеку jQuery, мы читаем содержимое файла avto_markers.csv, разбиваем его содержимое по строкам rows и по столбцам colls.
Из полученных данных формируется метки и добавляются в нашу коллекцию myCollection.
Также у нас динамически формируется меню со ссылкой для каждой метки.
src_res=src_res+'<li>'+'<a href="#" onClick="return go_point('+colls[5]+', '+colls[4]+",'"+colls[1]+"','"+colls[2]+"','"+colls[3]+"','"+colls[0]+"');"+'">'+colls[1]+'</a></li>'; |
Последним шагом, меню добавляется на нашу страницу с картой, а коллекция меток на карту.
$('#menu').html(src_res);
myMap.geoObjects.add(myCollection); |
Строка myMap.setBounds(myCollection.getBounds()); производит центрирование и масштабирование карты по содержимому геоколлекции.
При клике по ссылке из меню, вызывается функция go_point с параметрами.
В этой функции мы удаляем нашу коллекцию меток с карты
myMap.geoObjects.remove(myCollection); |
центрируем карту на нужную точку
myMap.setCenter([lat, lon], 16); |
И в этой точке создаем метку и задаем свойства для отображения балуна, а затем отображаем балун в данной точке.
Давайте переделаем наш пример так, чтобы метки добавлялись на карту только один раз, а при клике по пункту меню происходило автоматическое центрирование карты и показ содержимого балуна для нужной метке.
Для любой метки мы можем добавить произвольное свойство, а затем использовать его в нашем коде.
Для нашего примера мы зададим свойство iden — идентификатор метки, в котором будем хранить значение из первой колонки файла avto_markers.csv
По этому свойству, так как оно уникально для каждой метки, мы сможем определить нужную нам в коллекции геообъектов.
Код примера будет иметь следующий вид:
<!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>Вариант-2 - Отображение данных из csv-афйла на Яндекс.Картах - Версия для API 2.x</title>
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
var myMap, myCollection;
ymaps.ready(function () {
myMap = new ymaps.Map('ymapid', {
center: [56.3241,44.0014],
zoom: 15,
behaviors: ["scrollZoom","drag"]
});
myCollection = new ymaps.GeoObjectCollection();
$.ajax({
url:'avto_markers.csv',
success: function(data){
var rows = data.split("n");
var src_res='';
for(var i in rows){
var colls=rows[i].split(";");//или другой символ разделитель
// Устанавливаем координаты и содержимое балуна
myPlacemark = new ymaps.Placemark([colls[5], colls[4]], {
// Свойства
iden: colls[0],
balloonContentHeader: '<div style="color:#ff0303;font-weight:bold">'+colls[1]+'</div>',
balloonContentBody: '<div style="font-size:12px;"><strong>Адрес:</strong> '+colls[2]+'<br /><strong>Телефон:</strong> '+colls[3]+'</div>'
}, {
// Опции
preset: 'twirl#carIcon'
});
myCollection.add(myPlacemark);
$('#menu').append('<li>'+'<a href="#" onClick="return go_point('+colls[0]+");"+'">'+colls[1]+'</a></li>');
}
myMap.geoObjects.add(myCollection);
myMap.setBounds(myCollection.getBounds());
}
});
});
function go_point(id){
myCollection.each(function (item) {
if (item.properties.get('iden') == id) {
var coord = item.geometry.getCoordinates();
myMap.setCenter(coord, 16);
item.balloon.open();
}
});
}
</script>
<style type="text/css">
#menu {
list-style: none;
margin: 0;
padding: 0;
}
#menu a {
text-decoration: none;
border-bottom: dashed 1px;
}
a.active {
color: #000;
}
</style>
</head>
<body>
<table>
<tr>
<td valign="top"><div id="ymapid" style="width:800px;height:600px"></div></td>
<td valign="top"><ul id="menu"></ul></td>
</tr>
</table>
</body>
</html> |
Большей частью он похож на предидущий.
Отличия заключаются в следующем.
При создании метки мы задаем значение своего свойства iden строкой
iden: colls[0], |
При клике по ссылке вызывается функция go_point у которой теперь только один параметр id.
Далее в этой функциии мы находим элемент в коллекции у которого параметр iden равен id.
Получаем значения координат для этой метки
var coord = item.geometry.getCoordinates(); |
Производим центрирование карты
myMap.setCenter(coord, 16); |
И открываем балун для данной метки
item.balloon.open(); |
Изменим код второго примера так, чтобы в маркере отображалось id метки, пункты миню также имели соответствующую нумерацию.
Для этого нам необходимо изменить всего несколько строк кода.
При определении свойств метки после строки
iden: colls[0], |
добавим код
iconContent: colls[0], |
А стиль метки изменим с twirl#carIcon на twirl#lightblueIcon
Также изменим строку формирования элементов меню
$('#menu').append('<li>'+'<a href="#" onClick="return go_point('+colls[0]+");"+'">'+colls[1]+'</a></li>'); |
заменим на
$('#menu').append('<li>'+colls[0]+'. '+'<a href="#" onClick="return go_point('+colls[0]+");"+'">'+colls[1]+'</a></li>'); |
В результате мы увидим следующее:



Спасибо за пример.
Хочу отметить, что в первом варианте, если идти от списка к меткам на карте, то остальные метки перестают корректно отображаться на карте. (браузер Mozilla Firefox 20.1)
P.S.: Почему то на Вашей страничке в фейсбук нельзя поставить лайк и прокомментировать публикацию 🙁
А как совместить этот пример с пример кластеризации? http://dimik.github.io/ymaps/examples/cluster-simple/
Автор подскажи, как сделать чтобы при наведение на ссылку на карте изменялся цвет балуна?