将gga文件转换成kml文件,通过地图识别软件(如奥维地图)打开kml文件,本程序兼容以"$GPGGA"或者"$GNGGA"开头的gga文件。
import os
from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton, QFileDialog
class MyDialog(QDialog):
def __init__(self, parent=None):
super(MyDialog, self).__init__(parent)
self.setWindowTitle('gga文件转换成kml文件')
self.setGeometry(100, 100, 400, 300)
# 创建垂直布局管理器
layout = QVBoxLayout()
# 创建文件选择框
label3 = QLabel('请点击浏览按钮,选择gga文件;\n再点击执行按钮,生成kml文件;\n然后通过地图识别软件(如奥维地图)打开kml文件;\n本程序兼容以"$GPGGA"或者"$GNGGA"开头的gga文件。', self)
layout.addWidget(label3)
self.file_input1 = QPushButton('浏览...', self)
layout.addWidget(self.file_input1)
self.file_input1.clicked.connect(self.open_file_dialog1)
# 添加确认执行按钮
self.ok_button = QPushButton('执行', self)
self.ok_button.clicked.connect(self.execute)
layout.addWidget(self.ok_button)
# 将布局设置为主窗口的布局
self.setLayout(layout)
def open_file_dialog1(self):
file_dialog = QFileDialog(self)
file_dialog.setFileMode(QFileDialog.ExistingFiles)
if file_dialog.exec_():
file_paths = file_dialog.selectedFiles()
merged_filename = ""
if len(file_paths) > 1:
# 获取第一个文件的目录和文件名,用于创建合并后的文件名
directory = os.path.dirname(file_paths[0])
filename = os.path.splitext(os.path.basename(file_paths[0]))[0]
merged_filename = os.path.join(directory, f'{filename}_merged').replace('\\', '/')
with open(merged_filename, 'w') as merged_file:
for path in file_paths:
with open(path, 'r') as file:
merged_file.write(file.read())
merged_file.write('\n') # 在每个文件之间添加换行符
elif len(file_paths) == 1:
merged_filename = file_paths
else:
print('Please select files.')
if merged_filename:
self.file_input1.setText(''.join(merged_filename))
def execute(self):
# 执行操作,可以在这里处理输入框和文件选择框的内容
file_path_s = self.file_input1.text()
# 获取文件目录
file_path = os.path.dirname(file_path_s)
# 获取文件名(包含后缀)
file_name_with_extension = os.path.basename(file_path_s)
# 获取文件后缀
file_extension = os.path.splitext(file_name_with_extension)[1]
# 去除文件后缀得到不带后缀的文件名
file_name_without_extension = file_name_with_extension.replace(file_extension, "")
# 生成新的kml文件名称
file_name_without_extension_new = file_name_without_extension + '.kml'
file_path_d = os.path.join(file_path, file_name_without_extension_new)
# print(file_path_d)
# with open(file_path_s, 'r') as file:
# lines = file.readlines()
# print(lines)
# 创建一个新的文件来写入处理后的数据
with open(file_path_s, 'r') as file, open(file_path_d, 'w') as new_file:
lines = file.readlines()
# kml文件起始部分
start_line = '<?xml version="1.0" encoding="utf-8"?><kml xmlns="http://www.opengis.net/kml/2.2"><Document><Placemark><name>' + file_name_without_extension + '</name><LineString><extrude>1</extrude><tessellate>1</tessellate><coordinates>'
new_file.write(start_line)
# 遍历原始文件的每一行
for line in lines:
# 使用,分割每一行的内容
parts = line.split(',')
# 兼容"$GPGGA"和"$GNGGA"
if len(parts) > 10 and parts[0] == "$GPGGA" or parts[0] == "$GNGGA":
latitude = float(parts[2][:2]) + float(parts[2][2:]) / 60
longitude = float(parts[4][:3]) + float(parts[4][3:]) / 60
# print(latitude, longitude)
new_line = ','.join([str(longitude), str(latitude), str(parts[9])])
# 将处理后的行写入新文件,并在每行末尾添加空格符
new_file.write(new_line + ' ')
# kml文件结束部分
end_line = '</coordinates></LineString></Placemark></Document></kml>'
new_file.write(' ' + end_line)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
dialog = MyDialog()
dialog.exec_()