1 为什么会有高德坐标系和百度坐标系?

  • 根据《测绘法》和国家保密法规,在中国大陆范围内的地理坐标数据必须做加密处理,不允许直接使用 WGS84(openstreetmap)
    • 所以出现了GCJ-02 和 BD-09
      • 高德、腾讯、谷歌中国都遵循 GCJ-02
        • 在 WGS-84 的基础上,加了随机扰动和非线性偏移算法(保密算法)
        • 火星坐标系,是一种基于WGS-84制定的大地测量系统,由中国国测局制定。
        • 此坐标系所采用的混淆算法会在经纬度中加入随机的偏移。
      • 百度在 GCJ-02 的基础上又加了一次二次加密,形成 BD-09
        • 在 GCJ-02 的基础上,再做一次偏移和加密,主要是 保护商业利益和数据差异化
      • 因此,不同平台互换数据时,需要做坐标系转换,否则会出现“偏移”。
  • WGS-84(World Geodetic System, WGS)是使用最广泛的坐标系,也是世界通用的坐标系,GPS设备得到的经纬度就是在WGS84坐标系下的经纬度。

2  百度坐标转高德坐标

import mathdef bd09_to_gcj02(bd_lon, bd_lat):"""百度坐标系 (BD09) 转 高德/谷歌 (GCJ02)"""x = bd_lon - 0.0065y = bd_lat - 0.006z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * math.pi)theta = math.atan2(y, x) - 0.000003 * math.cos(x * math.pi)gg_lon = z * math.cos(theta)gg_lat = z * math.sin(theta)return gg_lon, gg_lat# 示例:百度坐标 -> 高德坐标
bd_lon, bd_lat = 121.495, 31.240   # 上海某点的百度坐标
gcj_lon, gcj_lat = bd09_to_gcj02(bd_lon, bd_lat)print("百度坐标:", bd_lon, bd_lat)
#百度坐标: 121.495 31.24
print("高德坐标:", gcj_lon, gcj_lat)
#高德坐标: 121.48850960667689 31.23401650463438

3  高德地图转百度地图

import mathdef gcj02_to_bd09(gcj_lon, gcj_lat):"""高德/腾讯/谷歌中国 (GCJ-02) → 百度 (BD-09)"""z = math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * math.sin(gcj_lat * math.pi)theta = math.atan2(gcj_lat, gcj_lon) + 0.000003 * math.cos(gcj_lon * math.pi)bd_lon = z * math.cos(theta) + 0.0065bd_lat = z * math.sin(theta) + 0.006return bd_lon, bd_lat# 示例
gcj_lon, gcj_lat = 121.48, 31.23
bd_lon, bd_lat = gcj02_to_bd09(gcj_lon, gcj_lat)
print(bd_lon, bd_lat)
#121.48649307312748 31.23597382351204

4 高德地图转WGS-84

import mathPI = math.pi
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 * PI) + 20.0 *math.sin(2.0 * x * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(y * PI) + 40.0 *math.sin(y / 3.0 * PI)) * 2.0 / 3.0ret += (160.0 * math.sin(y / 12.0 * PI) + 320 *math.sin(y * PI / 30.0)) * 2.0 / 3.0return retdef 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 * PI) + 20.0 *math.sin(2.0 * x * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(x * PI) + 40.0 *math.sin(x / 3.0 * PI)) * 2.0 / 3.0ret += (150.0 * math.sin(x / 12.0 * PI) + 300.0 *math.sin(x / 30.0 * PI)) * 2.0 / 3.0return retdef gcj02_to_wgs84(lon, lat):dlat = transform_lat(lon - 105.0, lat - 35.0)dlon = transform_lon(lon - 105.0, lat - 35.0)radlat = lat / 180.0 * PImagic = math.sin(radlat)magic = 1 - EE * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI)dlon = (dlon * 180.0) / (A / sqrtmagic * math.cos(radlat) * PI)mgLat = lat + dlatmgLon = lon + dlonreturn lon * 2 - mgLon, lat * 2 - mgLatgcj_lon, gcj_lat = 121.48, 31.23  # 高德
wgs_lon, wgs_lat = gcj02_to_wgs84(gcj_lon, gcj_lat)
print("高德(GCJ02):", gcj_lon, gcj_lat)
print("OSM(WGS84):", wgs_lon, wgs_lat)
'''
高德(GCJ02): 121.48 31.23
OSM(WGS84): 121.47549797745022 31.231959998113442
'''

