В этой заметке я хочу познакомить Вас с возможностями построения многоугольников на карте, с помощью API Яндекс.Карт 2.х.
Рассмотрим несколько примеров с пояснением.
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>
<title>Построение многоугольника по заданным координатам - API Яндекс.Карт v 2.x</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<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 () {
var myMap = new ymaps.Map("map", {
center: [56.317655,43.994362],
zoom: 15
}),
// Создаем многоугольник
myPolygon = new ymaps.Polygon([[
// Координаты вершин внешней границы многоугольника.
[56.316797,43.987925],
[56.316177,43.990586],
[56.316224,43.995564],
[56.317703,44.002258],
[56.319182,44.003288],
[56.318943,43.997194],
[56.318514,43.996679],
[56.320803,43.990071]
]]);
myMap.geoObjects
.add(myPolygon);
}
</script>
</head>
<body>
<h2>Построение многоугольника по заданным координатам</h2>
<div id="map" style="width:800px; height:600px"></div>
</body>
</html> |
Здесь все предельно просто.
Мы создаем новый объект Polygon и передаем ему значения координат вершин многоугольника.
А затем добавляем его на карту.
Можно определять многоугольник как геообъект, с типом геометрии «полигон» :
myGeoObject = new ymaps.GeoObject({
// Геометрия.
geometry: {
// Тип геометрии - полигон.
type: "Polygon",
// Координаты.
coordinates: [
[
[56.316797,43.987925],
[56.316177,43.990586],
[56.316224,43.995564],
[56.317703,44.002258],
[56.319182,44.003288],
[56.318943,43.997194],
[56.318514,43.996679],
[56.320803,43.990071]
]
]
}
}); |
Возможно задание стилей для отображения многоугольника.
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>
<title>Построение многоугольника с заданными стилями - API Яндекс.Карт v 2.x</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<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 () {
var myMap = new ymaps.Map("map", {
center: [56.317655,43.994362],
zoom: 15
}),
// Создаем многоугольник
myPolygon = new ymaps.Polygon([[
// Координаты вершин внешней границы многоугольника.
[56.316797,43.987925],
[56.316177,43.990586],
[56.316224,43.995564],
[56.317703,44.002258],
[56.319182,44.003288],
[56.318943,43.997194],
[56.318514,43.996679],
[56.320803,43.990071]
]], {
//Свойства
hintContent: "Многоугольник"
}, {
// Опции.
// Цвет заливки (красный)
fillColor: '#FF0000',
// Цвет границ (синий)
strokeColor: '#0000FF',
// Прозрачность (полупрозрачная заливка)
opacity: 0.6,
// Ширина линии
strokeWidth: 5,
// Стиль линии
strokeStyle: 'shortdash'
});
myMap.geoObjects
.add(myPolygon);
}
</script>
</head>
<body>
<h2>Построение многоугольника с заданными стилями</h2>
<div id="map" style="width:800px; height:600px"></div>
</body>
</html> |
В этом примере мы строим многоугольник с теми же координатами вершин, но задаем для него дополнительные опции для отображения:
цвет заливки — красный (fillColor: ‘#FF0000’) ;
цвет границы — синий (strokeColor: ‘#0000FF’);
прозрачность заливки многоугольника (opacity: 0.6);
ширина линии обводки (strokeWidth: 5);
стиль линии обводки (strokeStyle: ‘shortdash’).
В API имеется возможность построения многоугольников с полостями (отверстиями в многоугольнике).
3. Построение многоугольника с полостью

Рассмотрим код примера
<!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 Яндекс.Карт v 2.x</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<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 () {
var myMap = new ymaps.Map("map", {
center: [56.317655,43.994362],
zoom: 15
}),
// Создаем многоугольник
myPolygon = new ymaps.Polygon([[
// Координаты вершин внешней границы многоугольника.
[56.316797,43.987925],
[56.316177,43.990586],
[56.316224,43.995564],
[56.317703,44.002258],
[56.319182,44.003288],
[56.318943,43.997194],
[56.318514,43.996679],
[56.320803,43.990071]
],
// Координаты вершин внутренней границы многоугольника.
[
[56.317536,43.991337],
[56.319039,43.992839],
[56.319039,43.993783],
[56.318574,43.994233],
[56.317274,43.992903]
]
], {
//Свойства
hintContent: "Многоугольник"
}, {
// Опции.
// Цвет заливки (красный)
fillColor: '#FF0000',
// Цвет границ (синий)
strokeColor: '#0000FF',
// Прозрачность (полупрозрачная заливка)
opacity: 0.6,
// Ширина линии
strokeWidth: 5,
// Стиль линии
strokeStyle: 'shortdash'
});
myMap.geoObjects
.add(myPolygon);
}
</script>
</head>
<body>
<h2>Построение многоугольника с полостью</h2>
<div id="map" style="width:800px; height:600px"></div>
</body>
</html> |
Здесь после задания координат вершин внешней границы, задаются координаты вершин внутренней области в многоугольнике.
Следующий пример демонстрирует возможность рисования многоугольника.
4. Режим рисования многоугольника

Рассмотрим код примера
<!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 Яндекс.Карт v 2.x</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<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 () {
var myMap = new ymaps.Map("map", {
center: [56.317655,43.994362],
zoom: 15
}),
polygon = new ymaps.GeoObject({
geometry: {
type: "Polygon",
coordinates: []
}
});
myMap.geoObjects.add(polygon);
polygon.editor.startDrawing();
}
</script>
</head>
<body>
<h2>Режим рисования многоугольника</h2>
<div id="map" style="width:800px; height:600px"></div>
</body>
</html> |
В этом примере мы сначала создаем объект polygon с пустым массивом координат, добавляем его на карту.
А затем включаем режим рисование
polygon.editor.startDrawing(); |
Последовательно кликая по карте, мы задаем вершины нашего многоугольника.
Мы можем добавить полость в многоугольник, если щелкнуть мышью по одному из узлов многоугольника, обозначенного квадратиком и в появившимся меню выбрать пункт «Добавить внутренний контур».


5. Пример рисования многоугольника с выводом координат
Рассмотрим код примера
<!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 Яндекс.Карт v 2.x</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<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.6.4/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
// Как только будет загружен API и готов DOM, выполняем инициализацию
ymaps.ready(init);
function init () {
var myMap = new ymaps.Map("map", {
center: [56.317655,43.994362],
zoom: 15
}),
polygon = new ymaps.GeoObject({
geometry: {
type: "Polygon",
coordinates: []
}
});
myMap.geoObjects.add(polygon);
polygon.editor.startDrawing();
$('input').attr('disabled', false);
// Обработка нажатия на любую кнопку.
$('input').click(
function () {
// Отключаем кнопки, чтобы на карту нельзя было
// добавить более одного редактируемого объекта (чтобы в них не запутаться).
$('input').attr('disabled', true);
polygon.editor.stopEditing();
printGeometry(polygon.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>
<h2>Пример рисования многоугольника с выводом координат</h2>
<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.6.4/jquery.min.js" type="text/javascript"></script> |
При нажатии на кнопку «Завершить редактирование», вызывается функция в которой завершается режим редактирования
polygon.editor.stopEditing(); |
А также вызывается функция для вывода значений координат printGeometry (взята из примера здесь ).
Сама кнопка становиться неактивной.
6. Простейший редактор для рисования многоугольников
В этом коде мы развиваем предыдущий пример, добавляя возможность задания стилей для отображения многоугольника пользователю.
Для ввода параметров с права от окна с картой добавим форму для их ввода, а также три кнопки: добавить, удалить и завершить редактирование.
Рассмотрим работу готового примера, а затем я поясню его код.
В самом начале мы должны ввести в форму необходимые параметры многоугольника, например, толщина линии обводки — 3, необходимый нам цвет самого многоугольника и обводки, используя в качестве инструмента выбора возможности плагина jQuery SimpleColor и уровень прозрачности 1 для многоугольника, 0.8 — для обводки.
Нажимаем на кнопку «Добавить»
Кликая по карте, стоим ломаную нужной формы.
Если нас что-то не устраивает, мы можем нажать на кнопку «Удалить» и начать новое построение с кнопки «Добавить».
После того, ка необходимый полигон построен, нажимаем на кнопу «Завершить редактирование» для вывода значений координат.
Рассмотрим код примера
<!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 Яндекс.Карт v 2.x</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<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.6.4/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/jquery.simple-color.min.js"></script>
<script type="text/javascript">
// Как только будет загружен API и готов DOM, выполняем инициализацию
ymaps.ready(init);
var polygon;
function init () {
$('#color_polygon').simpleColor();
$('#color_line').simpleColor();
var myMap = new ymaps.Map("map", {
center: [56.317655,43.994362],
zoom: 15
});
//Добавляем элементы управления
myMap.controls
.add('zoomControl')
.add('typeSelector')
.add('mapTools');
// Обработка нажатия на кнопку Добавить
$('#addPolygon').click(
function () {
$('#stopEditPolygon').attr('disabled', false);
var color_polygon = $('#color_polygon').attr('value');
var fillopacity_polygon = $('#fillopacity_polygon').attr('value');
var width_line = $('#width_line').attr('value');
var color_line = $('#color_line').attr('value');
var opacity_line = $('#opacity_line').attr('value');
polygon = new ymaps.Polygon([[]],
{},
{
fillColor: color_polygon,
strokeColor: color_line,
opacity: fillopacity_polygon,
strokeOpacity: opacity_line,
strokeWidth: width_line
});
myMap.geoObjects.add(polygon);
polygon.editor.startDrawing();
$('#addPolygon').attr('disabled', true);
});
// Обработка нажатия на кнопку Завершить редактирование
$('#stopEditPolygon').click(
function () {
polygon.editor.stopEditing();
printGeometry(polygon.geometry.getCoordinates());
$('#stopEditPolygon').attr('disabled', true);
});
// Обработка нажатия на кнопку Удалить
$('#dellPolygon').click(
function () {
myMap.geoObjects.remove(polygon);
$('#geometry').html('');
$('#addPolygon').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>
<h2>Простейший редактор для рисования многоугольников</h2>
<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="formpolygon">
<strong>Форма ввода параметров многоугольника</strong><br />
<br />Цвет заливки: <input type="text" id="color_polygon" value="#0000ff" /><br />
<br />Уровень прозрачности заливки:<br /><input type="text" id="fillopacity_polygon" value="1">
<br />Толщина линии обводки: <input type="text" name="width_line" id="width_line" size="2" value="5" /><br />
<br />Цвет линии обводки:<br /><input type="text" id="color_line" value="#cc3333">
<br />Уровень прозрачности обводки:<br /><input type="text" id="opacity_line" value="1">
<p><input type="button" value="Добавить" id="addPolygon"/> <input type="button" value="Удалить" id="dellPolygon"/></p>
<p><input type="button" value="Завершить редактирование" id="stopEditPolygon"/></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_polygon').simpleColor();
$('#color_line').simpleColor(); |
где color_polygon и color_line — id-элементов ввода цвета полигона и обводки соответственно.
В секции body мы добавляем таблицу из одной строки и двух ячеек, в прервую помещаем контейнеры
div для вывода карты с id="map" и вывода координат id="geometry".
А во-вторую форму с полями для ввода значений и кнопками.
<div id="formpolygon"> <strong>Форма ввода параметров многоугольника</strong><br /> <br />Цвет заливки: <input type="text" id="color_polygon" value="#0000ff" /><br /> <br />Уровень прозрачности заливки:<br /><input type="text" id="fillopacity_polygon" value="1"> <br />Толщина линии обводки: <input type="text" name="width_line" id="width_line" size="2" value="5" /><br /> <br />Цвет линии обводки:<br /><input type="text" id="color_line" value="#cc3333"> <br />Уровень прозрачности обводки:<br /><input type="text" id="opacity_line" value="1"> <p><input type="button" value="Добавить" id="addPolygon"/> <input type="button" value="Удалить" id="dellPolygon"/></p> <p><input type="button" value="Завершить редактирование" id="stopEditPolygon"/></p> </div> |
При нажатии на кнопки вызываются соответствующие функции для обработки.
Если кликнуть по кнопке «Добавить», то обрабатываем ее нажатие с id="addPolygon".
Значения переменных из формы передаются соответствующим переменным color_polygon, fillopacity_polygon, width_line, color_line и opacity_line.
Мы можем начинать построение многоугольника с заданными параметрами.
При нажатии на кнопе «Удалить» обрабатываем это событие удаляя полигон с карты строкой
myMap.geoObjects.remove(poligon); |
Очищаем контейнер с id="geometry" строкой
$('#geometry').html(''); |
Включаем кнопку добавления многоугольника
$('#addPolygon').attr('disabled', false); |



Огромное спасибо за такую подробную статью.
Да действительно спасибо. Добавил в закладки.
Неделю уже мучаюсь, хочу сделать такую же карту как на циане. Информации с подробными примерами очень мало.
Отличные примеры, очень помогли!
Как рисовать, все понятно без статьи. А как это потом добавить на сайт, вопрос.