18

我正在尝试显示两个地方之间的路线,我想使用Google Places API V3来执行两点之间的路线步骤。


在我使用Old 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 地图 API


现在我尝试用新的 Google Maps API 替换它,并且以下请求给出了错误的结果,在这两种情况下我都使用相同的源和目标,但结果在 Google Map 上给出了不同的行为:

http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false

新的谷歌地图 API

我的问题是,新的 Google Maps API 在源和目的地之间返回的步骤数较少,因此该路线在 Google Map 上显示不完美。

请帮助为新的 Google Maps API v3 解决此问题。

提前致谢。

4

9 回答 9

21

我已获取您的请求 URL 并将其粘贴到我的应用程序中,该应用程序使用的是较新版本,并且效果很好。问题可能在于您如何解析数据或解码接收到的 JSON 字符串。 在此处输入图像描述

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()方法取自SO中的另一个问题,我不记得作者:

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;
}

我还包括了我用来将叠加层添加到地图本身的内容,我找不到它的教程......抱歉没有给予信任。(在我发布的第一个方法中添加了对此的调用)

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;
    }
}

希望这对你有用。

于 2012-07-06T06:59:10.580 回答
17

Google Map API v3 有哪些新功能?
Google Maps Directions API v3对于 Android 在Encoded Polyline Algorithm Format.

我们必须做什么?
We must have to decode this Polyline for showing exact Map

我们如何解码由 Google Directions API v3 提供的编码折线?
请参考这三个链接以更清楚地了解编码的折线返回Google Maps Directions API v3

我们如何解决上述问题中的问题?
请参考这三个答案链接,可以解决您的问题:

于 2012-07-07T18:11:39.917 回答
3

您没有使用结果中返回的所有点。您尚未提供代码,但这里有一个 v3 API 示例,显示的路径与您的“谷歌地图”示例返回的路径相同。

于 2012-07-06T06:55:51.910 回答
1

请检查此链接..

并指定出行方式

-- driving
-- walking 
-- bicycling 
-- transit 

所以你会得到不同的结果。

请尝试一下。

于 2012-07-06T06:52:43.073 回答
0

关于 GeoPoint 未解决,我只是将 GeoPoint 的所有出现更改为 LatLng 并且一切正常。

于 2012-12-13T15:34:29.573 回答
0

上面由https://stackoverflow.com/users/975959/la-bla-bla发布的解决方案与 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 用户。

于 2013-05-17T08:24:02.340 回答
0

我使用了“La bla bla”给出的解决方案,但我做了一些小的修改。当我有太多点时,我在显示路径时遇到问题,当你放大太多时,路线不再显示,并且你在 logcat 中收到此消息“形状路径太大而无法渲染为纹理”。

我所做的是按以下方式细分路径:

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 个点制作一次路径,效率可能会降低,但是这样可以在缩放值较高时显示路径。

于 2013-06-05T15:19:00.040 回答
0

@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);
    }

使用上面发布的代码之类的东西,您将在您的应用程序中完美地绘制路径。

pathList 是一个包含我们路径的所有点的列表。

干杯!

于 2013-06-06T23:18:09.193 回答
0

似乎有足够的答案,但对于这个主题,我受益于这个链接。但是当我下载并导入时它不起作用。所以我在自己的应用程序上实现了。该代码中有一个错误。当您想第二次计算路线时,应用程序。休息。

    if (mMarkerPoints.size() > 1) {

                mMarkerPoints.clear();
                map.clear();
                // LatLng startPoint = new LatLng(nearbyLatitude,
                // nearbyLongitude);
                // drawMarker(startPoint);
            }

找到那几行并像我一样发表评论。无论如何,实际上您要求绘制一条路线而不是整个代码,因此您可以在该网站上查看代码。擅长在点(标记)之间绘制路线。祝你有美好的一天。

于 2015-06-02T14:52:35.970 回答