我通过创建6个这样的类来做到这一点:
Parser.java:
public interface Parser { public Route parse();}XMLParser.java:public class XMLParser { // names of the XML tags protected static final String MARKERS = "markers"; protected static final String MARKER = "marker"; protected URL feedUrl; protected XMLParser(final String feedUrl) { try { this.feedUrl = new URL(feedUrl); } catch (MalformedURLException e) { //Log.e(e.getMessage(), "XML parser - " + feedUrl); } } protected InputStream getInputStream() { try { return feedUrl.openConnection().getInputStream(); } catch (IOException e) { //Log.e(e.getMessage(), "XML parser - " + feedUrl); return null; } }}Segment.java:
public class Segment { private GeoPoint start; private String instruction; private int length; private double distance; public Segment() { } public void setInstruction(final String turn) { this.instruction = turn; } public String getInstruction() { return instruction; } public void setPoint(final GeoPoint point) { start = point; } public GeoPoint startPoint() { return start; } public Segment copy() { final Segment copy = new Segment(); copy.start = start; copy.instruction = instruction; copy.length = length; copy.distance = distance; return copy; } public void setLength(final int length) { this.length = length; } public int getLength() { return length; } public void setDistance(double distance) { this.distance = distance; } public double getDistance() { return distance; }}Route.java:
public class Route { private String name; private final List<GeoPoint> points; private List<Segment> segments; private String copyright; private String warning; private String country; private int length; private String polyline; public Route() { points = new ArrayList<GeoPoint>(); segments = new ArrayList<Segment>(); } public void addPoint(final GeoPoint p) { points.add(p); } public void addPoints(final List<GeoPoint> points) { this.points.addAll(points); } public List<GeoPoint> getPoints() { return points; } public void addSegment(final Segment s) { segments.add(s); } public List<Segment> getSegments() { return segments; } public void setName(final String name) { this.name = name; } public String getName() { return name; } public void setCopyright(String copyright) { this.copyright = copyright; } public String getCopyright() { return copyright; } public void setWarning(String warning) { this.warning = warning; } public String getWarning() { return warning; } public void setCountry(String country) { this.country = country; } public String getCountry() { return country; } public void setLength(int length) { this.length = length; } public int getLength() { return length; } public void setPolyline(String polyline) { this.polyline = polyline; } public String getPolyline() { return polyline; }}GoogleParser.java:
public class GoogleParser extends XMLParser implements Parser { private int distance; public GoogleParser(String feedUrl) { super(feedUrl); } public Route parse() { // turn the stream into a string final String result = convertStreamToString(this.getInputStream()); //Create an empty route final Route route = new Route(); //Create an empty segment final Segment segment = new Segment(); try { //Tranform the string into a json object final JSonObject json = new JSonObject(result); //Get the route object final JSonObject jsonRoute = json.getJSonArray("routes").getJSonObject(0); //Get the leg, only one leg as we don't support waypoints final JSonObject leg = jsonRoute.getJSonArray("legs").getJSonObject(0); //Get the steps for this leg final JSonArray steps = leg.getJSonArray("steps"); //Number of steps for use in for loop final int numSteps = steps.length(); //Set the name of this route using the start & end addresses route.setName(leg.getString("start_address") + " to " + leg.getString("end_address")); //Get google's copyright notice (tos requirement) route.setCopyright(jsonRoute.getString("copyrights")); //Get the total length of the route. route.setLength(leg.getJSonObject("distance").getInt("value")); //Get any warnings provided (tos requirement) if (!jsonRoute.getJSonArray("warnings").isNull(0)) { route.setWarning(jsonRoute.getJSonArray("warnings").getString(0)); } for (int i = 0; i < numSteps; i++) { //Get the individual step final JSonObject step = steps.getJSonObject(i); //Get the start position for this step and set it on the segment final JSonObject start = step.getJSonObject("start_location"); final GeoPoint position = new GeoPoint((int) (start.getDouble("lat")*1E6), (int) (start.getDouble("lng")*1E6)); segment.setPoint(position); //Set the length of this segment in metres final int length = step.getJSonObject("distance").getInt("value"); distance += length; segment.setLength(length); segment.setDistance(distance/1000); //Strip html from google directions and set as turn instruction segment.setInstruction(step.getString("html_instructions").replaceAll("<(.*?)*>", "")); //Retrieve & depre this segment's polyline and add it to the route. route.addPoints(deprePolyLine(step.getJSonObject("polyline").getString("points"))); //Push a copy of the segment to the route route.addSegment(segment.copy()); } } catch (JSonException e) { Log.e(e.getMessage(), "Google JSON Parser - " + feedUrl); } return route; } private static String convertStreamToString(final InputStream input) { final BufferedReader reader = new BufferedReader(new InputStreamReader(input)); final StringBuilder sBuf = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sBuf.append(line); } } catch (IOException e) { Log.e(e.getMessage(), "Google parser, stream2string"); } finally { try { input.close(); } catch (IOException e) { Log.e(e.getMessage(), "Google parser, stream2string"); } } return sBuf.toString(); } private List<GeoPoint> deprePolyLine(final String poly) { int len = poly.length(); int index = 0; List<GeoPoint> depred = new ArrayList<GeoPoint>(); int lat = 0; int lng = 0; while (index < len) { int b; int shift = 0; int result = 0; do { b = poly.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { b = poly.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; depred.add(new GeoPoint( (int) (lat*1E6 / 1E5), (int) (lng*1E6 / 1E5))); } return depred; }}RouteOverlay.java:
public class RouteOverlay extends Overlay { private final List<GeoPoint> routePoints; private int colour; private static final int ALPHA = 120; private static final float STROKE = 4.5f; private final Path path; private final Point p; private final Paint paint; public RouteOverlay(final Route route, final int defaultColour) { super(); routePoints = route.getPoints(); colour = defaultColour; path = new Path(); p = new Point(); paint = new Paint(); } @Override public final void draw(final Canvas c, final MapView mv, final boolean shadow) { super.draw(c, mv, shadow); paint.setColor(colour); paint.setAlpha(ALPHA); paint.setAntiAlias(true); paint.setStrokeWidth(STROKE); paint.setStyle(Paint.Style.STROKE); redrawPath(mv); c.drawPath(path, paint); } public final void setColour(final int c) { colour = c; } public final void clear() { routePoints.clear(); } private void redrawPath(final MapView mv) { final Projection prj = mv.getProjection(); path.rewind(); final Iterator<GeoPoint> it = routePoints.iterator(); prj.toPixels(it.next(), p); path.moveTo(p.x, p.y); while (it.hasNext()) { prj.toPixels(it.next(), p); path.lineTo(p.x, p.y); } path.setLastPoint(p.x, p.y); }}然后,在包含地图的Activity中执行此操作:
1-添加此功能:
private Route directions(final GeoPoint start, final GeoPoint dest) { Parser parser; //https://developers.google.com/maps/documentation/directions/#JSON <- get api String jsonURL = "http://maps.googleapis.com/maps/api/directions/json?"; final StringBuffer sBuf = new StringBuffer(jsonURL); sBuf.append("origin="); sBuf.append(start.getLatitudeE6()/1E6); sBuf.append(','); sBuf.append(start.getLongitudeE6()/1E6); sBuf.append("&destination="); sBuf.append(dest.getLatitudeE6()/1E6); sBuf.append(','); sBuf.append(dest.getLongitudeE6()/1E6); sBuf.append("&sensor=true&mode=driving"); parser = new GoogleParser(sBuf.toString()); Route r = parser.parse(); return r;}2-在
onCreate()函数中添加:
MapView mapView = (MapView) findViewById(R.id.mapview); //or you can declare it directly with the API keyRoute route = directions(new GeoPoint((int)(26.2*1E6),(int)(50.6*1E6)), new GeoPoint((int)(26.3*1E6),(int)(50.7*1E6)));RouteOverlay routeOverlay = new RouteOverlay(route, Color.BLUE);mapView.getOverlays().add(routeOverlay);mapView.invalidate();
编辑:如果你遇到异常,请在中使用
directions()函数
AsyncTask以避免UI线程上的网络处理。



