用 Python 实现 Excel 坐标数据自动转换 KML 文件,支持 CGCS2000 坐标系高斯投影转换
📋 需求说明
工作中遇到这样的需求:
Excel 文件中有 3 列数据:
需要做如下处理:
- 自动识别坐标列:判断第二列和第三列的位数,如果第二列为 7 位、第三列为 6 位,自动调整两列位置
- 坐标转换:输入中央子午线经度,将 CGCS2000 高斯投影坐标转换为 WGS84 经纬度
- 生成 KML:输出可在 Google Earth 中查看的 KML 文件
🛠️ 技术方案
核心库
| 库名 |
用途 |
pandas |
读取 Excel 文件 |
pyproj |
坐标转换(CGCS2000 高斯投影 → WGS84) |
simplekml |
生成 KML 文件 |
tkinter |
文件选择对话框 |
安装依赖
pip install pandas pyproj simplekml openpyxl
💻 完整代码
第一步:导入库
import pandas as pd
import simplekml
from pyproj import Transformer
import tkinter as tk
from tkinter import filedialog
第二步:文件选择对话框
def select_excel_file():
root = tk.Tk()
root.withdraw() # 隐藏主窗口
file_path = filedialog.askopenfilename(
title="请选择 Excel 文件",
filetypes=[("Excel files", "*.xls *.xlsx")]
)
return file_path
# 执行文件选择
excel_file = select_excel_file()
if not excel_file:
print("没有选择文件,程序终止。")
exit()
# 读取 Excel 文件(默认 Sheet1,无标题)
df = pd.read_excel(excel_file, header=None)
第三步:自动识别并调整坐标列
def count_digits(x):
try:
return len(str(int(x)))
except:
return 0
x_digits = df[1].apply(count_digits)
y_digits = df[2].apply(count_digits)
if (x_digits == 7).all() and (y_digits == 6).all():
print("检测到 X 为 7 位,Y 为 6 位,正在交换列顺序...")
df[[1, 2]] = df[[2, 1]]
else:
print("未检测到需交换列的情况,继续处理...")
第四步:坐标转换
# 用户输入中央子午线
try:
central_meridian = float(input("请输入中央子午线经度(例如 117):"))
except ValueError:
print("输入无效,请输入一个有效的数字。")
exit()
# 设置投影转换器(高斯投影 → WGS84)
transformer = Transformer.from_crs(
f"+proj=tmerc +lat_0=0 +lon_0={central_meridian} +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs",
"epsg:4326",
always_xy=True
)
第五步:生成 KML 文件
# 创建 KML 文件
kml = simplekml.Kml()
for index, row in df.iterrows():
tower_id = row[0]
x_coord = row[1]
y_coord = row[2]
try:
lon, lat = transformer.transform(x_coord, y_coord)
point = kml.newpoint(name=str(tower_id), coords=[(lon, lat)])
except Exception as e:
print(f"处理杆塔 {tower_id} 出错:{e}")
# 保存 KML 文件
kml_file = 'towers_output.kml'
kml.save(kml_file)
print(f"KML 文件已生成:{kml_file}")
📌 使用说明
Excel 文件格式
GZ001 300123.45 3456789.12
GZ002 300456.78 3453456.90
GZ003 300789.01 3450123.45
运行步骤
保存代码:将完整代码保存为 generate_kml.py
python generate_kml.py
查看结果:生成的 KML 文件可在 Google Earth 或 QGIS 中查看
🧠 技术说明
CGCS2000 坐标系
- 全称:中国大地坐标系 2000(China Geodetic Coordinate System 2000)
- 投影:高斯 - 克吕格投影(Gauss-Krüger)
中央子午线
中央子午线是投影带的中心经度,常见规格:
| 投影类型 |
分带方式 |
中央子午线计算 |
| 3°带 |
每 3°一带 |
L₀ = 3° × n |
| 6°带 |
每 6°一带 |
L₀ = 6° × n - 3° |
示例:
坐标位数判断
🔧 扩展功能
如需支持以下功能,可进一步改进脚本:
📥 代码下载
完整代码已整理为 Python 脚本,可根据实际需求修改使用。
注意事项:
提示:如有多个投影带,请在每条记录中提供对应的中央子午线并分别处理。
觉得有用?欢迎点赞、收藏、转发! 🚀