MapView - Окно просмотра карты
- class axipy.MapView
Базовые классы:
DrawableView
Окно просмотра карты. Используется для проведения различных манипуляций с картой. Для создания экземпляра необходимо использовать
axipy.ViewManager.create_mapview()
через экземпляр view_manager (пример см. ниже).Примечание
При создании „MapView“ посредством
axipy.ViewManager.create_mapview()
производится клонирование экземпляра картыaxipy.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])Ширина окна карты.
Сигналы:
Сигнал о том, что система координат изменилась.
Сигнал о том, что редактируемый слой сменился.
Сигнал при смещении курсора мыши.
Сигнал об изменении контента окна.
Специальные методы:
__str__
()Неформальное строковое представление объекта при вызове
str
илиprint()
.- property calc_mode: CalcMode
Устанавливает или возвращает режим расчета для карты
Пример установки для активной карты:
if isinstance(view_manager.active, MapView): view_manager.active.calc_mode = CalcMode.ELLIPSOID
- 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 – Единицы измерения. Если не заданы, берутся текущие для карты.