18

2 地点間のルートを表示しようとしています。2 地点間のルート ステップに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 マップで異なる動作をします:

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

新しい Google マップ API

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

新しい 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 v3Android の場合、 でルートを提供します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 つの回答リンクを参照してください。

于 2012-07-07T18:11:39.917 に答える
3

結果で返されたすべてのポイントを使用していません。コードを提供していませんが、「google maps」の例で返されるパスと同じパスを示す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

十分な答えがあるようですが、この件に関しては、このリンクにメリットがあります。しかし、ダウンロードしてインポートすると機能しませんでした。だから私は自分のアプリケーションに実装しました。そして、そのコードには誤りがあります。ルートを再計算したい時はアプリ。壊れます。

    if (mMarkerPoints.size() > 1) {

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

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

于 2015-06-02T14:52:35.970 に答える
0

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

これが Google Maps API v2 ユーザーに役立つことを願っています。

于 2013-05-17T08:24:02.340 に答える
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 に答える