基于Java后台实现百度、高德和WGS84坐标的转换实战

目录

前言

一、需求的缘由

1、百度坐标拾取

2、高德坐标拾取 

3、不同地图的坐标展示

二、后端坐标偏移转换处理

1、相关类库介绍

2、coordtransorm类图介绍

3、后台实际转换

三、总结 


前言

        在当今数字化时代,地理位置信息的精确性和实时性对于各种应用至关重要。其实在之前的博客中,我们曾将提到过高德AOI的位置偏移,也讲过如何来解决这些位置偏移带来的问题,基于Leaflet的高德AOI数据在天地图底图可视化纠偏实践。无论是地图导航、物流配送还是社交网络,都依赖于精确的地理坐标系统来提供服务。然而,不同的地图服务提供商,如百度地图、高德地图和国际上广泛使用的WGS84坐标系统,它们之间存在着坐标系的差异。这种差异给开发者在实现跨平台、跨服务的地理信息服务时带来了挑战。因此,掌握如何在这些不同的坐标系统之间进行转换,成为了后端开发人员的一项必备技能。在下图中详细演示了这种场景,以天地图底图为例,右边两个位置分别是百度和高德的位置,紫色的位置是正确的原始位置。

        本文旨在探讨如何使用Java后台技术实现百度、高德和WGS84坐标之间的转换。我们将深入分析这些坐标系统的特点,以及它们之间的转换逻辑和算法。通过实战案例,我们将展示如何在Java环境中编写高效、可靠的坐标转换代码,以满足不同业务场景的需求。

        首先,我们需要了解不同的坐标系统下,比如百度、高德的具体位置展示。然后在技术实现上,我们将探讨如何利用java来简化开发过程,提高开发效率。此外,本文还将分享一些在实际开发中遇到的常见问题及其解决方案,比如如何处理坐标转换中的精度问题、如何优化大规模坐标转换的性能等。通过这些实战经验的分享,我们希望能够帮助开发者在面对复杂的地理信息服务时,能够更加从容不迫。最后,随着技术的不断进步,坐标转换的方法和工具也在不断更新。本文将提供一个持续学习和探索的平台,鼓励开发者关注最新的技术动态,不断优化和升级自己的坐标转换解决方案,以适应不断变化的市场需求。

一、需求的缘由

        说起一个在刚开始接触GIS时一位老同志讲的故事,虽然现在听起来有点不可思议。但是当时,说不定你也是抱有同样的疑问。故事的起因是这样,某公司要求一名工程师通过手机去采集车辆的轨迹信息,然后将轨迹信息放到地图中去展示。需求很简单,没什么复杂的。手机嘛,一般都是用的GPS的信息,底图有点意思。当时用户没有自己的离线地图,因此就尝试用高德地图作为他们的离线地图服务器。三下五除二,把坐标导出来,然后连接成一条线,接着二三并作五,再把生成的线叠加到地图上。本来以为手到擒来,可以汇报结果。可当一群人看到地图上的曲线傻眼了。明明自己只是过了一座桥,怎么在地图上跑河里去了。于是大家你一言,我一语的说。张三说,这是有人搞破坏,我们的数据被篡改了。有的说,发生了不可描述的事情,大家被带偏了。一时没有了主义。于是找到了一个大牛,将情况跟大佬说了一下。大佬听到了高德地图,眼神闪过一丝亮光,似乎有了答案,又卖了一个关子。

        相信以上场景,对于半路出家的GISER同学来说,确实有点悬,明明是好的。来的时候明明走的陆地,怎么到这里却飞了呢?不是走的河里,就是穿墙而过。当你在这一行有了一定的经验后,一定会会心的一笑。那么我们先来使用地图来情景再现一下。当然,这里我们只是模拟,通过现象看本质。为了起到对比的作用,这里分别选用百度地图和高德地图的坐标拾取器来对同一个标志物(长沙市橘子洲景区的橘市文创店)进行拾取,然后将两者的坐标叠加到天地图中。来看看是在山上还是河里?

1、百度坐标拾取

        首先我们打开百度地图的坐标拾取器地址百度地图坐标拾取器,然后缩放到我们的目标地点。如下所示:

        首先当我们在地图上找到我们的目标点,即橘市文创店。然后点击鼠标的左键。在界面的右上角就有生成的当前选择地点的坐标位置。可以点击按钮实现复制。当前的坐标信息如下:

(112.967397, 28.172314)

        在获取了百度的坐标之后,接下来我们尝试在高德地图上获取同一个位置的坐标。

2、高德坐标拾取 

        与百度地图一样,高德地图也提供的坐标拾取的功能,它的官方地址是:高德坐标拾取器。依然选择缩放到橘市文创店附近,如下图所示:

        最终得到的高德坐标为: 

