基于python实现高德经纬度批量转wgs_84经纬度

在高德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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值