5 WGS84 转高德

import mathdef 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 * math.pi) + 20.0 * math.sin(2.0 * lon * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * math.pi) + 40.0 * math.sin(lat / 3.0 * math.pi)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * math.pi) + 320.0 * math.sin(lat * math.pi / 30.0)) * 2.0 / 3.0return retdef 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 * math.pi) + 20.0 * math.sin(2.0 * lon * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lon * math.pi) + 40.0 * math.sin(lon / 3.0 * math.pi)) * 2.0 / 3.0ret += (150.0 * math.sin(lon / 12.0 * math.pi) + 300.0 * math.sin(lon / 30.0 * math.pi)) * 2.0 / 3.0return retdef wgs84_to_gcj02(lat,lon):"""WGS84 → GCJ02"""dlat = transform_lat(lon - 105.0, lat - 35.0)dlon = transform_lon(lon - 105.0, lat - 35.0)radlat = lat / 180.0 * math.pimagic = math.sin(radlat)magic = 1 - 0.00669342162296594323 * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((6378245.0 * (1 - 0.00669342162296594323)) / (magic * sqrtmagic) * math.pi)dlon = (dlon * 180.0) / (6378245.0 / sqrtmagic * math.cos(radlat) * math.pi)mglat = lat + dlatmglon = lon + dlonreturn mglat,mglon

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94449.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94449.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94449.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SkyWalking高效线程上下文管理机制:确保调用链中traceId来自同一个请求

SkyWalking Agent 能确保获取到“正确”的 traceId,其核心在于它建立并维护了一套高效的线程上下文管理机制。这套机制确保了即使在复杂的多线程、异步环境下,也能将正确的上下文(包含 traceId)与当前正在执行的代码逻辑关联起来。 其工作原理可以概括为下图所示的流程: …

Kafka-Eagle安装

目录Eagle环境安装Mysql环境准备Kafka环境准备Eagle安装Kafka-Eagle框架可以监控Kafka集群的整体运行情况,在生产环境中经常使用 Eagle环境安装 Mysql环境准备 Eagle的安装依赖于Mysql,Mysql主要用来存储可视化展示的数据 将mysql文件夹及里面所有内…

Matlab系列(005) 一 归一化

目录1、前言2、什么是归一化?3、为什么要进行归一化4、归一化方法详解与Matlab实现5、总结1、前言 ​   归一化技术是数据预处理的核心环节,本文将深度解析主流归一化方法,提供可复现Matlab代码,并探讨其在各领域中的应用场景。…

【K8s】整体认识K8s之namespace

命名空间将资源划分为相互隔离的组。kubectl get namespace/ns系统默认创建四个namespace,分别是default、kube-node-lease、kube-public、kube-system。default 没有指明使用其它命名空间的对象所使用的默认命名空间、kube-system 系统创建对象所使用的命名空间。…

rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十八) 使用表格

使用表格egui_extras::TableBuilder // Cargo.toml [dependencies] eframe "0.32.1" egui "0.32.1" egui_extras "0.32.1"egui_extras::Column::auto() 列宽根据内容自动计算.resizable(true) 允许用户手动拖动调整列宽 fn main() -> efra…

【C#】构造函数实用场景总结

文章目录前言一、构造函数是什么?二、构造函数的用法1.初始化对象,避免无效状态2 初始化静态成员3 构造函数重载4.构造函数链5. 单例模式,多次实例化保持一个对象6. 依赖注入7. 初始化只读对象前言 构造函数是我们平常编程里经常能碰到的老伙…

LLM预训练架构全解析:从零构建一个语言世界的“操作系统”

导读:作为开发者,我们每天都在import或#include各种库,我们信任这些由无数代码构成的底层依赖。那么,当我们调用一个LLM时,它所依赖的那个更底层的、无形的**“语言操作系统”**,又是如何被“编译”出来的&…

Linux服务测试题(DNS,NFS,DHCP,HTTP)

