根据坐标行驶的距离算出最优路径Dijkstra(迪杰斯特拉算法)

//这只是适合单源节点,如有不懂原理的可以先参考以下链接的文章

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html



//以下是根据坐标行驶的距离算出最优路径Dijkstra(迪杰斯特拉算法)的具体实现方法

import java.util.ArrayList;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import com.paiye.common.core.amap.AmapUtil;


import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


/**
 * @ClassName: Dijkstra.java
 * @Description: TODO(迪杰斯特拉算法)
 * @author lx
 * @date 2017年1月23日 下午2:55:35
 * @version V1.0
 */
public class Dijkstra {

private StringBuilder route;

public static void main(String[] args) {
List<String> points = new ArrayList<String>();// 存储点集合
points.add("104.064362,30.664187");
points.add("104.300568,30.524697");
points.add("104.635651,30.624016");
points.add("104.984467,30.675999");

String start = "104.984467,30.675999";

Dijkstra d = new Dijkstra();
d.initData(points, start);

Map<String, Object> result = d.getBestWay(d.getRoute().toString().split(";"));
System.out.println("steps=" + Arrays.asList((String[]) result.get("steps")));
System.out.println("distance="+result.get("distance"));
System.out.println("polyline="+result.get("polyline"));
}

public Map<String, Object> getBestWay(String points[]){
Map<String, Object> resultMap = new HashMap<String, Object>();

StringBuilder buffer = new StringBuilder();

for (int i = 0; i < points.length - 1; i++) {
Map<String, String> params = new HashMap<String, String>();
params.put("origin", points[i]);
params.put("destination", points[i+1]);
params.put("extensions", "base");
params.put("strategy1", "5"); // 具体查看:http://lbs.amap.com/api/webservice/guide/api/direction#driving
String result = AmapUtil.driving(params); //这里是我上面写道的根据坐标算出导航距离
JSONObject jsonObject = JSONObject.fromObject(result);
if(jsonObject.get("status").equals("1")){

JSONObject route = jsonObject.getJSONObject("route");
JSONArray paths = route.getJSONArray("paths");

String distance = paths.getJSONObject(0).getString("distance");
JSONArray steps = paths.getJSONObject(0).getJSONArray("steps");

Iterator<?> iter = steps.iterator();
while (iter.hasNext()) {
JSONObject object = (JSONObject)iter.next();
String polyline = object.getString("polyline");
buffer.append(polyline + ";");
}
if(buffer.toString().contains(";")){
String point="";
for (int j = 0; j < points.length; j++) {
point=point+points[j]+";";
}
resultMap.put("steps", point);
resultMap.put("distance", distance);
resultMap.put("polyline", buffer.toString().substring(0, buffer.toString().length()-1));
}
}
}
return resultMap;
}

public void initData(List<String> points,String start){
Map<String, Point> pointMap = new HashMap<String, Point>();
for (String id : points) {
Point point = new Point();
point.setId(id);
point.setDistance(points);
pointMap.put(id, point);
}

route = new StringBuilder();
// 单源最短路径遍历
showDijkstra(pointMap, start);
}


public void showDijkstra(Map<String, Point> pointMap, String p) {
route.append(p + ";");
pointMap.get(p).changeFlag();
Point point = getTopointMin(pointMap, pointMap.get(p));
if (null == point)
return;
showDijkstra(pointMap, point.getId());
}


public Point getTopointMin(Map<String, Point> pointMap, Point p) {
Point temp = null;
Double minDistance = Double.MAX_VALUE;

for (Map.Entry<String, Point> entry : pointMap.entrySet()) {
String key = entry.getKey();
Point point = entry.getValue();
if(point.isVisit() || point.getId().endsWith(p.getId()) || p.distanceToPointId(key) < 0D){
continue;
} else {
Double distance = p.distanceToPointId(key);
if (distance < minDistance) {
minDistance = distance;
temp = point;
}
}
}
return temp;
}


public StringBuilder getRoute() {
return route;
}


public void setRoute(StringBuilder route) {
this.route = route;
}

}



//这是一个工具类

import java.util.List;
import java.util.Map;
import java.util.TreeMap;


import com.paiye.common.core.amap.AmapUtil;


public class Point implements java.io.Serializable {


private static final long serialVersionUID = 1L;


private String id; // 点的id,此处为经纬度
private boolean flag = false; // 标志是否被遍历
private Map<String, Double> thisPointMap = new TreeMap<String, Double>();// 该点到各点的距离,距离单位:米


public String getId() {
return id;
}


public void setId(String id) {
this.id = id;
}


public void changeFlag() {// 修改访问状态。
this.flag = true;
}


public boolean isVisit() {// 查看访问状态
return flag;
}


public Map<String, Double> getThisPointMap() {
return thisPointMap;
}


public void setThisPointMap(Map<String, Double> thisPointMap) {
this.thisPointMap = thisPointMap;
}


// 初始化改点到各顶点的距离。
public void setDistance(List<String> points) {
for (String point : points) {
if (point.equals(getId())) {
thisPointMap.put(point, 0D);
} else {
Double distance = AmapUtil.distance(AmapUtil.pointFormatter(getId()), AmapUtil.pointFormatter(point));//这里是我上面写道的根据坐标算出导航距离
thisPointMap.put(point, distance);
}
}
}


// 该点到顶尖point id的 距离
public Double distanceToPointId(String point) {
return thisPointMap.get(point);
}
}

猜你喜欢

转载自blog.csdn.net/lx1309244704/article/details/75235016
今日推荐