Google Maps API 版本差异

Posted

技术标签:

【中文标题】Google Maps API 版本差异【英文标题】:Google Maps API Version difference 【发布时间】:2012-07-04 15:04: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 Maps API 替换它,并且以下请求给出了错误的结果,在这两种情况下我都使用相同的源和目的地,但结果在 Google Map 上给出了不同的行为:

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

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

请帮助解决新的 Google Maps API v3 的这个问题。

提前致谢。

【问题讨论】:

【参考方案1】:

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

    if (mMarkerPoints.size() > 1) 

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

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

【讨论】:

【参考方案2】:

@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 是一个包含路径所有点的 List。

干杯!

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

https://***.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 用户。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

请查看link..

并指定出行方式

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

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

请尝试一下。

【讨论】:

【参考方案7】:

Google Map API v3 有哪些新功能?androidGoogle Maps Directions API v3Encoded Polyline Algorithm Format 中提供路线。

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

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

Decoding polylines from google maps direction api with java Encoding polylines for Google Maps The encoding algorithm for the levels string

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

Android - Draw route map between two geopoints https://***.com/a/10268114/1472665 https://***.com/a/11357351/1494309

【讨论】:

【参考方案8】:

我已获取您的请求 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;
    

希望这对你有用。

【讨论】:

我使用这个答案将 kml 解析更改为 json 解析。谢谢你,很好的答案。 GeoPoint 无法解析为 java 中的类型。我的项目不是 Android.Normal Java 项目。如何导入 GeoPoint 库。请告诉我? 我正在用 nw map api 尝试这段代码,但我没有得到 mapView.getOverlays() 这个方法..你能帮忙吗? 听起来你的问题比我写的要基本得多。先按照这个教程developers.google.com/maps/documentation/android/v1/…,它可能会帮助你解决这个问题【参考方案9】:

您没有使用结果中返回的所有点。您尚未提供代码,但 here is an example with the v3 API 显示的路径与您的“谷歌地图”示例返回的路径相同。

【讨论】:

以上是关于Google Maps API 版本差异的主要内容,如果未能解决你的问题,请参考以下文章

一个好用的字符过滤,差异匹配补丁的扩展库,各语言版本

最新版本的 Safari(Windows)与 Safari(MAC)、Google Chrome(Mac)与 Google Chrome(Windows)之间的渲染差异是啥?

Google Maps API 密钥在侧面加载时在发布版本中有效,在发布时无效

如果指定了邮政地址,如何为 Google Maps JavaScript API 版本 3 设置正确的标题?

广播接收者的特点和版本差异

Google Analytics API 收入差异