一,实验拓扑:二,需求APPSRV:主机名:appsrv.example.comip地址:192.168.100.10网关:192.168.100.254网卡为NAT模式STORAGESRV:主机名:storagesrv.example.comip地址&#…

DevOps 简介及就业前景

DevOps 简介及就业前景 目录 DevOps简介核心概念重难点解析具体场景使用就业前景学习路径最佳实践 DevOps简介 什么是DevOps DevOps是Development(开发)和Operations(运维)的组合词,是一种软件开发和IT运维的文化…

《CF1120D Power Tree》

题目描述 给定一棵有 n 个顶点的有根树,树的根为顶点 1。每个顶点都有一个非负的价格。树的叶子是指度为 1 且不是根的顶点。 Arkady 和 Vasily 在树上玩一个奇怪的游戏。游戏分为三个阶段。第一阶段,Arkady 购买树上的一些非空顶点集合。第二阶段&…

CPTS-Agile (Werkzeug / Flask Debug)

枚举 nmap -sC -sV -T4 -Pn -n -p- 10.10.11.203进行常规的网页枚举和测试发现报错信息,‘Werkzeug / Flask Debug’ 测试Export导出功能发现存在路径遍历查看这篇文章 https://book.hacktricks.wiki/zh/network-services-pentesting/pentesting-web/werkzeug.html#…

【网络运维】Shell 脚本编程:while 循环与 until 循环

Shell 脚本编程:while 循环与 until 循环 循环结构简介 循环语句是 Shell 脚本中用于重复执行一条或一组指令的重要工具,直到满足特定条件时停止执行。Shell 脚本中常见的循环语句包括 while、until、for 和 select。本文将重点介绍 while 和 until 两种…

LLM 中评价指标与训练概要介绍

在【LLM】LLM 中增量解码与模型推理解读一文中对 LLM 常见名词进行了介绍,本文会对 LLM 中评价指标与训练概要进行介绍,本文并未介绍训练实操细节,未来有机会再了解~ 一、LLM 如何停止输出 在看 LLM 评价指标前,先看…

Java 20 新特性及具体应用

目录 1. 模式匹配 for switch(预览特性) 2. 记录模式(预览特性) 3. 外部函数与内存 API(预览特性) 4. 矢量 API(孵化器特性) 5. 作用域值(预览特性) 6. …

【STM32】CubeMX(十一):FreeRTOS任务挂起与解挂

这篇文章是 STM32 HAL FreeRTOS 下的任务挂起与恢复机制, 结合 CubeMX 图示与代码,构建了一个 FreeRTOS 控制示例。 本篇目标:创建两个任务: 一个控制蓝灯闪烁(myTask01) 另一个监控按键(Start…

图片预加载:提升Web性能的关键

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

大模型压缩三剑客:量化、剪枝与知识蒸馏全解析

在人工智能飞速发展的今天,大语言模型(LLM)如通义千问、GPT 等已成为推动智能应用的核心引擎。然而,这些模型动辄数十亿甚至上千亿参数,带来了高昂的计算成本和部署门槛。如何在不显著牺牲性能的前提下,让大…

Seaborn数据可视化实战:Seaborn基础图表绘制入门

基础图表绘制:Seaborn入门教程 学习目标 通过本课程的学习,你将掌握如何使用Seaborn库绘制基础图表,包括条形图、折线图和散点图。你将了解Seaborn的基本函数和参数设置,以及如何通过调整这些参数来优化图表的视觉效果。 相关知识…

阿里开源通义万相Wan2.2:视频生成技术的革命性突破

在人工智能视频生成领域,阿里云通义实验室于2025年7月重磅开源了新一代视频生成大模型 Wan2.2,其核心亮点包括人体动作生成的极致精度、电影级美学表达以及高效的资源利用效率,标志着视频生成技术迈入了一个全新的阶段。 一、核心功能:三大模型,覆盖全场景视频生成 Wan2.…

说说你对Integer缓存的理解?

大家好,我是锋哥。今天分享关于【说说你对Integer缓存的理解?】面试题。希望对大家有帮助; 说说你对Integer缓存的理解? 超硬核AI学习资料,现在永久免费了! Integer 缓存是 Java 中一个优化机制,它主要通过缓存一部…