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

举报
夜郎king 发表于 2024/12/12 12:49:02 2024/12/12
【摘要】 本文将探讨如何基于Java后台实现百度米制坐标到WGS84地理坐标的转换。这是一个实战指南,旨在帮助开发者理解和掌握坐标转换的原理和实践方法。

 目录


前言

一、需求简介

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、相关属性

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

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

2、相关转换方法

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。