ymaps.ready(init);
function init() {
var map = new ymaps.Map('map', {
center: [56, 9],
zoom: 1,
type: 'yandex#map',
controls: ['zoomControl']
});
map.controls.get('zoomControl').options.set({
size: 'small'
});
// Зададим цвета для раскрашивания.
// Обратите внимание, для раскраски более крупных карт нужно задавать пятый цвет.
var colors = ['#6666F0', '#F0F075', '#FB6C3F', '#3D4C76', '#49C0B5'];
var objectManager = new ymaps.ObjectManager();
// Загрузим регионы.
ymaps.borders.load('001', {
lang: 'ru',
quality: 2
}).then(function(result) {
// Очередь раскраски.
var queue = [];
// Создадим объект regions, где ключи это ISO код региона.
var regions = result.features.reduce(function(acc, feature) {
// Добавим ISO код региона в качестве feature.id для objectManager.
var iso = feature.properties.iso3166;
feature.id = iso;
// Добавим опции региона по умолчанию.
feature.options = {
fillOpacity: 0.6,
strokeColor: '#FFF',
strokeOpacity: 0.5
};
acc[iso] = feature;
return acc;
}, {});
// Функция, которая раскрашивает регион и добавляет всех нераскрасшенных соседей в очередь на раскраску.
function paint(iso) {
var allowedColors = colors.slice();
// Получим ссылку на раскрашиваемый регион и на его соседей.
var region = regions[iso];
var neighbors = region.properties.neighbors;
// Если у региона есть опция fillColor, значит мы его уже раскрасили.
if (region.options.fillColor) {
return;
}
// Если у региона есть соседи, то нужно проверить, какие цвета уже заняты.
if (neighbors.length !== 0) {
neighbors.forEach(function(neighbor) {
var fillColor = regions[neighbor].options.fillColor;
// Если регион раскрашен, то исключаем его цвет.
if (fillColor) {
var index = allowedColors.indexOf(fillColor);
if (index != -1) {
allowedColors.splice(index, 1);
}
// Если регион не раскрашен, то добавляем его в очередь на раскраску.
} else if (queue.indexOf(neighbor) === -1) {
queue.push(neighbor);
}
});
}
// Раскрасим регион в первый доступный цвет.
region.options.fillColor = allowedColors[0];
}
for (var iso in regions) {
// Если регион не раскрашен, добавим его в очередь на раскраску.
if (!regions[iso].options.fillColor) {
queue.push(iso);
}
// Раскрасим все регионы из очереди.
while (queue.length > 0) {
paint(queue.shift());
}
}
// Добавим регионы на карту.
result.features = [];
for (var reg in regions) {
result.features.push(regions[reg]);
}
objectManager.add(result);
map.geoObjects.add(objectManager);
// Подпишемся на событие клика
map.geoObjects.events.add('click', function(e) {
alert(e.get('objectId'));
});
})
}
<!DOCTYPE html>
<html>
<head>
<title>Раскраска карты регионов (политическая карта)</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--
Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=<ваш API-ключ>" type="text/javascript"></script>
<style>
html,
body,
#map {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
</style>
</head>
<body>
<div id="map">
</div>
</body>
</html>
基于沙箱中的示例https://tech.yandex.ru/maps/jsbox/2.1/regions_colors(政治地图)和https://tech.yandex.ru/maps/jsbox/2.1/regions(添加国家或地区) 结果是这样的: