Слой
Для отображения данных таблицы или растра необходимо создать на
основе этого источника данных слой 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()
Результат будет выглядеть примерно так: