WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集

野火 ATGM332D简介

高性能、低功耗 GPS、北斗双模定位模块

STM32 GPS定位_为了维护世界和平_的博客-CSDN博客

秉火多功能调试助手上位机开源!共六款软件,学到你吐... , - 电脑上位机 - 野火电子论坛 - Powered by Discuz!
https://www.firebbs.cn/forum.php?mod=viewthread&tid=11985&fromuid=64

百度地图API应用小实例_百度地图使用场景100字学生_海之沐的博客-CSDN博客 根据百度API处理实际问题

坐标计算距离公式 火星坐标系_地图坐标转换 -- 火星坐标与GPS坐标_暗夜猎手 Vayne的博客-CSDN博客

国内各地图API坐标系统比较 - Rover.Tang - 博客园
https://www.cnblogs.com/Tangf/archive/2012/03/15/2398397.html

GPS定位及通信协议解析_gps协议解析_卷积神经网络的博客-CSDN博客

4.GPS模块测试软件

gps模块可以使用u-center测试软件来测试,可以支持串口和网口两种方式

 

5.相关软件下载
数字地球软件下载地址:https://download.csdn.net/download/xipengbozai/19774250

GPS测试软件下载地址:https://download.csdn.net/download/xipengbozai/19774233

GPS数据转换工具:https://download.csdn.net/download/xipengbozai/19774213

WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换_wgs84坐标系与百度坐标系_ThinkWon的博客-CSDN博客

背景:从GPS和北斗卫星定位得到的定位数据采用的都是WGS84坐标系,即地球坐标系,但是国内不管是高德地图、百度地图采用的并不是WGS84坐标系,所以需要经过转换后才能使用,前端用百度API提供的方法转换速度较慢。通过网上搜索收集资料,然后自己编写代码测试,总结了一下有关坐标系简介与转换的知识,分享给大家!
文章目录
1.各坐标系简介
2.各坐标系转换
2.1坐标点实体类
2.2各坐标系转换工具类
3.测试
1.各坐标系简介
WGS84坐标系
即地球坐标系,国际上通用的坐标系。
设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系。谷歌地图采用的是WGS84地理坐标系(中国范围除外,谷歌中国地图采用的是GCJ02地理坐标系。)

GCJ02坐标系
即火星坐标系,WGS84坐标系经加密后的坐标系。
出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标。

BD09坐标系
即百度坐标系,GCJ02坐标系经加密后的坐标系。搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。

各主流地图API采用的坐标系
高德MapABC地图API 火星坐标
腾讯搜搜地图API 火星坐标
阿里云地图API 火星坐标
灵图51ditu地图API 火星坐标

百度地图API 百度坐标
搜狐搜狗地图API 搜狗坐标
图吧MapBar地图API 图吧坐标

这里介绍几个常用的在线坐标工具
高德开放平台
百度拾取坐标系统

在线坐标转换工具

2.各坐标系转换

2.1坐标点实体类

