WGS84转BD09经纬度

直接上码!

import pandas as pd
import math


def wgs84_to_gcj02(wgs_lon, wgs_lat):
    a = 6378245.0
    ee = 0.00669342162296594323
    pi = 3.14159265358979324

    def transform_lon(lon, lat):
        ret = 300.0 + lon + 2.0 * lat + 0.1 * lon * lon + 0.1 * lon * lat + 0.1 * math.sqrt(abs(lon))
        ret += (20.0 * math.sin(6.0 * lon * pi) + 20.0 * math.sin(2.0 * lon * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lon * pi) + 40.0 * math.sin(lon / 3.0 * pi)) * 2.0 / 3.0
        ret += (150.0 * math.sin(lon / 12.0 * pi) + 300.0 * math.sin(lon / 30.0 * pi)) * 2.0 / 3.0
        return ret

    def transform_lat(lon, lat):
        ret = -100.0 + 2.0 * lon + 3.0 * lat + 0.2 * lat * lat + 0.1 * lon * lat + 0.2 * math.sqrt(abs(lon))
        ret += (20.0 * math.sin(6.0 * lon * pi) + 20.0 * math.sin(2.0 * lon * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
        ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0
        return ret

    lon = float(wgs_lon)
    lat = float(wgs_lat)

    d_lat = transform_lat(lon - 105.0, lat - 35.0)
    d_lon = transform_lon(lon - 105.0, lat - 35.0)

    rad_lat = lat / 180.0 * pi
    magic = math.sin(rad_lat)
    magic = 1 - ee * magic * magic

    sqrt_magic = math.sqrt(magic)

    d_lat = (d_lat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi)
    d_lon = (d_lon * 180.0) / (a / sqrt_magic * math.cos(rad_lat) * pi)

    gcj_lon = lon + d_lon
    gcj_lat = lat + d_lat

    return gcj_lon, gcj_lat


def gcj02_to_bd09(gcj_lon, gcj_lat):
    x_pi = 3.14159265358979324 * 3000.0 / 180.0
    z = math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * math.sin(gcj_lat * x_pi)
    theta = math.atan2(gcj_lat, gcj_lon) + 0.000003 * math.cos(gcj_lon * x_pi)
    bd_lon = z * math.cos(theta) + 0.0065
    bd_lat = z * math.sin(theta) + 0.006
    return bd_lon, bd_lat


# 输入和输出文件路径
input_file = 'input.xlsx'
output_file = 'output.xlsx'

# 读取xlsx文件
df = pd.read_excel(input_file)

# 添加新列并转换坐标
df['百度经度'] = 0.0
df['百度纬度'] = 0.0

for index, row in df.iterrows():
    wgs_lon = row['经度']
    wgs_lat = row['纬度']

    gcj_lon, gcj_lat = wgs84_to_gcj02(wgs_lon, wgs_lat)
    bd_lon, bd_lat = gcj02_to_bd09(gcj_lon, gcj_lat)

    df.at[index, '百度经度'] = bd_lon
    df.at[index, '百度纬度'] = bd_lat

# 写入到新的xlsx文件
df.to_excel(output_file, index=False)

print(f"转换完成,结果已保存到 {output_file}")

 

posted @ 2025-03-27 17:23  17岁AD想打职业呢  阅读(113)  评论(0)    收藏  举报