Java【代码分享 04】坐标系说明+WGS84 GCJ02 BD09坐标系转换工具+Java坐标系转换及验证源代码分享(粘贴可用

WGS84 是为 GPS 全球定位系统建立的坐标系统,是世界上第一个统一的地心坐标系,因此也被称为大地坐标系原始坐标系。一般通过 GPS 记录仪记录下来的经纬度,就是基于 WGS84 坐标系的数据。Google 和高德地图定位的的经纬度(国外)都是基于WGS84坐标系的;但是在国内是不允许直接用 WGS84 坐标系标注的,必须经过加密后才能使用。

1.2 GCJ02(国家测量局02号标准)

GCJ02 是由中国国家测绘局制订的地理信息系统的坐标系统,是在 WGS84 经纬度的基础上执行加密算法而成。因为 GPS 得到的经纬度直接在 GCJ02 坐标系下会定位到错误的地点,有种到了火星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系。

国测局规定,国内出版的各种地图系统(包括电子形式),必须至少采用 GCJ02 对地理位置进行首次加密的坐标系,腾讯(搜搜)地图、阿里云地图、Google和高德(国内)都是使用 GCJ02 坐标系,可以说 GCJ02 是国内最广泛使用的坐标系。

1.3 BD09(百度坐标系09)

BD09 是在 GCJ02 坐标系的基础上再次加密偏移后形成的坐标系,官方解释为进一步保护用户隐私,当前只适用于百度地图。

GPS经纬度是39°54'26.2"N 116°23'28.4"E,转化为度的单位就是39.907270 116.391213(小数部分 = 分 / 60 + 秒 / 3600)

2. 坐标系转换

  • 国测局规定:互联网地图在国内必须至少使用 GCJ02 进行首次加密,不允许直接使用 WGS84 坐标下的地理数据,同时任何坐标系均不可转换为 WGS84 坐标。因此不存在将 GCJ02 坐标转换为 WGS84 坐标的官方转换方法。
  • 目前百度 API 提供了从其它坐标系转换为 BD09 坐标系的 API,但却没有从 BD09 坐标系转为其他坐标系的API。
2.1 WGS84转换

WGS84转换测试工具 可将 WGS84 转换成 GCJ02、BD09ll 坐标系:

在这里插入图片描述

2.2 高德坐标系转换

高德坐标系转换工具 能够将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标:

在这里插入图片描述
以上的两个工具可以用来验证Java坐标系转换结果是否正确。

3. Java坐标系转换工具

package yz.com.javautil.utilpackage;


import yz.com.javautil.vo.TransformPoint;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;


/\*\*
 \* 坐标系转换工具类
 \*
 \* @author Administrator
 \*/
public class CoordinateTransferUtils {

    /\*\*
 \* 国内坐标边界
 \*/
    private static final double MIN_LON = 72.004D;
    private static final double MAX_LON = 137.8347D;
    private static final double MIN_LAT = 0.8293D;
    private static final double MAX_LAT = 55.8271D;

    /\*\*
 \* PI 圆周率
 \*/
    private static final double PI = 3.14159265358979324D;

    /\*\*
 \* A WGS 长轴半径
 \*/
    private static final double A = 6378245.0D;

    /\*\*
 \* EE WGS 偏心率的平方
 \*/
    private static final double EE = 0.00669342162296594323D;


    /\*\*
 \* WGS84转换GCJ02适用于继承的情况
 \*
 \* @param t 继承TransformPoint类的子类对象
 \*/
    public static <T extends TransformPoint> void wgs84ToGcj02(T t) {
        wgs84ToGcj02(t::getLng, t::getLat, t::setTransformLng, t::setTransformLat);
    }

    /\*\*
 \* WGS84转换GCJ02核心方法
 \*
 \* @param fromLon 转换前的经度
 \* @param fromLat 转换前的纬度
 \* @return 转换后的经纬度map对象
 \*/
    public static Map<String, Double> wgs84ToGcj02(double fromLon, double fromLat) {
        HashMap<String, Double> transformRes = new HashMap<>(2);
        // 国外坐标不用进行加密
        if (outOfChina(fromLon, fromLat)) {
            transformRes.put("lon", fromLon);
            transformRes.put("lat", fromLat);
            return transformRes;
        }
        // 计算转换后的经纬度坐标
        double dLat = transformLat(fromLon - 105.0, fromLat - 35.0);
        double dLon = transformLon(fromLon - 105.0, fromLat - 35.0);
        double radLat = fromLat / 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);
        dLon = (dLon \* 180.0) / (A / sqrtMagic \* Math.cos(radLat) \* PI);
        double mgLat = fromLat + dLat;
        double mgLon = fromLon + dLon;
        transformRes.put("lon", new BigDecimal(mgLon + "", new MathContext(9, RoundingMode.HALF_UP)).doubleValue());
        transformRes.put("lat", new BigDecimal(mgLat + "", new MathContext(9, RoundingMode.HALF_UP)).doubleValue());

        return transformRes;
    }

    /\*\*
 \* GCJ02转换WGS84
 \*
 \* @param lon 转换前的经度
 \* @param lat 转换后的纬度
 \* @return 转换后的经纬度map对象
 \*/
    public static Map<String, Double> gcj02ToWgs84(double lon, double lat) {
        Map<String, Double> transformRes = new HashMap<>(2);
        double longitude = lon \* 2 - wgs84ToGcj02(lon, lat).get("lon");
        double latitude = lat \* 2 - wgs84ToGcj02(lon, lat).get("lat");
        transformRes.put("lon", longitude);
        transformRes.put("lat", latitude);
        return transformRes;
    }

    /\*\*
 \* GCJ02转换BD09
 \*
 \* @param gcjLat GCL纬度坐标
 \* @param gcjLng GCL经度坐标
 \*/
    public static Map<String, Double> Gcj02ToBd09(double gcjLat, double gcjLng) {
        Map<String, Double> transformRes = new HashMap<>(2);
        double z = Math.sqrt(gcjLng \* gcjLng + gcjLat \* gcjLat) + 0.00002 \* Math.sin(gcjLat \* PI);
        double theta = Math.atan2(gcjLat, gcjLng) + 0.000003 \* Math.cos(gcjLng \* PI);
        transformRes.put("lon", z \* Math.cos(theta) + 0.0065);
        transformRes.put("lat", z \* Math.sin(theta) + 0.006);
        return transformRes;
    }

    /\*\*
 \* BD09转换GCJ02
 \*
 \* @param bdLat 百度纬度坐标
 \* @param bdLng 百度经度坐标
 \*/
    public static Map<String, Double> bd09ToGcj02(double bdLat, double bdLng) {
        Map<String, Double> transformRes = new HashMap<>(2);
        double x = bdLng - 0.0065, y = bdLat - 0.006;
        double z = Math.sqrt(x \* x + y \* y) - 0.00002 \* Math.sin(y \* PI);
        double theta = Math.atan2(y, x) - 0.000003 \* Math.cos(x \* PI);

        transformRes.put("lon", z \* Math.cos(theta));
        transformRes.put("lat", z \* Math.sin(theta));
        return transformRes;
    }

    /\*\*
 \* WGS84转换GCJ02优化(处理转换前经纬度坐标为null问题)



还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!


王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。


对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!


【完整版领取方式在文末!!】


***93道网络安全面试题***


![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)








![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)





![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)





内容实在太多,不一一截图了


### 黑客学习资源推荐


最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


😝朋友们如果有需要的话,可以联系领取~

#### 1️⃣零基础入门


##### ① 学习路线


对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。


![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)


##### ② 路线对应学习视频


同时每个成长路线对应的板块都有配套的视频提供:


![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)


#### 2️⃣视频配套工具&国内外网安书籍、文档


##### ① 工具


![](https://img-blog.csdnimg.cn/img_convert/d3f08d9a26927e48b1332a38401b3369.png#pic_center)


##### ② 视频


![image1](https://img-blog.csdnimg.cn/img_convert/f18acc028dc224b7ace77f2e260ba222.png#pic_center)


##### ③ 书籍


![image2](https://img-blog.csdnimg.cn/img_convert/769b7e13b39771b3a6e4397753dab12e.png#pic_center)

资源较为敏感,未展示全面,需要的最下面获取

![在这里插入图片描述](https://img-blog.csdnimg.cn/e4f9ac066e8c485f8407a99619f9c5b5.png#pic_center)![在这里插入图片描述](https://img-blog.csdnimg.cn/111f5462e7df433b981dc2430bb9ad39.png#pic_center)


##### ② 简历模板


![在这里插入图片描述](https://img-blog.csdnimg.cn/504b8be96bfa4dfb8befc2af49aabfa2.png#pic_center)

 **因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆**




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WGS84坐标系转换GCJ02坐标系是一个常见的需求,在Java开发中可以使用提供的Java代码来实现。该代码可以在的博客中找到,可以参考该博客进行使用。 具体的转换过程如下: 1. 首先,你需要获取要转换WGS84坐标系的经度和纬度。 2. 然后,使用提供的Java代码,将WGS84坐标系的经度和纬度作为参数传入转换函数。 3. 转换函数会返回对应的GCJ02坐标系的经度和纬度。 4. 最后,你可以使用返回的GCJ02坐标系的经度和纬度进行后续的操作。 通过这个过程,你就可以将WGS84坐标系转换GCJ02坐标系了。请参考中的Java代码说明来实现具体的转换过程。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换](https://download.csdn.net/download/junehappylove/11218182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [java_adnroid_GPS坐标转换工具类的标准代码_百度坐标系 GCJ-02 WGS84 经纬度转换](https://download.csdn.net/download/qq_38334677/85377874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值