模拟百度地图WebAPI-计算距离

      最近公司需要通过计算终端与商家的两点直线距离,根据距离做一些服务。查看了各大互联网地图API,百度地图、高德地图等等通过两点的经纬度来计算两点的距离(位移)的服务只能通过网页调用脚本(JavaScript)来计算,这样对于后台来说实现是有点坑爹快哭了。从而在网上找了很久才找到有个方法计算出来的结果跟百度地图API比较接近。

以下是一些参考资料:

【百度地图API】如何根据摩卡托坐标进行POI查询,和计算两点距离

经纬度计算公式的原理

百度地图JSAPI示例

模拟百度地图API

以下测试用到的工具:

获取地点经纬度或者通过经纬度验证地点的网页百度地图工具:拾取坐标系统

以下是跟百度地图JS API的结果最接近的干货:

public class DistanceUtil {

	private static double  DEF_PI =Math.PI;// 3.14159265359
	private static double  DEF_2PI =2 *Math.PI;// 6.28318530712
	private static double  DEF_PI180 =Math.PI/ 180.0;// 0.01745329252
	private static double  DEF_R =6370996.81;// 地球的半径
	
	/**
	 * 通过两点的经纬度计算两点直线距离
	 * @param lng1Str  终端经度
	 * @param lat1Str  终端纬度
	 * @param lng2Str  商家经度
	 * @param lat2Str  商家纬度
	 * @return 返回的值四舍五入并保留两位小数,单位米
	 */
	public static Double getTwopointsDistance(String lng1Str,String lat1Str, String lng2Str,String lat2Str) {
		if ((StringUtil.isBlank(lat1Str)) || (StringUtil.isBlank(lng1Str))
				|| (StringUtil.isBlank(lat2Str))
				|| (StringUtil.isBlank(lng2Str))){return null;}
		
		Double lon1 = Double.parseDouble(lng1Str);
        Double lat1 = Double.parseDouble(lat1Str);
        Double lon2 = Double.parseDouble(lng2Str);
        Double lat2 = Double.parseDouble(lat2Str);
        
        // 角度转换为弧度
        double ew1 =  lon1 * DEF_PI180;
        double ns1 =  lat1 * DEF_PI180;
        double ew2 =  lon2 * DEF_PI180;
        double ns2 =  lat2 * DEF_PI180;
        
        // 求大圆劣弧与球心所夹的角(弧度)
        double distance = Math.sin(ns1) * Math.sin(ns2)+ Math.cos(ns1)* Math.cos(ns2)* Math.cos(ew1- ew2);
        // 调整到[-1..1]范围内,避免溢出
        if(distance >1.0) distance = 1.0;
        else if(distance <-1.0) distance = -1.0;
        distance = DEF_R *Math.acos(distance);
        
        //格式化返回值
        BigDecimal bd = new BigDecimal(distance);
        return distance = bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
	}
}

猜你喜欢

转载自sunnyzh66.iteye.com/blog/2287770