//这只是适合单源节点,如有不懂原理的可以先参考以下链接的文章
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);
}
}