Commit 40fb794798897da0873db4bb03fe04200d874003
1 parent
fcf8c401
使用临时方案解决更新通道调用百度API问题
Showing
2 changed files
with
176 additions
and
41 deletions
src/main/java/com/genersoft/iot/vmp/utils/Coordtransform.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.utils; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * 坐标转换 | ||
| 5 | + * 一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具类 | ||
| 6 | + * 参考https://github.com/wandergis/coordtransform 写的Java版本 | ||
| 7 | + * @author Xinconan | ||
| 8 | + * @date 2016-03-18 | ||
| 9 | + * @url https://github.com/xinconan/coordtransform | ||
| 10 | + */ | ||
| 11 | +public class Coordtransform { | ||
| 12 | + | ||
| 13 | + private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0; | ||
| 14 | + private static double PI = 3.1415926535897932384626; | ||
| 15 | + private static double a = 6378245.0; | ||
| 16 | + private static double ee = 0.00669342162296594323; | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 | ||
| 20 | + * 即 百度 转 谷歌、高德 | ||
| 21 | + * @param bd_lon | ||
| 22 | + * @param bd_lat | ||
| 23 | + * @return Double[lon,lat] | ||
| 24 | + */ | ||
| 25 | + public static Double[] BD09ToGCJ02(Double bd_lon,Double bd_lat){ | ||
| 26 | + double x = bd_lon - 0.0065; | ||
| 27 | + double y = bd_lat - 0.006; | ||
| 28 | + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); | ||
| 29 | + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); | ||
| 30 | + Double[] arr = new Double[2]; | ||
| 31 | + arr[0] = z * Math.cos(theta); | ||
| 32 | + arr[1] = z * Math.sin(theta); | ||
| 33 | + return arr; | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + /** | ||
| 37 | + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 | ||
| 38 | + * 即谷歌、高德 转 百度 | ||
| 39 | + * @param gcj_lon | ||
| 40 | + * @param gcj_lat | ||
| 41 | + * @return Double[lon,lat] | ||
| 42 | + */ | ||
| 43 | + public static Double[] GCJ02ToBD09(Double gcj_lon,Double gcj_lat){ | ||
| 44 | + double z = Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI); | ||
| 45 | + double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI); | ||
| 46 | + Double[] arr = new Double[2]; | ||
| 47 | + arr[0] = z * Math.cos(theta) + 0.0065; | ||
| 48 | + arr[1] = z * Math.sin(theta) + 0.006; | ||
| 49 | + return arr; | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + /** | ||
| 53 | + * WGS84转GCJ02 | ||
| 54 | + * @param wgs_lon | ||
| 55 | + * @param wgs_lat | ||
| 56 | + * @return Double[lon,lat] | ||
| 57 | + */ | ||
| 58 | + public static Double[] WGS84ToGCJ02(Double wgs_lon,Double wgs_lat){ | ||
| 59 | + if(outOfChina(wgs_lon, wgs_lat)){ | ||
| 60 | + return new Double[]{wgs_lon,wgs_lat}; | ||
| 61 | + } | ||
| 62 | + double dlat = transformlat(wgs_lon - 105.0, wgs_lat - 35.0); | ||
| 63 | + double dlng = transformlng(wgs_lon - 105.0, wgs_lat - 35.0); | ||
| 64 | + double radlat = wgs_lat / 180.0 * PI; | ||
| 65 | + double magic = Math.sin(radlat); | ||
| 66 | + magic = 1 - ee * magic * magic; | ||
| 67 | + double sqrtmagic = Math.sqrt(magic); | ||
| 68 | + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); | ||
| 69 | + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); | ||
| 70 | + Double[] arr = new Double[2]; | ||
| 71 | + arr[0] = wgs_lon + dlng; | ||
| 72 | + arr[1] = wgs_lat + dlat; | ||
| 73 | + return arr; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + /** | ||
| 77 | + * GCJ02转WGS84 | ||
| 78 | + * @param gcj_lon | ||
| 79 | + * @param gcj_lat | ||
| 80 | + * @return Double[lon,lat] | ||
| 81 | + */ | ||
| 82 | + public static Double[] GCJ02ToWGS84(Double gcj_lon,Double gcj_lat){ | ||
| 83 | + if(outOfChina(gcj_lon, gcj_lat)){ | ||
| 84 | + return new Double[]{gcj_lon,gcj_lat}; | ||
| 85 | + } | ||
| 86 | + double dlat = transformlat(gcj_lon - 105.0, gcj_lat - 35.0); | ||
| 87 | + double dlng = transformlng(gcj_lon - 105.0, gcj_lat - 35.0); | ||
| 88 | + double radlat = gcj_lat / 180.0 * PI; | ||
| 89 | + double magic = Math.sin(radlat); | ||
| 90 | + magic = 1 - ee * magic * magic; | ||
| 91 | + double sqrtmagic = Math.sqrt(magic); | ||
| 92 | + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); | ||
| 93 | + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); | ||
| 94 | + double mglat = gcj_lat + dlat; | ||
| 95 | + double mglng = gcj_lon + dlng; | ||
| 96 | + return new Double[]{gcj_lon * 2 - mglng, gcj_lat * 2 - mglat}; | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + private static Double transformlat(double lng, double lat) { | ||
| 100 | + 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)); | ||
| 101 | + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; | ||
| 102 | + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; | ||
| 103 | + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; | ||
| 104 | + return ret; | ||
| 105 | + } | ||
| 106 | + | ||
| 107 | + private static Double transformlng(double lng,double lat) { | ||
| 108 | + double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); | ||
| 109 | + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; | ||
| 110 | + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; | ||
| 111 | + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; | ||
| 112 | + return ret; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + /** | ||
| 116 | + * outOfChina | ||
| 117 | + * @描述: 判断是否在国内,不在国内则不做偏移 | ||
| 118 | + * @param lng | ||
| 119 | + * @param lat | ||
| 120 | + * @return {boolean} | ||
| 121 | + */ | ||
| 122 | + private static boolean outOfChina(Double lng,Double lat) { | ||
| 123 | + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); | ||
| 124 | + }; | ||
| 125 | + | ||
| 126 | +} |
src/main/java/com/genersoft/iot/vmp/utils/GpsUtil.java
| @@ -17,48 +17,57 @@ public class GpsUtil { | @@ -17,48 +17,57 @@ public class GpsUtil { | ||
| 17 | public static BaiduPoint Wgs84ToBd09(String xx, String yy) { | 17 | public static BaiduPoint Wgs84ToBd09(String xx, String yy) { |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | - try { | ||
| 21 | - Socket s = new Socket("api.map.baidu.com", 80); | ||
| 22 | - BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8")); | ||
| 23 | - OutputStream out = s.getOutputStream(); | ||
| 24 | - StringBuffer sb = new StringBuffer("GET /ag/coord/convert?from=0&to=4"); | ||
| 25 | - sb.append("&x=" + xx + "&y=" + yy); | ||
| 26 | - sb.append("&callback=BMap.Convertor.cbk_3976 HTTP/1.1\r\n"); | ||
| 27 | - sb.append("User-Agent: Java/1.6.0_20\r\n"); | ||
| 28 | - sb.append("Host: api.map.baidu.com:80\r\n"); | ||
| 29 | - sb.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n"); | ||
| 30 | - sb.append("Connection: Close\r\n"); | ||
| 31 | - sb.append("\r\n"); | ||
| 32 | - out.write(sb.toString().getBytes()); | ||
| 33 | - String json = ""; | ||
| 34 | - String tmp = ""; | ||
| 35 | - while ((tmp = br.readLine()) != null) { | ||
| 36 | - // logger.info(tmp); | ||
| 37 | - json += tmp; | ||
| 38 | - } | 20 | +// try { |
| 21 | +// Socket s = new Socket("api.map.baidu.com", 80); | ||
| 22 | +// BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8")); | ||
| 23 | +// OutputStream out = s.getOutputStream(); | ||
| 24 | +// StringBuffer sb = new StringBuffer("GET /ag/coord/convert?from=0&to=4"); | ||
| 25 | +// sb.append("&x=" + xx + "&y=" + yy); | ||
| 26 | +// sb.append("&callback=BMap.Convertor.cbk_3976 HTTP/1.1\r\n"); | ||
| 27 | +// sb.append("User-Agent: Java/1.6.0_20\r\n"); | ||
| 28 | +// sb.append("Host: api.map.baidu.com:80\r\n"); | ||
| 29 | +// sb.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n"); | ||
| 30 | +// sb.append("Connection: Close\r\n"); | ||
| 31 | +// sb.append("\r\n"); | ||
| 32 | +// out.write(sb.toString().getBytes()); | ||
| 33 | +// String json = ""; | ||
| 34 | +// String tmp = ""; | ||
| 35 | +// while ((tmp = br.readLine()) != null) { | ||
| 36 | +// // logger.info(tmp); | ||
| 37 | +// json += tmp; | ||
| 38 | +// } | ||
| 39 | +// | ||
| 40 | +// s.close(); | ||
| 41 | +// int start = json.indexOf("cbk_3976"); | ||
| 42 | +// int end = json.lastIndexOf("}"); | ||
| 43 | +// if (start != -1 && end != -1 && json.contains("\"x\":\"")) { | ||
| 44 | +// json = json.substring(start, end); | ||
| 45 | +// String[] point = json.split(","); | ||
| 46 | +// String x = point[1].split(":")[1].replace("\"", ""); | ||
| 47 | +// String y = point[2].split(":")[1].replace("\"", ""); | ||
| 48 | +// BaiduPoint bdPoint= new BaiduPoint(); | ||
| 49 | +// bdPoint.setBdLng(new String(decode(x))); | ||
| 50 | +// bdPoint.setBdLat(new String(decode(y))); | ||
| 51 | +// return bdPoint; | ||
| 52 | +// //return (new String(decode(x)) + "," + new String(decode(y))); | ||
| 53 | +// } else { | ||
| 54 | +// logger.info("gps坐标无效!!"); | ||
| 55 | +// } | ||
| 56 | +// out.close(); | ||
| 57 | +// br.close(); | ||
| 58 | +// } catch (Exception e) { | ||
| 59 | +// e.printStackTrace(); | ||
| 60 | +// } | ||
| 39 | 61 | ||
| 40 | - s.close(); | ||
| 41 | - int start = json.indexOf("cbk_3976"); | ||
| 42 | - int end = json.lastIndexOf("}"); | ||
| 43 | - if (start != -1 && end != -1 && json.contains("\"x\":\"")) { | ||
| 44 | - json = json.substring(start, end); | ||
| 45 | - String[] point = json.split(","); | ||
| 46 | - String x = point[1].split(":")[1].replace("\"", ""); | ||
| 47 | - String y = point[2].split(":")[1].replace("\"", ""); | ||
| 48 | - BaiduPoint bdPoint= new BaiduPoint(); | ||
| 49 | - bdPoint.setBdLng(new String(decode(x))); | ||
| 50 | - bdPoint.setBdLat(new String(decode(y))); | ||
| 51 | - return bdPoint; | ||
| 52 | - //return (new String(decode(x)) + "," + new String(decode(y))); | ||
| 53 | - } else { | ||
| 54 | - logger.info("gps坐标无效!!"); | ||
| 55 | - } | ||
| 56 | - out.close(); | ||
| 57 | - br.close(); | ||
| 58 | - } catch (Exception e) { | ||
| 59 | - e.printStackTrace(); | ||
| 60 | - } | ||
| 61 | - return null; | 62 | + |
| 63 | + double lng = Double.parseDouble(xx); | ||
| 64 | + double lat = Double.parseDouble(yy); | ||
| 65 | + Double[] gcj02 = Coordtransform.WGS84ToGCJ02(lng, lat); | ||
| 66 | + Double[] doubles = Coordtransform.GCJ02ToBD09(gcj02[0], gcj02[1]); | ||
| 67 | + BaiduPoint bdPoint= new BaiduPoint(); | ||
| 68 | + bdPoint.setBdLng(doubles[0] + ""); | ||
| 69 | + bdPoint.setBdLat(doubles[1] + ""); | ||
| 70 | + return bdPoint; | ||
| 62 | } | 71 | } |
| 63 | 72 | ||
| 64 | /** | 73 | /** |