基于Java后台实现百度米制坐标转WGS84地理坐标实战

news2025/1/11 7:53:01

目录

前言

一、需求简介

1、信息查询

二、Java后台转换

1、相关属性

2、相关转换方法

3、实例转换

三、Leaflet可视化

1、准备展示数据

2、Marker标记

3、可视化效果

四、总结


前言

        在现代信息技术高速发展的今天,地理信息系统(GIS)已经成为我们生活中不可或缺的一部分。无论是导航、地图服务还是位置数据分析,GIS都在其中扮演着重要角色。而在GIS领域,坐标系的转换是一个经常需要处理的问题。在之前的系列博客中,我们介绍了一些在前后端来进行高德、百度等坐标转WGS84坐标的内容。原文地址如下:

序号博客内容
1基于Leaflet的高德AOI数据在天地图底图可视化纠偏实践
2使用Java实现度分秒坐标转十进制度的实践
3基于Java后台实现百度、高德和WGS84坐标的转换实战

        这三篇分别对应前端高德坐标纠偏,Java后台度分秒转换,后台的高德、百度经纬度坐标转换。最近在浏览百度地图时,发现其返回的坐标并不是常见的经纬度坐标,而是看起来很大的米制坐标。比如在地图中搜索“杨梅公园”,然后打开调试控制台可以看到以下的返回。

        下面是从控制台摘录的JSON信息,如下所示,这里采用的坐标就是米制坐标:

addr: "赏月路杨梅公园"
c: 158
geo: "1|12565817.88,3253294.46;12565817.88,3253294.46|12565817.88,3253294.46;"
name: "公厕"
navi_x: "12565866.380689"
navi_y: "3253288.166706"
phone: null
showtag: "公共厕所"
srcName: "life"
std_tag: "生活服务;公共厕所"
street_id: ""
uid: "42f120f98ed8b80f02ec0105"
x: "12565817.88"
y: "3253294.46"

        不同的坐标系适用于不同的场景,比如百度地图使用的是百度米制坐标系,而全球定位系统(GPS)使用的是WGS84坐标系。因此,实现这两种坐标系之间的转换对于开发者来说是一项基本技能。众所周知,这种米制的坐标无法直接在地图上进行展示,需要先将米制坐标转为经纬度坐标,同时要解决偏移的问题,再将百度的经纬度偏移到WGS84的原始坐标,就可以叠加到我们的地图中。

        本文将探讨如何基于Java后台实现百度米制坐标到WGS84地理坐标的转换。这是一个实战指南,旨在帮助开发者理解和掌握坐标转换的原理和实践方法。通过阅读本文,你将了解到坐标转换的背景知识、转换算法的实现细节,以及如何在实际项目中应用这些知识。

一、需求简介

        首先我们来介绍一下如何在百度地图中进行位置的查询,比如POI数据的获取,在相应的接口中得到米制的坐标信息。作为我们的需求基础。

1、信息查询

        首先在浏览器中打开百度地图的查询界面,在输入框中输入“杨梅公园”,然后寻找附近的一个公厕地点,如下图所示:

        打开浏览器的网络监控窗口,可以看到请求地址如下:

https://map.baidu.com/?uid=42f120f98ed8b80f02ec0105&info_merge=1&isBizPoi=false&ugc_type=3&ugc_ver=1&qt=detailConInfo&device_ratio=1&compat=1&t=1733750916396&auth=dHEweMKAdgVveUxvgQ9zMZgW9LfUdaxauxNBBNHVTxEt1RRRPLFXRRzXy1FYdD%3DCvkGcuVtvvhguVtvyheuVtvCMGuVtvCQMuVtvIPcuxtw8wkv7uvZgMuVtv%40vcuVtvc3CuVtvcPPuVtveGvuxzEtzhl4yBxdw8E62qvyMuJx7OIgHvhgMuzVVtvrMhuxREtJggagyYxegvcguxNBBNHVNRR&seckey=iU3j1BawOjf%2BpnmHKyAgVMfie%2FAABTPoi0TrSbY8PSQ%3D%2CiU3j1BawOjf-pnmHKyAgVLqAmd-Cs0_YgowpdkjrKZcYwbseMSWFzKb52WFtaW5t1KtsqyQRAbw-VBQ235Vpcgh0XENr_7MYcFSMB2E_IQ4GXw703GMxpNPiRsnwsxcwxPOBHTGF1mxa1t5fxSjjbvocmE_J9f7YYiIbo2VXEMglx6G2Uz-bRyqSIsvjNY1l&pcevaname=pc4.1&newfrom=zhuzhan_webmap

        这是一个标准的详情请求地址,发送的请求参数如下:

        在拿到这个点的x和y信息之后,如果我们想这个坐标点入库或者在天地图上进行展示,就需要将这种米制的坐标转经纬度后才能进行可视化。而实现这种百度的米制坐标转换的方法介绍得比较少。因此这里介绍一种基于Java的转换方法。 

