高德地图之路线规划 多点路线规划路线最短原则排序算法

继续高德地图  

高德地图-自定义地图

高德地图-自定义导航

tsp最短路线原则和demo下载

继续写路线规划

上一篇写道多点路线规划 高德地图仅仅只会按照你给出的点的顺序进行路线规划 并不会智能的给你按照最近或者最快进行规划 举个例子 A B C D 四个点路线规划 A是起点 D是终点 B C 是途径点 加入你按照 A - B - C - D 的顺序给高德 那么高德返回给你的就是 A - B - C - D这个顺序 加入这时A - B - C - D 并不是最优的路线 是不是就萌币了

不要着急 下面我就是给你一个最优路线

说一下思路 以A - B - C - D 为例 

首先起点A 终点 D 不会变 我们不用管 

现在命名: 

AStartLat 起点纬度 ASP A的起点 

AStartLon 起点经度

BStartLat B起点纬度 BSP 

BStartLon B起点经度

CStartLat C起点纬度 CSP 

CStartLon C起点经度

BEndLat B终点纬度 BEP 

BEndLon B终点经度

CEndLat B终点纬度 CEP 

CEndLon B终点经度

简单做个用例图 

A —> B——>C—–>D 原顺序

A—–>B 10KM 

A—–>C 3KM

A—->C—->B—->D 排序后顺序

我们要做的就是 A —> B——>C—–>D 计算出每两个点的距离 然后比较大小 得到距离最近的点 并以这个点为起点 再次计算下一轮的最近的点 最后得到一个最短的路线 就是我们的最后的目的

好 下面上代码

// 排序所有途经点 

private List sortPoint(List sortList) { 

for (int no = 0; no < sortList.size()*2-1; no++) { 

if (no!=0){// 不是第一次 要判断添加终点 

for (int i = 1; i < startList.size(); i++) { 

for (int j = 1; j < sortList.size(); j++) { 

if (startList.get(i).getLlPoint()==sortList.get(j).getSrartPoint()&&startList.get(i).getLlPoint()!=sortList.get(j).getEndPoint()){ 

Point p = new Point(); 

p.setLlPoint(sortList.get(j).getEndPoint()); 

p.setDistance(0); 

startList.add(p); 

}else {// 第一次 只添加所有起点 

for (int i = 0; i < sortList.size(); i++) { 

Point p = new Point(); 

p.setLlPoint(sortList.get(i).getSrartPoint()); 

p.setDistance(0); 

startList.add(p); 

for (int i = 0; i < startList.size()-1; i++) { 

for (int j = (i+1); j < startList.size(); j++) { 

if (i == 0){ 

startList.get(j).setDistance(DrivingRouteOverlay.calculateDistance(convertToLatLng(startList.get(i).getLlPoint()),convertToLatLng(startList.get(j).getLlPoint()))); 

Collections.sort(startList, new Comparator() { 

@Override 

public int compare(Point o1, Point o2) { 

if (o1.getDistance()==o2.getDistance()){ 

return o1.getDistance(); 

}else { 

return o1.getDistance() - o2.getDistance(); 

}); 

for (int i = 0; i < startList.size(); i++) { 

for (int j = 0; j < startList.size(); j++) { 

if (i!=j){ 

if (startList.get(i).getLlPoint().getLatitude()==startList.get(j).getLlPoint().getLatitude()&&startList.get(i).getLlPoint().getLongitude()==startList.get(j).getLlPoint().getLongitude()){ 

startList.remove(j); 

}

return startList;

}

计算两点之间的距离 

public static int calculateDistance(LatLng start, LatLng end) { 

double x1 = start.longitude; 

double y1 = start.latitude; 

double x2 = end.longitude; 

double y2 = end.latitude; 

return calculateDistance(x1, y1, x2, y2); 

// 根据经纬度计算两点的距离

public static int calculateDistance(double x1, double y1, double x2, double y2) {

    final double NF_pi = 0.01745329251994329; // 弧度 PI/180

    x1 *= NF_pi;

    y1 *= NF_pi;

    x2 *= NF_pi;

    y2 *= NF_pi;

    double sinx1 = Math.sin(x1);

    double siny1 = Math.sin(y1);

    double cosx1 = Math.cos(x1);

    double cosy1 = Math.cos(y1);

    double sinx2 = Math.sin(x2);

    double siny2 = Math.sin(y2);

    double cosx2 = Math.cos(x2);

    double cosy2 = Math.cos(y2);

    double[] v1 = new double[3];

    v1[0] = cosy1 * cosx1 - cosy2 * cosx2;

    v1[1] = cosy1 * sinx1 - cosy2 * sinx2;

    v1[2] = siny1 - siny2;

    double dist = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]);

    return (int) (Math.asin(dist / 2) * 12742001.5798544);

}


算法有带点粗糙 感兴趣的可以继续优化方案  这个不但可以计算点的距离 还可以计算多路线规划 设置不同路线颜色等等 看你的需要

如有疑问 欢迎留言或私信

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,273评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,905评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,281评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,817评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,690评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,491评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,886评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,513评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,810评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,839评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,642评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,455评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,901评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,091评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,381评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,895评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,104评论 2 338

推荐阅读更多精彩内容