状态栏显示信息逻辑如下:

  • 监听画布鼠标移动事件
  • 将点坐标绘制在状态组件中

显示坐标参考系统

找到init_qgis_map方法,在初始化画布的时候,设置状态栏的坐标参考系统

# 设置状态栏
set_status_crs(main.ui.label_crs, main.preview_canvas)
  • main.ui.label_crs:为QLabel控件

设置代码如下:

def set_status_crs(label: QLabel, canvas: QgsMapCanvas):
canvas.mapSettings().destinationCrs().description()
map_setting: QgsMapSettings = canvas.mapSettings()
label.setText(f"坐标系: {map_setting.destinationCrs().description()}-{map_setting.destinationCrs().authid()}")

监听鼠标移动

QGIS的画布已经提供该监听方法,

main.preview_canvas.xyCoordinates.connect(lambda point: set_status_xy(
_ui.edit_coords_default_value, _ui.edit_coords_value, main.preview_canvas, point))
  • point:即为监听方法传递的坐标信息,对应的是鼠标此刻位置

set_status_xy为显示的方法,其接受参数如下

  • _ui.edit_coords_default_value:控件,显示默认坐标系坐标
  • _ui.edit_coords_value:控件,显示转换的坐标`
  • main.preview_canvas:当前画布
  • point:当前点

显示坐标

def set_status_xy(label_origin, label_latlon, canvas: QgsMapCanvas, point: QgsPointXY):
label_origin.setText(f'{point.x():.0f}, {point.y():.0f}')
convert_point = convert_to_wgs84(QgsCoordinateReferenceSystem(canvas.mapSettings().destinationCrs().authid()), point)
label_latlon.setText(f'{convert_point.y():.5f}°, {convert_point.x():.5f}°')
label_latlon.setCursorPosition(0)

坐标转换方法

from qgis._core import QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsCoordinateTransformContext, QgsPointXY
def convert_to_wgs84(src_crs, point: QgsPointXY):
"""
转换到 EPSG:4326 坐标系
:param src_crs: 原始坐标系
:param point:
:return:
"""
dest_crs = QgsCoordinateReferenceSystem("EPSG:4326")
crs_tras = QgsCoordinateTransform(src_crs, dest_crs, QgsCoordinateTransformContext())
return crs_tras.transform(point)