二、Java后台转换

        众所周知,一般米制的坐标是投影坐标。比如常见的Web墨卡托投影坐标,这种转换后的坐标就是米制的。如果是常规的投影坐标,比如3857的坐标转4326的坐标,我们可以直接使用GeoTools的转换系统来实现,而百度是有偏移的,因此不能直接利用这个公式来求解。这里分享一个前辈开源的Java实现算法,以此来实现百度米制坐标到经纬度坐标的转换。

1、相关属性

        为了实现从米制坐标转为经纬度坐标,需要定义一些基础的属性参数。如下:

序号属性名说明
1MCBAND墨卡托投影各个带的常数
2LLBAND经纬度投影各个带的常数
3MC2LL墨卡托坐标转换为经纬度坐标转换系数
4LL2MC经纬度坐标转换为墨卡托坐标转换系数

2、相关转换方法

        类提供了一套完整的工具,用于在百度墨卡托坐标系和WGS84经纬度坐标系之间进行转换。这对于需要在百度地图和其他使用WGS84坐标系的服务之间转换位置数据的开发者来说非常有用

        掌握了相关属性之后,下面来介绍一下转换的方法,具体方法如下表所示:

序号方法名称说明
1convertMC2LL(Double x, Double y)墨卡托坐标转经纬度坐标
2convertLL2MC(Double lng, Double lat)经纬度坐标转墨卡托坐标
3converter(Double x, Double y, Double[] cE)辅助方法,用于执行实际的坐标转换计算。
4getLoop(Double lng, Integer min, Integer max)getLoop确保经度值在[-180, 180]范围内
5getRange(Double lat, Integer min, Integer max)确保纬度值在[-74, 74]范围内

3、实例转换

        下面以上图中的x和y投影坐标进行转换,然后将转换后的经纬度值使用Leaflet来进行WebGIS展示。转换代码如下:

public static void main(String[] args) {
		Map<String,Double> map =convertMC2LL(12566792.75D,3252757.92D);
		System.out.println(map);
		double [] bd284 = CoordinateTransformUtil.bd09towgs84(map.get("lng"), map.get("lat"));
	    System.out.println("百度坐标转wgs84坐标" + bd284[0] + "=" + bd284[1]);
	    System.out.println("--------------------------------------------------------");
	    map =convertMC2LL(12565817.88D,3253294.46D);
		System.out.println(map);
		bd284 = CoordinateTransformUtil.bd09towgs84(map.get("lng"), map.get("lat"));
	    System.out.println("百度坐标转wgs84坐标" + bd284[0] + "=" + bd284[1]);
	}

        来看转换后的结果:

1.256679275E7==>3252757.92
{lng=112.88819166656145, lat=28.19141061569673}
百度坐标转wgs84坐标112.87626584662794=28.189085499636683
--------------------------------------------------------
1.256581788E7==>3253294.46
{lng=112.87943435563922, lat=28.195681037862602}
百度坐标转wgs84坐标112.86746750941569=28.19346781158566

        下面在Leaflet当中将转换后的坐标在天地图中进行展示。

三、Leaflet可视化

        最后我们将经过转换计算的结果在Leaflet中进行展示,以此来对比一下转换前后的效果,也可以直观的对偏移前后的两个点进行展示。

1、准备展示数据

        关于如何在Leaflet中进行坐标的展示,在之前的博客中我们花了很多的章节来进行讲解。这里只将关键的前端代码进行展示,仅供参考。在上述的转换过程当中,一个点是杨梅公园的公厕点,另外一个是梅西湖西地铁站。经过转换的WGS84坐标地址如下:

