// TODO : need to fix turn by turn ramp public static String turnByTurn(ArrayList<Long> pathNodeList) { String turnByTurnText = ""; int prevHierarchy = -1; int prevDirIndex = -1; String prevName = ""; long distance = 0; boolean firstRoute = true; NodeInfo prevNodeInfo = null; if (pathNodeList == null || pathNodeList.size() == 0) { return getErrorText() + OSMParam.LINEEND; } for (long nodeId : pathNodeList) { if (prevNodeInfo == null) { prevNodeInfo = OSMData.nodeHashMap.get(nodeId); continue; } NodeInfo nodeInfo = OSMData.nodeHashMap.get(nodeId); EdgeInfo edge = prevNodeInfo.getEdgeFromNodes(nodeInfo); String highway = edge.getHighway(); String name = edge.getName(); int hierarchy = 6; if (OSMData.hierarchyHashMap.containsKey(highway)) { hierarchy = OSMData.hierarchyHashMap.get(highway); } int dirIndex = Geometry.getDirectionIndex(prevNodeInfo.getLocation(), nodeInfo.getLocation()); // initial prev if (prevHierarchy == -1) { prevHierarchy = hierarchy; prevDirIndex = dirIndex; prevName = name; } if (prevHierarchy > 1 && hierarchy == 1) { // from arterial to highway if (firstRoute) { // first route message turnByTurnText = getFirstRouteText(prevDirIndex, prevName, name) + OSMParam.LINEEND; firstRoute = false; } // distance message turnByTurnText += getDistanceText(distance) + OSMParam.LINEEND; turnByTurnText += getRampText(name) + OSMParam.LINEEND; distance = 0; } else if (prevHierarchy == 1 && hierarchy > 1) { // from highway to arterial if (firstRoute) { // first route message turnByTurnText = getFirstRouteText(prevDirIndex, prevName, name) + OSMParam.LINEEND; firstRoute = false; } // distance message turnByTurnText += getDistanceText(distance) + OSMParam.LINEEND; turnByTurnText += getExitText(name) + OSMParam.LINEEND; distance = 0; } else if (prevHierarchy == 1 && hierarchy == 1) { // on the highway if (!prevName.equals(name)) { // change highway if (firstRoute) { // first route message turnByTurnText = getFirstRouteText(prevDirIndex, prevName, name) + OSMParam.LINEEND; firstRoute = false; } // distance message turnByTurnText += getDistanceText(distance) + OSMParam.LINEEND; turnByTurnText += getExitText(name) + OSMParam.LINEEND; distance = 0; } } else { // on the arterial // change direction or road happen if (!Geometry.isSameDirection(dirIndex, prevDirIndex) || !prevName.equals(name)) { if (firstRoute) { // first route message turnByTurnText = getFirstRouteText(prevDirIndex, prevName, name) + OSMParam.LINEEND; firstRoute = false; } // distance message turnByTurnText += getDistanceText(distance) + OSMParam.LINEEND; if (!Geometry.isSameDirection(dirIndex, prevDirIndex)) { // change direction turnByTurnText += getTurnText(prevDirIndex, dirIndex, prevName, name) + OSMParam.LINEEND; } else { // change road turnByTurnText += getMergeText(name) + OSMParam.LINEEND; } distance = 0; } } prevNodeInfo = nodeInfo; prevHierarchy = hierarchy; prevDirIndex = dirIndex; prevName = name; distance += edge.getDistance(); } // distance message turnByTurnText += getDistanceText(distance) + OSMParam.LINEEND; turnByTurnText += getArriveText() + OSMParam.LINEEND; return turnByTurnText; }