(112.960922, 28.166447)

        到这里,可能您并不觉得他们有什么问题,因为我们还没有把他们放到一起来进行展示。是骡子是马,是该拉出来溜溜。因此下面我们统一将他们放到天地图中进行展示。

3、不同地图的坐标展示

        为了解决工作量,也为了有统一展示的效果。我们将采集到的百度坐标和高德坐标进行统一展示。展示组件依然选用Leaflet。Leaflet展示点的关键代码如下:

// 待标绘的点
var dataJson = [
	{lat:28.172314,lon:112.967397,name:"橘市文创店-百度坐标(转换前)",color:"#aba021"},
	{lat:28.166447,lon:112.960922,name:"橘市文创店-高德坐标(转换前)",color:"#21abab"}
];
	
for(var i=0;i<dataJson.length;i++){
	L.marker([dataJson[i].lat, dataJson[i].lon], {
		icon: L.divIcon({
			iconSize: null,
			className: '',
			popupAnchor:[5,5],
			shadowAnchor:[5,5],
			html: "<div class='marsBlackPanel'  animation-spaceInDown style='background:"+dataJson[i].color+"'>"+
					"<div class='marsBlackPanel-text' style=''>"+dataJson[i].name+"</div>"+
					"<div class='marsBlackPanel-text' style=''>经度:"+dataJson[i].lon+"</div>"+
					"<div class='marsBlackPanel-text' style=''>经度:"+dataJson[i].lat+"</div>"+
					"</div>"
		})
	}).addTo(map);
}

        首先来看一下这时的效果:

        是不是符合你的预期呢?将百度的坐标和高德的坐标叠加在天地图的底图上,你会惊奇的发现。点居然跑了。不在我们预期的橘子洲头的位置。而且,百度的坐标偏的更厉害。这也就解释了什么事二次偏移。在高德的偏移上还加了自己的偏移。 到这里,能理解为什么GPS的信息,可能到了高德这里,会跑到河里了吧。

        遇到问题不可怕,下面我们来解决问题。之前我们曾经分享过了如何在Javascript前端来解决,下面我们来介绍如何使用后端的方式来进行处理。

二、后端坐标偏移转换处理

        在之前的博客中,我们介绍了使用JavaScript前端的方式来进行坐标的转换。这种方式在前端使用普遍,而且能很好的与前端开发语言进行结合。但是缺点也同样的明显,很多场景中,我们需要在后台进行数据的处理,比如某接口调用的是百度或者高德的地图的API接口。通过这些API接口得到的坐标都是对应平台的。通过前面的博客可以得知,其坐标在不同的平台有不同的偏移。因此急需在后台来进行相应的坐标转换。同时,我们还可以在后台以接口的形式提供对外服务,提供坐标转换的服务。因此本节来具体介绍如何在后台,以java语言为例,详细介绍如何进行坐标偏移转换。

1、相关类库介绍

        这里提供一个开源的java坐标转换组件。不再进行重复造轮子。为了让大家熟悉相关的组件和方法,这里还是对组件进行简单的介绍。coordtransform java实现。

        这个组件主要提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具模块 (参考wandergis的python版coordtransform的Java版实现)。也是我们在后台进行坐标转换的主要方法。

2、coordtransorm类图介绍

        左边转换的类比较简单,这里采用面向对象的方法对它的类图进行介绍,让大家对转换组件有一个详细的认识。类图结构如下所示:

        属性列表:

序号参数参数说明
1x_pi3.14159265358979324 * 3000.0 / 180.0
2π3.1415926535897932384626
3a长半轴,6378245.0
4ee扁率,0.00669342162296594323

        方法列表:

序号方法名方法说明参数说明
1bd09towgs84百度坐标系(BD-09)转WGS坐标百度坐标经纬度
2wgs84tobd09WGS坐标转百度坐标系(BD-09)WGS84坐标系的经纬度
3gcj02tobd09火星坐标系(GCJ-02)转百度坐标系(BD-09)火星坐标系经纬度
4bd09togcj02百度坐标系(BD-09)转火星坐标系(GCJ-02)百度坐标系经纬度
5wgs84togcj02WGS84转GCJ02(火星坐标系)WGS84坐标系的经纬度
6gcj02towgs84GCJ02(火星坐标系)转GPS84火星坐标系经纬度
7transformlat纬度转换
8transformlng经度转换
9out_of_china判断是否在国内,不在国内不做偏移

        在掌握了以上的参数和方法之后,下面我们使用Java开发语言在后台来进行相关坐标的转换与转换。

3、后台实际转换

        下面根据第一章中采集的百度和高德坐标,在后台分别进行相应的转换。变成我们需要的WGS84坐标后,然后我们在天地图中进行WebGIS展示。

