| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- from qgis.PyQt.QtWidgets import QAction
- from qgis.core import QgsCoordinateReferenceSystem
- from ..icons import icons
- class FitZoomAction(QAction):
- def __init__(self, iface, parent=None):
- self.iface = iface
- super().__init__(parent)
- self.setIcon(icons["fitzoom"])
- self.setText("调整缩放比例")
- self.triggered.connect(self.fit_zoom_level)
- self.iface.mapCanvas().destinationCrsChanged.connect(self.check_crs)
- self.iface.mapCanvas().layersChanged.connect(self.check_crs)
- self.check_crs()
- def fit_zoom_level(self):
- crs = self.iface.mapCanvas().mapSettings().destinationCrs()
- if crs == QgsCoordinateReferenceSystem("EPSG:3857"):
- max_zoom_level = 23
- mpp_3857 = [40075016.685 / (2**i * 256) for i in range(max_zoom_level)]
- current_mpp = self.iface.mapCanvas().mapUnitsPerPixel()
- nearest_level = self.find_nearest_number_index(mpp_3857, current_mpp)
- zoom_factor = mpp_3857[nearest_level] / current_mpp
- if not abs(1 - zoom_factor) < 1e-5:
- self.iface.mapCanvas().zoomByFactor(zoom_factor)
- @staticmethod
- def find_nearest_number_index(numbers_list, target):
- min_difference = float("inf")
- nearest_index = None
- for i, number in enumerate(numbers_list):
- difference = abs(number - target)
- if difference < min_difference:
- min_difference = difference
- nearest_index = i
- return nearest_index
- def check_crs(self):
- crs = self.iface.mapCanvas().mapSettings().destinationCrs()
- layers_number = self.iface.mapCanvas().layerCount()
- if crs == QgsCoordinateReferenceSystem("EPSG:3857") and layers_number > 0:
- self.setText("调整缩放比例")
- self.setEnabled(True)
- else:
- self.setText("调整缩放比例不可用")
- self.setEnabled(False)
|