坐标系转换 Python 实现

地图坐标系之间的转换(百度地图、GCJ、WGS84) 文章目录文章参考坐标系介绍常见坐标系WGS84坐标系(标准的GPS坐标)WGS84 Web墨卡托(平面地图)GCJ02经纬度投影(火星坐标系)GCJ02 Web 墨卡托投影BD09 经纬度投影常用坐标系区分?地图偏移为什么要地图偏移?偏移在哪里?地图做了偏移,为什么地图定位很精准(百度地图说明)坐标转换为什么要做坐标转换地图服务(后台地图引擎可提供的能力)TMS——Tile Map Service 即TMS,切片地图服务WMTS——Web Map Tile Service即WMTS,网络地图切片服务,WMS 阅读详情

本文将介绍一种 Python 实现,该实现可以在 WGS-84,GCJ-02(火星坐标系),以及 BD-09(百度坐标系)之间进行坐标转换。

坐标系简介

  • WGS-84 即地球坐标系,国际上通用的坐标系(设备一般包含GPS或者北斗芯片获取的经纬度为WGS84坐标–谷歌地图获取的是WGS84坐标(但是中国除外))

  • GCJ-02坐标系 ,即火星坐标系,有中国国家测绘局制定的地理信息系统的系统坐标。由WGS84坐标系经过加密后实现的;

  • BD-09坐标系 ,即百度坐标系,由GCJ-02坐标系经过加密后的坐标系

    图片

坐标系统转换情况

  1. 高德地图提供了WGS转火星坐标系的方法;

  2. 百度地图提供了WGS转百度地图的方法;

  3. 微信获取地理位置默认WGS可选择为火星坐标

同一个地点不同坐标系下的坐标

  • 谷歌地图:39.9821199343,116.3263878498

  • 百度地图:39.9878838520,116.3330148177

  • 腾讯高德:39.9821328830,116.3264038577

  • 图吧地图:39.9813033330,116.3156777777

  • 谷歌地球:39.9808333330,116.3202777777

  • 北纬N39°58′51.00″ 东经E116°19′13.00″

  • 海拔:56.89 米

  • 靠近:北京市海淀区科学院南路6号

  • 周边:中国科学院计算技术研究所 约55米

  • 参考:北京市海淀区中关村街道科煦社区

Python 实现

坐标系转换原理如下:

图片

以下是 Python 的实现,包括以下几个函数:

  • gcj02_to_bd09(lng, lat): 火星坐标系(GCJ-02)转百度坐标系(BD-09)

  • bd09_to_gcj02(bd_lon, bd_lat): 百度坐标系(BD-09)转火星坐标系(GCJ-02)

  • wgs84_to_gcj02(lng, lat): WGS84转GCJ02(火星坐标系)

  • gcj02_to_wgs84(lng, lat): GCJ02(火星坐标系)转GPS84

  • bd09_to_wgs84(bd_lon, bd_lat): 百度坐标系(BD-09)转GPS84

  • wgs84_to_bd09(lon, lat): GPS84转百度坐标系(BD-09)

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

import math

x_pi = math.pi  * 3000.0 / 180.0

a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 扁率


def gcj02_to_bd09(lng, lat):
   """
  火星坐标系(GCJ-02)转百度坐标系(BD-09)
  谷歌、高德——>百度
  :param lng:火星坐标经度
  :param lat:火星坐标纬度
  :return:
  """
   z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)
   theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)
   bd_lng = z * math.cos(theta) + 0.0065
   bd_lat = z * math.sin(theta) + 0.006
   return [bd_lng, bd_lat]


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]


def wgs84_to_gcj02(lng, lat):
   """
  WGS84转GCJ02(火星坐标系)
  :param lng:WGS84坐标系的经度
  :param lat:WGS84坐标系的纬度
  :return:
  """
   if out_of_china(lng, lat):  # 判断是否在国内
       return lng, lat
   dlat = _transformlat(lng - 105.0, lat - 35.0)
   dlng = _transformlng(lng - 105.0, lat - 35.0)
   radlat = lat / 180.0 * pi
   magic = math.sin(radlat)
   magic = 1 - ee * magic * magic
   sqrtmagic = math.sqrt(magic)
   dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
   dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
   mglat = lat + dlat
   mglng = lng + dlng
   return [mglng, mglat]


