Back to project page smartnavi.
The source code is released under:
Apache License
If you think the Android project smartnavi listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package org.osmdroid.bonuspack.routing; //from w w w . j a v a 2 s .c o m import android.util.Log; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.osmdroid.bonuspack.utils.BonusPackHelper; import org.osmdroid.bonuspack.utils.HttpConnection; import org.osmdroid.bonuspack.utils.PolylineEncoder; import org.osmdroid.util.BoundingBoxE6; import org.osmdroid.util.GeoPoint; import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; /** * get a route between a start and a destination point. * It uses OSRM, a free open source routing service based on OpenSteetMap data. <br> * See https://github.com/DennisOSRM/Project-OSRM/wiki/Server-api<br> * <p/> * It requests by default the OSRM demo site. * Use setService() to request an other (for instance your own) OSRM service. <br> * TODO: improve internationalization of instructions * * @author M.Kergall */ public class OSRMRoadManager extends RoadManager { static final String OSRM_SERVICE = "http://router.project-osrm.org/viaroute?"; //Note that the result of OSRM is quite close to Cloudmade NavEngine format: //http://developers.cloudmade.com/wiki/navengine/JSON_format /** * mapping from OSRM directions to MapQuest maneuver IDs: */ static final HashMap<String, Integer> MANEUVERS; static { MANEUVERS = new HashMap<String, Integer>(); MANEUVERS.put("0", 0); //No instruction MANEUVERS.put("1", 1); //Continue MANEUVERS.put("2", 6); //Slight right MANEUVERS.put("3", 7); //Right MANEUVERS.put("4", 8); //Sharp right MANEUVERS.put("5", 12); //U-turn MANEUVERS.put("6", 5); //Sharp left MANEUVERS.put("7", 4); //Left MANEUVERS.put("8", 3); //Slight left MANEUVERS.put("9", 24); //Arrived (at waypoint) MANEUVERS.put("10", 24); //"Head" => used by OSRM as the start node. Considered here as a "waypoint". MANEUVERS.put("11-1", 27); //Round-about, 1st exit MANEUVERS.put("11-2", 28); //2nd exit, etc ... MANEUVERS.put("11-3", 29); MANEUVERS.put("11-4", 30); MANEUVERS.put("11-5", 31); MANEUVERS.put("11-6", 32); MANEUVERS.put("11-7", 33); MANEUVERS.put("11-8", 34); //Round-about, 8th exit MANEUVERS.put("15", 24); //Arrived } //From: Project-OSRM-Web / WebContent / localization / OSRM.Locale.en.js // driving directions // %s: road name // %d: direction => removed // <*>: will only be printed when there actually is a road name static final HashMap<String, Object> DIRECTIONS; static { DIRECTIONS = new HashMap<String, Object>(); HashMap<String, String> directions; directions = new HashMap<String, String>(); DIRECTIONS.put("en", directions); directions.put("0", "Unknown instruction< on %s>"); directions.put("1", "Continue< on %s>"); directions.put("2", "Turn slight right< on %s>"); directions.put("3", "Turn right< on %s>"); directions.put("4", "Turn sharp right< on %s>"); directions.put("5", "U-Turn< on %s>"); directions.put("6", "Turn sharp left< on %s>"); directions.put("7", "Turn left< on %s>"); directions.put("8", "Turn slight left< on %s>"); directions.put("9", "You have reached a waypoint of your trip"); directions.put("10", "<Go on %s>"); directions.put("11-1", "Enter roundabout and leave at first exit< on %s>"); directions.put("11-2", "Enter roundabout and leave at second exit< on %s>"); directions.put("11-3", "Enter roundabout and leave at third exit< on %s>"); directions.put("11-4", "Enter roundabout and leave at fourth exit< on %s>"); directions.put("11-5", "Enter roundabout and leave at fifth exit< on %s>"); directions.put("11-6", "Enter roundabout and leave at sixth exit< on %s>"); directions.put("11-7", "Enter roundabout and leave at seventh exit< on %s>"); directions.put("11-8", "Enter roundabout and leave at eighth exit< on %s>"); directions.put("11-9", "Enter roundabout and leave at nineth exit< on %s>"); directions.put("15", "You have reached your destination"); directions = new HashMap<String, String>(); DIRECTIONS.put("fr", directions); directions.put("0", "Instruction inconnue< sur %s>"); directions.put("1", "Continuez< sur %s>"); directions.put("2", "Tournez lgrement droite< sur %s>"); directions.put("3", "Tournez droite< sur %s>"); directions.put("4", "Tournez fortement droite< sur %s>"); directions.put("5", "Faites demi-tour< sur %s>"); directions.put("6", "Tournez fortement gauche< sur %s>"); directions.put("7", "Tournez gauche< sur %s>"); directions.put("8", "Tournez lgrement gauche< sur %s>"); directions.put("9", "Vous tes arriv une tape de votre voyage"); directions.put("10", "<Prenez %s>"); directions.put("11-1", "Au rond-point, prenez la premire sortie< sur %s>"); directions.put("11-2", "Au rond-point, prenez la deuxime sortie< sur %s>"); directions.put("11-3", "Au rond-point, prenez la troisime sortie< sur %s>"); directions.put("11-4", "Au rond-point, prenez la quatrime sortie< sur %s>"); directions.put("11-5", "Au rond-point, prenez la cinquime sortie< sur %s>"); directions.put("11-6", "Au rond-point, prenez la sixime sortie< sur %s>"); directions.put("11-7", "Au rond-point, prenez la septime sortie< sur %s>"); directions.put("11-8", "Au rond-point, prenez la huitime sortie< sur %s>"); directions.put("11-9", "Au rond-point, prenez la neuvime sortie< sur %s>"); directions.put("15", "Vous tes arriv"); directions = new HashMap<String, String>(); DIRECTIONS.put("pl", directions); directions.put("0", "Nieznana instrukcja<w %s>"); directions.put("1", "Kontynuuj jazd?<na %s>"); directions.put("2", "Skr?? lekko w prawo<w %s>"); directions.put("3", "Skr?? w prawo<w %s>"); directions.put("4", "Skr?? ostro w prawo<w %s>"); directions.put("5", "Zawr?<na %s>"); directions.put("6", "Skr?? ostro w lewo<w %s>"); directions.put("7", "Skr?? w lewo<w %s>"); directions.put("8", "Skr?? lekko w lewo<w %s>"); directions.put("9", "Dotar?e? do punktu po?redniego"); directions.put("10", "<Jed? %s>"); directions.put("11-1", "Wjed? na rondo i opu?? je pierwszym zjazdem<w %s>"); directions.put("11-2", "Wjed? na rondo i opu?? je drugim zjazdem<w %s>"); directions.put("11-3", "Wjed? na rondo i opu?? je trzecim zjazdem<w %s>"); directions.put("11-4", "Wjed? na rondo i opu?? je czwartym zjazdem<w %s>"); directions.put("11-5", "Wjed? na rondo i opu?? je pi?tym zjazdem<w %s>"); directions.put("11-6", "Wjed? na rondo i opu?? je szstym zjazdem<w %s>"); directions.put("11-7", "Wjed? na rondo i opu?? je sidmym zjazdem<w %s>"); directions.put("11-8", "Wjed? na rondo i opu?? je smym zjazdem<w %s>"); directions.put("11-9", "Wjed? na rondo i opu?? je dziewi?tym zjazdem<w %s>"); directions.put("15", "Dotar?e? do celu podr?y"); directions = new HashMap<String, String>(); DIRECTIONS.put("de", directions); directions.put("0", "Unbekannte Instruktion< auf %s>"); directions.put("1", "Bleiben Sie< auf %s>"); directions.put("2", "Biegen Sie leicht rechts ab< auf %s>"); directions.put("3", "Biegen Sie rechts ab< auf %s>"); directions.put("4", "Biegen Sie scharf rechts ab< auf %s>"); directions.put("5", "Bitte wenden< auf %s>"); directions.put("6", "Biegen Sie scharf links ab< auf %s>"); directions.put("7", "Biegen Sie links ab< auf %s>"); directions.put("8", "Biegen Sie leicht links ab< auf %s>"); directions.put("9", "Sie haben einen Wegpunkt ihrer Reise erreicht"); directions.put("10", "<Begeben Sie sich auf %s>"); directions.put("11-1", "Begeben Sie sich in den Kreisverkehr und nehmen die erste Ausfahrt< auf %s>"); directions.put("11-2", "Begeben Sie sich in den Kreisverkehr und nehmen die zweite Ausfahrt< auf %s>"); directions.put("11-3", "Begeben Sie sich in den Kreisverkehr und nehmen die dritte Ausfahrt< auf %s>"); directions.put("11-4", "Begeben Sie sich in den Kreisverkehr und nehmen die vierte Ausfahrt< auf %s>"); directions.put("11-5", "Begeben Sie sich in den Kreisverkehr und nehmen die fnfte Ausfahrt< auf %s>"); directions.put("11-6", "Begeben Sie sich in den Kreisverkehr und nehmen die sechste Ausfahrt< auf %s>"); directions.put("11-7", "Begeben Sie sich in den Kreisverkehr und nehmen die siebente Ausfahrt< auf %s>"); directions.put("11-8", "Begeben Sie sich in den Kreisverkehr und nehmen die achte Ausfahrt< auf %s>"); directions.put("11-9", "Begeben Sie sich in den Kreisverkehr und nehmen die neunte Ausfahrt< auf %s>"); directions.put("15", "Sie haben ihr Ziel erreicht"); } protected String mServiceUrl; protected String mUserAgent; public OSRMRoadManager() { super(); mServiceUrl = OSRM_SERVICE; mUserAgent = BonusPackHelper.DEFAULT_USER_AGENT; //set user agent to the default one. } /** * allows to request on an other site than OSRM demo site */ public void setService(String serviceUrl) { mServiceUrl = serviceUrl; } /** * allows to send to OSRM service a user agent specific to the app, * instead of the default user agent of OSMBonusPack lib. */ public void setUserAgent(String userAgent) { mUserAgent = userAgent; } protected String getUrl(ArrayList<GeoPoint> waypoints) { StringBuffer urlString = new StringBuffer(mServiceUrl); for (int i = 0; i < waypoints.size(); i++) { GeoPoint p = waypoints.get(i); urlString.append("&loc=" + geoPointAsString(p)); } urlString.append("&instructions=true&alt=false"); urlString.append(mOptions); return urlString.toString(); } @Override public Road getRoad(ArrayList<GeoPoint> waypoints) { String url = getUrl(waypoints); Log.d(BonusPackHelper.LOG_TAG, "OSRMRoadManager.getRoad:" + url); //String jString = BonusPackHelper.requestStringFromUrl(url); HttpConnection connection = new HttpConnection(); connection.setUserAgent(mUserAgent); connection.doGet(url); String jString = connection.getContentAsString(); connection.close(); if (jString == null) { Log.e(BonusPackHelper.LOG_TAG, "OSRMRoadManager::getRoad: request failed."); return new Road(waypoints); } Locale l = Locale.getDefault(); HashMap<String, String> directions = (HashMap<String, String>) DIRECTIONS.get(l.getLanguage()); if (directions == null) directions = (HashMap<String, String>) DIRECTIONS.get("en"); Road road = new Road(); try { JSONObject jObject = new JSONObject(jString); road.mStatus = jObject.getInt("status"); String route_geometry = jObject.getString("route_geometry"); road.mRouteHigh = PolylineEncoder.decode(route_geometry, 1); JSONArray jInstructions = jObject.getJSONArray("route_instructions"); int n = jInstructions.length(); RoadNode lastNode = null; for (int i = 0; i < n; i++) { JSONArray jInstruction = jInstructions.getJSONArray(i); RoadNode node = new RoadNode(); int positionIndex = jInstruction.getInt(3); node.mLocation = road.mRouteHigh.get(positionIndex); node.mLength = jInstruction.getInt(2) / 1000.0; node.mDuration = jInstruction.getInt(4); //Segment duration in seconds. String direction = jInstruction.getString(0); String roadName = jInstruction.getString(1); if (lastNode != null && "1".equals(direction) && "".equals(roadName)) { //node "Continue" with no road name is useless, don't add it lastNode.mLength += node.mLength; lastNode.mDuration += node.mDuration; } else { node.mManeuverType = getManeuverCode(direction); node.mInstructions = buildInstructions(direction, roadName, directions); //Log.d(BonusPackHelper.LOG_TAG, direction+"=>"+node.mManeuverType+"; "+node.mInstructions); road.mNodes.add(node); lastNode = node; } } JSONObject jSummary = jObject.getJSONObject("route_summary"); road.mLength = jSummary.getInt("total_distance") / 1000.0; road.mDuration = jSummary.getInt("total_time"); } catch (JSONException e) { e.printStackTrace(); } if (road.mStatus != Road.STATUS_OK) { //Create default road: int status = road.mStatus; road = new Road(waypoints); road.mStatus = status; } else { road.buildLegs(waypoints); road.mBoundingBox = BoundingBoxE6.fromGeoPoints(road.mRouteHigh); road.mStatus = Road.STATUS_OK; } Log.d(BonusPackHelper.LOG_TAG, "OSRMRoadManager.getRoad - finished"); return road; } protected int getManeuverCode(String direction) { Integer code = MANEUVERS.get(direction); if (code != null) return code; else return 0; } protected String buildInstructions(String direction, String roadName, HashMap<String, String> directions) { if (directions == null) return null; direction = directions.get(direction); if (direction == null) return null; String instructions = null; if (roadName.equals("")) //remove "<*>" instructions = direction.replaceFirst("<[^>]*>", ""); else { direction = direction.replace('<', ' '); direction = direction.replace('>', ' '); instructions = String.format(direction, roadName); } return instructions; } }