Google Maps API版本的差异
我试图在两个地方之间显示路线,我想使用Google Places API V3进行两点之间的路线步骤。
在使用旧的Google Maps API之前 ,以下请求会给出完美的结果:
http://maps.google.com/maps?f=d&hl=en&saddr=19.5217608,-99.2615823&daddr=19.531224,-99.248262&ie=UTF8&0&om=0&output=kml
输出:
现在我尝试用新的Google Maps APIreplace这个,并且按照请求提供了错误的结果。在这两种情况下,我使用的是相同的源和目标,但结果在Google地图上给出了不同的行为:
http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false
我的问题是,新的Google Maps API在源和目的地之间返回的步数较less,因此路线在Google地图上显示效果不佳。
请帮助解决新Google Maps API v3中的这个问题。
提前致谢。
Google Map API v3有哪些新function?
Google Maps Directions API v3
for Android以Encoded Polyline Algorithm Format
提供路由。
我们必须做什么?
We must have to decode this Polyline for showing exact Map
我们如何解码Google Directions API v3提供的编码Polyline?
请使用Google Maps Directions API v3
编码Polyline返回来更清楚地引用这三个链接
- 从谷歌地图解码多义线方向api与Java
- 为Google地图编码多段线
- string的编码algorithm
如何解决上述问题?
请参考这三个答案链接,解决您的问题:
- Android – 绘制两个地点之间的路线图
- https://stackoverflow.com/a/10268114/1472665
- https://stackoverflow.com/a/11357351/1494309
我已将您的请求url粘贴到正在使用较新版本的应用程序中,并且效果很好。 问题可能在于如何parsing数据或解码接收到的JSONstring。
String url = "http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false"; HttpPost httppost = new HttpPost(url); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); InputStream is = null; is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); sb.append(reader.readLine() + "\n"); String line = "0"; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); reader.close(); String result = sb.toString(); JSONObject jsonObject = new JSONObject(result); JSONArray routeArray = jsonObject.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject overviewPolylines = routes.getJSONObject("overview_polyline"); String encodedString = overviewPolylines.getString("points"); List<GeoPoint> pointToDraw = decodePoly(encodedString); //Added line: mapView.getOverlays().add(new RoutePathOverlay(pointToDraw));
decodePoly()
方法是从另一个问题在这里采取的,我不记得作者:
private List<GeoPoint> decodePoly(String encoded) { List<GeoPoint> poly = new ArrayList<GeoPoint>(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.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 = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6)); poly.add(p); } return poly; }
我包括我用来添加叠加到地图本身,我无法find它的教程来自.. ..抱歉不给信用。 (在我发布的第一个方法中添加了对此的调用)
public class RoutePathOverlay extends Overlay { private int _pathColor; private final List<GeoPoint> _points; private boolean _drawStartEnd; public RoutePathOverlay(List<GeoPoint> points) { this(points, Color.RED, true); } public RoutePathOverlay(List<GeoPoint> points, int pathColor, boolean drawStartEnd) { _points = points; _pathColor = pathColor; _drawStartEnd = drawStartEnd; } private void drawOval(Canvas canvas, Paint paint, Point point) { Paint ovalPaint = new Paint(paint); ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE); ovalPaint.setStrokeWidth(2); int _radius = 6; RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius); canvas.drawOval(oval, ovalPaint); } public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { Projection projection = mapView.getProjection(); if (shadow == false && _points != null) { Point startPoint = null, endPoint = null; Path path = new Path(); //We are creating the path for (int i = 0; i < _points.size(); i++) { GeoPoint gPointA = _points.get(i); Point pointA = new Point(); projection.toPixels(gPointA, pointA); if (i == 0) { //This is the start point startPoint = pointA; path.moveTo(pointA.x, pointA.y); } else { if (i == _points.size() - 1)//This is the end point endPoint = pointA; path.lineTo(pointA.x, pointA.y); } } Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(_pathColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); paint.setAlpha(90); if (getDrawStartEnd()) { if (startPoint != null) { drawOval(canvas, paint, startPoint); } if (endPoint != null) { drawOval(canvas, paint, endPoint); } } if (!path.isEmpty()) canvas.drawPath(path, paint); } return super.draw(canvas, mapView, shadow, when); } public boolean getDrawStartEnd() { return _drawStartEnd; } public void setDrawStartEnd(boolean markStartEnd) { _drawStartEnd = markStartEnd; } }
希望这对你有用。
您没有使用结果中返回的所有点。 你还没有提供你的代码,但是这里是一个v3 API的例子 ,显示了与你的“google maps”例子相同的path。
请检查这个链接..
并指定旅行模式
-- driving -- walking -- bicycling -- transit
所以你得到不同的结果。
请尝试一下。
关于GeoPoint没有解决,我只是把所有GeoPoint的发生改为LatLng,一切正常。
以上https://stackoverflow.com/users/975959/la-bla-bla发布的解决scheme在Google Maps API V2中运行良好,但需要稍作修改:
用LatLng代替所有的GeoPoint。
更换线路:
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
它位于decodePoly方法结束之前,用下面这行代码:
LatLng p = new LatLng(lat / 1E5, lng / 1E5);
希望这适用于Google Maps API v2用户。
我使用了“La bla bla”给出的解决scheme,但是我做了一些小的修改。 我有一个问题显示path,当我有太多的点,当你放大太多,路线不再显示,你得到这个消息在logcat“形状path太大,无法渲染成纹理”。
我所做的就是以如下方式细分path:
if (shadow == false && _points != null) { Path path = new Path();; //We are creating the path Point pointA = new Point(); for (int i = 0; i < _points.size(); i++) { mapView.getProjection().toPixels(_points.get(i), pointA); if (i == 0) path.moveTo(pointA.x, pointA.y); else path.lineTo(pointA.x, pointA.y); if(i%10==0 || i == _points.size()-1){ Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(_pathColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeWidth(mapView.getZoomLevel()-10); paint.setAlpha(200); if (!path.isEmpty()) canvas.drawPath(path, paint); path = new Path(); path.moveTo(pointA.x, pointA.y); } } }
我每10个点制作一个path,效率可能会降低,但是这种方式可以在缩放比例较高时显示path。
@ Ghareeb-Strange-但是为什么我们需要API v2? 我的意思是,我们有折线,使得它更容易。
private void drawPath(){ PolylineOptions options = new PolylineOptions(); options.width(4); options.color(Color.RED); for(int i = 0; i< pathList.size(); i++ ){ options.add(pathList.get(i)); } map.addPolyline(options); }
像上面贴出的代码一样,你将有完美的绘制在你的应用程序的path。
pathList是包含我们path的所有点的列表。
干杯!
似乎有足够的答案,但对于这个问题,我受益于这个环节 。 但是,当我下载和导入时,它不工作。 所以我实现了我自己的应用程序。 代码中有一个错误。 当你想第二次计算路线,应用程序。 rest。
if (mMarkerPoints.size() > 1) { mMarkerPoints.clear(); map.clear(); // LatLng startPoint = new LatLng(nearbyLatitude, // nearbyLongitude); // drawMarker(startPoint); }
find这些线,并做出评论,因为我已经做了。 无论如何,实际上你要求画一条不是完整的代码的路线,所以你可以检查该网站上的代码。 绘制点(标记)之间的路线很好。 祝你有美好的一天。
- 如何将文件写入资产文件夹或在android的原始文件夹?
- 清单合并失败:uses-sdk:minSdkVersion 14
- android.util.AndroidRuntimeException:在添加内容之前必须调用requestFeature()
- 未安装HAX内核模块
- Google地图在Android中签署api重要错误
- 具有自定义布局和EditText的AlertDialog.Builder; 无法访问视图
- 如何在Nexus 4上find并打开USBdebugging模式
- 如何使我的ViewPager一次只加载一个页面,即setOffscreenPageLimit(0);
- Android的Python编程