def gcj02_to_wgs84(lng, lat):
   """
  GCJ02(火星坐标系)转GPS84
  :param lng:火星坐标系的经度
  :param lat:火星坐标系纬度
  :return:
  """
   if out_of_china(lng, lat):
       return lng, lat
   dlat = _transformlat(lng - 105.0, lat - 35.0)
   dlng = _transformlng(lng - 105.0, lat - 35.0)
   radlat = lat / 180.0 * math.pi
   magic = math.sin(radlat)
   magic = 1 - ee * magic * magic
   sqrtmagic = math.sqrt(magic)
   dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi)
   dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi)
   mglat = lat + dlat
   mglng = lng + dlng
   return [lng * 2 - mglng, lat * 2 - mglat]


def bd09_to_wgs84(bd_lon, bd_lat):
   lon, lat = bd09_to_gcj02(bd_lon, bd_lat)
   return gcj02_to_wgs84(lon, lat)


def wgs84_to_bd09(lon, lat):
   lon, lat = wgs84_to_gcj02(lon, lat)
   return gcj02_to_bd09(lon, lat)


def _transformlat(lng, lat):
   ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
         0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
   sin_lng_pi = math.sin(6.0 * lng * math.pi)
   sin_2_lng_pi = math.sin(2.0 * lng * math.pi)
   sin_lat_pi = math.sin(lat * math.pi)
   sin_lat_3_pi = math.sin(lat / 3.0 * math.pi)
   sin_lat_12_pi = math.sin(lat / 12.0 * math.pi)
   sin_lat_30_pi = math.sin(lat * math.pi / 30.0)
   ret += (20.0 * sin_lng_pi + 20.0 * sin_2_lng_pi) * 2.0 / 3.0
   ret += (20.0 * sin_lat_pi + 40.0 * sin_lat_3_pi) * 2.0 / 3.0
   ret += (160.0 * sin_lat_12_pi + 320 * sin_lat_30_pi) * 2.0 / 3.0
   return ret

def _transformlng(lng, lat):
   ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
         0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
   ret += (20.0 * math.sin(6.0 * lng * math.pi) + 20.0 *
           math.sin(2.0 * lng * math.pi)) * 2.0 / 3.0
   ret += (20.0 * math.sin(lng * math.pi) + 40.0 *
           math.sin(lng / 3.0 * math.pi)) * 2.0 / 3.0
   ret += (150.0 * math.sin(lng / 12.0 * math.pi) + 300.0 *
           math.sin(lng / 30.0 * math.pi)) * 2.0 / 3.0
   return ret


def out_of_china(lng, lat):
   """
  判断是否在国内,不在国内不做偏移
  :param lng:
  :param lat:
  :return:
  """
   return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)

if __name__ == '__main__':
   lng = 113.224367
   lat = 25.69346
   result5 = bd09_to_wgs84(lng, lat)
   #result1 = gcj02_to_bd09(lng, lat)
   #result2 = bd09_to_gcj02(lng, lat)
   #result3 = wgs84_to_gcj02(lng, lat)
   #result4 = gcj02_to_wgs84(lng, lat)
   #result5 = wgs84_to_bd09(lng, lat)

   print(result)

使用方法

以下是如何使用这些函数的示例:

lng = 114.224367
lat = 24.69
result = bd09_to_wgs84(lng, lat)
print(result)

在上述代码中,我们将百度坐标系(BD-09)的坐标转换为GPS84坐标系的坐标,并打印出结果。

结论

本文档提供了一种 Python 实现,该实现可以在 WGS-84,GCJ-02(火星坐标系),以及 BD-09(百度坐标系)之间进行坐标转换。这些函数可以用于各种需要进行坐标转换的应用,包括地图应用、地理信息系统等。

基于python实现地理坐标系与投影坐标系的转换 基于python实现地理坐标系与投影坐标系的转换 #-*-coding=utf-8 -*- import pyproj import pandas as pd import numpy as np data = pd.read_csv("test.csv",sep=',',header='infer')#将第一行作为表头 p1 = pyproj.Proj(init="epsg:4326")#wgs坐标系统的EPSG Code p2 = pyproj.Proj(init="epsg:32651")#UTM 5 阅读详情

