安装扩展 执行命令 pip install pyproj
import math
from pyproj import Transformer
import tkinter as tk
def gcj02_to_wgs84(lng, lat):
"""
将 GCJ-02 坐标转换为 WGS84 坐标
:param lng: GCJ-02 经度
:param lat: GCJ-02 纬度
:return: WGS84 经度和纬度
"""
if out_of_china(lng, lat):
return lng, lat
dlat = transform_lat(lng - 105.0, lat - 35.0)
dlng = transform_lng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * math.pi
magic = math.sin(radlat)
magic = 1 - 0.00669342162296594323 * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - 0.00669342162296594323)) / (sqrtmagic * sqrtmagic) * math.pi)
dlng = (dlng * 180.0) / (a / math.cos(radlat) * math.pi * sqrtmagic * sqrtmagic)
mglat = lat + dlat
mglng = lng + dlng
return [mglng, mglat]
def out_of_china(lng, lat):
"""
检查坐标是否在中国境内
:param lng: 经度
:param lat: 纬度
:return: 布尔值
"""
if lng < 72.004 or lng > 137.8347:
return True
if lat < 0.8293 or lat > 55.8271:
return True
return False
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_lng(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
# 定义常量
a = 6378245.0 # 半长轴
ee = 0.00669342162296594323 # 偏心率平方
# 示例使用
gcj_lng, gcj_lat = 116.482086, 39.990496
# GCJ-02 到 WGS84
wgs_lng, wgs_lat = gcj02_to_wgs84(gcj_lng, gcj_lat)
print(f"GCJ-02: {gcj_lng}, {gcj_lat}")
print(f"WGS84: {wgs_lng}, {wgs_lat}")
# WGS84 到 CGCS2000
transformer = Transformer.from_crs("EPSG:4326", "EPSG:4979")
cgcs_lng, cgcs_lat = transformer.transform(wgs_lng, wgs_lat)
# 输出 CGCS2000 坐标
print(f"CGCS2000: {cgcs_lng}, {cgcs_lat}")
# 创建 GUI 界面
root = tk.Tk()
root.title("GCJ-02 转 CGCS2000 坐标转换器")
gcj_lon_label = tk.Label(root, text="GCJ-02 经度(输入lng):")
gcj_lon_label.grid(row=0, column=0)
gcj_lon_entry = tk.Entry(root)
gcj_lon_entry.grid(row=0, column=1)
# 创建输入框和标签
gcj_lat_label = tk.Label(root, text="GCJ-02 纬度(输入lat):")
gcj_lat_label.grid(row=1, column=0)
gcj_lat_entry = tk.Entry(root)
gcj_lat_entry.grid(row=1, column=1)
wgcgcs_lon_label = tk.Label(root, text="WGS84 经度(输出lng):")
wgcgcs_lon_label.grid(row=2, column=0)
wgcgcs_lon_entry = tk.Entry(root)
wgcgcs_lon_entry.grid(row=2, column=1)
wgcgcs_lat_label = tk.Label(root, text="WGS84 纬度(输出lat):")
wgcgcs_lat_label.grid(row=3, column=0)
wgcgcs_lat_entry = tk.Entry(root)
wgcgcs_lat_entry.grid(row=3, column=1)
# 创建输出框和标签
cgcs_lon_label = tk.Label(root, text="CGCS2000 经度(输出lng):")
cgcs_lon_label.grid(row=4, column=0)
cgcs_lon_entry = tk.Entry(root)
cgcs_lon_entry.grid(row=4, column=1)
cgcs_lat_label = tk.Label(root, text="CGCS2000 纬度(输出lat):")
cgcs_lat_label.grid(row=5, column=0)
cgcs_lat_entry = tk.Entry(root)
cgcs_lat_entry.grid(row=5, column=1)
# 创建转换函数
def convert():
gcj_lat = float(gcj_lat_entry.get())
gcj_lon = float(gcj_lon_entry.get())
# 定义常量
a = 6378245.0 # 半长轴
ee = 0.00669342162296594323 # 偏心率平方
# 示例使用
gcj_lng, gcj_lat = gcj_lon, gcj_lat
# GCJ-02 到 WGS84
wgs_lng, wgs_lat = gcj02_to_wgs84(gcj_lng, gcj_lat)
print(f"GCJ-02: {gcj_lng}, {gcj_lat}")
print(f"WGS84: {wgs_lng}, {wgs_lat}")
# WGS84 到 CGCS2000
transformer = Transformer.from_crs("EPSG:4326", "EPSG:4979")
cgcs_lng, cgcs_lat = transformer.transform(wgs_lng, wgs_lat)
# 输出 CGCS2000 坐标
print(f"CGCS2000: {cgcs_lng}, {cgcs_lat}")
wgcgcs_lon_entry.delete(0, tk.END)
wgcgcs_lon_entry.insert(0, str(wgs_lng))
wgcgcs_lat_entry.delete(0, tk.END)
wgcgcs_lat_entry.insert(0, str(wgs_lat))
cgcs_lon_entry.delete(0, tk.END)
cgcs_lon_entry.insert(0, str(cgcs_lng))
cgcs_lat_entry.delete(0, tk.END)
cgcs_lat_entry.insert(0, str(cgcs_lat))
# 创建转换按钮
convert_button = tk.Button(root, text="转换", command=convert)
convert_button.grid(row=7, column=0, columnspan=2)
# 运行 GUI 界面
root.mainloop()
编译好的 直接下转换软件