您的位置:首页 > 其它

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

2018-03-12 09:32 441 查看
    本方法是将一组坐标点,由一个起点开始,选取下一个距起点最近的坐标点,并将该点作为新的坐标点以此将一组坐标排序放入一个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);
}
}    完全的业务是一个关于巡查任务的路线规划,包含巡查目标的积分、状态计算,以积分及状态作为条件筛选和各种极端情况的分析,这里只贴出其中一个方法来记录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息