相关推荐

火星坐标系、WGS84坐标系、百度坐标系和Web墨卡托坐标系相互转换(基于Python实现)

主流被使用的地理坐标系并不统一,导致在处理多源数据时往往会出现对不齐的情况,如何在火星坐标系、WGS84坐标系、百度坐标系和Web墨卡托坐标系进行坐标转换非常关键,本文介绍了基于python实现的坐标系转换代码。

weixin_41399650的博客 6963

Python坐标系转换

1. 相关名词 地心地固坐标系(Earth-Centered, Earth-Fixed,ECEF),简称地心坐标系。 地理坐标系统(Geographic Coordinate System,GCS),坐标系是地心坐标系,用经纬度表示球面上的点。 世界大地测量系统(World Geodetic System, WGS),比如WGS84,是一种地理坐标系统,用于全球定位系统(GPS)。 投影坐标系统(Projection Coordinate System,PCS),在二维平面上用米表示位置。 通用横轴墨卡托

diligent_lee的博客 8964

python实现常见的坐标系转换——点拟合圆

python实现点拟合圆

ningsheng的博客 1066

利用python进行坐标系之间的转换

地理坐标系是由大地基准面衍生而来,使用三维球面来定义地球表面位置,以实现通过经纬度对地球表面点位引用的坐标系。一个地理坐标系包括角度测量单位、本初子午线和基准面三部分。一个大地基准面可以对应多个地理坐标系统,而一个地理坐标系统只能对应一个大地基准面。同一个坐标点在不同地理坐标系的地图上,会落在不同的区域;同一个地点获取不同地理坐标系下的坐标数据,值不相同。

2302_76597285的博客 2498

【姿态估计】相机坐标系转换-python实现

