java中WGS84坐标(ios)转换BD-09坐标(百度坐标)

news/2024/9/17 3:44:04/文章来源:https://www.cnblogs.com/fswhq/p/18138182

iPhone的GPS定位(CLLocationManager)获得的经纬坐标是基于WGS-84坐标系(世界标准),Google地图使用的是GCJ-02坐标系(中国特色的火星坐标系),百度的经纬坐标在GCJ-02的基础上再做了次加密,就是BD-09坐标系。

复制代码
public class CoordinateConversion {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 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 mglat+","+mglng;};/*** WGS84 转换为 BD-09* @param lng* @param lat* @returns {*[]}* */private 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;}public static void main(String[] args) {// 两次谷歌转换为百度坐标// 第一次  WGS84转GCj02String lnglat=wgs84togcj02(117.20296517261839,31.841652709281103);  double lng=Double.parseDouble(lnglat.split(",")[0]);double lat=Double.parseDouble(lnglat.split(",")[1]);System.out.println("第一次转换的结果:"+lng+","+lat);// 第二次 gcj02tobd09System.out.println("第二次转换的结果:"+gcj02tobd09(lng,lat));// 谷歌转百度一次转换System.out.println("谷歌转换为百度一次转换的结果:"+wgs84tobd09(117.20296517261839,31.841652709281103));}
}
复制代码

项目中遇到的问题,以做笔记。原文链接:https://blog.51cto.com/11964104/2121131

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【地图导航有讲究】教你识别合法地图

在这个数字化时代,地图已成为我们日常生活中不可或缺的导航工具。无论是纸质地图还是手机中的电子地图,准确合法的地图不仅能为我们指引方向,还关乎国家安全和社会秩序。那么,如何确保你手中的地图是合法的呢?今天,就让我们一起学习几个识别合法地图的小技巧。 了解地图的…

可视化理解constructor、prototype、__proto__形成的指向图

Person类和person实例 首先给出一段js代码:function Person() {} const person = new Person()根据以下规则:每个实例都有一个__proto__指向其原型对象。 每个构造函数都有一个prototype属性指向其实例的原型对象 每一个原型都有一个prototype指向其实例的构造函数。于是就有…

记一次MySQL执行修改语句超时问题

异常问题原因分析这个问题发生在开发环境,怀疑是提交事务时终止项目运行,没有提交该事务,造成死锁 调试该事务时时间太长,为什么说有这个原因呢,因为通过查找日志显示The client was disconnected by the server because of inactivity. See wait_timeout and interactive…

高抗干扰触摸芯片VK36N系列1/2/3/4/5/6/7/8/9/10按键/通道适用于家电/玩具【FAE技术支持】

概述. VK36N1D具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了1个1对1输出脚,可通过IO脚选择上电输出电平,有直接输出和锁存输出2个型号 可选。芯片内部采用特殊的集成电路,具有高电…

初识yolo

确认版本 cuda我的是11.3.121,后面安装的CUDA toolkit和cuDNN大版本不能超过它 pythonAnoconda version虚拟环境 # 创建虚拟环境 conda create -n yolov8 python=3.8.0 # 激活虚拟环境(切换至这个环境) conda activate yolov8 # 查看已创建的虚拟环境 conda info -e #删除 con…

需求分析

高校社团管理系统系统分析 1.需求分析 1.功能性需求 1.1 学生模块 - 学生注册:学生可以通过填写个人信息注册成为系统用户。 - 学生登录:注册用户可以通过用户名和密码登录系统。 - 修改个人信息:学生可以修改自己的基本信息。 - 查看已加入社团:学生可以查看自己已加入的社…

vue3插件(unplugin-auto-import自动引入的使用)

1. vite.config 文件里面1 import AutoImport from unplugin-auto-import/vite2 3 plugins: [4 .......,5 AutoImport({6 include: [7 /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx8 /\.vue$/,9 /\.vue\?vue/, // .vue 10 /\.…

斯嘉丽约翰逊指控 OpenAI 非法使用其声音;微软推出AI 工具「回顾」(Recall)丨RTE 开发者日报 Vol.208

Copilot+ PCs、GPT-4、NetBSD 开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻」、「有态度的 观点 」、「有意思的 数据」、「有思考的文章」、「有看点的…

【Quant102】50 个形态学指标的 Pandas 代码

早晨之星(黎明之星) def morning_star(df, inplace=False):if not inplace:df = df.copy()# 计算三日移动平均线df[ma3] = df[close].rolling(3).mean()# 计算昨天的收盘价df[prev_close] = df[close].shift(1)# 找到所有符合条件的早晨之星形态df[morning_star] = (df[close…

kettle之 创建作业和转换

1.创建转换 连接数据库 找到表输入 和 表输出 拖动到右侧点击表输入,进入配置 点击表输出 配置 我这里是把一张表的前10条数据复制到另一张表, 点击运行,可看到日志中提示运行成功还是失败,成功后,可在数据库查看对应的数据。 2.作业 新建作业 拖入控件 设置定时设置执行…

SpringMVC@RequestBody如何实现YYYY-MM-dd HH:mm:ss转Long

@Configuration public class JsonConfig {static {ParserConfig.getGlobalInstance().setSafeMode(true);}@Bean // 使用@Bean注入fastJsonHttpMessageConvertpublic HttpMessageConverters fastJsonHttpMessageConverters() {项目使用FastJson序列化方式 com.alibaba.fastjso…

保障商业机密的智能策略:如何使用华企盾DSC提升文件安全

在商业竞争激烈的今天,每一份企业文件、每一张设计图纸都可能决定企业的未来。因此,如何保护这些珍贵的商业机密不被泄露成为了企业的重中之重。接下来,我们将分享几个实用的技巧,帮助您在文件安全管理上迈出坚实的一步。文件加密:企业数据保护的第一道防线 在数字安全的世…