Продолжаем изучать API Яндекс.Карт версии 2.х.
В этот раз мы познакомимся с возможностью построения ломаных линий — полилиний.
Рассмотрим несколько примеров с пояснением.
Первый пример — вывод ломаной линии по заданным координатам.
Рассмотрим код примера.
<!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>Пример вывода ломаной линии, с использованием JavaScript API Яндекс.Карт 2.х</title> <!-- Подключаем API карт 2.x --> <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script> <script type="text/javascript"> // Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map") var myMap = new ymaps.Map('map', { // При инициализации карты, обязательно нужно указать // ее центр и коэффициент масштабирования center: [56.310073,43.998007], // Нижний Новгород zoom: 14 }); var geometry = [[56.308475,43.982986], [56.30795,43.987793], [56.310073,43.998007], [56.314963,44.012555]], properties = { hintContent: "Ломаная линия" }, options = { draggable: true, strokeColor: '#ff0000', strokeWidth: 5 }, polyline = new ymaps.Polyline(geometry, properties, options); myMap.geoObjects.add(polyline); } </script> </head> <body> <div id="map" style="width:800px; height:600px"></div> </body> </html> |
В начале мы определяем основные параметры карты (координаты центра и масштаб),
после этого задаем параметры нашей полилинии:
геометрию (geometry) — в виде набора пар координат узловых точек;
данные геообъекта (properties) — в нашем примере текст подсказки, отображаемой при наведении мыши на нашу ломаную;
набор опций (options) — набор параметров для ломаной.
В данном примере к качестве опций используются следующие параметры:
draggable — задает возможность перемещения ломаной линии по карте, в нашем случае оно равно true, значение по умолчанию false;
strokeColor — задает цвет ломаной;
strokeWidth — определяет толщину ломаной
Кроме этого возможны и другие параметры:
strokeOpacity — определяет степень прозрачности геообъекта, значения в диапазоне от 0 до 1 (непрозрачный);
strokeStyle — определяет стиль линии (представляет собой точкитире и так далее)
Второй пример — задание стиля линии
Здесь код похож на предыдущий, за исключением двух параметров:
нет параметра draggable, по умолчанию false;
strokeStyle имеет значение 1 5, это означает, что надо нарисовать штрих длиной одну ширину линии, и потом 5 ширин пропустить.
Третий пример — включение режима редактирования линии
Для включения режима редактирования ломаной линии после добавления ее на карту нужно добавить строку:
polyline.editor.startEditing();
Мы включаем режим редактирования, появляются маркеры, перемещая которые мышью мы можем изменять форму нашей полилинии.
Четвертый пример — пример рисования ломаной линии.
После загрузки карты, мы можем кликнув левой кнопкой мыши по окну с картой начать построение ломаной линии от данной точки.
При клике левой кнопкой мыши по последнему квадратному маркеру появляется контекстное меню, где мы можем выбрать необходимое действие: Удалить — удалить последний построенный сегмент, Завершить — завершить построение ломаной.
Если еще раз кликнуть левой кнопкой мыши по крайним квадратным маркерам, мы можем продолжить построение от начала или конца ломаной.
Рассмотрим код примера
<!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>Пример рисования ломаной линии, с использованием JavaScript API Яндекс.Карт 2.х</title> <!-- Подключаем API карт 2.x --> <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script> <script type="text/javascript"> // Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map") var myMap = new ymaps.Map('map', { // При инициализации карты, обязательно нужно указать // ее центр и коэффициент масштабирования center: [56.310073,43.998007], // Нижний Новгород zoom: 14 }); var polyline = new ymaps.Polyline([], {}, { strokeColor: '#ff0000', strokeWidth: 5 // ширина линии }); myMap.geoObjects.add(polyline); polyline.editor.startEditing(); polyline.editor.startDrawing(); } </script> </head> <body> <div id="map" style="width:800px; height:600px"></div> </body> </html> |
Здесь код отличается тем, что мы не задаем геометрию нашей ломаной.
А задаем только две опции: цвет линии и толщину.
Затем добавляем определенный объект на карту, включаем режим редактирования строкой
polyline.editor.startEditing();
Далее включаем режим рисования:
polyline.editor.startDrawing();
Пятый пример
В нем мы развиваем далее код из четвертого примера, если после окончания редактирования нажать на кнопку «Завершить редактирование», то для нашей ломаной отменяется режим редактирования и рисования, а значения координат вершин выводятся ниже карты.
Рассмотрим код примера
<!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>Пример рисования ломаной линии и вывод координат, с использованием JavaScript API Яндекс.Карт 2.х</title> <!-- Подключаем API карт 2.x --> <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.4.2/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> // Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map") var myMap = new ymaps.Map('map', { // При инициализации карты, обязательно нужно указать // ее центр и коэффициент масштабирования center: [56.310073,43.998007], // Нижний Новгород zoom: 14 }); var polyline = new ymaps.Polyline([], {}, { strokeColor: '#ff0000', strokeWidth: 5 // ширина линии }); myMap.geoObjects.add(polyline); polyline.editor.startEditing(); polyline.editor.startDrawing(); $('input').attr('disabled', false); // Обработка нажатия на любую кнопку. $('input').click( function () { // Отключаем кнопки, чтобы на карту нельзя было // добавить более одного редактируемого объекта (чтобы в них не запутаться). $('input').attr('disabled', true); polyline.editor.stopEditing(); printGeometry(polyline.geometry.getCoordinates()); }); } // Выводит массив координат геообъекта в <div id="geometry"> function printGeometry (coords) { $('#geometry').html('Координаты: ' + stringify(coords)); function stringify (coords) { var res = ''; if ($.isArray(coords)) { res = '[ '; for (var i = 0, l = coords.length; i < l; i++) { if (i > 0) { res += ', '; } res += stringify(coords[i]); } res += ' ]'; } else if (typeof coords == 'number') { res = coords.toPrecision(6); } else if (coords.toString) { res = coords.toString(); } return res; } } </script> </head> <body> <div id="map" style="width:800px; height:600px"></div> <input type="button" value="Завершить редактирование" id="stopEditPolyline"/> <div id="geometry"/></div> </body> </html> |
В этом примере мы используем JavaScript – библиотеку jQuery, подключая ее из хранилища скриптов Яндекса строкой:
<script src="http://yandex.st/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
При нажатии на кнопку «Завершить редактирование», вызывается функция в которой завершается режим редактирования
polyline.editor.stopEditing();
А также вызывается функция для вывода значений координат printGeometry (взята из примера по адресу http://api.yandex.ru/maps/doc/jsapi/2.x/examples/linestringedit.html ).
Сама кнопка становиться неактивной.
Шестой пример.
Продолжаем улучшать наш код для рисования ломаной.
В этом примере мы добавим возможность определения параметров ломаной пользователю.
Будем использовать следующие параметры:
толщина линии strokeWidth;
цвет линии strokeColor;
величина прозрачности strokeOpacity
Для ввода параметров с права от окна с картой добавим форму для их ввода, а также три кнопки: добавить, удалить и завершить редактирование.
Рассмотрим работу готового примера, а затем я поясню его код.
В самом начале мы должны ввести в форму необходимые параметры ломаной, например, толщина линии — 5, необходимый нам цвет, используя в качестве инструмента выбора возможности плагина jQuery SimpleColor и уровень прозрачности 1.
Нажимаем на кнопку «Добавить»
Кликая по карте, стоим ломаную нужной формы.
Если нас что-то не устраивает, мы можем нажать на кнопку «Удалить» и начать новое построение с кнопки «Добавить».
После того, ка необходимая линия построена, нажимаем на кнопу «Завершить редактирование» для вывода значений координат.
Демонстрация работы в небольшом видео.
Рассмотрим код примера
<!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>Пример рисования ломаной линии с заданием параметров - JavaScript API Яндекс.Карт 2.х</title> <!-- Подключаем API карт 2.x --> <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.4.2/jquery.min.js" type="text/javascript"></script> <script type="text/javascript" src="js/jquery.simple-color.min.js"></script> <script type="text/javascript"> var polyline; ymaps.ready(init); function init () { $('#color_pline').simpleColor(); var myMap = new ymaps.Map('map', { center: [56.310073,43.998007], zoom: 14 }); //Добавляем элементы управления myMap.controls .add('zoomControl') .add('typeSelector') .add('mapTools') // Обработка нажатия на кнопку Добавить $('#addPolyline').click( function () { $('#stopEditPolyline').attr('disabled', false); var widthpl = $('#width_line').attr('value'); var colorpl = $('#color_pline').attr('value'); var transparencypl = $('#transparency_pline').attr('value'); polyline = new ymaps.Polyline([], {}, { strokeColor: colorpl, strokeOpacity: transparencypl, strokeWidth: widthpl }); myMap.geoObjects.add(polyline); polyline.editor.startEditing(); polyline.editor.startDrawing(); $('#addPolyline').attr('disabled', true); }); // Обработка нажатия на кнопку Завершить редактирование $('#stopEditPolyline').click( function () { polyline.editor.stopEditing(); printGeometry(polyline.geometry.getCoordinates()); $('#stopEditPolyline').attr('disabled', true); }); // Обработка нажатия на кнопку Удалить $('#dellPolyline').click( function () { myMap.geoObjects.remove(polyline); $('#geometry').html(''); $('#addPolyline').attr('disabled', false); }); } // Выводит массив координат геообъекта в <div id="geometry"> function printGeometry (coords) { $('#geometry').html('Координаты: ' + stringify(coords)); function stringify (coords) { var res = ''; if ($.isArray(coords)) { res = '[ '; for (var i = 0, l = coords.length; i < l; i++) { if (i > 0) { res += ', '; } res += stringify(coords[i]); } res += ' ]'; } else if (typeof coords == 'number') { res = coords.toPrecision(6); } else if (coords.toString) { res = coords.toString(); } return res; } } </script> </head> <body> <table border="0" cellspacing="3" cellpadding="3"> <tr> <td width="800px"> <div id="map" style="width:800px; height:600px"></div> <div id="geometry"/></div> </td> <td width="250px" valign="top"> <div id="formpline"> <strong>Форма ввода параметров ломаной</strong><br /> <br />Толщина линии: <input type="text" name="width_line" id="width_line" size="2" value="5" /><br /> <br />Цвет линии:<br /><input type="text" id="color_pline" value="#cc3333"> <br />Уровень прозрачности:<br /><input type="text" id="transparency_pline" value="1"> <p><input type="button" value="Добавить" id="addPolyline"/> <input type="button" value="Удалить" id="dellPolyline"/></p> <p><input type="button" value="Завершить редактирование" id="stopEditPolyline"/></p> </div> </td> </tr> </table> </body> </html> |
Для реализации выбора цветов использован плагин jQuery SimpleColor, загрузить который можно здесь
Из всего архива нам нужен один файл jquery.simple-color.min.js
Копируем его в заранее созданную папку js.
И подключаем в наш код строкой:
<script type="text/javascript" src="js/jquery.simple-color.min.js"></script>
Использовать плагин очень просто, перед определением параметров карты мы добавляем строку
$(‘#color_pline’).simpleColor();,
где color_pline — id-элемента ввода цвета ломаной.
В секции body мы добавляем таблицу из одной строки и двух ячеек, в прервую помещаем контейнеры div для вывода карты с id="map" и вывода координат id="geometry".
А во-вторую форму с полями для ввода значений и кнопками.
<div id="formpline"> <strong>Форма ввода параметров ломаной</strong><br /> <br />Толщина линии: <input type="text" name="width_line" id="width_line" size="2" value="5" /><br /> <br />Цвет линии:<br /><input type="text" id="color_pline" value="#cc3333"> <br />Уровень прозрачности:<br /><input type="text" id="transparency_pline" value="1"> <p><input type="button" value="Добавить" id="addPolyline"/> <input type="button" value="Удалить" id="dellPolyline"/></p> <p><input type="button" value="Завершить редактирование" id="stopEditPolyline"/></p> </div> |
При нажатии на кнопки вызываются соответствующие функции для обработки.
Если кликнуть по кнопке «Добавить», то обрабатываем ее нажатие с id="addPolyline".
Значения переменных из формы передаются соответствующим переменным widthpl, colorpl и transparencypl.
Мы можем начинать построение ломаной с заданными параметрами.
При нажатии на кнопе «Удалить» обрабатываем это событие удаляя полилинию с карты строкой
myMap.geoObjects.remove(polyline);
Очищаем контейнер с id="geometry" строкой
$(‘#geometry’).html(»);
Включаем кнопку добавления полилинии
$(‘#addPolyline’).attr(‘disabled’, false);
Конечно это пример не идеальный, но мы уже получили простой редактор для рисования ломаных линий на Яндекс.Карте.
Загрузить архив с файлами примеров
В следующий раз я рассмотрю, как можно его усовершенствовать, а также сохранять координаты ломаной в базе данных MySQL и выводить обратно на карту из базы.
Огромное спасибо 🙂
В следующий раз, когда будешь писать про добавление в БД, если можно, включи возможность сохранения зума тоже 🙂
Большое спасибо! Очень помогает.
Вот была такая замечательная статья http://webmap-blog.ru/yandex-maps/poisk-blizhajshego-obekta-na-yandeks-karte
Можно попросить сделать аналогичное по версии 2.0?
А как сделать ломаные линии не по координатам а по заданию названия города?
Нужно провести предварительное геокодирование названия города, а затем уже строить ломаную