`

DistanceUtil

 
阅读更多

☆功能

①主要是模拟百度地图 JavaScript API 中的测距功能 -- 计算两点距离

②判断是否符合两点距离之内

③根据两点的距离排序实体

持续更新.....

 

☆代码

 

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

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.trim());
        Double lat1 = Double.parseDouble(lat1Str.trim());
        Double lon2 = Double.parseDouble(lng2Str.trim());
        Double lat2 = Double.parseDouble(lat2Str.trim());
        
        // 角度转换为弧度
        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();
	}
	
	/**
	 * 判断两点距离是否在比较距离之内
	 * @param distance 需要比较的距离
	 * @param lng1Str  终端经度
	 * @param lat1Str  终端经度
	 * @param lng2Str  商家经度
	 * @param lat2Str  商家纬度
	 * @return
	 */
	public static boolean isWithin(Integer distance,String lng1Str,String lat1Str, String lng2Str,String lat2Str){
		if (distance == null || distance <= 0) return false;
		if ((StringUtil.isBlank(lat1Str)) || (StringUtil.isBlank(lng1Str))
				|| (StringUtil.isBlank(lat2Str))
				|| (StringUtil.isBlank(lng2Str))){return false;}
		Double calDistance =  getTwopointsDistance(lng1Str,lat1Str,lng2Str,lat2Str);
		if(calDistance !=null){
			boolean result = distance >= (calDistance.intValue()) ? true : false;
			return result;
		}
		return false;
	}
	
	/**
	 * 根据距离排序实体
	 * @param map key:比较的距离,value:距离对应的实体
	 * @return 排序过后额实体
	 */
	public static <T> List<T> sortByDistance(Map<Double, T> map){
		if(!COMMON.isEmpty(map)){
			List<Double> distanceList = new ArrayList<Double>();
			for(Double distance : map.keySet()){
				distanceList.add(distance);
			}
			//System.out.println("排序前:"+distanceList.toString());
			Collections.sort(distanceList);//升序排序
			//System.out.println("排序后:"+distanceList.toString());
			
			List<T> returnList = new ArrayList<T>();
			for(Double d : distanceList){
				returnList.add(map.get(d));
			}
			return returnList;
		}
		return null;
	}
	
}

 备注:

 

COMMON.isEmpty(map) :判断集合是否为null和集合长度是否为0;效果同等:

org.apache.commons.collections.CollectionUtils.isEmpty(new ArrayList());

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics