python-国标2000(EPSG-4547)转KML
本文最后更新于 482 天前,其中的信息可能已经有所发展或是发生改变。

测试文件:
A,598427.816,2994656.273
B,598592.423,2994717.284
C,598629.527,2994944.332
D,598615.402,2995045.744
E,598579.710,2995139.163
F,598544.018,2995232.582
G,598350.461,2995480.785
H,598152.839,2995408.000
I,598181.731,2995204.832
J,598174.761,2994989.071
K,598264.836,2994702.513

请写一段python代码,我的需求如下:
运行程序后弹出一个文本框要求输入多行文字
每一行代表一个epsg4547参考系坐标,有三个值用逗号隔开
第一个值为序号,第二个、第三个值为epsg4547参考系坐标
GUI界面上出现2个按钮,第一个按钮命名为“生成KML”
第一个按钮的功能是将这些将这些坐标一一转换成epsg4326参考系坐标,将生成后的坐标生成一个能导入谷歌地球的kml文件
第二个按钮命名为“生成KML多边形”
第二个按钮的功能是将这些生成坐标一一转换成epsg4326参考系坐标,将生成后的坐标连成一个多边形,将多边形转化成一个能导入谷歌地球的kml文件
输出这个kml文件

生成的代码使用tkinter,打开的时候有控制台

pyinstaller --onefile --noconsole --icon=1.ico test.py

或者spec文件中,将console=False,打开后无控制台
有bug关掉窗口,进程不会退出

请将上述代码改造一下,点击按钮之后,弹窗提示用户已生成文件,和文件名

使用pyqt重构下面的代码:
<代码>

pyqt用pyinstaller打包设置界面图标跟任务栏图标:

#1、创建一个名为 “icons.qrc” 的文件,包含以下内容:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>icon.png</file>
</qresource>
</RCC>
#2、使用 pyrcc 工具将 .qrc 文件编译为 Python 模块。在命令行中输入以下命令:
pyrcc5 icons.qrc -o icons_rc.py
#3、接下来,在你的 PyQt 程序中,你可以使用以下代码来设置应用程序图标和任务栏图标:
from PyQt5.QtGui import QIcon

import icons_rc  # 导入编译后的 .qrc 文件

app = QApplication(sys.argv)
app.setWindowIcon(QIcon(':/icon.png'))  # 设置应用程序图标

微调窗口大小,位置

仿Material的样式,美化下面的代码:
<代码>

优化代码体积(没用)后最终代码:

import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QTextEdit, QPushButton, QLabel, QMessageBox
)
from PyQt5.QtGui import QIcon
import pyproj
import simplekml

class CoordinateConverterApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("EPSG-4547")
        self.setGeometry(100, 100, 400, 300)
        self.setWindowIcon(QIcon(":/1.png"))

        self.text_label = QLabel("请输入坐标(每行一个:序号,X,Y):", self)
        self.text_label.move(20, 20)

        self.text_widget = QTextEdit(self)
        self.text_widget.setGeometry(20, 50, 360, 160)

        self.convert_button = QPushButton("生成KML", self)
        self.convert_button.setGeometry(20, 230, 150, 30)
        self.kml_button = QPushButton("生成KML多边形", self)
        self.kml_button.setGeometry(230, 230, 150, 30)

        self.convert_button.clicked.connect(self.generate_kml)
        self.kml_button.clicked.connect(self.generate_kml_polygon)

        self.setStyleSheet("""
            QLabel {
                font-size: 16px;
                font-weight: bold;
            }
            QTextEdit {
                font-size: 14px;
                background-color: #f2f2f2;
            }
            QPushButton {
                font-size: 16px;
                background-color: #2196F3;
                color: white;
                border: none;
                border-radius: 5px;
            }
            QPushButton:hover {
                background-color: #1976D2;
            }
        """)

    def generate_coordinates(self):
        input_text = self.text_widget.toPlainText()
        lines = input_text.split('\n')

        coordinates = []

        crs_epsg4547 = pyproj.CRS.from_epsg(4547)
        crs_epsg4326 = pyproj.CRS.from_epsg(4326)
        transformer = pyproj.Transformer.from_crs(crs_epsg4547, crs_epsg4326, always_xy=True)

        for line in lines:
            parts = line.strip().split(',')
            if len(parts) == 3:
                index, coord1, coord2 = parts
                lon, lat = transformer.transform(float(coord1), float(coord2))
                coordinates.append((index, lon, lat))

        return coordinates

    def generate_kml(self):
        coordinates = self.generate_coordinates()

        kml = simplekml.Kml()
        for index, lon, lat in coordinates:
            kml.newpoint(name=index, coords=[(lon, lat)])

        kml_file = "output.kml"
        kml.save(kml_file)
        QMessageBox.information(self, "生成完成", f"已保存为 {kml_file}")

    def generate_kml_polygon(self):
        coordinates = self.generate_coordinates()

        kml = simplekml.Kml()
        polygon = kml.newpolygon(outerboundaryis=[(lon, lat) for _, lon, lat in coordinates])

        polygon.style.linestyle.width = 1
        polygon.style.linestyle.color = simplekml.Color.red
        polygon.style.polystyle.fill = 1
        polygon.style.polystyle.color = simplekml.Color.changealphaint(100, simplekml.Color.red)

        kml_file = "output_polygon.kml"
        kml.save(kml_file)
        QMessageBox.information(self, "生成完成", f"已保存为 {kml_file}")


def main():
    app = QApplication(sys.argv)
    window = CoordinateConverterApp()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
暂无评论

发送评论 编辑评论


				
上一篇
下一篇