Skip to content

Commit

Permalink
Merge pull request #11 from liuxsdev/dev
Browse files Browse the repository at this point in the history
✨ Feat:add fit zoom
  • Loading branch information
liuxspro authored Jul 2, 2023
2 parents ce5f34f + 387f44c commit 3d0f94c
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 4 deletions.
6 changes: 6 additions & 0 deletions tianditu-tools/images/fitzoom.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified tianditu-tools/images/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 4 additions & 1 deletion tianditu-tools/metadata.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name=TianDiTu Tools
qgisMinimumVersion=3.4
description=天地图底图加载
about=QGIS 天地图工具,方便进行天地图瓦片底图的添加以及简单实现了部分天地图 Web 服务 API(地名搜索、地理编码查询、逆地理编码查询)
version=0.2.1
version=0.3.0
tags=basemap, xyz, tianditu, geocoder, 天地图
icon=images/icon.png
experimental=False
Expand All @@ -14,6 +14,9 @@ homepage=https://github.com/liuxsdev/qgis-plugin-tianditu
tracker=https://github.com/liuxsdev/qgis-plugin-tianditu/issues
repository=https://github.com/liuxsdev/qgis-plugin-tianditu
changelog=
Version 0.3.0 2023/7/1:
* ✨ 新增功能:调整缩放比例至正确的 Zoom Level
* 💄 更换图标
Version 0.2.1 2023/5/25:
* 🐛 修复地名搜索不正常/添加地名点时图标丢失
Version 0.2.0 2023/5/5:
Expand Down
54 changes: 51 additions & 3 deletions tianditu-tools/tiandituPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,23 @@
from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction, QMenu, QToolButton, QMessageBox
from qgis.core import Qgis, QgsRasterLayer, QgsProject, QgsSettings
from qgis.core import (
Qgis,
QgsRasterLayer,
QgsProject,
QgsSettings,
QgsCoordinateReferenceSystem,
)

from .searchDockWidget import SearchDockWidget
from .settingDialog import SettingDialog
from .tiandituConfig import TianMapInfo, extra_maps, tianditu_province
from .utils import tianditu_map_url, TIANDITU_HOME_URL, PluginDir
from .utils import (
tianditu_map_url,
TIANDITU_HOME_URL,
PluginDir,
find_nearest_number_index,
)

current_qgis_version = Qgis.QGIS_VERSION_INT

Expand Down Expand Up @@ -88,7 +99,12 @@ def __init__(self, iface):
self.addTiandituToolbar = None
self.addTiandituButton = None
self.searchdockwidget = None
self.actions = {"search": None, "setting": None, "extra_map_action": None}
self.actions = {
"search": None,
"setting": None,
"extra_map_action": None,
"fitzoom": None,
}
# 配置文件
self.qset = QgsSettings()
if not self.qset.contains("tianditu-tools/Tianditu/key"):
Expand All @@ -107,6 +123,7 @@ def initGui(self):
"map": QIcon(PluginDir + "/images/map_tianditu.svg"),
"other": QIcon(PluginDir + "/images/earth.svg"),
"search": QIcon(PluginDir + "/images/search.svg"),
"fitzoom": QIcon(PluginDir + "/images/fitzoom.svg"),
}
# 天地图添加 Action
menu = QMenu()
Expand Down Expand Up @@ -170,6 +187,17 @@ def initGui(self):
self.actions["search"].triggered.connect(self.openSearch)
self.toolbar.addAction(self.actions["search"])

# 调整至合适的 Zoom Level (EPSG:3857 Only)
self.actions["fitzoom"] = QAction(
icons["fitzoom"], "调整至合适的 Zoom Level", self.iface.mainWindow()
)
self.actions["fitzoom"].triggered.connect(self.fit_zoom_level)
self.toolbar.addAction(self.actions["fitzoom"])

self.check_crs()
self.iface.mapCanvas().destinationCrsChanged.connect(self.check_crs)
self.iface.mapCanvas().layersChanged.connect(self.check_crs)

def show_setting_dialog(self):
dlg = SettingDialog(self.actions["extra_map_action"])
dlg.exec_()
Expand Down Expand Up @@ -214,11 +242,31 @@ def openSearch(self):
self.iface.addDockWidget(Qt.LeftDockWidgetArea, self.searchdockwidget)
self.searchdockwidget.show()

def fit_zoom_level(self):
crs = self.iface.mapCanvas().mapSettings().destinationCrs()
if crs == QgsCoordinateReferenceSystem("EPSG:3857"):
maxZoomLevel = 23
mpp_3857 = [40075016.685 / (2**i * 256) for i in range(maxZoomLevel)]
current_mpp = self.iface.mapCanvas().mapUnitsPerPixel()
nearest_level = 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)

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.actions["fitzoom"].setEnabled(True)
else:
self.actions["fitzoom"].setEnabled(False)

def unload(self):
"""Unload from the QGIS interface"""
self.addTiandituButton.setMenu(None)
self.iface.removeToolBarIcon(self.actions["setting"])
self.iface.removeToolBarIcon(self.actions["search"])
self.iface.removeToolBarIcon(self.actions["fitzoom"])
self.iface.removeToolBarIcon(self.addTiandituToolbar)
if self.searchdockwidget:
self.iface.removeDockWidget(self.searchdockwidget)
13 changes: 13 additions & 0 deletions tianditu-tools/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,19 @@ def check_key_format(key: str) -> object:
}


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


class TiandituAPI:
"""实现天地图搜索API"""

Expand Down

0 comments on commit 3d0f94c

Please sign in to comment.