本方法是将一组坐标点,由一个起点开始,选取下一个距起点最近的坐标点,并将该点作为新的坐标点以此将一组坐标排序放入一个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); } }
完全的业务是一个关于巡查任务的路线规划,包含巡查目标的积分、状态计算,以积分及状态作为条件筛选和各种极端情况的分析,这里只贴出其中一个方法来记录