根据经纬度计算两点之间的距离

package com.bandweaver.tunnel.common.platform.util;

import java.math.BigDecimal;

import javafx.geometry.Point2D;


public class GPSUtil {

	private static final double EARTH_RADIUS = 6378137;// 赤道半径(单位m)

	/**
	 * 转化为弧度(rad)
	 */
	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}

	/**
	 * 基于googleMap中的算法得到两经纬度之间的距离,计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下(单位m)
	 * 
	 * @param lon1 第一点的精度
	 * @param lat1 第一点的纬度
	 * @param lon2 第二点的精度
	 * @param lat3 第二点的纬度
	 * @return 返回的距离,单位km
	 */
	public static double GetDistance(double lon1, double lat1, double lon2, double lat2) {
		double radLat1 = rad(lat1);
		double radLat2 = rad(lat2);
		double a = radLat1 - radLat2;
		double b = rad(lon1) - rad(lon2);
		double s = 2 * Math.asin(Math.sqrt(
				Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		// s = Math.round(s * 10000) / 10000;
		return s;

	}
	
	
	/**(米勒投影算法)将经纬度转化为平面坐标 (单位m)
	 * @param lon 经度
	 * @param lat 维度
	 * @return   
	 * @author shaosen
	 * @Date 2018年8月24日
	 */
	public static Point2D MillierConvertion(double lon, double lat)  
    {  
         double L = 6381372  * Math.PI * 2;//地球周长  
         double W=L;// 平面展开后,x轴等于周长  
         double H=L/2;// y轴约等于周长一半  
         double mill=2.3;// 米勒投影中的一个常数,范围大约在正负2.3之间  
         double x = lon * Math.PI / 180;// 将经度从度数转换为弧度  
         double y = lat * Math.PI / 180;// 将纬度从度数转换为弧度  
         y=1.25 * Math.log( Math.tan( 0.25 * Math.PI + 0.4 * y ) );// 米勒投影的转换  
         // 弧度转为实际距离  
         x = ( W / 2 ) + ( W / (2 * Math.PI) ) * x;  
         y = ( H / 2 ) - ( H / ( 2 * mill ) ) * y;  
//         double[] result=new double[2];  
//         result[0]=x;  
//         result[1]=y; 
         return new Point2D(x, y);  
    }

}

猜你喜欢

转载自blog.csdn.net/csdn_ss1991/article/details/82253711