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