/*** Description: 坐标点* * @author JourWon* @date Created on 2018年6月19日*/
public class Point implements Serializable {private static final long serialVersionUID = 3584864663880053897L;/*** 经度*/private double lng;/*** 纬度*/private double lat;

2.2各坐标系转换工具类

package com.jourwon.util;import com.jourwon.pojo.Point;/*** Description: 各坐标系之间的转换工具类* * @author JourWon* @date Created on 2018年6月19日*/
public class CoordinateTransformUtils {// 圆周率πprivate static final double PI = 3.1415926535897932384626D;// 火星坐标系与百度坐标系转换的中间量private static final double X_PI = 3.14159265358979324 * 3000.0 / 180.0D;// Krasovsky 1940// 长半轴a = 6378245.0, 1/f = 298.3// b = a * (1 - f)// 扁率ee = (a^2 - b^2) / a^2;// 长半轴private static final double SEMI_MAJOR = 6378245.0D;// 扁率private static final double FLATTENING = 0.00669342162296594323D;// WGS84=>GCJ02 地球坐标系=>火星坐标系public static Point wgs84ToGcj02(double lng, double lat) {if (outOfChina(lng, lat)) {return new Point(lng, lat);}double[] offset = offset(lng, lat);double mglng = lng + offset[0];double mglat = lat + offset[1];return new Point(mglng, mglat);}// GCJ02=>WGS84 火星坐标系=>地球坐标系(粗略)public static Point gcj02ToWgs84(double lng, double lat) {if (outOfChina(lng, lat)) {return new Point(lng, lat);}double[] offset = offset(lng, lat);double mglng = lng - offset[0];double mglat = lat - offset[1];return new Point(mglng, mglat);}// GCJ02=>WGS84 火星坐标系=>地球坐标系(精确)public static Point gcj02ToWgs84Exactly(double lng, double lat) {if (outOfChina(lng, lat)) {return new Point(lng, lat);}double initDelta = 0.01;double threshold = 0.000000001;double dLat = initDelta, dLon = initDelta;double mLat = lat - dLat, mLon = lng - dLon;double pLat = lat + dLat, pLon = lng + dLon;double wgsLat, wgsLng, i = 0;while (true) {wgsLat = (mLat + pLat) / 2;wgsLng = (mLon + pLon) / 2;Point point = wgs84ToGcj02(wgsLng, wgsLat);dLon = point.getLng() - lng;dLat = point.getLat() - lat;if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold))break;if (dLat > 0)pLat = wgsLat;elsemLat = wgsLat;if (dLon > 0)pLon = wgsLng;elsemLon = wgsLng;if (++i > 10000)break;}return new Point(wgsLng, wgsLat);}// GCJ-02=>BD09 火星坐标系=>百度坐标系public static Point gcj02ToBd09(double lng, double lat) {double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * X_PI);double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * X_PI);double bd_lng = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;return new Point(bd_lng, bd_lat);}// BD09=>GCJ-02 百度坐标系=>火星坐标系public static Point bd09ToGcj02(double lng, double lat) {double x = lng - 0.0065;double y = lat - 0.006;double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * X_PI);double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * X_PI);double gcj_lng = z * Math.cos(theta);double gcj_lat = z * Math.sin(theta);return new Point(gcj_lng, gcj_lat);}// WGS84=>BD09 地球坐标系=>百度坐标系public static Point wgs84ToBd09(double lng, double lat) {Point point = wgs84ToGcj02(lng, lat);return gcj02ToBd09(point.getLng(), point.getLat());}// BD09=>WGS84 百度坐标系=>地球坐标系public static Point bd09ToWgs84(double lng, double lat) {Point point = bd09ToGcj02(lng, lat);return gcj02ToWgs84(point.getLng(), point.getLat());}/*** Description: 中国境外返回true,境内返回false* @param lng 	经度* @param lat	纬度* @return*/public static boolean outOfChina(double lng, double lat) {if (lng < 72.004 || lng > 137.8347)return true;if (lat < 0.8293 || lat > 55.8271)return true;return false;}// 经度偏移量private static double transformLng(double lng, double lat) {double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;}// 纬度偏移量private static double transformLat(double lng, double lat) {double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat+ 0.2 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;}// 偏移量public static double[] offset(double lng, double lat) {double[] lngLat = new double[2];double dlng = transformLng(lng - 105.0, lat - 35.0);double dlat = transformLat(lng - 105.0, lat - 35.0);double radlat = lat / 180.0 * PI;double magic = Math.sin(radlat);magic = 1 - FLATTENING * magic * magic;double sqrtmagic = Math.sqrt(magic);dlng = (dlng * 180.0) / (SEMI_MAJOR / sqrtmagic * Math.cos(radlat) * PI);dlat = (dlat * 180.0) / ((SEMI_MAJOR * (1 - FLATTENING)) / (magic * sqrtmagic) * PI);lngLat[0] = dlng;lngLat[1] = dlat;return lngLat;}}

3.测试

/*** Description: 坐标系转换工具测试类* * @author JourWon* @date Created on 2018年6月19日*/
public class CoordinateTransformUtilsTest {/*** Description: 地球坐标系 =>火星坐标系、百度坐标系*/@Testpublic void test01() {// 广州市中大地铁站Point point = new Point(113.28749670783887D, 23.094783676708065D);System.out.println("地球坐标系 : " + point);Point wgs84ToGcj02 = CoordinateTransformUtils.wgs84ToGcj02(point.getLng(), point.getLat());System.out.println("火星坐标系 : " + wgs84ToGcj02);Point wgs84ToBd09 = CoordinateTransformUtils.wgs84ToBd09(point.getLng(), point.getLat());System.out.println("百度坐标系 : " + wgs84ToBd09);}/*** Description: 火星坐标系=>地球坐标系、百度坐标系*/@Testpublic void test02() {// 广州市珠江新城地铁站Point point = new Point(113.321171D, 23.119285D);System.out.println("火星坐标系 : " + point);Point wgs84ToGcj02 = CoordinateTransformUtils.gcj02ToWgs84(point.getLng(), point.getLat());System.out.println("地球坐标系 : " + wgs84ToGcj02);Point wgs84ToBd09 = CoordinateTransformUtils.gcj02ToBd09(point.getLng(), point.getLat());System.out.println("百度坐标系 : " + wgs84ToBd09);}/*** Description: 百度坐标系=>地球坐标系、火星坐标系*/@Testpublic void test03() {// 广州市体育西路地铁站Point point = new Point(113.328035D, 23.136929D);System.out.println("百度坐标系 : " + point);Point wgs84ToGcj02 = CoordinateTransformUtils.bd09ToWgs84(point.getLng(), point.getLat());System.out.println("地球坐标系 : " + wgs84ToGcj02);Point wgs84ToBd09 = CoordinateTransformUtils.bd09ToGcj02(point.getLng(), point.getLat());System.out.println("火星坐标系 : " + wgs84ToBd09);}}

完整代码下载链接

百度坐标要先转GCJ-02,之后再转WGS84

(1)WGS84:表示GPS获取的坐标;

(2)GCJ02:是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系;

(3)BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中BD09II表示百度经纬度坐标,BD09MC表示百度墨卡托米制坐标。

public class Transform {double x_PI = 3.14159265358979324 * 3000.0 / 180.0;double PI = 3.1415926535897932384626;double a = 6378245.0;double ee = 0.00669342162296594323;/*** 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换* 即 百度 转 谷歌、高德* @param bd_lon* @param bd_lat* @returns {*[]}*/public Point bd09togcj02(double bd_lon, double bd_lat){double x = bd_lon - 0.0065;double y = bd_lat - 0.006;double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);double gg_lng = z * Math.cos(theta);double gg_lat = z * Math.sin(theta);Point point=new Point(gg_lng, gg_lat);return point;}/*** 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换* 即谷歌、高德 转 百度* @param lng* @param lat* @returns {*[]}*/public Point gcj02tobd09(double lng, double lat){double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);double bd_lng = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;Point point=new Point(bd_lng, bd_lat);return point;};/*** WGS84转GCj02* @param lng* @param lat* @returns {*[]}*/public Point wgs84togcj02(double lng, double lat){double dlat = transformlat(lng - 105.0, lat - 35.0);double dlng = transformlng(lng - 105.0, lat - 35.0);double radlat = lat / 180.0 * PI;double magic = Math.sin(radlat);magic = 1 - ee * magic * magic;double sqrtmagic = Math.sqrt(magic);dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;Point point=new Point(mglng, mglat);return point;};/*** GCJ02 转换为 WGS84* @param lng* @param lat* @returns {*[]}*/public Point gcj02towgs84(double lng, double lat){double dlat = transformlat(lng - 105.0, lat - 35.0);double dlng = transformlng(lng - 105.0, lat - 35.0);double radlat = lat / 180.0 * PI;double magic = Math.sin(radlat);magic = 1 - ee * magic * magic;double sqrtmagic = Math.sqrt(magic);dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;Point point=new Point(mglng, mglat);return point;};private double transformlat(double lng,double lat){double ret= -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;}private double transformlng(double lng,double lat){double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;}}

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

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

相关文章

M1 Pro 利用docker 搭建pytho2的开发环境,以vscode连接开发为例

使用 M1 Pro &#xff08;不支持python2的安装&#xff09;开发&#xff0c;需要使用 Python 2.7 的环境&#xff0c;在使用 pyenv 安装 Python 2 时遇到了各种奇怪的问题。最终&#xff0c;我决定使用 Docker 搭建开发环境&#xff0c;并使用 VS Code 连接到本地容器。以下是详…

Docker【部署 04】Docker Compose下载安装及实例Milvus Docker compose(CPU)使用说明分享

Docker Compose 下载安装使用说明 1.Compose说明1.1 Overview of installing Docker Compose1.2 Installation scenarios1.2.1 Scenario one: Install Docker Desktop1.2.2 Scenario two: Install the Compose plugin1.2.3 Scenario three: Install the Compose standalone 2.C…

Python爬虫快速入门指南

引言&#xff1a; 网络爬虫是一种自动化程序&#xff0c;可以在互联网上搜集和提取数据。Python作为一种功能强大且易学的编程语言&#xff0c;成为了许多爬虫开发者的首选。本文将为你提供一个关于Python爬虫的快速入门指南&#xff0c;包括基本概念、工具和实际案例。 第一…

Conda命令整理-自用版

Conda用法整理-自用版 Conda介绍1、环境操作1.1 创建环境1.2 激活环境1.3 导出环境1.4 导入环境1.5 关闭环境1.6 删除环境 2、包操作2.1 安装软件包2.2 安装指定包的指定版本 参考资料 Conda介绍 Conda是一个开源的包管理系统和环境管理器&#xff0c;用于在不同的计算环境中安…

Unity 应用消息中心-MessageCenter

Ps&#xff1a;主要解决耦合问题&#xff0c;把脚本之间的联系通过不同消息类型事件形式进行贯通 1.MessageCenter主脚本 2.DelegateEvent消息类型脚本 3.MC_Default_Data具体接收类脚本 using System; using System.Collections; using System.Collections.Generic; using …

macbook m1 docker中使用go

已经有一个centos8的镜像&#xff0c;本来打算在centos8中安装go 安装方法&#xff1a; # 1.下载go的安装包 mkdir install && cd install # 任意创建个文件夹 wget https://go.dev/dl/go1.20.2.linux-amd64.tar.gz# 2. 解压 tar -C xzf go1.20.2.linux-amd64.tar.g…

ThreadPoolExecutor的参数keepAliveTime的作用

直接断点进去&#xff1a; Test public void testKeepAliveTime3() {//生存时间 - 针对救急线程ThreadPoolExecutor executor new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, new SynchronousQueue<>()); }public ThreadPoolExecutor(int corePoolSize,int maxim…

layui表格事件分析实例

在 layui 的表格组件中&#xff0c;区分表头事件和行内事件是通过事件类型&#xff08;toolbar 和 tool&#xff09;以及 lay-filter 值来实现的。 我们有一个表格&#xff0c;其中有一个工具栏按钮和操作按钮。我们将使用 layui 的 table 组件来处理这些事件。 HTML 结构&…

vue2+element-ui 实现下拉框滚动加载

一、自定义滚动指令。 VUE.directive( el-select-loadmore: { bind(el, binding) { const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap) SELECTWRAP_DOM.addEventListener(scroll, function () { /*…

算法训练营第三十六天(8.26)| 动态规划Part07:完全背包

Leecode 139.单词拆分 题目地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目类型&#xff1a;完全背包 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {// 完全背包问题// dp[i]代表从0…

汇总区间java解决方案

问题&#xff1a; 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区…

unity 模型显示在UI上 并交互(点击、旋转、缩放)

项目工程&#xff1a;unity模型显示在UI上并交互&#xff08;点击、旋转、缩放&#xff09;资源-CSDN文库 1.在Assets创建 Render Texture&#xff08;下面会用到&#xff09;&#xff0c;根据需要设置Size 2.创建UIRawImage&#xff0c;并把Render Texture赋上 3.创建相机&am…

深度解读Promise.prototype.finally

由一个问题引发的血案&#xff1a; 手写源码实现Promise.prototype.finally。 我们知道&#xff0c;对于promise来讲&#xff0c;当状态敲定&#xff0c;无论状态兑现或拒绝时都需要调用的函数&#xff0c;可以使用Promise.prototype.finally的回调来实现。那么如何手写实现Pro…

在vscode(idea)使用GitHub账号、Copilot异常

在idea使用GitHub账号、Copilot异常 登录GitHub显示 Invalid authentication data.Connection refused: connect或者副驾驶显示 Failed to initiate the GitHub login process. Please try again.一般网上的方法推荐使用token登录&#xff0c;或者降级副驾驶 经过研究&#x…

Docker安装并配置Pushgateway

Linux下安装Docker请参考&#xff1a;Linux安装Docker 简介 Pushgateway是Prometheus的一个组件&#xff0c;prometheus server默认是通过Exporter主动获取数据&#xff08;默认采取pull拉取数据&#xff09;&#xff0c;Pushgateway则是通过exporter主动方式推送数据到Pushg…

前端需要理解的CSS知识

CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;不是编程语言&#xff0c;而是用来描述 HTML 或 XML&#xff08;包括如 SVG、MathML 或 XHTML 之类的 XML 分支语言&#xff09;文档的表现与展示效果的样式表语言。CSS3是CSS的最新标准&#xff0c;是…

mysql基础——认识索引

一、介绍 “索引”是为了能够更快地查询数据。比如一本书的目录&#xff0c;就是这本书的内容的索引&#xff0c;读者可以通过在目录中快速查找自己想要的内容&#xff0c;然后根据页码去找到具体的章节。 二、优缺点 优势&#xff1a;以快速检索&#xff0c;减少I/O次数&am…

【Go语言】基于Socket编程的P2P通信程序示例

Go语言的Socket编程实现为开发者提供了一种高效且强大的方式来实现网络通信。通过Go语言的并发模型和内置的网络库&#xff0c;如net包&#xff0c;开发者可以轻松地创建基于套接字的通信应用。Go语言的goroutine和channel机制使并发处理变得简单&#xff0c;能够轻松处理多个连…

U盘怎么加密?U盘加密方法有哪些?

U盘是我们生活和工作中最常用的移动储存设备&#xff0c;经常被用来存放各种重要数据&#xff0c;为了保证数据的安全&#xff0c;我们需要加密U盘。那么&#xff0c;U盘加密方法有哪些呢&#xff1f; U盘加密普通方法 如果你的U盘储存数据不多&#xff0c;并且对于加密的要求…

C. Another Problem on Strings

Problem - C - Codeforces 问题描述&#xff1a;给定一个k和一个01串&#xff0c;求该01串中有多少个’1’个数为k的字串&#xff0c;出现位置不同算不同的子串。 思路&#xff1a;暴力会挂&#xff0c;考虑优化。对于一个字串他满足’1’为k个条件时&#xff0c;它的前面第一…