Не так давно я публиковал на своем блоге заметку «Создание карты на сайте с адресами магазинов, с использованием API Яндекс.Карт версии 2.х».
С момента публикации в API Яндекс.Карт появился метод getBounds для автоматического позиционирования карты по коллекции геообъектов.
Мне также задавали вопрос о том, как удалить метки с карты при выборе нового города.
Я подготовил новую версию кода примера вывода адресов магазинов на карту.
Что же нового в коде примера.
В API Яндекс.Карт появился метод getBounds и теперь нет необходимости использовать дополнительный скрипт bounds-collection.js
Удаляем весь код для его использования, строки
$.getScript('bounds-collection.js', function () { collection = new GeoCollectionBounds(); |
collection.events.add('boundschange', function (e) { map.setBounds(e.get('bounds')); }); |
collection.add(placemark); |
А ткже не нужные закрывающие скобки }); после строки $(‘#shops’).html(src_res);
Глобальную переменную collection называем myCollection.
Сразу после добавления на карту элементов управления вставляем строку кода
myCollection = new ymaps.GeoObjectCollection(); |
Создаем новую коллекцию геообъектов.
После создания метки нужно добавить ее в коллекцию.
Для этого в функцию do_search перед строкой
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>'; |
добавляем код
myCollection.add(placemark); |
А после добавления всех меток, нужно добавить коллекцию на карту и устанавливаем центр и масштаб карты так, чтобы охватить коллекцию целиком.
За это отвечают строчки
map.geoObjects.add(myCollection); map.setBounds(myCollection.getBounds()); |
Нужно также заменить название коллекции в строке
collection.each(function (item) { |
в функции go_to на myCollection
myCollection.each(function (item) { |
Для того, чтобы удалить предыдущие результаты поиска из нашей коллекции добавляем строку кода
myCollection.removeAll(); |
сразу после строки
var src_res="<p><strong>результаты поиска: </strong></p>"; |
Код файла 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 myCollection; 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'); myCollection = new ymaps.GeoObjectCollection(); $("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>"; myCollection.removeAll(); src_res=src_res+'<p><strong>Найдено объектов: '+json.length+'</strong></p>'; 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' // иконка растягивается под контент }); myCollection.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(myCollection); map.setBounds(myCollection.getBounds()); $('#shops').html(src_res); }); } function go_to(lat,lon,address){ map.setCenter([lon, lat], 16); myCollection.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> |
А остальные файлы мы будем использовать без изменений.
Аналогичным образом изменяем файл примера, использующего ссылки вместо select для выбора городов.
Загрузить архив с новыми файлами примеров
Добрый!
Подскажите пожалуйста, есть ли у яндекса или гугла функции определения кратчайшие n расстояниq, между одним адресом и списком адресов.
заранее благодарю за ответ.
А если я не выбираю город, а получаю его другим способом как мне изменить конструкцию:
$(«select»).change(function () {
var town = $(«#selecttown :selected»).val();
do_search(town);
})
.change();
Разобрался)) удалите…
Подскажите плиз почему не работает следующее:
Пытаюсь вывести список предприятий из joomla.
Вот ваш измененый скрипт:
var map;
var myCollection;
ymaps.ready(function () {
map = new ymaps.Map(‘YMapsID’, {
center: [55.43099,37.54541],
zoom: 14,
type: ‘yandex#map’,
behaviors: [‘default’, ‘scrollZoom’]
});
//Добавляем элементы управления
map.controls
.add(‘zoomControl’)
.add(‘typeSelector’)
.add(‘mapTools’);
myCollection = new ymaps.GeoObjectCollection();
do_search();
})
function do_search(){
$(‘#shops’).html(»);
$.getJSON(«searcheshop.php», function(json){
var src_res=»результаты поиска: «;
myCollection.removeAll();
src_res=src_res+’Найдено объектов: ‘+json.length+’‘;
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: '’+json[i].address+»,
balloonContentBody: ‘Адрес: ‘+json[i].address+»+’Режим работы: ‘+json[i].rrab+»
}, {
// Опции
preset: ‘twirl#nightStretchyIcon’ // иконка растягивается под контент
});
myCollection.add(placemark);
src_res=src_res+»+sch+’. ‘+’‘+json[i].address+’‘;
}
map.geoObjects.add(myCollection);
map.setBounds(myCollection.getBounds());
$(‘#shops’).html(src_res);
});
}
Вот searcheshop.php:
?php
$cat = JRequest::getInt( ‘sid’ ); //запрос на текущую категорию
$query = «select pod_sobipro_object.id, pod_sobipro_object.name, pod_sobipro_field_geo.latitude, pod_sobipro_field_geo.longitude FROM pod_sobipro_object
LEFT JOIN pod_sobipro_field_geo ON pod_sobipro_field_geo.sid = pod_sobipro_object.id
WHERE pod_sobipro_object.parent = ‘$cat’ ORDER BY name»;
$db =& JFactory::getDBO();
$db->setQuery($query);
//$result1 = $db->query($query);
$result1 = $db->loadAssocList();
if($result1){
foreach ( $result1 as $par1 ) {
$addressshop[] = array(«id»=>$par1[‘id’],
«name» => $par1[‘name’],
«lat» => $par1[‘longitude’],
«lon» => $par1[‘latitude’]);
}
}
$json = json_encode($addressshop);
echo $json;
?>
Запрос отрабатывается нормально.
Вот такой json получается:
[{«id»:»1398″,»name»:»BP u041fu043eu0434u043eu043bu044cu0441u043a (u0411u0438 u041fu0438)»,»lat»:»37.555555″,»lon»:»55.428373″},{«id»:»694″,»name»:»u0418u043du0442u043eu043f»,»lat»:»37.560691″,»lon»:»55.406048″},{«id»:»2359″,»name»:»u041cu043eu0440u0438u043eu043d u0445u043eu043bu0434u0438u043du0433″,»lat»:»37.528109″,»lon»:»55.424843″},{«id»:»2358″,»name»:»u041cu043eu0441u0430u0432u0442u043eu0433u0430u0437 u0410u0413u041du041au0421 u0413u0423u041f»,»lat»:»37.542392″,»lon»:»55.40182″}]
Но на карту ничего не выводится!
Более того даже «найдено объектов» не пишет..
И еще — как сделать название метки ссылкой на запись так, чтобы при нажатии шел переход на соответствующий элемент в каталоге sobi?
Подскажите пожалуйста, вот есть установленный компонент и плагин версии 2. Как применить ваше исправление (дополнение), чтобы указывать корректно адреса? Я в не ламер, но из вашего примера так и непонял ((( что и куда вставлять/удалять.
Вот есть скачанные файлы примера, есть установленный компанент-плагин, что дальше?
Расскажите немного подробнее.
Спасибо.
Дело в том, что для добавления примера в Joomla нужно использовать специальный плагин для вставки кода, см. новую заметку
Здравствуйте!
Подскажите, пожалуйста, как вместо базы использовать текстовый файл?
Спасибо.
Можно исходные данные хранить в виде набора текстовых файлов в формате JSON, подгружать необходимый из них для определенного города.
Скоро напишу заметку об этом.
проблема с масштабом карты, когда например по отдельному городу один магазин сделать то объект выводится а карта не видна ибо масштаб очень большой
В API существует параметр для отслеживания доступного уровня масштаба в данной точке — zoomRange
Добрый день! Подскажите, как можно каждому городу сделать «свой» цвет меток?
Скажите, пожалуйста, как сделать карту 100% по высоте и ширине?
Прописать CSS стили для страницы с картой:
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#map {
height: 100%;
width: 100%;
}
Сделал используя этот код аналогичную карту с гораздо большим кол-вом объектов и вот что заметил: в Опере и Гуглхром все работает как по маслу, и двигается плавно и открываеются балуны коректно а вот в Интернет Эксплорере все работает но очень сильно тормозит и балуны открываются долго, можете объяснить нормально это или есть причина?
Получается много объектов в DOM из-за этого Эсплорер тормозит, в этом случае лучше использовать YMapsML или активные области.
Помогите пожалуйста, что мне нужно сделать, чтобы я мог использовать иконку метки свою вместо яндексовской. к примеру меня есть картинка тут : http://site.ru/icon.png, что изменить в коде, чтобы использовалась моя иконка для метки?
Смотрите примеры из документации: первый и второй
Здравствуйте!
Я подумываю поставить карту на сайт, такую же как у Вас на скриншоте. Но практически нет времени разбираться. Вы бы не могли помочь в ее создании за денюжку, или подсказать человека, который сможет?
Все аналогично тому, как у Вас показано на скриншоте, только количество меток и групп отличается (100/20)
Спасибо!
Сейчас занят к сожалению, напишите мне через недельку подробнее обсудим.
А не подскажите, если не сложно, куда нужно добавлять эти файлы.
Сайт на joomla 2.5.
1.Я экспортировал mvideo_shops.sql в БД сайта.
2.В bd.php прописал параметры доступа к БД.
3.Затем, через плагин Sourcerer добавил все файлы из архива и код карты с вашего урока.
После сохранения страница, где должна публиковаться карта, становится белой и выводит такую ошибку: Разбор ошибки :
Parse error: syntax error, unexpected ‘<' in /home/webost/kino-v-seti.ru/plugins/system/sourcerer/helper.php(450) : runtime-created function on line 28
Fatal error: Function name must be a string in /home/webost/kino-v-seti.ru/plugins/system/sourcerer/helper.php on line 454
При использовании библиотеки jQuery в Joomla возникает конфликт со встроенной библиотекой mootools, см заметку
Чуть позже напишу пример использования карты с адресами магазинов для Joomla
Добрый день, подскажите плз, а как в существующий пример добавить возможность добавлять кривые и области
Залил на хостинг. БД залил, подключил, все правильно, но ничего не выводится на странице: карта грузится, список выпадающий есть, а из базы ничего не выгружается.
Залита отдельным html в папку, сайт основной на WP — не может быть конфликта?
Подскажите как сделать что бы город выбирался не из списка фильтра, а автоматически показывалась карта города с магазинами по определению местоположения. В яндексе функция опред-ния местоположения есть.
Что бы если пользователь зашел с Казани — видел карту магазинов Казани, пользователь с Самары — карта магазинов Самары, и т.д.
Очень нужно!!! Заранее спасибо.
Присоединяюсь к вопросу Евгения. Аналогичная проблема…(
Ни как не могу решить проблему с масштабированием, когда в городе один магазин. здесь уже был ответ что нужно использовать zoomRange, пожалуйста опишите как? Спасибо.
Отвечаю на свой вопрос… думаю люди сталкиваются с этим:
Где,
map = new ymaps.Map(‘YMapsID’, {
center: [55.755773, 37.617761],
zoom: 11,
type: ‘yandex#map’,
behaviors: [‘default’, ‘scrollZoom’]
});
добавить
checkZoomRange: true,
>Воффка
Не работает у меня checkZoomRange: true,
Код:
map = new ymaps.Map(‘YMapsID’, {
center: [55.7336,37.581559],
zoom: 15,
type: ‘yandex#map’,
behaviors: [‘default’, ‘scrollZoom’],
checkZoomRange: true
});
> Igor, вот как у меня
map = new ymaps.Map(‘YMapsID’, {
center: [55.755773, 37.617761],
zoom: 11,
type: ‘yandex#map’,
checkZoomRange: true,
behaviors: [‘default’, ‘scrollZoom’]
Привет!
как можно адаптировать этот пример под последнюю версию карт 2.1?