栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么使用KML数据检索Android的Google Directions不再有效?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么使用KML数据检索Android的Google Directions不再有效?

我通过创建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线程上的网络处理。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431876.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号