python GCJ-02转CGCS2000 界面脚本

 安装扩展 执行命令  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()

编译好的 直接下转换软件

### 如何将地图上的地点换为点坐标的实现方法 在地理信息系统(GIS)领域,将地图上的地点换为点坐标通常涉及以下几个方面: #### 1. 坐标系的选择与理解 不同的地图服务提供商可能采用不同的坐标系。例如: - 高德地图使用的是GCJ-02坐标系[^1]。 - 百度地图使用的是BD-09坐标系[^2]。 - 天地图支持多种坐标系,包括WGS-84、CGCS2000等。 因此,在进行坐标转换之前,需明确目标坐标系以及原始数据所在的坐标系。 #### 2. 数据准备 如果要将特定的地图位置导入为经纬度坐标,可以按照以下方式操作: - **手动输入**:对于少量的数据,可以直接记录其对应的经纬度值。 - **批量导入**:当有大量数据时,可以通过CSV或TXT文件的形式存储,并附加必要的字段描述。例如,引用中提到的奥维互动地图支持通过增加列的方式处理不同坐标系下的数据[^3]。 #### 3. 编程实现坐标转换 以下是基于Python的一个简单示例,展示如何利用`pyproj`库完成两种常见坐标系间的换——假设从百度坐标(BD-09)至标准地理坐标(WGS-84): ```python import pyproj def bd09_to_wgs84(bd_lon, bd_lat): """ 将百度坐标 (BD-09) 换为 WGS-84 坐标. 参数: bd_lon (float): BD-09 经度 bd_lat (float): BD-09 纬度 返回: tuple: WGS-84 的经度和纬度 """ # 定义投影对象 proj_bd = pyproj.Proj("+proj=merc +a=6378245 +b=6356863.0188 +lat_0=0 +lon_0=105 +k=1.0013333333333333 +x_0=0 +y_0=0 +units=m +no_defs") proj_wgs = pyproj.Proj(init='epsg:4326') wgs_lon, wgs_lat = pyproj.transform(proj_bd, proj_wgs, bd_lon, bd_lat) return wgs_lon, wgs_lat if __name__ == "__main__": lon_bd, lat_bd = 116.404, 39.915 # 示例百度坐标 result = bd09_to_wgs84(lon_bd, lat_bd) print(f"WGS-84 Coordinates: Longitude={result[0]}, Latitude={result[1]}") ``` 此脚本展示了如何借助 `pyproj` 库执行具体的坐标变换逻辑。 #### 4. Unity 中的应用扩展 针对三维环境开发需求,比如游戏引擎Unity里加载地理位置信息,则可考虑引入专门设计好的插件或者自行编写适配器函数来进行此类映射工作。正如资料所提及,“GisPointTo3DPoint” 工具包提供了便捷途径让用户能够轻松达成这一目的[^4]。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值