// 待标绘的点
var dataJson = [
		{lat:28.19141061569673,lon:112.88819166656145,name:"梅溪湖西-投影坐标转地理坐标(转换前)",color:getRandomColor()},
		{lat:28.189085499636683,lon:112.87626584662794,name:"梅溪湖西-投影坐标转地理坐标(转换后)",color:getRandomColor()},
		{lat:28.195681037862602,lon:112.87943435563922,name:"杨梅公园公厕-投影坐标转地理坐标(转换前)",color:getRandomColor()},
		{lat:28.19346781158566,lon:112.86746750941569,name:"杨梅公园公厕-投影坐标转地理坐标(转换后)",color:getRandomColor()}
];

2、Marker标记

        这里阐述如何把上述的坐标点在Leaflet界面中进行展示。可视化逻辑比较简单,将经纬度坐标点转换为Marker对象,然后叠加到地图中即可。关键代码如下:

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);
}

3、可视化效果

        下面我们结合最终的展示效果来看一下使用坐标转换前后的位置效果。

        上图中,影像地图采用的是天地图遥感影像。首先我们来看两个点偏移之前的点。可以在图上直观的看到,其偏离位置较远, 以梅溪湖西为例,转换前它的坐标点偏移到了湖里。结合之前博客的内容,我们将位置进行纠偏后,就实现了真实坐标的还原。其位置基本是准确的。

四、总结

        以上就是本文的主要内容,本文将探讨如何基于Java后台实现百度米制坐标到WGS84地理坐标的转换。这是一个实战指南,旨在帮助开发者理解和掌握坐标转换的原理和实践方法。通过阅读本文,你将了解到坐标转换的背景知识、转换算法的实现细节,以及如何在实际项目中应用这些知识。文中首先介绍了在百度地图应用中存在的坐标格式展示问题,其次介绍如何在后台使用Java语言来进行百度的米制坐标转经纬度坐标,最后对转换结果使用Leaflet进行WebGIS可视化展示。行文仓促,定有许多不足之处,如有不足还恳请各位专家博主在评论区留言指出,不甚感激。

        站在巨人的肩膀上才能看得更远,博文编写参考以下信息:

        1、github BaiduMokatorToLngLat.java。

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

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

相关文章

声音克隆GPT-SoVITS

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 一、原理介绍 GPT-SoVITS&#xff0c;作为一款结合了GPT&#xff08;生成预训练模型&#xff09;和SoVITS&#xff08;基于变分信息瓶颈技术的歌声转换&#xff09;的创新工具&#xff0c;正在声音克隆领域掀…

自动驾驶数据集的应用与思考

数据作为新型生产要素&#xff0c;是数字化、网络化、智能化的基础&#xff0c;是互联网时代的“石油”“煤炭”&#xff0c;掌握数据对于企业而言是能够持续生存和发展的不竭动力&#xff0c;对于需要大量数据训练自动驾驶系统的企业而言更是如此。 而随着激光雷达、毫米波雷…

开源项目:轻型图像分割 unet_lite

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

【大模型系列篇】GPU资源容器化访问使用指南

在当今的高性能计算和机器学习领域&#xff0c;GPU&#xff08;图形处理单元&#xff09;因其卓越的并行计算能力而扮演着至关重要的角色。随着容器化技术如 Docker 的普及&#xff0c;越来越多的数据科学家和开发者选择将他们的应用和工作负载封装到 Docker 容器中&#xff0c…

【力扣】409.最长回文串

问题描述 思路解析 因为同时包含大小写字母&#xff0c;直接创建个ASCII表大小的桶来标记又因为是要回文子串&#xff0c;所以偶数个数的一定可以那么同时&#xff0c;对于出现奇数次数的&#xff0c;我没需要他们的次数-1&#xff0c;变为偶数&#xff0c;并且可以标记出现过…

Linux——管理用户和用户组