public static void main(String[] args) {
    double [] bd284 = CoordinateTransformUtil.bd09towgs84(112.967397D, 28.172314D);
    System.out.println("百度坐标转wgs84坐标" + bd284[0] + "=" + bd284[1]);
	
    double [] gcj284 = CoordinateTransformUtil.gcj02towgs84(112.960922D, 28.166447D);
    System.out.println("高德坐标转wgs84坐标" + gcj284[0] + "=" + gcj284[1]);
}

        在控制台中看到以下的转换结果,如下所示:

百度坐标转wgs84坐标112.95536764126244=28.16996238135615
高德坐标转wgs84坐标112.95541908168103=28.16990747088316

        单从转换后的结果可以看到,两个坐标的值是非常接近的。稍微有点偏差,这可能与我们在实际拾取坐标时有一定的偏差。将转换后的坐标在Leaflet中进行展示。关键代码如下:

// 待标绘的点
var dataJson = [
	{lat:28.172314,lon:112.967397,name:"橘市文创店-百度坐标(转换前)",color:"#aba021"},
	{lat:28.166447,lon:112.960922,name:"橘市文创店-高德坐标(转换前)",color:"#21abab"},
	{lat:28.16996238135615,lon:112.95536764126244,name:"橘市文创店-百度坐标(转换后)",color:"#b91980"},
	{lat:28.16990747088316,lon:112.95541908168103,name:"橘市文创店-高德坐标(转换后)",color:"#b91980"}
];

        最后来看一下经过转换后的坐标在天地图中的位置展示如下:

        可以看到,经过纠偏后的坐标基本实现了还原,有一点的误差,大概率是我们在拾取时可能手抖了导致的。忽略这个误差,说明我们的转换结果符合我们的需求。至此,基于后台来进行相关坐标的转换就已经实现。

三、总结 

        以上就是本文的主要内容,本文旨在探讨如何使用Java后台技术实现百度、高德和WGS84坐标之间的转换。我们将深入分析这些坐标系统的特点,以及它们之间的转换逻辑和算法。通过实战案例,我们将展示如何在Java环境中编写高效、可靠的坐标转换代码,以满足不同业务场景的需求。行文藏度,定有诸多不足之处,如有不足,还恳请各位专家朋友在评论区批评指出,不胜感激。文章重点在讲解偏移的出现场景,通过场景的还原让大家了解不同的坐标展示效果,同时为下一步进行转换奠定基础。关于java的转换代码,完全是开源的,大家可以根据需要集成到自己的gis系统当中。

        参考地址:coordtransform java转换

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark抓取HTTPS流量技巧

一、工具准备 首先安装wireshark工具&#xff0c;官方链接&#xff1a;Wireshark Go Deep 二、环境变量配置 TLS 加密的核心是会话密钥。这些密钥由客户端和服务器协商生成&#xff0c;用于对通信流量进行对称加密。如果能通过 SSL/TLS 日志文件&#xff08;例如包含密钥的…

网络安全,文明上网(6)网安相关法律

列举 1. 《中华人民共和国网络安全法》&#xff1a; - 这是中国网络安全的基本法律&#xff0c;于2017年6月1日开始实施。该法律明确了网络运营者的安全保护义务&#xff0c;包括采取数据分类、重要数据备份和加密等措施。 2. 《中华人民共和国数据安全法》&#xff1a; …

111 - Lecture 10

File I/O and GUI with JavaFX 文件输入/输出与JavaFX图形用户界面 一、Overview 1. File I/O &#xff08;1&#xff09; learning Java File I/O mechanism &#xff08;2&#xff09; writing into and reading from a file 使用文件I/O进行数据读取和…

【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍

文章目录 前言一、Zachman架构二、ToGAF架构三、FEA架构四、DoDAF 前言 企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是指企业在信息技术和业务流程方面的整体设计和规划。 最近接触到“企业架构”这个概念&#xff0c;转念一想必定和我们软件架构…

vue3:使用插件递归组件

vue3:使用插件递归组件 首先安装插件 npm i unplugin-vue-define-optionsvite.config.ts 配置插件 // vite.config.ts// 引入 unplugin-vue-define-options import DefineOptions from "unplugin-vue-define-options"; export default defineConfig({// 注册插件 De…

开源远程桌面工具:RustDesk

在远程办公和远程学习日益普及的今天&#xff0c;我们经常需要远程访问办公电脑或帮助他人解决电脑问题。 市面上的远程控制软件要么收费昂贵&#xff0c;要么需要复杂的配置&#xff0c;更让人担心的是数据安全问题。 最近我发现了一款名为 RustDesk 的开源远程桌面工具&…

springboot整合hive

springboot整合hive pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

ChatGPT 与其他 AI 技术在短视频营销中的技术应用与协同策略

