# Слой

Для отображения данных таблицы или растра необходимо создать на основе этого источника данных слой `axipy.Layer`.

    from axipy.render import Layer

    layer = Layer.create(table)

В зависимости от типа передаваемого объекта будет создан векторный или растровый слой.

Свойства подписей

Настройки автоматического подписывания определяются классом `axipy.Label` свойством `axipy.VectorLayer.label`.

Пример использования

    world = generate_layer_for_geometry_table()
    # Зададим в качестве формулы метки атрибут "Страна" и запретим перекрытие меток друг другом:
    world.label.text = "Страна"
    world.label.placementPolicy = LabelOverlap.DisallowOverlap
    # Задание стиля оформления слоя
    style_lay = Style.from_mapinfo("Pen (1, 2, 0) Brush (8, 255) Symbol (33,255,14)")
    world.overrideStyle = style_lay
    # Для сброса переопределения достаточно задать значение None
    world.overrideStyle = None

Настройки автоматического подписывания `axipy.Label` повторяют соответствующие настройки в интерфейсе ГИС Аксиома диалога «Свойства слоя» > «Подписи».

См.также

Подробнее в разделе «Подписывание» руководства пользователя для ГИС Аксиома.

# Карта

Совокупность слоев образует карту `axipy.Map`. Порядок отрисовки слоев прямо зависит от их расположения в карте. То есть первый слой будет на самом верху, а последний - в самом низу.

Создадим карту с двумя слоями. Передадим в карту список таблиц - из них автоматически создадутся слои с параметрами по умолчанию.

    import axipy

    world = axipy.provider_manager.openfile('../path/to/datadir/example.gpkg', dataobject='world')
    capital = axipy.provider_manager.openfile('../path/to/datadir/worldcap.tab')
    map_ = axipy.Map([capital, world])

Карту можно вывести в изображение - `PySide2.QtGui.QImage`, которое, например, можно в качестве результата сохранить в файл.

    image = map_.to_image(600, 300)

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

    print(image.save('../path/to/outdir/map.png'))

    >>> True

Мы указали только размеры изображения. Карта вывелась в Системе Координат (СК), наиболее подходящей для отображения слоев в ней. В нашем случае обе таблицы оказались в одной СК, которая и была выбрана для отображения.

Теперь отрисуем эту же карту Азимутальной СК:

    from axipy.cs import CoordSystem

    azimuth = CoordSystem.from_epsg(2163)
    image = map_.to_image(600, 300, coordsystem=azimuth)

Границы карты по умолчанию определились равными границам СК. Снова нарисуем нашу карту уже в Широте/Долготе в границах, примерно включающих Италию. Ограничивающий прямоугольник указываем в градусах:

    longlat = CoordSystem.from_epsg(4326)
    image = map_.to_image(600, 300, coordsystem=longlat, bbox=(5, 35, 15, 15))

Теперь попробуем для слоя capital задать выражение для отображаемых меток `axipy.VectorLayer.label`, и для обоих слоев переопределить стиль оформления, сделав его однообразным `axipy.VectorLayer.overrideStyle`. Заметим, что перечень доступных слоев карты доступен через свойство `axipy.Map.layers`. Т.е. помимо передачи перечня слоев в конструктор карты, также возможно управление этим списком позже.

    from axipy import Label, Style

    lay_capital = map_.layers[0]
    lay_capital.label.text = 'Столица'
    lay_capital.label.placementPolicy = Label.DisallowOverlap
    lay_capital.overrideStyle = Style.from_mapinfo('Symbol (34,255,6)')
    lay_world = map_.layers['world']
    lay_world.overrideStyle = Style.from_mapinfo('Pen (1, 2, 0) Brush (8, 255)')
    image = map_.to_image(600, 300, coordsystem=longlat, bbox=(5, 35, 15, 15))

В рамках примера по управлению слоями в конце удалим слой со столицами (самый верхний):

    map_.layers.remove(0)

Создадим карту на базе растра как подложки и установим прозрачным цвет фона.

    from PySide2.QtGui import QColor
    from axipy import provider_manager, Layer, Map

    raster = provider_manager.openfile("../path/to/datadir/TrueMarble.tab")
    rasterLayer = Layer.create(raster)
    rasterLayer.transparentColor = QColor("#000014")

    mapRaster = Map([capital, rasterLayer])
    image = mapRaster.to_image(600, 320)

## Окно редактирования карты

Окно карты `axipy.Map`, созданное программно, можно экспортировать в виде растра или же поместить в отчет. Если же стоит задача проведения некоторых манипуляций с картой, таких как редактирование геометрии, то для проведения подобных манипуляций ее необходимо поместить в окно редактирования `axipy.MapView`. Для создания этого окна необходимо использовать метод `axipy.ViewManager.create_mapview()`. Данный метод доступен через сервис view_manager. Рассмотрим на примере:

Пример использования.

    # Откроем таблицу, создадим на ее базе слой и добавим в карту
    table_world = provider_manager.openfile(filepath)
    world = Layer.create(table_world)
    map = Map([world])
    # Для полученной карты создадим окно просмотра
    mapview = view_manager.create_mapview(map)

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

    from PySide2.QtWidgets import QSlider, QFrame, QLabel, QVBoxLayout
    from PySide2.QtCore import Qt

    def change_opacity(v):
        mv = view_manager.active
        if mv and len(mv.map.layers):
            mv.map.layers[0].opacity = 100 - v

    mv = view_manager.active
    if mv is not None:
        frame = QFrame(mv.widget)
        layout = QVBoxLayout()
        slider = QSlider(Qt.Vertical, frame)
        slider.setRange(0, 100)
        slider.valueChanged.connect(change_opacity)
        layout.addWidget(QLabel("Макс", frame))
        layout.addWidget(slider)
        layout.addWidget(QLabel("Мин", frame))
        frame.setGeometry(10, 10, 50, 300)
        frame.setLayout(layout)
        frame.show()

Результат будет выглядеть примерно так: