当前位置:首页>python>坐标导出 KML 文件程序 | Python 自动化处理 CGCS2000 坐标

坐标导出 KML 文件程序 | Python 自动化处理 CGCS2000 坐标

  • 2026-09-06 00:18:10
坐标导出 KML 文件程序 | Python 自动化处理 CGCS2000 坐标


用 Python 实现 Excel 坐标数据自动转换 KML 文件,支持 CGCS2000 坐标系高斯投影转换


📋 需求说明

工作中遇到这样的需求:

Excel 文件中有 3 列数据:

  • 第一列:杆塔编号
  • 第二列:X 坐标
  • 第三列:Y 坐标

需要做如下处理:

  1. 自动识别坐标列:判断第二列和第三列的位数,如果第二列为 7 位、第三列为 6 位,自动调整两列位置
  2. 坐标转换:输入中央子午线经度,将 CGCS2000 高斯投影坐标转换为 WGS84 经纬度
  3. 生成 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 文件格式

  • 共 3 列:杆塔编号、X 坐标、Y 坐标
  • 无表头:第一行即为数据
  • 示例:
GZ001    300123.45    3456789.12
GZ002    300456.78    3453456.90
GZ003    300789.01    3450123.45

运行步骤

  1. 保存代码:将完整代码保存为 generate_kml.py

  2. 运行脚本:

python generate_kml.py
  1. 选择文件:在弹出的对话框中选择 Excel 文件

  2. 输入参数:输入中央子午线经度(如 117)

  3. 查看结果:生成的 KML 文件可在 Google Earth 或 QGIS 中查看


🧠 技术说明

CGCS2000 坐标系

  • 全称:中国大地坐标系 2000(China Geodetic Coordinate System 2000)
  • 椭球:基于 GRS80 椭球
  • 投影:高斯 - 克吕格投影(Gauss-Krüger)

中央子午线

中央子午线是投影带的中心经度,常见规格:

投影类型 分带方式 中央子午线计算
3°带 每 3°一带 L₀ = 3° × n
6°带 每 6°一带 L₀ = 6° × n - 3°

示例:

  • 117° 代表 3°带的第 39 带
  • 114° 代表 3°带的第 38 带

坐标位数判断

  • 7 位数:通常是 Y 坐标(含带号)
  • 6 位数:通常是 X 坐标
  • 自动识别:程序会根据位数自动调整列顺序

🔧 扩展功能

如需支持以下功能,可进一步改进脚本:

  • ✅ 支持多工作表处理
  • ✅ 支持带列名的 Excel 文件
  • ✅ 批量处理多个文件
  • ✅ 输出 Shapefile 格式
  • ✅ 添加进度条显示
  • ✅ 生成转换报告

📥 代码下载

完整代码已整理为 Python 脚本,可根据实际需求修改使用。

注意事项:

  1. 确保 Excel 文件格式正确
  2. 中央子午线输入要准确
  3. 坐标数据应无异常值
  4. 生成的 KML 文件建议反推后验证

提示:如有多个投影带,请在每条记录中提供对应的中央子午线并分别处理。


觉得有用?欢迎点赞、收藏、转发! 🚀

最新文章

随机文章