当前位置: 首页 > news >正文

[java][gps]GPS坐标系转换

 

码是一个Java类,名为GpsTransform,它包含了一些用于坐标转换的方法。这些方法主要用于处理不同坐标系之间的转换,包括:

  1. BD-09(百度坐标系)与 GCJ-02(中国火星坐标系)之间的转换。
  2. WGS-84GCJ-02 的转换。
  3. GCJ-02WGS-84 的转换。
  4. WGS-84BD-09 的转换。

类中定义了一些常量,如x_PI(用于坐标转换的常数)、PI(圆周率)、a(地球半径)、ee(椭球体偏心率平方)。

主要的方法包括:

  • bd09togcj02(double bd_lon, double bd_lat):将BD-09坐标转换为GCJ-02坐标。
  • gcj02tobd09(double lng, double lat):将GCJ-02坐标转换为BD-09坐标。
  • wgs84togcj02(double lng, double lat):将WGS-84坐标转换为GCJ-02坐标。
  • gcj02towgs84(double lng, double lat):将GCJ-02坐标转换为WGS-84坐标。
  • wgs84tobd09(double lng, double lat):将WGS-84坐标转换为BD-09坐标。
  • transformlat(double lng, double lat)transformlng(double lng, double lat):这两个方法用于计算纬度和经度的偏移量。

main 方法中测试了 wgs84tobd09 方法,将WGS-84坐标(122.048000, 29.881927)转换为BD-09坐标,并打印结果。然后,它尝试将转换后的坐标再次转换回GCJ-02坐标,最后将GCJ-02坐标转换回BD-09坐标,并打印结果。

需要注意的是,代码中有一些注释掉的代码行,如Point point=new Point(gg_lng, gg_lat);,这表明原始代码可能依赖于一个名为Point的类,但在这段代码中并没有定义。此外,返回值是经纬度坐标以逗号分隔的字符串,而不是Point对象。

此外,gcj02towgs84 方法的实现实际上与 wgs84togcj02 方法相同,这可能是一个错误,因为这两个方法应该执行相反的转换操作。

这段代码可以用于需要在中国进行地图服务开发时,处理不同坐标系之间的转换。


public class GpsTransform {static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;static double PI = 3.1415926535897932384626;static double a = 6378245.0;static double ee = 0.00669342162296594323;/*** 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换* 即 百度 转 谷歌、高德* @param bd_lon* @param bd_lat* @returns {*[]}*/public String  bd09togcj02(double bd_lon, double bd_lat){double x = bd_lon - 0.0065;double y = bd_lat - 0.006;double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);double gg_lng = z * Math.cos(theta);double gg_lat = z * Math.sin(theta);// Point point=new Point(gg_lng, gg_lat);// return point;return gg_lng+","+gg_lat;}/*** 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换* 即谷歌、高德 转 百度* @param lng* @param lat* @returns {*[]}*/public static String gcj02tobd09(double lng, double lat){double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);double bd_lng = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;//Point point=new Point(bd_lng, bd_lat);// return point;return bd_lng+","+bd_lat;};/*** WGS84转GCj02* @param lng* @param lat* @returns {*[]}*/public static String wgs84togcj02(double lng, double lat){double dlat = transformlat(lng - 105.0, lat - 35.0);double dlng = transformlng(lng - 105.0, lat - 35.0);double radlat = lat / 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);dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;//Point point=new Point(mglng, mglat);// return point;return mglng+","+mglat;};/*** GCJ02 转换为 WGS84* @param lng* @param lat* @returns {*[]}*/public static String gcj02towgs84(double lng, double lat){double dlat = transformlat(lng - 105.0, lat - 35.0);double dlng = transformlng(lng - 105.0, lat - 35.0);double radlat = lat / 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);dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;// Point point=new Point(mglng, mglat);// return point;return mglng+","+mglat;};/*** WGS84 转换为 BD-09* @param lng* @param lat* @returns {*[]}* */public static String  wgs84tobd09(double lng, double lat){//第一次转换double dlat = transformlat(lng - 105.0, lat - 35.0);double dlng = transformlng(lng - 105.0, lat - 35.0);double radlat = lat / 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);dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;//第二次转换double z = Math.sqrt(mglng * mglng + mglat * mglat) + 0.00002 * Math.sin(mglat * x_PI);double theta = Math.atan2(mglat, mglng) + 0.000003 * Math.cos(mglng * x_PI);double bd_lng = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;return bd_lng+","+bd_lat;}private static double transformlat(double lng,double lat){double ret= -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;}private static double transformlng(double lng,double lat){double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;}//122.048000    29.881927//120.00046342601003,30.554973975289602//public static void main(String[] args) {//两次谷歌转换为百度坐标//第一次  WGS84转GCj02System.out.println("第一次转换的结果:"+wgs84tobd09(122.048000,29.881927));String gcj02towgs84 = wgs84tobd09(122.048000,29.881927);System.out.println("第二次转换的结果:"+gcj02tobd09(Double.valueOf(gcj02towgs84.split(",")[0]),Double.valueOf(gcj02towgs84.split(",")[1])));}}

相关文章:

  • JVM总结
  • Python in Excel作图分析实战!
  • JAVA入门1——理论+helloworld
  • Word导出样式模板,应用到其他所有word
  • MySQL 之索引详解
  • Chrome开发者工具如何才能看到Vue项目的源码
  • java初识
  • 【注册/登录安全分析报告:孔夫子旧书网】
  • 腾讯云SDK产品功能
  • 动态规划入门题目->使用最小费用爬楼梯
  • 【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!
  • 一行代码,AI大模型训练成本再降30%,混合精度训练再升级
  • 不夸张、我就是这样考过PMP~
  • Python OpenCV精讲系列 - 计算机视觉应用深入理解(十五)
  • 宠物空气净化器希喂和352哪个好用?两大爆火机型哪款吸毛、除臭效果比较好?
  • 10个确保微服务与容器安全的最佳实践
  • ES6语法详解(一)
  • HTTP中GET与POST的区别 99%的错误认识
  • Intervention/image 图片处理扩展包的安装和使用
  • Java-详解HashMap
  • laravel with 查询列表限制条数
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • oldjun 检测网站的经验
  • passportjs 源码分析
  • SpringCloud集成分布式事务LCN (一)
  • Tornado学习笔记(1)
  • Wamp集成环境 添加PHP的新版本
  • 闭包--闭包作用之保存(一)
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 关于 Cirru Editor 存储格式
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 七牛云假注销小指南
  • 使用SAX解析XML
  • 世界上最简单的无等待算法(getAndIncrement)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 物联网链路协议
  • 延迟脚本的方式
  • 责任链模式的两种实现
  • Android开发者必备:推荐一款助力开发的开源APP
  • mysql面试题分组并合并列
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • # Redis 入门到精通(一)数据类型(4)
  • #include到底该写在哪
  • #NOIP 2014# day.2 T2 寻找道路
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (学习总结16)C++模版2
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • .Net mvc总结
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET分布式缓存Memcached从入门到实战
  • .net经典笔试题