1、概念
緯線、經線、維度、經度
2、根據兩點的經緯度,計算距離
/** * <p>Description: 計算兩點之間距離</p> * @param slng 起始經度 * @param slat 起始緯度 * @param elng 結束經度 * @param elat 結束緯度 * @return 米 */ public static double getDistanceByGaoDe(double slng, double slat, double elng, double elat) { double lng1 = (Math.PI / 180) * slng; double lng2 = (Math.PI / 180) * elng; double lat1 = (Math.PI / 180) * slat; double lat2 = (Math.PI / 180) * elat; // 兩點間距離 km,如果想要米的話,結果*1000就可以了 double d = Math.acos( Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lng2 - lng1) ) * EARTH_RADIUS; // 精度1位小數 d = Math.round(d * 10000d) / 10000d; return d * 1000; }
3、根據當前經緯度以及距離,求周邊正方形區間(通過求出的區間范圍作為SQL入參過濾數據)
/** * <p>Description: 計算兩點之間距離</p> * @param dis 距離 * @param lng 起始經度 * @param lat 起始緯度 * @return 正方形范圍 */ public static double[] getPoiRange(double dis, double lng, double lat) { double[] poi = new double[4]; double lng1 = (Math.PI / 180) * lng; double lng2 = (Math.PI / 180) * lng; double lat1 = (Math.PI / 180) * lat; double lat2 = (Math.PI / 180) * lat; // 角度 double theta = dis / EARTH_RADIUS; // 維度相同,反算經度 double lngVal = Math.cos(theta) - Math.sin(lat1) * Math.sin(lat2); double lngThetaVal = lngVal / (Math.cos(lat1) * Math.cos(lat2)); double elng1 = (-Math.acos(lngThetaVal) + lng1) / (Math.PI / 180); double elng2 = (Math.acos(lngThetaVal) + lng1) / (Math.PI / 180); LogLIB.LogRun.info("elng1=" + UtilTools.format(elng1) + " elng2=" + UtilTools.format(elng2)); // 經度相同,反算維度(根據輔助角公式計算 asinx + bcosx) // theta = a * Math.sin(lat2) + b * Math.cos(lat2) = Math.sqrt(a平方 + b平方)sin(x + arctan(b/a)) double a = Math.sin(lat1); double b = Math.cos(lat1) * Math.cos(lng2 - lng1); double sqrt = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)); double latTheteVal = Math.cos(theta) / sqrt; double elat1 = (Math.asin(latTheteVal) - Math.atan(b/a)) / (Math.PI / 180); double elat2 = (Math.asin(-latTheteVal) - Math.atan(b/a)) / (Math.PI / 180) + 180; LogLIB.LogRun.info("elat1=" + UtilTools.format(elat1) + " elat2=" + UtilTools.format(elat2)); poi[0] = elng1; poi[1] = elng2; poi[2] = elat1; poi[3] = elat2; return poi; }