谷歌地图API版本的区别谷歌地图API版本的区别(Google Maps API Version d

2019-06-14 14:18发布

我想两地之间的路径显示,我想使用谷歌Places API的V3两点之间的路径步骤。


我用的是之前旧的谷歌地图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

输出:


现在,我尝试用新的谷歌地图API来代替这一点,下面的请求给出错误的结果,在这两种情况下,我使用相同的源和目的,但结果让谷歌地图上不同的行为:

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

我的问题是,新的谷歌地图API返回更少的源和目的地之间的步数,因此不会显示在谷歌地图完美的路线。

请帮助解决这个问题,新谷歌地图API第3版。

提前致谢。

Answer 1:

什么在谷歌地图API第3版的新功能?
Google Maps Directions API v3为Android提供的路线Encoded Polyline Algorithm Format

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

我们如何解码由谷歌地图API V3提供了这个编码折线?
请参考这三个环节,以更加清晰与编码折线返回Google Maps Directions API v3

  • 从谷歌解码折线方向API映射用java
  • 编码折线谷歌地图
  • 对于水平串编码算法

我们怎样才能解决上述问题的问题吗?
请参考这三个答案的链接,可以解决你的问题:

  • Android的-两个geopoints之间绘制路线图
  • https://stackoverflow.com/a/10268114/1472665
  • https://stackoverflow.com/a/11357351/1494309


Answer 2:

我已经采取了你的请求的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;
    }
}

希望这对你的作品。



Answer 3:

您没有使用结果中返回的所有问题。 您没有提供您的代码,但在这里是第3版API的例子 ,显示为您的“谷歌地图”的例子返回相同的路径。



Answer 4:

请检查此链接..

并指定出行方式

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

所以你得到不同的结果。

请尝试。



Answer 5:

至于被GeoPoint的未解决的,我刚换的GeoPoint的所有occurances以经纬度和一切工作。



Answer 6:

发表上述解决方案https://stackoverflow.com/users/975959/la-bla-bla的作品非常好与谷歌地图API V2,但它需要一些小的修改:
GeoPoint对象的所有事件与经纬度更换。
将行:

GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));

正好位于该方法decodePoly结束前,这条线:

LatLng p = new LatLng(lat / 1E5, lng / 1E5);

希望这适用于谷歌地图API V2的用户。



Answer 7:

我曾经给出“香格里拉喇嘛喇嘛”的解决方案,但我做了一些小的修改。 我有显示路径的问题时,我有太多的分,当你放大太多,不再被显示的路线,你会得到在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分的路径,也可以是低效率的,但这样一来就可以显示路径时的变焦时的高值。



Answer 8:

@ Ghareeb-Strange-但是为什么我们需要与API第2? 我的意思是,我们有折线,使得它更加的方式更容易。

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

随着像你上面贴的代码将有路径在您的应用程序完美drawed。

pathlist是包含我们的道路的所有点的列表。

干杯!



Answer 9:

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

    if (mMarkerPoints.size() > 1) {

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

查找线路和提出意见,因为我已经做了。 不管怎么说,其实你的要求画的路线不完整的代码,这样你就可以在该网址校验码。 这是擅长对点(标记)之间绘制路线。 祝你有美好的一天。



文章来源: Google Maps API Version difference