web-dev-qa-db-ja.com

Google MapsAPIのバージョンの違い

2つの場所の間のルートを表示しようとしていますが、2つのポイント間のルートステップに Google Places API V を使用したいと思います。


私が使用する前に 古い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

出力:

Old Google Maps API


今、これを新しいGoogle Maps APIに置き換えようとすると、次のリクエストで間違った結果が得られます。どちらの場合も、同じソースと宛先を使用していますが、結果はGoogleMapで異なる動作を示します。

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

New Google Maps API

私の問題は、新しいGoogle Maps APIがソースと宛先の間で返すステップ数が少ないため、ルートがGoogleMapで完全に表示されないことです。

新しいGoogleMaps APIv3のこの問題の解決にご協力ください。

前もって感謝します。

18
Dipali

Google Map API v3の新機能
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によって提供されるこのエンコードされたポリラインをどのようにデコードしますか?
これらの3つのリンクを参照して、Google Maps Directions API v3からのエンコードされたポリラインリターンをより明確にしてください。

上記の質問の問題をどのように解決できますか?
問題を解決する次の3つの回答リンクを参照してください。

16
Hitesh Patel

リクエストのURLを取得して、新しいバージョンを使用しているアプリに貼り付けました。これは問題なく機能します。問題は、データを解析する方法、または受信したJSON文字列をデコードする方法にある可能性があります。 enter image description here

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

これがあなたのために働くことを願っています。

21
La bla bla

結果で返されたすべてのポイントを使用しているわけではありません。コードを提供していませんが、 これはv3 APIの例です 「googlemaps」の例で返されるパスと同じパスを示しています。

3
geocodezip

これを確認してください リンク..

そして指定旅行モード

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

したがって、異なる結果が得られます。

ぜひお試しください。

1
Nikhil

GeoPointが未解決であるという点で、GeoPointのすべてのオカレンスをLatLngに変更したところ、すべてが機能しました。

0
user330844

十分な答えがあるようですが、この主題については、私はこれに利益をもたらします リンク 。しかし、ダウンロードしてインポートしたときに機能しませんでした。だから私は自分のアプリケーションに実装しました。そして、そのコードには間違いがあります。もう一度ルートを計算したいときは、アプリ。休憩。

    if (mMarkerPoints.size() > 1) {

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

その行を見つけて、私がしたようにコメントをしてください。とにかく、実際にはコード全体ではなくルートを描くように依頼したので、そのWebサイトでコードを確認できます。ポイント(マーカー)までのルートを描くのが得意です。良い一日を過ごしてください。

0
Ensar

「Lablabla」のソリューションを使用しましたが、少し変更を加えました。ポイントが多すぎるとパスの表示に問題がありました。ズームインしすぎるとルートが表示されなくなり、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ポイントごとにパスを作成します。効率が低下する可能性がありますが、この方法では、ズームが高い値のときにパスを表示できます。

0
ivanhoe_gg

https://stackoverflow.com/users/975959/la-bla-bla によって投稿された上記のソリューションは、Google Maps API V2で非常にうまく機能しますが、いくつかの小さな変更が必要です。
GeoPointのすべての出現箇所をLatLngに置き換えます。
次の行を置き換えます。

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

これは、decodePolyメソッドの終わりの直前にあります。次の行があります。

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

これがGoogleMaps APIv2ユーザーで機能することを願っています。

0
Ghareeb Falazi

@ Gareeeb-奇妙な-しかし、なぜ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は、パスのすべてのポイントを含むリストです。

乾杯!

0
ivanhoe_gg