摘要&#xff1a; 本文深入探讨了 ChatGPT 及其他 AI 技术在短视频营销中的应用。从技术层面剖析了这些技术如何助力短视频内容创作、个性化推荐、用户互动以及营销效果评估等多方面&#xff0c;通过具体方法分析、数据引用与大模型工具介绍&#xff0c;旨在为短视频营销领域提…

国土安全部发布关键基础设施安全人工智能框架

美国国土安全部 (DHS) 发布建议&#xff0c;概述如何在关键基础设施中安全开发和部署人工智能 (AI)。 https://www.dhs.gov/news/2024/11/14/groundbreaking-framework-safe-and-secure-deployment-ai-critical-infrastructure 关键基础设施中人工智能的角色和职责框架 https:/…

xtu oj 前缀和

样例输入 3 3 2 1 2 3 1 2 3 2 1 2 3 -1 -2 3 3 -4 3 1 4 2 1 样例输出 0 3 3 解题思路&#xff1a;排序前缀和二分查找 因为数组b是可以插入到数组a任意位置&#xff0c;要想k最大&#xff0c;就要尽可能把b的小数插到a数组的前面。所以&#xff0c;用qsort方法对数组b进…

Nexus搭建go私有仓库,加速下载go依赖包

一、搭建go私库 本文我们梳理一下go依赖包的私库搭建以及使用。 它只分为proxy和group两种仓库&#xff0c;这一点和maven仓库有所不同。 1、创建Blob Stores 为了区分不同的私库依赖包&#xff0c;存储的位置分隔开。 2、新建go proxy官网 Remote storage&#xff1a;htt…

CPU算法分析LiteAIServer摄像机实时接入分析平台固废检测算法助力环保

随着城市化进程的加速和工业化发展的不断深入&#xff0c;固体废弃物的处理问题逐渐成为了一个全球性的挑战。传统的固废检测方法主要依赖于人工巡查和抽样检测&#xff0c;这种方式不仅效率低下&#xff0c;而且难以实现对固体废弃物的全面覆盖和实时监测。为了解决这一问题&a…

国内镜像android studio

Android SDK在线更新镜像服务器 1.中国科学院协会镜像站: 部分地区无法使用 ◦IPV4/IPV6: mirrors.opencas.cn 端口&#xff1a;80 ◦IPV4/IPV6: mirrors.opencas.org 端口&#xff1a;80 ◦IPV4/IPV6: mirrors.opencas.ac.cn 端口&#xff1a;80 2.上海GDG镜像服务器地址…

Ubuntu上安装MySQL并且实现远程登录

目录 下载网络工具 查看网络连接 更新系统软件包&#xff1b; 安装mysql数据库 查看mysql数据库状态 以数字ip形式显示mysql的监听状态。&#xff08;默认监听端口是3306&#xff09; 查看安装mysql数据库时系统创建的目录信息。 根据查询到的系统用户名以及随机密码&a…

从零开始认识显卡

显卡&#xff08;GPU&#xff0c;全称为Graphics Processing Unit&#xff09;&#xff0c;是电脑中专门负责图形处理的硬件组件。以下是从零开始认识显卡的简单介绍&#xff1a; 1. 显卡的基本组成 显卡通常由以下几个主要部分组成&#xff1a; GPU核心&#xff1a;显卡的“…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令&#xff1a;brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了&#xff0c;而且Vue项目就应该正经走项目流程啊喂&#xff01; npm i amap/amap-jsapi-loader --save 官方说这样执行完&#xff0c;就这结束啦&#xff01;它结束了&#xff0c;我还没有&#xff0c;不然不可能记录这篇文…

三极管工作原理,以及小电流,如何驱动大电流

因为研究【自动下载电路实现】&#xff0c;涉及到三极管内容&#xff0c;之前看过&#xff0c;现在回看之前的笔记&#xff0c;一点印象都没了&#xff0c;于是&#xff0c;想了个办法&#xff0c;记住它 个人联想&#xff0c;不喜绕道&#xff0c;只是帮助个人记忆的 标题也是…

一文了解倾斜摄影

倾斜摄影是通过从一个垂直、四个倾斜、五个不同的视角同步采集影像&#xff0c;获取到丰富的建筑物顶面及侧视的高分辨率纹理。它不仅能够真实地反映地物情况&#xff0c;高精度地获取物方纹理信息&#xff0c;还可通过先进的定位、融合、建模等技术&#xff0c;生成真实的三维…

浅谈,华为切入具身智能赛道

近期&#xff0c;全球具身智能大模型&#xff08;机器人“通用大脑”&#xff09;赛道热闹非凡&#xff0c;科技大厂、初创公司接连发布重磅消息。 国外&#xff1a; 10月底&#xff0c;美国科技巨头【Meta】旗下基础人工智能研究 &#xff08;FAIR&#xff09;公布公司触摸感…