吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2437|回复: 50
上一主题 下一主题
收起左侧

[Python 原创] Python+pyqt5写的坐标转换工具

[复制链接]
跳转到指定楼层
楼主
Allenxu520 发表于 2024-5-17 16:05 回帖奖励
本帖最后由 Allenxu520 于 2024-5-24 10:53 编辑

后端使用Python,界面使用的是pyqt5
坐标转换工具,GPS、高德、百度坐标互转,已打包exe程序,可自行取用(未适配win7)
下载地址:坐标转换https://www.alipan.com/s/XiEXRLYcgcb(不确定有没有被和谐)

[Python] 纯文本查看 复制代码
class GPS(Ui_gps, QWidget):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setupUi(self)
        # 更改objectName名称
        self.setObjectName("GPS")

        # 将PushButton1-6与坐标转换函数关联
        functions = [wgs84_to_gcj02, wgs84_to_bd09, gcj02_to_bd09, gcj02_to_wgs84, bd09_to_wgs84, bd09_to_gcj02]
        for i in range(6):
            button = getattr(self, f"zuobiao_{i + 1}")
            button.clicked.connect(lambda _, func=functions[i]: self.do_convert(func))
        # 点击导出
        self.zuobiao_7.clicked.connect(self.export_table_data)
        # 选择导入文件
        self.pushButton_2.clicked.connect(self.selectFile)
        # 执行导入程序
        self.pushButton.clicked.connect(self.update_coordinates)
        self.conn = None
        self.cur = None
        self.worker = None  # 初始化worker线程

    """=============================如下坐标转换==================================="""

    def do_convert(self, convert_func):
        # 获取用户选择的文件路径
        filePath, _ = QFileDialog.getOpenFileName(self, "选择文件")
        if filePath:
            # 获取文件扩展名
            ext = os.path.splitext(filePath)[1]
            # 判断是否为Excel文件
            if ext in [".xlsx", ".xls"]:
                # 读取 Excel 文件
                df = pd.read_excel(filePath)
                # 处理数据
                rows = []
                for i, row in df.iterrows():
                    lng, lat = row['经度'], row['纬度']
                    result_lng, result_lat = convert_func(lng, lat)
                    rows.append([i + 2, lng, lat, result_lng, result_lat])

                # 在 tableWidget 中显示转换结果
                self.tableWidget.setRowCount(len(rows))
                self.tableWidget.setColumnCount(5)
                for i, row in enumerate(rows):
                    for j, value in enumerate(row):
                        item = QTableWidgetItem(str(value))
                        if j == 0:
                            item.setFlags(item.flags() & (~Qt.ItemIsEnabled))
                        self.tableWidget.setItem(i, j, item)
            else:
                # 否则弹出警告窗口,并清空QLineEdit
                QMessageBox.warning(self, "友情提示:", "请选择正确的Excel文件!")

    def export_table_data(self):
        # 检查 TableWidget 是否为空
        if self.tableWidget.rowCount() == 0:
            QtWidgets.QMessageBox.warning(self, '无数据导出', '请先进行坐标转换!')
        else:
            # 弹出提示窗口
            self.progress_dialog = QMessageBox(self)
            self.progress_dialog.setWindowTitle('正在导出')
            self.progress_dialog.setText('正在导出,请稍后...')
            self.progress_dialog.show()
            try:
                # 创建一个空的 DataFrame 对象
                data_frame = pd.DataFrame(columns=[self.tableWidget.horizontalHeaderItem(j).text() for j in
                                                   range(self.tableWidget.columnCount())])
                # 将每一行的数据添加到 DataFrame 中
                for i in range(self.tableWidget.rowCount()):
                    row_data = [
                        self.tableWidget.item(i, j).text() if self.tableWidget.item(i, j) is not None else ''
                        for j in range(self.tableWidget.columnCount())]
                    data_frame.loc[len(data_frame)] = row_data

                # 将 DataFrame 导出到 Excel 文件中
                writer = pd.ExcelWriter('坐标转换完成.xlsx', engine='openpyxl')
                data_frame.to_excel(writer, index=False)
                writer.close()
                # 隐藏进度对话框并弹出提示窗口
                self.progress_dialog.hide()
                QMessageBox.information(self, '导出成功', f'文件已保存至 {os.path.abspath("坐标转换完成.xlsx")}')
            except Exception as e:
                # 隐藏进度对话框并弹出错误窗口
                self.progress_dialog.hide()
                QMessageBox.critical(self, '导出失败', f'导出文件时发生错误:{e}')

    """=============================如下坐标更新==================================="""

    def selectFile(self):
        """
        打开文件对话框以选择需要验证的数据文件。
        """
        # 使用QFileDialog获取文件路径
        filePath, _ = QFileDialog.getOpenFileName(self, "选择文件")
        if filePath:
            # 获取文件扩展名
            ext = os.path.splitext(filePath)[1]
            # 判断是否为Excel文件
            if ext in [".xlsx", ".xls"]:
                # 如果成功选择Excel文件,则将其路径显示在QLineEdit中
                self.lineEdit.setText(filePath)
            else:
                # 否则弹出警告窗口,并清空QLineEdit
                QMessageBox.warning(self, "友情提示:", "请选择正确的Excel文件!")
                self.lineEdit.clear()
        else:
            # 如果没有选择任何文件,则清空QLineEdit
            self.lineEdit.clear()

    def update_coordinates(self):
        conn = gl.get_value("current_connection")
        file_path = self.lineEdit.text()
        # 获取是否使用高德GPS
        use_gaode_gps = self.radioButton.isChecked()
        if file_path and conn:
            if self.worker is not None and self.worker.isRunning():
                QMessageBox.warning(self, "友情提示:", "当前有正在执行的任务,请等待完成后再执行新任务。")
                return
            self.worker = Worker(file_path, conn, use_gaode_gps)
            self.worker.progress_updated.connect(self.progressBar.setValue)
            self.worker.message_updated.connect(self.log_message)
            self.worker.operation_complete.connect(self.final_message)
            self.worker.start()
        else:
            QMessageBox.warning(self, "友情提示:", "请选择文件并确保数据库连接正常后再进行操作!")

    def log_message(self, message):
        self.textEdit.append(message)
        QCoreApplication.processEvents()

    def final_message(self, message):
        QMessageBox.information(self, "操作完成", message)

image.png (93.9 KB, 下载次数: 2)

image.png

免费评分

参与人数 7吾爱币 +13 热心值 +6 收起 理由
MuaLoya + 1 谢谢@Thanks!
kkkukujiajia + 1 + 1 热心回复!
junjia215 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
woyucheng + 1 + 1 谢谢@Thanks!
WM715 + 1 + 1 谢谢@Thanks!
vethenc + 1 + 1 谢谢@Thanks!啊,真香!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
jieshisan 发表于 2024-5-17 16:24
这个挺好,之前用JAVA写了一个后端,Python学习中
3#
cyantea 发表于 2024-5-17 16:39
4#
lgz0701 发表于 2024-5-17 16:43
5#
renpeng009 发表于 2024-5-17 17:01
让我学习学习
6#
wyxa 发表于 2024-5-17 17:03
大佬求分享
7#
jun269 发表于 2024-5-17 17:12
求楼主分享,谢谢
8#
唯一笑解千愁 发表于 2024-5-17 18:10
请楼主分享,试试行不行.
9#
homehome 发表于 2024-5-17 19:15
谢谢楼主,发来看看
10#
xunlei1993 发表于 2024-5-17 19:34
求分享,正需要这个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表