在高德app的小程序上采集了部分点位信息。
由于自身水平的问题没法直接从网页上爬取,只能另存为txt然后进行分析将数据经纬度信息转存到excel中,但是需求是获取wgs84的经纬度信息,因此通过python将excel表格中的高德经纬度数据批量转为wgs84的坐标,并存到新的excel表格中以供使用。
具体实现方式如下:
import pandas as pd
import math
import os
# ======================================================================
# 坐标转换函数 (核心部分)
# ======================================================================
def gcj02_to_wgs84_custom(lng, lat):
"""
自定义的GCJ02坐标系转WGS84坐标系
:param lng: GCJ02经度
:param lat: GCJ02纬度
:return: (WGS84经度, WGS84纬度)
"""
a = 6378245.0 # 长半轴
ee = 0.00669342162296594323 # 扁率
def transform_lat(x, y):
ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(abs(x))
ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0
ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0
return ret
def transform_lon(x, y):
ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(abs(x))
ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0
ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0 * math.pi)) * 2.0 / 3.0
return ret
dlat = transform_lat(lng - 105.0, lat - 35.0)
dlng = transform_lon(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * math.pi
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi)
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi)
mglat = lat + dlat
mglng = lng + dlng
return lng * 2 - mglng, lat * 2 - mglat
# ======================================================================
# 主程序逻辑
# ======================================================================
def convert_coords(input_file, output_file):
"""
读取Excel文件,转换坐标并保存到新的Excel文件。
"""
try:
# 读取Excel文件
df = pd.read_excel(input_file)
print(f"成功读取文件: {input_file}")
print(f"文件包含 {len(df)} 行数据。")
# 检查必需的列是否存在
if '经度' not in df.columns or '纬度' not in df.columns:
print("错误: Excel文件中必须包含 '经度' 和 '纬度' 列。")
return
# 创建用于存储新坐标的列表
wgs84_lons = []
wgs84_lats = []
# 遍历每一行数据
for index, row in df.iterrows():
gcj_lon = row['经度']
gcj_lat = row['纬度']
# 使用自定义的函数进行坐标转换
wgs_lon, wgs_lat = gcj02_to_wgs84_custom(gcj_lon, gcj_lat)
wgs84_lons.append(wgs_lon)
wgs84_lats.append(wgs_lat)
# 打印进度
if (index + 1) % 10 == 0 or (index + 1) == len(df):
print(f"正在处理第 {index + 1}/{len(df)} 行...")
# 将新坐标添加为DataFrame的新列
df['WGS84_经度'] = wgs84_lons
df['WGS84_纬度'] = wgs84_lats
# 保存到新的Excel文件
df.to_excel(output_file, index=False, engine='openpyxl')
print(f"\n转换完成!结果已保存到: {output_file}")
print(f"文件位置: {os.path.abspath(output_file)}")
except FileNotFoundError:
print(f"错误: 找不到文件 '{input_file}'。请确认文件名和路径是否正确。")
except Exception as e:
print(f"处理过程中发生未知错误: {e}")
# --- 程序入口 ---
if __name__ == "__main__":
# 原有excel文件位置
input_filename = r'*.xlsx'
# 转换后新的excel文件位置
output_filename = r'*.xlsx'
convert_coords(input_filename, output_filename)