MapView - Окно просмотра карты

class axipy.MapView

Базовые классы: DrawableView

Окно просмотра карты. Используется для проведения различных манипуляций с картой. Для создания экземпляра необходимо использовать axipy.ViewManager.create_mapview() через экземпляр view_manager (пример см. ниже).

Примечание

При создании „MapView“ посредством axipy.ViewManager.create_mapview() производится клонирование экземпляра карты axipy.render.Map и для последующей работы при доступе к данному объекту необходимо использовать свойство map.

Свойство device_rect определяет размер самого окна карты, а свойство scene_rect - прямоугольную область, которая умещается в этом окне в СК карты.

Преобразование между этими двумя прямоугольниками производится с помощью матриц трансформации scene_to_device_transform и device_to_scene_transform.

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

Рассмотрим пример создания карты с последующим помещением ее в окно ее просмотра. Далее, попробуем преобразовать объект типа полигон из координат окна экрана в координаты СК слоя посредством axipy.Geometry.affine_transform().

# Откроем таблицу, создадим на ее базе слой и добавим в карту
>>> import axipy
>>> table_world = axipy.provider_manager.openfile('world.tab')
>>> world = Layer.create(table_world)
>>> map_ = Map([world])
# Для полученной карты создадим окно просмотра
>>> mapview = axipy.view_manager.create_mapview(map_)
# Выведем полученные параметры отображения
>>> print('Прямоугольник экрана:', mapview.device_rect)
Прямоугольник экрана: (0.0 0.0) (300.0 200.0)
>>> print('Прямоугольник карты:', mapview.scene_rect)
Прямоугольник карты: (-16194966.287183324 -8621185.324024437) (16789976.633236416 8326222.646170927)
# Установим ширину карты и ее центр
>>> mapview.center = (1000000, 1000000)
>>> mapview.set_zoom(10e6)
# Создадим геометрический объект полигон в координатах экрана и преобразуем его в СК карты
>>> poly_device = axipy.Polygon([(100,100), (100,150), (150, 150), (150,100)])
# Используя матрицу трансформации, преобразуем его в координаты карты.
>>> poly_scene = poly_device.affine_transform(mapview.device_to_scene_transform)
# Для контроля выведем полученный полигон в виде WKT
>>> print('WKT:', poly_scene.to_wkt())
WKT: POLYGON ((-5199985.31371008 -147481.338926755, -5199985.31371008 -4384333.3314756, 297505.173026545 -4384333.3314756, 297505.173026545 -147481.338926755, -5199985.31371008 -147481.338926755))

Свойства:

can_redo

Возможен ли откат на один шаг вперед.

can_undo

Возможен ли откат на один шаг назад.

center

Центр окна карты.

clip

Геометрия обрезки карты.

coordsystem

Система координат карты.

coordsystem_visual

Система координат карты с учетом поправки цены градуса по широте.

device_rect

Видимая область в координатах окна (пиксели).

device_to_scene_transform

Объект трансформации из координат окна в координаты карты.

editable_layer

Редактируемый слой на карте.

is_modified

Есть ли изменения в окне.

map

Объект карты.

position

Размер и положение окна.

scale

Масштаб карты.

scene_rect

Видимая область в координатах карты (в единицах измерения СК).

scene_to_device_transform

Объект трансформации из координат карты в координаты окна.

selected_layer

Выделенный слой на карте.

show_type

Возвращает тип состояния окна.

snap_mode

Включает режим привязки координат при редактировании геометрии в окне карты или отчета.

title

Заголовок окна просмотра.

unit

Единицы измерения координат карты.

widget

Виджет, соответствующий содержимому окна.

Методы:

close()

Закрывает окно.

offset(dx, dy)

Производит сдвиг окна карты или отчета.

redo()

Производит откат на один шаг вперед.

reset_parent(parent)

Сбрасывает окно контейнера для карты или таблицы просмотра, если он существует и закрывает его.

scale_with_center(scale, center)

Установка нового центра с заданным масштабированием.

set_zoom(zoom[, unit])

Задание ширины окна карты.

set_zoom_and_center(zoom, center[, unit])

Задает новый центр и ширину окна карты.

show([type])

Показывает окно в соответствие с приведенным типом.

show_all()

Полностью показывает все слои карты.

show_selection()

Перемещает карту к группе выделенных объектов, максимально увеличивая масштаб, но так, чтобы все объекты попадали.

undo()

Производит откат на один шаг назад.

zoom([unit])

Ширина окна карты.

Сигналы:

coordsystem_changed

Сигнал о том, что система координат изменилась.

editable_layer_changed

Сигнал о том, что редактируемый слой сменился.

mouse_moved

Сигнал при смещении курсора мыши.

scene_changed

Сигнал об изменении контента окна.

property can_redo: bool

Возможен ли откат на один шаг вперед.

property can_undo: bool

Возможен ли откат на один шаг назад.

property center: Pnt

Центр окна карты.

property clip: ClipGeometry

Геометрия обрезки карты. Устанавливается геометрия, в рамках которой будет отрисована карта. За пределами отрисовка производиться не будет. Обрабатываются только площадные объекты. Так-же допустимо устанавливать коллекции.

Пример установки обрезки по заданной геометрии:

rectangle = axipy.Rectangle(axipy.Rect(-50, -50, 50, 50))
axipy.view_manager.active.clip.geometry = rectangle

Если установить None, то режим сбрасывается:

axipy.view_manager.active.clip.geometry = None

Если необходимо сохранить объект, то можно просто отключить режим:

axipy.view_manager.active.clip.status = False
close()

Закрывает окно.

Примечание

Если при закрытии окна выдается запрос о сохранении данных перед закрытием и необходимо изменить поведение, то это можно сделать через соответствующие типу окна настройки или же через свойство axipy.CurrentSettings.SilentCloseWidget

