1 public static double getDistance(double lat1, double lng1, double lat2, double lng2) { 2 double radLat1 = rad(lat1); 3 double radLat2 = rad(lat2); 4 double a = radLat1 - radLat2; 5 double b = rad(lng1) - rad(lng2); 6 double s = 2 * Math.asin(Math.sqrt( 7 Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); 8 s = s * EARTH_RADIUS; 9 s = Math.round(s * 10000d) / 10000d; 10 s = s * 1000; 11 return s; 12 }
这个方法在网上找到的,很多,相对是比较精确的。但是当我们只需要关心的是短距离的。那完全可以把地球看成是个近似平面。这个和我们平时在路上走的感觉一样。
地球是平的
有这个近似计算量就缩小了很多。
1 /** 2 * 近似算法,在短距离情况下,地球表面可以近似于平面,以三角计算法计算即可 3 * 与getDistance相比,此方法计算时间大概缩小100倍 4 * @return 5 */ 6 public static double getDistanceSimple(double lat1, double lng1, double lat2, double lng2) { 7 double distance=Math.sqrt(Math.pow((lng1-lng2), 2)+Math.pow((lat1-lat2), 2)); 8 return distance*110193; // 1°对应的距离,大概11公里 9 }
1 public static void main(String [] args) { 2 long s=System.nanoTime(); 3 Double d1=getDistance(30.245317899331223,120.17062046716632,30.249613375259734,120.17361255101852); 4 long e=System.nanoTime(); 5 Double d2=getDistanceSimple(30.245317899331223,120.17062046716632,30.249613375259734,120.17361255101852); 6 long f=System.nanoTime(); 7 System.out.println(d1.intValue()+" "+(e-s)*1.0/1000+"ns"); 8 System.out.println(d2.intValue()+" "+(f-e)*1.0/1000+"ns"); 9 }
558 172.849ns
576 1.921ns
距离差几米,计算时间差100倍左右