一、用户有哪些 root用户 定义&#xff1a;root用户是Linux系统中的最高权限用户&#xff0c;具有对系统所有资源的完全控制权。特性&#xff1a;root用户可以执行系统中的任何操作&#xff0c;包括修改系统配置文件、安装软件、管理系统服务等。由于其拥有最高权限&#xff0c…

SIP系列七:ICE框架(P2P通话)

我的音视频/流媒体开源项目(github) SIP系列目录 目录 一、NAT 1、NAT介绍 2、NAT类型 2.1、 完全圆锥型NAT 2.2、受限圆锥型NAT 2.3、端口受限圆锥型NAT 2.4、对称NAT 3、NAT打洞 3.1、不同一NAT下 3.2、同一NAT下 二、ICE 三、ICE中的SDP 至此&#x…

Spring Boot如何实现防盗链

一、什么是盗链 盗链是个什么操作&#xff0c;看一下百度给出的解释&#xff1a;盗链是指服务提供商自己不提供服务的内容&#xff0c;通过技术手段绕过其它有利益的最终用户界面&#xff08;如广告&#xff09;&#xff0c;直接在自己的网站上向最终用户提供其它服务提供商的…

5.内容管理模块-课程查询

搞清楚一个项目的业务流程最直接的手段&#xff0c;就是找一个账号登录进去&#xff0c;操作一遍。 3.3设计接口 接口设计分析 post在需要提交很多参数的时候使用&#xff0c;并且post的安全性较高。 接口分析&#xff1a; po包&#xff0c;一般存放和数据库交互的实体类。 …

网络编程 | TCP套接字通信及编程实现经验教程

1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一&#xff0c;它为互联网上的数据传输提供了可靠性和连接管理。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议…

vue3组件间传值

definProps方式 子组件&#xff1a;assignSuppliers.vue const propdefineProps({fid:String}); 父组件&#xff1a;index.vue <!-- 供应商分配 --><n-drawerwidth"800"v-model:visible"drawerSupplierConfig.visible":title"drawerSuppli…

《网络安全编程基础》之Socket编程

我的代码 server.c // server.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件 void main(int argc,char* argv[]) {WSADATA …

不只是请求和响应:使用Fiddler解读Cookie与状态码全指南(下)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 不只是请求和响应&#xff1a;使用Fiddler抓包HTTP协议全指南(上)_fiddler 获取响应脚本-CSDN博客https://blog.csdn.net/Chunfeng6yugan/article/details/144005872?spm1001.2014.3001.5501 不只是请求和响…

Linx下自动化之路:Redis安装包一键安装脚本实现无网极速部署并注册成服务

目录 简介 安装包下载 安装脚本 服务常用命令 简介 通过一键安装脚本实现 Redis 安装包的无网极速部署&#xff0c;并将其成功注册为系统服务&#xff0c;开机自启。 安装包下载 redis-7.0.8.tar.gzhttp://download.redis.io/releases/redis-7.0.8.tar.gz 安装脚本 修…

第3章.垃圾收集器与内存分配策略

概述 对象已死 引用计数法 可达性分析算法 再谈引用 生存还是死亡 回收方法区 垃圾收集算法 分代收集理论 3种垃圾收集算法 HotSpot的算法细节实现 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并发的可达性分析 误消亡问题 经典垃圾收集器 概述 简单的一些GC CMS G1 低延…

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例 一、设计类需满足的三要素1. 类名2. 属性和方法 二、以植物大战僵尸的为例的类的设计1. 尝试分类2. 创建对象调用类的属性和方法*【代码二】*3. 僵尸的继承 三、代码实现 一、设计类需满足的三要素 1. 类名 类名&#xff1a;某类事物的名…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

【Java】—— 图书管理系统

基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标&#xff1a; 1、系统中能够表示多本图书的信息 2、提供两种用户&#xff08;普通用户&#xff0c;管理员&#xff09; 3、普通用户…

记录ubuntu22.04重启以后无法获取IP地址的问题处理方案

现象描述&#xff1a;我的虚拟机网络设置为桥接模式&#xff0c;输入ifconfig只显示127.0.0.1&#xff0c;不能连上外网。&#xff0c;且无法上网&#xff0c;用ifconfig只有如下显示&#xff1a; 1、sudo -i切换为root用户 2、输入dhclient -v 再输入ifconfig就可以看到多了…