# Тематические слои

Тематическая карта отображает ваши данные в виде условных знаков, выделяя их оттенками, цветами, штриховками, а также представляя их в виде столбчатых и круговых диаграмм.

Для векторных слоев `axipy.VectorLayer` есть возможность формирования и отрисовки тематических слоев. Т.е. применить оформление на базе атрибутивной информации.

Тематические слои добавляются как дочерние к их базовому слою.

    from axipy import RangeThematicLayer

    world = map_.layers[0]
    thematic = RangeThematicLayer('Население')
    world.thematic.add(thematic)

Поддерживаются следующие виды тематических слоев:

- RangeThematicLayer - Интервалы

- PieThematicLayer - Круговые диаграммы

- BarThematicLayer - Столбчатые диаграммы

- SymbolThematicLayer - Знаки

- IndividualThematicLayer - Индивидуальные значения

- DensityThematicLayer - Плотность точек

Для более удобного распределения по цветам используются различного рода алгоритмы. Выбор того или иного алгоритма обусловлен исходными требованиями к составлению тематики. Эти алгоритмы сгруппированы в базовом интерфейсе `axipy.ReallocateThematicColor` и могут быть использованы в наследниках. Поддерживаются следующие виды распределения:

- По двум заданным крайним цветам `axipy.ReallocateThematicColor.assign_two_colors()`.

- По двум заданным крайним цветам и цвету разрыва `axipy.ReallocateThematicColor.assign_two_colors()`.

- По спектру `axipy.ReallocateThematicColor.assign_rainbow()`.

- Градация серого `axipy.ReallocateThematicColor.assign_gray()`.

- Монотонная заливка разной яркости `axipy.ReallocateThematicColor.assign_monotone()`.

Рассмотрим на примере тематики по интервалам. Построим тематику по атрибутивному полю “Население” на 6 интервалов с равномерным распределением по количеству записей. Цвета распределим градиентом от желтого до красного.

    table_world = provider_manager.openfile('world.tab')
    world = Layer.create(table_world)
    range1 = RangeThematicLayer("Население")
    range1.ranges = 6
    range1.splitType = RangeThematicLayer.EQUAL_COUNT
    range1.assign_two_colors(Qt.yellow, Qt.red)
    world.thematic.add(range1)

Поменяем стиль оформления для первого интервала:

    range1.set_style(0, PolygonStyle(45, Qt.blue))

Так же есть возможность ручного переопределения значений разбивки по интервалам. Т.е. задание минимального и максимального значений требуемого интервала. Переопределим верхнее значение для первого интервала:

    iv = range1.get_interval_value(0)
    print('Old values:', iv)
    range1.set_interval_value(0, (iv[0], 100000.0))
    print('New values:', range1.get_interval_value(0))

    >>> Old values: (0.0, 66687.0)
    >>> New values: (0.0, 100000.0)

Создадим тематику с отдельными значениями по полю „Страна“. Распределение по цветам случайное:

    individual = IndividualThematicLayer('Страна')
    individual.assign_rainbow()
    world.thematic.add(individual)
    individual.set_style(0, PolygonStyle(45, Qt.blue))

Изменим цвет интервала по индексу 1 на желтый.

    s = individual.get_style(1)
    s.polygon.fill.color = Qt.yellow
    individual.set_style(1, s)

Необходимую тематику слоя можно получить по ее индексу `axipy.Layer.thematic()`:

    range1 = world.thematic[0]

Если необходимо просмотреть все тематики слоя:

    for t in world.thematic:
        print('thematic:', t.title)

    >>> thematic: Интервалы
    >>> thematic: Значения