Skip to content

Commit 8b097fe

Browse files
author
371718330@qq.com
committed
增加工具类
1 parent 7fd3494 commit 8b097fe

File tree

1 file changed

+163
-0
lines changed

1 file changed

+163
-0
lines changed
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package com.jingewenku.abrahamcaijin.commonutil;
2+
3+
/**
4+
* @Description:主要功能:GPS坐标转换工具 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具
5+
* @Prject: CommonUtilLibrary
6+
* @Package: com.jingewenku.abrahamcaijin.commonutil
7+
* @author: AbrahamCaiJin
8+
* @date: 2017年06月02日 10:26
9+
* @Copyright: 个人版权所有
10+
* @Company:
11+
* @version: 1.0.0
12+
*/
13+
14+
public class CoordinateTransformUtil {
15+
16+
static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
17+
static double pi = 3.1415926535897932384626;
18+
static double a = 6378245.0;
19+
static double ee = 0.00669342162296594323;
20+
21+
/**
22+
* 百度坐标系(BD-09)转WGS坐标(百度坐标纬度,百度坐标经度),WGS84坐标数组
23+
* @param lng
24+
* @param lat
25+
* @return
26+
*/
27+
public static double[] bd09towgs84(double lng, double lat) {
28+
double[] gcj = bd09togcj02(lng, lat);
29+
double[] wgs84 = gcj02towgs84(gcj[0], gcj[1]);
30+
return wgs84;
31+
}
32+
33+
/**
34+
* WGS坐标转百度坐标系(BD-09)(WGS84坐标系的经度,WGS84坐标系的纬度),百度坐标数组
35+
* @param lng
36+
* @param lat
37+
* @return
38+
*/
39+
public static double[] wgs84tobd09(double lng, double lat) {
40+
double[] gcj = wgs84togcj02(lng, lat);
41+
double[] bd09 = gcj02tobd09(gcj[0], gcj[1]);
42+
return bd09;
43+
}
44+
45+
/**
46+
* 火星坐标系(GCJ-02)转百度坐标系(BD-09)(火星坐标经度,火星坐标纬度),百度坐标数组
47+
* @param lng
48+
* @param lat
49+
* @return
50+
*/
51+
public static double[] gcj02tobd09(double lng, double lat) {
52+
double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_pi);
53+
double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_pi);
54+
double bd_lng = z * Math.cos(theta) + 0.0065;
55+
double bd_lat = z * Math.sin(theta) + 0.006;
56+
return new double[]{bd_lng, bd_lat};
57+
}
58+
59+
/**
60+
* 百度坐标系(BD-09)转火星坐标系(GCJ-02)(百度坐标纬度,百度坐标经度),火星坐标数组
61+
* @param bd_lon
62+
* @param bd_lat
63+
* @return
64+
*/
65+
public static double[] bd09togcj02(double bd_lon, double bd_lat) {
66+
double x = bd_lon - 0.0065;
67+
double y = bd_lat - 0.006;
68+
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
69+
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
70+
double gg_lng = z * Math.cos(theta);
71+
double gg_lat = z * Math.sin(theta);
72+
return new double[]{gg_lng, gg_lat};
73+
}
74+
75+
/**
76+
* WGS84转GCJ02(火星坐标系)(WGS84坐标系的经度,WGS84坐标系的纬度),火星坐标数组
77+
* @param lng
78+
* @param lat
79+
* @return
80+
*/
81+
public static double[] wgs84togcj02(double lng, double lat) {
82+
if (out_of_china(lng, lat)) {
83+
return new double[]{lng, lat};
84+
}
85+
double dlat = transformlat(lng - 105.0, lat - 35.0);
86+
double dlng = transformlng(lng - 105.0, lat - 35.0);
87+
double radlat = lat / 180.0 * pi;
88+
double magic = Math.sin(radlat);
89+
magic = 1 - ee * magic * magic;
90+
double sqrtmagic = Math.sqrt(magic);
91+
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi);
92+
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * pi);
93+
double mglat = lat + dlat;
94+
double mglng = lng + dlng;
95+
return new double[]{mglng, mglat};
96+
}
97+
98+
/**
99+
* GCJ02(火星坐标系)转GPS84(火星坐标系的经度,火星坐标系纬度),WGS84坐标数组
100+
* @param lng
101+
* @param lat
102+
* @return
103+
*/
104+
public static double[] gcj02towgs84(double lng, double lat) {
105+
if (out_of_china(lng, lat)) {
106+
return new double[]{lng, lat};
107+
}
108+
double dlat = transformlat(lng - 105.0, lat - 35.0);
109+
double dlng = transformlng(lng - 105.0, lat - 35.0);
110+
double radlat = lat / 180.0 * pi;
111+
double magic = Math.sin(radlat);
112+
magic = 1 - ee * magic * magic;
113+
double sqrtmagic = Math.sqrt(magic);
114+
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi);
115+
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * pi);
116+
double mglat = lat + dlat;
117+
double mglng = lng + dlng;
118+
return new double[]{lng * 2 - mglng, lat * 2 - mglat};
119+
}
120+
121+
/**
122+
* 纬度转换
123+
* @param lng
124+
* @param lat
125+
* @return
126+
*/
127+
public static double transformlat(double lng, double lat) {
128+
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));
129+
ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0;
130+
ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0;
131+
ret += (160.0 * Math.sin(lat / 12.0 * pi) + 320 * Math.sin(lat * pi / 30.0)) * 2.0 / 3.0;
132+
return ret;
133+
}
134+
135+
/**
136+
* 经度转换
137+
* @param lng
138+
* @param lat
139+
* @return
140+
*/
141+
public static double transformlng(double lng, double lat) {
142+
double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
143+
ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0;
144+
ret += (20.0 * Math.sin(lng * pi) + 40.0 * Math.sin(lng / 3.0 * pi)) * 2.0 / 3.0;
145+
ret += (150.0 * Math.sin(lng / 12.0 * pi) + 300.0 * Math.sin(lng / 30.0 * pi)) * 2.0 / 3.0;
146+
return ret;
147+
}
148+
149+
/**
150+
* 判断是否在国内,不在国内不做偏移
151+
* @param lng
152+
* @param lat
153+
* @return
154+
*/
155+
public static boolean out_of_china(double lng, double lat) {
156+
if (lng < 72.004 || lng > 137.8347) {
157+
return true;
158+
} else if (lat < 0.8293 || lat > 55.8271) {
159+
return true;
160+
}
161+
return false;
162+
}
163+
}

0 commit comments

Comments
 (0)