首页
留言
关于
友链
更多
足迹
实验室
地图组件
Search
1
SpringMVC+Spring+MyBatis整合完整版Web实例(附数据)
2,643 阅读
2
关于在Flutter实现Google地图的方法
1,117 阅读
3
SqlServer分组排序后取第一条记录
722 阅读
4
Maven仓库报错:Could not transfer artifact org.springframework.boot:spring-boot-maven-plugin:pom···
642 阅读
5
druid报异常 “sql injection violation, part alway true condition not allow”的解决方案
616 阅读
发现
技术
生活
户外
登录
Search
标签搜索
Git
JavaScript
Oracle
Git学习
Java
Flutter
MySQL
SQL Server
Spring Boot
对称加密算法
IntelliJ IDEA
Google地图
Maven
ES6
秦岭户外
Flutter 2.0
linux
Tomcat
Redis
Spring
Bai Keyang
累计撰写
269
篇文章
累计收到
275
条评论
首页
栏目
发现
技术
生活
户外
页面
留言
关于
友链
足迹
搜索到
1
篇与
地图
的结果
2017-12-13
GPS纠偏算法
在网上找了一个GPS的纠偏算法,适用于 Google(国内)、高德地图、腾讯地图 等地图的坐标体系。自己也已经将该纠偏算法应用于公司的项目中。 下面贴出经纬度纠偏的算法Java代码:package com.baikeyang.map.util; import java.util.ArrayList; import java.util.List; public class GpsCorrect { final static double pi = 3.14159265358979324; final static double a = 6378245.0; final static double ee = 0.00669342162296594323; /** * 经纬度纠偏 * @param lon 经度 * @param lat 纬度 * @return */ public static String getGpsCorrect(String lon,String lat) { String lnglat="0,0"; double wgLat=Double.parseDouble(latTag); double wgLon=Double.parseDouble(lonTag); if (!outOfChina(wgLat, wgLon)) { double dLat = transformLat(wgLon - 105.0, wgLat - 35.0); double dLon = transformLon(wgLon - 105.0, wgLat - 35.0); double radLat = wgLat / 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); lnglat=(wgLon + dLon)+","+(wgLat + dLat); } else { double[] latlng = new double[2]; transform(wgLat, wgLon, latlng); lnglat = latlng[1] + "," + latlng[0]; } return lnglat; } public static void transform(double wgLat, double wgLon, double[] latlng) { if (outOfChina(wgLat, wgLon)) { latlng[0] = wgLat; latlng[1] = wgLon; return; } double dLat = transformLat(wgLon - 105.0, wgLat - 35.0); double dLon = transformLon(wgLon - 105.0, wgLat - 35.0); double radLat = wgLat / 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); latlng[0] = wgLat + dLat; latlng[1] = wgLon + dLon; } /** * 非国内经纬度 * @param lat * @param lon * @return */ public static boolean outOfChina(double lat, double lon) { if (lon < 72.004 || lon > 137.8347) return true; if (lat < 0.8293 || lat > 55.8271) return true; return false; } private static double transformLat(double x, double y) { double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; return ret; } private static double transformLon(double x, double y) { double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0; return ret; } } 同时还在网络上整理了几个关于国内几大互联网厂商之间地图经纬度的转换:package com.baikeyang.map.util; import java.util.ArrayList; import java.util.List; public class GpsConvert { final static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; /** * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System * * @param lat * @param lon * @return */ public static double[] gps84_To_Gcj02(double lat, double lon) { if (outOfChina(lat, lon)) { return new double[]{lat,lon}; } double dLat = transformLat(lon - 105.0, lat - 35.0); double dLon = transformLon(lon - 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); dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); double mgLat = lat + dLat; double mgLon = lon + dLon; return new double[]{mgLat, mgLon}; } /** * 火星坐标系 (GCJ-02) to 84 * @param lat * @param lon * @return */ public static double[] gcj02_To_Gps84(double lat, double lon) { double[] gps = new double[2]; GpsCorrect.transform(lat, lon, gps); double lontitude = lon * 2 - gps[1]; double latitude = lat * 2 - gps[0]; return new double[]{latitude, lontitude}; } /** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 * * @param lat * @param lon */ public static double[] gcj02_To_Bd09(double lat, double lon) { double x = lon, y = lat; 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 tempLon = z * Math.cos(theta) + 0.0065; double tempLat = z * Math.sin(theta) + 0.006; double[] gps = {tempLat,tempLon}; return gps; } /** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * 将 BD-09 坐标转换成GCJ-02 坐标 * @param lat * @param lon * @return */ public static double[] bd09_To_Gcj02(double lat, double lon) { double x = lon - 0.0065, y = 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 tempLon = z * Math.cos(theta); double tempLat = z * Math.sin(theta); double[] gps = {tempLat,tempLon}; return gps; } /** * 将gps84转为bd09 * @param lat * @param lon * @return */ public static double[] gps84_To_bd09(double lat,double lon){ double[] gcj02 = gps84_To_Gcj02(lat,lon); double[] bd09 = gcj02_To_Bd09(gcj02[0],gcj02[1]); return bd09; } public static double[] bd09_To_gps84(double lat,double lon){ double[] gcj02 = bd09_To_Gcj02(lat, lon); double[] gps84 = gcj02_To_Gps84(gcj02[0], gcj02[1]); //保留小数点后六位 gps84[0] = retain6(gps84[0]); gps84[1] = retain6(gps84[1]); return gps84; } /** * 保留小数点后六位 * @param num * @return */ private static double retain6(double num){ String result = String .format("%.6f", num); return Double.valueOf(result); } }
2017年12月13日
286 阅读
0 评论
0 点赞