经纬度坐标列表直线(坐标)距离排序

时间:2022-12-15 19:51:33

    本方法是将一组坐标点,由一个起点开始,选取下一个距起点最近的坐标点,并将该点作为新的坐标点以此将一组坐标排序放入一个List中返回的方法。直接上代码。


    1、计算坐标点之间的坐标相对距离

    

/**
	 * 利用勾股定理计算两个巡查对象之间的坐标距离 
	 * @param teb1
	 * @param teb2
	 * @return
	 */
	private static double GetDistance(TourEnBo teb1, TourEnBo teb2){  
       
       double a = Math.pow((teb1.getLat()-teb2.getLat()), 2);      
       double b = Math.pow((teb1.getLng()-teb2.getLng()), 2);
       
       double s = Math.sqrt(a+b); 
       return s;  
    }

    附上一个使用的模型类

public class TourEnBo {

	private double lng;
	private double lat;
	
	public TourEnBo(){}
	public TourEnBo(double lng,double lat){
		super();
		this.lng = lng;
		this.lat = lat;
	}
	public double getLng() {
		return lng;
	}
	public void setLng(double lng) {
		this.lng = lng;
	}
	public double getLat() {
		return lat;
	}
	public void setLat(double lat) {
		this.lat = lat;
	}
}

    2、接下来是通过迭代将坐标点List进行排序

/**
	 * 递归排序所有坐标点 两两之间直线距离最短
	 * @param tlist 需要进行排序的List
	 * @param result 排序结果List
	 * @param currently 每次作为起点的坐标点
	 * @return
	 */
	private List<TourEnBo> getPath(List<TourEnBo> tlist,List<TourEnBo> result,TourEnBo currently){		
		if(tlist.size()==0){
			return result;			
		}else{
			int target = 0;
			double distance = GetDistance(currently,tlist.get(0));
			//循环判断路线 并放入result中
			for(int i=0;i<tlist.size();i++){
				
				double temp = GetDistance(currently,tlist.get(i));
				if(temp <= distance){
					distance = temp;
					target = i;
				}
				
			}
			result.add(tlist.get(target));
			currently = tlist.get(target);
			tlist.remove(target);
			
			return getPath(tlist, result, currently);
		}
	}

    完全的业务是一个关于巡查任务的路线规划,包含巡查目标的积分、状态计算,以积分及状态作为条件筛选和各种极端情况的分析,这里只贴出其中一个方法来记录