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))
Свойства:
Возможен ли откат на один шаг вперед.
Возможен ли откат на один шаг назад.
Центр окна карты.
Геометрия обрезки карты.
Система координат карты.
Система координат карты с учетом поправки цены градуса по широте.
Видимая область в координатах окна (пиксели).
Объект трансформации из координат окна в координаты карты.
Редактируемый слой на карте.
Есть ли изменения в окне.
Объект карты.
Размер и положение окна.
Масштаб карты.
Видимая область в координатах карты (в единицах измерения СК).
Объект трансформации из координат карты в координаты окна.
Выделенный слой на карте.
Возвращает тип состояния окна.
Включает режим привязки координат при редактировании геометрии в окне карты или отчета.
Заголовок окна просмотра.
Единицы измерения координат карты.
Виджет, соответствующий содержимому окна.
Методы:
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
()Полностью показывает все слои карты.
Перемещает карту к группе выделенных объектов, максимально увеличивая масштаб, но так, чтобы все объекты попадали.
undo
()Производит откат на один шаг назад.
zoom
([unit])Ширина окна карты.
Сигналы:
Сигнал о том, что система координат изменилась.
Сигнал о том, что редактируемый слой сменился.
Сигнал при смещении курсора мыши.
Сигнал об изменении контента окна.
- 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 mouse_moved: Signal
Сигнал при смещении курсора мыши. Возвращает значения в СК карты.
Пример:
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 – Смещение по вертикали в координатах экрана (пикселях)
- 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()
- scale_with_center(scale: float, center: Pnt)
Установка нового центра с заданным масштабированием.
- Параметры:
scale – Коэффициент масштабирования по отношению к текущему.
center – Устанавливаемый центр.
- 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 snap_mode: bool
Включает режим привязки координат при редактировании геометрии в окне карты или отчета.
- undo()
Производит откат на один шаг назад.
- property unit: LinearUnit
Единицы измерения координат карты.
- property widget: QWidget
Виджет, соответствующий содержимому окна.
- Результат:
Qt5 виджет содержимого.
- zoom(unit: Optional[LinearUnit] = None) float
Ширина окна карты.
- Параметры:
unit – Единицы измерения. Если не заданы, берутся текущие для карты.