axioma.render.
Map
¶Класс карты. Предназначен для предоставления доступа к своим элементам: слоям и группам слоев.
Map
(parent=None)¶Конструктор
Параметры: parent ( QObject
) – Родительский объект. При удалении владельца так же удаляется и сам элемент
Map
(layers, parent=None)Конструктор
Параметры:
boundingRect
(cs)¶Определение области карты.
Параметры: cs (CoordSystem) – КС для области Результат: Область карты, в которую попадают все слои Тип результата: GeoRect
canRenderAllLayersInCS
(cs)¶Определение, могут ли все слои карты быть отображены в переданной координатной системе.
Параметры: cs (CoordSystem) – КС для проверки Результат: True, если да. В противном случае False Тип результата: bool
editableLayer
()¶Редактируемый слой карты
Результат: Слой или None
, если таковой отсутствуетТип результата: Layer
editableLayerChanged
()¶[signal] Сигнал испускается, когда производится смена редактируемого слоя.
findBestCoordSys
()¶Возвращает координатную систему, в которой может быть нарисовано наибольшее число слоев.
Результат: Координатная система Тип результата: CoordSystem
flatLayerList
()¶Список слоев карты.
Результат: «Плоский» список слоев карты со всех уровней вложенности Тип результата: list
[Layer
]
labelContainer
()¶Контейнер параметров подписывания (ссылка)
Результат: контейнер параметров подписывания Тип результата: FeatureLabelContainer
mapProperties
()¶Текущие настройки карты.
Результат: Настройки Тип результата: MapProperties
needRedraw
()¶[signal] Сигнал испускается, когда необходимо перерисовать содержимое карты.
renderSelection
(context)¶Отрисовка выделения в карте
Параметры: context ( Context
) – Контекст, в котором будет отрисовано выделение
rootLayerGroup
()¶Корневая группа слоев карты.
Результат: Группа слоев Тип результата: RootLayerGroup
setEditableLayer
(layer)¶Установка редактируемого слоя.
Параметры: layer ( Layer
) – Слой, который нужно сделать редактируемым.
setMapProperties
(mapProperties)¶Установка настроек карты.
Параметры: mapProperties ( MapProperties
) – Новый набор настроек
visibilityChanged
()¶[signal] Сигнал испускается, когда меняются параметры видимости содержимого карты.
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #!/usr/bin/python3
# -*- coding: utf-8 -*-
# Импорт
from axioma.cs import *
from axioma.render import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import threading
'''
Пример отрисовки слоя в растр и отображение его в диалоговом окне.
Перед запуском скрипта необходимо открыть карту со слоем world.
'''
class MapDialog(QDialog):
def __init__(self, parent, layer):
QDialog.__init__(self, parent)
self.layer = layer
self.image = QImage()
self.lock = threading.Lock()
self.initUI()
def initUI(self):
self.setGeometry(200, 200, 1200, 600)
self.setWindowTitle(self.tr("Отрисовка карты со слоем World"))
def renderMap(self): # Рисование карты
try:
br = self.layer.boundingRect() # rect слоя
imRect = QRect (0, 0, self.width(), self.width() * br.height() / br.width()) # размер растра
self.image = QImage(imRect.size(), QImage.Format_ARGB32_Premultiplied) # Сам растр, куда будем рисовать
self.image.fill(Qt.white)
painter = QPainter(self.image)
sceneRect = QRectF(br.left(), br.top(), br.width(), br.height())
viewport = MapViewport(QRectF(imRect), sceneRect, self.layer.coordSystem())
context = MapContext (painter,viewport) # контекст, куда рисуем
#self.layer.render(context) # Если мы хотим просто отрисовать существующий слой, не создавая карты (Вместо следующих строчек с созданием карты)
map = Map() # временная карта
renderer = ConcurrentMapRenderer() # объект, занимающийся многопоточной отрисовкой
lay = axioma.app.render.createLayerForDataObject(self.layer.table()) # временный слой
props = lay.featureLayerProperties() #Свойства слоя
#Если мы хотим управлять видимостью
#constraints = props.visibilityConstraints() # Ограничение по видимости
#print(constraints.zoomMin(), constraints.zoomMax()) # Текущие значения
#constraints.setZoomMax(2) #
#constraints.setEnabled(True) # Включаем
#props.setVisibilityConstraints(constraints) # Подменяем
props.setLabelingAttributeName(self.tr("Страна")) # устанавливаем выражение для метки
# Сделаем так, чтобы метки не перекрывали друг друга
policy = props.labelPlacementPolicy()
policy.labelingType = LabelPlacementPolicy.DisallowOverlap
props.setLabelPlacementPolicy(policy)
textRenderer = props.textRenderer() # Стиль текста. Поменяем цвет.
textRenderer.setColor(Qt.gray)
props.setTextRenderer(textRenderer)
props.setShowLabels(True) # Показ меток
props.setCentroidsVisible(True) # Показ центроидов
lay.setProperties(props) # Устанавливаем новые свойства слоя
map.rootLayerGroup().append(lay) # добавляем слой в карту
renderer.blockingRender(map, context) # отрисовка
#self.image.save("/tmp/out.png") # Если мы хотим сохранить как растр в файловой системе
except Exception as ex:
print(ex)
def paintEvent(self, event): # событие по перерисовке окна
painter = QPainter(self)
painter.fillRect(event.rect(), Qt.lightGray)
if not self.image.isNull():
painter.drawImage(0,0, self.image)
def resizeEvent(self, event):
try:
self.lock.acquire()
self.renderMap()
finally:
self.lock.release()
# Создаем диалоговое окно
for mapview in axioma.app.mainWindow.mapViewManager().mapViews():
layer = mapview.rootLayerGroup().findChildByName("world")
if layer is not None:
dlg = MapDialog(axioma.app.mainWindow, layer)
dlg.exec()
|