Клуб API Карт

Раскрашивание регионов в разные цвета

r-omk-a
25 мая 2010, 19:23

Есть задача, состоящая в том, что нужно, исходя из некоторых условий, раскрасить регионы России в разные цвета. Делаю это следующим образом (для примера цвета всех регионов оставил одинаковыми). В цикле по всем полученным через YMaps.Regions.load данным создаю новый полигон:

var polygon = YMaps.Polygon.fromEncodedPoints(
  obj.metaDataProperty.encodedShapes[0].coords,
  obj.metaDataProperty.encodedShapes[0].levels,
  geoObjectOptions
);


Полный исходный код выглядит так:

var map = new YMaps.Map(document.getElementById("ymap"));
map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 3);
            
YMaps.Regions.load("ru", function (state, response) {
    if (state == YMaps.State.SUCCESS) {
    
      response.forEach(function (obj, objIndex, group) {
         
      obj.setOptions({
        highlightRegion: false
      });
     
      var geoObjectOptions = {
        hasBalloon: true,
        hasHint: true,
        hintOptions: {
           offset: new YMaps.Point(5, 5)
        }
      }
            
      var style = new YMaps.Style();
      style.polygonStyle = new YMaps.PolygonStyle();
      style.polygonStyle.fill = true;
      style.polygonStyle.outline = true;
      style.polygonStyle.strokeWidth = 3;
      style.polygonStyle.strokeColor = "ffffff88";
      style.polygonStyle.fillColor = "ff000055";
            
      var polygon = YMaps.Polygon.fromEncodedPoints(
        obj.metaDataProperty.encodedShapes[0].coords,
        obj.metaDataProperty.encodedShapes[0].levels,
        geoObjectOptions
      );
            
      polygon.name = obj.name + ' (' + objIndex + ')';
      polygon.description = 'tratata ' + obj.name;
            
      polygon.setStyle(style);
    
      map.addOverlay(polygon);
  }
    
    
  response.setStyle({
    polygonStyle : {
      fillColor : "ffffff99",
      strokeColor : "000000",
      strokeWidth: 3
    },
    hasHint : false
  });
} else {
  alert("Во время выполнения запроса произошла ошибка: " + response.error.message)
}
    );

В итоге вся карта России заливается полигонами нужных цветов (в количестве 82 штук) и карта начинает заметно подтормаживать, особенно в IE. Возможно я делаю что-то неправильно и есть способ разукрасить карту потребляя меньше ресурсов системы посетителя?

5 комментариев
Подписаться на комментарии к посту
Вы все делаете правильно. Однако, добавление сразу всех регионов на
карту, конечно, повлияет на производительность.

Если вы будете
использовать слой активных областей, то скорость увеличится в разы.
Правда, данный способ более трудозатратный (вам нужно будет
сгенерировать тайлы с нарисованными многоугольниками).
Смотрел этот пример: http://api.yandex.ru/maps/jsapi/doc/mod/hotspots/tasks/how-to-use-twirl-util.xml. Правильно я понимаю, что логика работы у меня должна быть такой:
* вытаскиваю координаты полигонов для каждого региона (кстати, можно получить координаты регионов не закодированными BASE64? Или может быть в YMapsML-документ можно передать закодированные координаты?)
* создаю шаблонный YMapsML-документ, в котором вместо цветов регионов указаны некоторые маски.
* произвожу нужные мне рассчеты, определяю цвета для каждого региона, в шаблонном YMapsML-документе заменяю маски цветами, передаю сгенерированный YMapsML скрипту hsTiler, скрипт генерирует тайлы, которые я смогу использовать и получить бОльшую производительность, чем есть в том примере, который я привел изначально?
Массив незакодированных координат можно получить. Подробнее здесь:
http://api.yandex.ru/maps/jsapi/doc/mod/regions/concepts/api-modules-regions.xml#coordinates

Утилита от twirl не умеет работать с полигонами, на сколько мне известно. Ее придется дописать.
Спасибо.
а можешь результат выложить ?