Map

class axioma.render.Map

Класс карты. Предназначен для предоставления доступа к своим элементам: слоям и группам слоев.

Map(parent=None)

Конструктор

Параметры:parent (QObject) – Родительский объект. При удалении владельца так же удаляется и сам элемент
Map(layers, parent=None)

Конструктор

Параметры:
  • layers (list [ Layer ]) – Первоначальный список слоев для инициализации карты
  • parent (QObject) – Родительский объект. При удалении владельца так же удаляется и сам элемент
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()