在地理信息分析的过程中,经常会遇到各种坐标格式的数据,在分析之前我们首先要统一底图,也就是统一坐标系。
下面以BD09转GCJ02为例,介绍python3下坐标的批量转换,并最终输出excel文件。
首先感谢指路文章:python3实现GPS经纬度坐标(WGS84)国测局火星坐标(GCJ02)百度坐标(BD09)相互转换_python 实现百度坐标(bd09)及gcj02与wgs84之间的转换的方法-CSDN博客
参考文章重点提供了坐标转换的相关参数,由于输出结果为单组数据,考虑很多情况下我们需要批量转换,所以本文重点补充了“单组数据——装入字典——输出文件”的部分,并在文件名中加入时间戳。下面直接上代码:
# -*- coding: utf-8 -*-
#准备包
import json
import requests
import math
import pandas as pd
import datetime
#转换系数
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626 # π
a = 6378245.0 # 长半轴
ee = 0.00669342162296594323 # 偏心率平方
#读取文件
path01 = '/Users/oakes.zh/Documents/point.csv' #【修改】引号内路径修改为自己的文件路径
file = pd.read_csv(path01)
def bd09_to_gcj02(bd_lon, bd_lat):
"""
百度坐标系(BD-09)转火星坐标系(GCJ-02)
百度——>谷歌、高德
:param bd_lat:百度坐标纬度
:param bd_lon:百度坐标经度
:return:转换后的坐标列表形式
"""
x = bd_lon - 0.0065
y = bd_lat - 0.006
z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
gg_lng = z * math.cos(theta)
gg_lat = z * math.sin(theta)
return gg_lng, gg_lat
#准备字典
lonlat_dict = {}
for x in range(len(file)):
m = file.iloc[x, 1] #【修改】注意经度所在的列数,默认第二列
n = file.iloc[x, 2] #【修改】注意经度所在的列数,默认第三列
zzz = bd09_to_gcj02(m, n)
lonlat_dict[x] = (m, n, zzz)
# 字典转换为DataFrame
df = pd.DataFrame.from_dict(lonlat_dict, orient='index')
# 添加或设置列名
df.columns = ['lon_old', 'lat_old', 'coord_new']
# 重置索引
df = df.reset_index(drop=True)
# 获取当前日期
current_date = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
# 定义输出文件名称
df.to_excel('output_'+current_date+'.xlsx', index=True)
最终输出的文件名类似“output_2024-07-03_22/27/20.xlsx"
注:默认分析的百度坐标数据均为国内数据。

2万+

被折叠的 条评论
为什么被折叠?