背景:TOF相机输出的RGB分辨率为1280×960,IR分辨率为960×480,深度图分辨率为960×480 IR图与深度图为同一摄像头,时间与空间均一致 需完成RGB上的UVZ,转为IR坐标系下的UVZ 实现流程: 代码: import cv2 import os import numpy as np import json import matplotlib.pyplot as plt from PIL import Image, ImageTk,ImageDraw depth_f =[492.90

sunnyblogs的博客 7279

python实现常见的坐标系转换——仿射变换

python实现仿射变换

ningsheng的博客 977

百度坐标与GPS坐标转换

 官网这么说的   4.3 百度坐标为何有偏移? 国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。 百度地图API中,有GPS坐标转百度坐标的功能 http://developer.ba...

xwanglyxwangly的专栏 1454

Python实现GCJ02坐标系向WGS84坐标系的转换

WGS84是大地坐标系,这是一种国际通用的坐标,中国的大地坐标是CGCS2000,也是原始坐标系,一般的终端设备,如果自己有定位功能,比如车载系统,他们发出的gps坐标就是原始坐标,我们在一些地图应用中使用的定位,比如打车软件,其他自带地图的软件,他们一般都是火星坐标系GCJ02,需要进行一个坐标转换。而百度地图相关的应用,基本都是使用的百度坐标,这个是在火星坐标基础上进行的再次加密,所以它还是与火星坐标有关系。国内的一般都是GCJ02坐标系。国外的很多都是WGS84坐标系。

Alkali!的博客 3614

python实现 经纬度的 各GIS坐标系转换

这里是gis坐标的单点转换. 下面是利用python反射机制实现的gis坐标转换类.精度不是很完美但一般也够用啦.   # coding=utf-8 import math, re class GisTransform(object): """gis坐标转换类""" def __init__(self, old_gis_name, new_gis_name): ...

he93007的博客 8577

Python实现坐标系的转换

以下是一个用Python编写的简单示例,可以实现坐标系的转换(J2000坐标系转换成地心系和地心系转换成发射系)。利用Python编写界面,界面上可以输入坐标系(时间t,x,y,z,vx,vy,vz)或者选择坐标系txt文件,选择输出坐标系路径,输出为txt,并两个框里显示转换前和转换后的坐标,实现输入一个坐标系转换成另一个坐标系(时间t,x,y,z,vx,vy,vz)例如,当从卫星接收到J2000坐标系下的位置和速度信息时,您可能需要将其转换为地心系或发射系的坐标,以便更好地理解和应用这些数据。

走向CTO的路上... 1859

python实现百度坐标和世界经纬度坐标之间的转换

python实现百度墨卡托坐标,百度经纬度坐标,火星坐标,WGS84坐标之间的相互转换。

python实现坐标系转换_python、js实现WGS84、高德(火星)、百度坐标转换

在日常工作学习中常会涉及到WGS84、高德(火星/谷歌)、百度三种空间坐标系的坐标转换,本文将通过python、js两种语言实现坐标系的转换。坐标系说明:wgs84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。高德/谷歌:采用GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GC...

weixin_39743064的博客 1432

利用python和百度地图API实现数据地图标注的方法

如题,先上效果图: 主要分为两大步骤 使用python语句,通过百度地图API,对已知的地名抓取经纬度 使用百度地图API官网的html例程,修改数据部分,实现呈现效果 一、使用python语句,通过百度地图API,获取经纬度读取文件信息 import pandas as pd data = pd.read_excel('test_baidu.xlsx') data 图中可以看出,原始数据并没有经纬度。 2. 构建抓取经纬度函数 import json from urllib.request import urlopen, quote import requests def getln

python实现坐标系转换_python – 执行坐标系转换的库?

您可以使用shapely库:http://toblerity.org/shapely/manual.htmlfrom shapely.geometry import Pointfrom functools import partialimport pyprojfrom shapely.ops import transformpoint1 = Point(9.0, 50.0)print (point...

weixin_39622150的博客 979

LangChain学习及应用(超详细)

Model I/O 部分是与语言模型进行交互的核心组件,包括输入提示(Prompt Template)、调用模型(Model)、输出解析(Output Parser)。简单来说,就是输入、处理、输出这三个步骤。LLM 因其具有海量参数,需要花费相当的物力与时间成本进行预训练和微调,同时商用 LLM 还需要进行各种安全测试与风险评估等。因此 LLM 会存在知识滞后的问题。在专有领域,LLM 无法学习到所有的专业知识细节,因此在面向专业领域知识的提问时,无法给出可靠准确的回答。

weixin_39764056的博客 4233

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec请求头加密

本文详细解析了Shopee商品详情页反爬机制中x-sap-Ri和x-sap-Sec请求头参数的加密逻辑,通过JS逆向技术手把手教你定位加密入口、分析哈希算法与对称加密实现,并提供完整实战案例和应对反爬策略的高级技巧,助力开发者突破电商平台数据采集难点。

weixin_27875131的博客 1823

车辆运动学模型的数学之美:用Python实现五种坐标系转换

本文深入探讨了车辆运动学模型中五种关键坐标系的数学转换原理,包括惯性坐标系、车身坐标系、轮胎坐标系、传感器坐标系和路径坐标系。通过Python代码示例详细展示了坐标系间的转换实现,特别强调了路径跟踪控制在自动驾驶中的应用价值,为开发者提供了实用的数学工具和实现方法。

dd012的博客 748

电赛综合测评题练习(一)-(与2013年电赛综合测评要求类似)

电赛综合测评题练习 文章目录电赛综合测评题练习前言1. 波形发生器1.1 题目说明1.1.1 可用器件1.1.2 设计要求1.1.3 设计方案论证1.2 仿真电路设计1.2.1 脉冲波发生器电路1.2.1.1 方案介绍1.2.1.2 理论分析与计算1.2.1.3 电路系统设计1.2.1.4 仿真方案与仿真测试结果1.2.2 锯齿波电路1.2.2.1 理论分析与计算1.2.2.2 电路系统设计1.2.2.3 仿真方案与仿真测试结果1.2.3 正弦波I电路1.2.3.1 理论分析与计算1.2.3.2 电路系

daydayup!的博客 3万+

2D坐标系与3D坐标系的相互转换--python实现

并不是做关于SLAM方向的,但由于某些任务涉及到,故作此笔记~ 相机内参矩阵: 不同的的深度摄像头具有不同的特征参数,在计算机视觉里,将这组参数设置为相机的内参矩阵C: [fx0cx0fycy001 ]\begin{bmatrix} f_x&amp; 0 &amp;c_x \\\\ 0 &amp; f_y &amp; c_y \\\\ 0 &amp...

cuihaoren01的专栏 3万+

如何用Python+Librosa实现轴承异响检测?5步搞定工业设备故障预警

本文详细介绍了如何利用Python和Librosa库,通过5个步骤构建工业轴承异响检测与故障预警系统。从音频采集、预处理、频谱特征提取,到构建机器学习模型并进行实时监测,提供了完整的代码级解决方案。该方法能有效识别轴承早期故障特征,实现低成本、高效的设备预测性维护。

rnn9storyteller的博客 631

避开这些坑!医疗影像数据增强的6个安全操作指南(附PyTorch代码)

本文详细介绍了医疗影像数据增强的六大安全准则,包括解剖结构守恒、密度值物理意义保留和病灶特征保护等关键原则,并提供了PyTorch实战代码。通过具体案例和参数建议,帮助开发者在肺结节检测和MRI分割等医疗AI应用中实现安全有效的数据增强,避免因不当操作导致的诊断误差。

cola5的博客 553

C#调用python实现shp文件的CGCS2000坐标系向WGS84坐标系转换

前言:我们项目上最近有个需求,要把shp文件导入到我们的webgis系统中来,展示在前端的网页上。如果是任意的shp想展示在webgis中,我们就使用postgresql提供的ogr2ogr工具,直接将shp转为geojson,数据传给前端就行了。但是现在我们的shp是有固定格式的,我们的数据库中也有对应格式的表,因此问题就转变为了,将shp导入我们的表中。 s...

AIGIS的博客 1780

【四足机器人项目实战】四足机器人腿部机械结构设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–腿部机械结构设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 为了减轻腿部惯量,使用有限元分析着重进行轻量化设计,小腿采用工字梁方案,大腿采用内部镂方案,并使用1.5 mm的AL 6061硬质材料,轻量化的腿部设了腿部运动时摆动

qq_35635374的博客 7538

相机外参矩阵详解:如何用Python实现世界坐标系到相机坐标系的转换

本文详细解析了相机外参矩阵的原理及其在计算机视觉中的应用,通过Python代码实现从世界坐标系到相机坐标系的转换。内容包括旋转矩阵的几何意义、欧拉角转换、齐次坐标变换以及实际应用示例,帮助开发者掌握相机标定和姿态估计的核心技术。

weixin_33734785的博客 112

一文看懂 SAP Integration Suite:从架构治理、接口编排到事件驱动的集成全景

SAP Integration Suite是企业数字化转型中的关键集成平台,通过统一的方法论和工具链解决系统互联、数据对齐和流程协同等复杂问题。其核心能力包括:1)集成评估(Integration Assessment)提供战略规划框架;2)迁移评估(Migration Assessment)支持从传统平台向云的平滑过渡;3)云集成(Cloud Integration)实现日常业务流程编排;4)集成顾问(Integration Advisor)简化B2B标准映射;5)贸易伙伴管理(TPM)优化外部协作流程;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 501

【问题解决】解决 Python `PermissionError` 权限不足:文件/进程/端口全场景修复

本文总结了Python程序中常见的权限问题及解决方案,包括文件、进程和端口权限错误。文件权限问题通常由文件占用、权限不足或路径错误引起;进程问题多因权限不足或系统限制;端口问题则与端口占用、防火墙或特权端口相关。解决方案提供了详细的代码实现:文件权限管理器类(FilePermissionManager)包含检查权限(check_permission)、修复权限(fix_permission)、安全写入(safe_write)和安全删除(safe_delete)等方法,通过异常处理和临时文件等技术确保操作安全

博客 356
上一篇: ArcGis中shp文件出现问号状态,打不开怎么解决?
下一篇: 开展遥感专业的71个普通高校,有没有你的母校?
小白说遥感
博客等级 码龄10年 2033粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值