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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**