main.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from qgis.PyQt.QtWidgets import QAction
  2. from qgis.core import QgsCoordinateReferenceSystem
  3. from ..icons import icons
  4. class FitZoomAction(QAction):
  5. def __init__(self, iface, parent=None):
  6. self.iface = iface
  7. super().__init__(parent)
  8. self.setIcon(icons["fitzoom"])
  9. self.setText("调整缩放比例")
  10. self.triggered.connect(self.fit_zoom_level)
  11. self.iface.mapCanvas().destinationCrsChanged.connect(self.check_crs)
  12. self.iface.mapCanvas().layersChanged.connect(self.check_crs)
  13. self.check_crs()
  14. def fit_zoom_level(self):
  15. crs = self.iface.mapCanvas().mapSettings().destinationCrs()
  16. if crs == QgsCoordinateReferenceSystem("EPSG:3857"):
  17. max_zoom_level = 23
  18. mpp_3857 = [40075016.685 / (2**i * 256) for i in range(max_zoom_level)]
  19. current_mpp = self.iface.mapCanvas().mapUnitsPerPixel()
  20. nearest_level = self.find_nearest_number_index(mpp_3857, current_mpp)
  21. zoom_factor = mpp_3857[nearest_level] / current_mpp
  22. if not abs(1 - zoom_factor) < 1e-5:
  23. self.iface.mapCanvas().zoomByFactor(zoom_factor)
  24. @staticmethod
  25. def find_nearest_number_index(numbers_list, target):
  26. min_difference = float("inf")
  27. nearest_index = None
  28. for i, number in enumerate(numbers_list):
  29. difference = abs(number - target)
  30. if difference < min_difference:
  31. min_difference = difference
  32. nearest_index = i
  33. return nearest_index
  34. def check_crs(self):
  35. crs = self.iface.mapCanvas().mapSettings().destinationCrs()
  36. layers_number = self.iface.mapCanvas().layerCount()
  37. if crs == QgsCoordinateReferenceSystem("EPSG:3857") and layers_number > 0:
  38. self.setText("调整缩放比例")
  39. self.setEnabled(True)
  40. else:
  41. self.setText("调整缩放比例不可用")
  42. self.setEnabled(False)