數據集筆記:百度地圖高德地圖坐標互轉

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 中一個優化機制,它主要通過緩存一部…