property coordsystem: CoordSystem

Система координат карты.

property coordsystem_changed: Signal

Сигнал о том, что система координат изменилась.

Пример::
>>> import axipy
>>> layer_world = axipy.Layer.create(table_world)
>>> map_ = axipy.Map([layer_world])
>>> mapview = axipy.view_manager.create_mapview(map_)
>>> mapview.coordsystem_changed.connect(lambda: print('СК была изменена'))
>>> csLL = axipy.CoordSystem.from_prj("1, 104")
>>> mapview.coordsystem = csLL
СК была изменена
property coordsystem_visual: CoordSystem

Система координат карты с учетом поправки цены градуса по широте. Отличается от coordsystem только лишь в случае, когда основная система координат - это широта/долгота и широта имеет ненулевое значение. При этом в диапазоне широты (-70…70) градусов вводится поправочный коэффициент, растягивающий изображение по широте и равный 1/cos(y).

property device_rect: Rect

Видимая область в координатах окна (пиксели).

Результат:

Прямоугольник в координатах окна.

property device_to_scene_transform: QTransform

Объект трансформации из координат окна в координаты карты.

Результат:

Объект трансформации.

property editable_layer: Optional[VectorLayer]

Редактируемый слой на карте.

Результат:

Редактируемый слой. Если не определен, возвращает None.

property editable_layer_changed: Signal

Сигнал о том, что редактируемый слой сменился.

property is_modified: bool

Есть ли изменения в окне.

property map: Map

Объект карты.

Результат:

Карта.

property mouse_moved: Signal

Сигнал при смещении курсора мыши. Возвращает значения в СК карты.

Тип результата:

Signal[float, float]

Пример:

mapview.mouse_moved.connect(lambda x,y: print('Coords: {} {}'.format(x, y)))

>> Coords: -5732500.0 958500.0
>> Coords: -5621900.0 847900.0
offset(dx: float, dy: float)

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

Параметры:
  • dx – Смещение по горизонтали в координатах экрана (пикселях)

  • dy – Смещение по вертикали в координатах экрана (пикселях)

property position: QRect

Размер и положение окна.

redo()

Производит откат на один шаг вперед. При этом возвращается состояние до последней отмены.

reset_parent(parent: QWidget)

Сбрасывает окно контейнера для карты или таблицы просмотра, если он существует и закрывает его. Это требуется когда окно карты или таблица просмотра необходимо встроить в другое окно.

Параметры:

parent – Окно - новый родитель

Пример встраивания окно карты в диалог:

table = provider_manager.openfile('world.tab')
layer = Layer.create(table)
m = Map([layer])
view = view_manager.create_mapview(m)

# Диалог, в который будет встраиваться
class MyDialog(QDialog):

    def __init__(self ):
        super().__init__()
        # Инициализируем менеджер компоновки
        self.layout = QGridLayout()
        self.setLayout(self.layout)

    def set_mapview(self, view):
        # Устанавливаем окно карты как контент данного диалога
        view.reset_parent(self)
        self.layout.addWidget(view.widget)
        view.show()

dialog = MyDialog()
dialog.resize(500,300)
dialog.set_mapview(view)
dialog.show()
property scale: float

Масштаб карты.

scale_with_center(scale: float, center: Pnt)

Установка нового центра с заданным масштабированием.

Параметры:
  • scale – Коэффициент масштабирования по отношению к текущему.

  • center – Устанавливаемый центр.

property scene_changed: Signal

Сигнал об изменении контента окна.

Тип результата:

Signal[]

property scene_rect: Rect

Видимая область в координатах карты (в единицах измерения СК).

Результат:

Прямоугольник в координатах карты.

property scene_to_device_transform: QTransform

Объект трансформации из координат карты в координаты окна.

Результат:

Объект трансформации.

property selected_layer: Optional[VectorLayer]

Выделенный слой на карте.

Результат:

Выделенный слой. Если выделение отсутствует, возвращает None.

set_zoom(zoom: float, unit: Optional[LinearUnit] = None)

Задание ширины окна карты.

Параметры:
  • zoom – Значение ширины карты.

  • unit – Единицы измерения. Если не заданы, берутся текущие для карты.

set_zoom_and_center(zoom: float, center: Pnt, unit: Optional[LinearUnit] = None)

Задает новый центр и ширину окна карты.

Параметры:
  • zoom – Значение ширины карты.

  • center – Центр карты.

  • unit – Единицы измерения. Если не заданы, берутся текущие для карты.

show(type: int = SHOW_NORMAL)

Показывает окно в соответствие с приведенным типом.

Допустимые значения:

Константа

Значение

Описание

SHOW_NORMAL

1

Обычный показ окна (по умолчанию).

SHOW_MINIMIZED

2

Показ окна в режиме минимизации.

SHOW_MAXIMIZED

3

Показ окна в режиме распахивания.

show_all()

Полностью показывает все слои карты.

show_selection()

Перемещает карту к группе выделенных объектов, максимально увеличивая масштаб, но так, чтобы все объекты попадали.

property show_type: int

Возвращает тип состояния окна. Подробнее см. show()

property snap_mode: bool

Включает режим привязки координат при редактировании геометрии в окне карты или отчета.

property title: str

Заголовок окна просмотра.

undo()

Производит откат на один шаг назад.

property unit: LinearUnit

Единицы измерения координат карты.

property widget: QWidget

Виджет, соответствующий содержимому окна.

Результат:

Qt5 виджет содержимого.

zoom(unit: Optional[LinearUnit] = None) float

Ширина окна карты.

Параметры:

unit – Единицы измерения. Если не заданы, берутся текущие для карты.