web-dev-qa-db-ja.com

Google Map API v2で道路の方向を表示する方法はありますか?

私はグーグルとここを使用して答えを探していました、そして私が見つけた唯一の関連する投稿は:

GoogleマップAndroid V2およびDirection API

Google Maps API v2を使用して運転ルートを取得

しかし、答えはありません。既に述べましたが、もう一度言います。 FragmentActivityとSupportMagFragmentおよびLatLngオブジェクトを使用し、MapView、MapActivity、およびGeoPointを使用しない、Google Map API v2のソリューションを探しています。

さらに、使用するオーバーレイオブジェクトがないため、マップ上の方向をペイントできません。代わりの方法はありますか?

それを行う方法はありますか?

11
Emil Adz

この解決策を試してください ここ 。 V2で運転または徒歩の方向を取得できます。

8
Akexorcist

オーバーレイは確かに忘れてしまうものです。

ポリラインは簡単に描くことができます

https://developers.google.com/maps/documentation/Android/lines#add_a_polyline

JSON応答を解析した後、ポイントをループするだけです。

PolylineOptions rectOptions = new PolylineOptions()
        .add(new LatLng(37.35, -122.0))
        .add(new LatLng(37.45, -122.0))  // North of the previous point, but at the same longitude
        .add(new LatLng(37.45, -122.2))  // Same latitude, and 30km to the west
        .add(new LatLng(37.35, -122.2))  // Same longitude, and 16km to the south
        .add(new LatLng(37.35, -122.0)); // Closes the polyline.

// Set the rectangle's color to red
rectOptions.color(Color.RED);

// Get back the mutable Polyline
Polyline polyline = myMap.addPolyline(rectOptions);
4
Waza_Be

質問のタイトルは要件よりもはるかに一般的です。そのため、この質問を表示している人にメリットがあり、おそらく別の方法で要件を満たすことを期待できる方法でこれに回答します。

既にロードされたフラグメントであるマップのコンテキストで方向を表示しておらず、マップ上で方向を表示するために何かが行われている場合(これはおそらくOPが行っていることと同様です)、これはより簡単であり、これを行うのが標準だと思いますIntent

これにより、マップパスアクティビティが起動します(別のアプリケーションを介して-起動されるアプリはユーザーの互換性のあるアプリ(デフォルトではGoogleマップ)によって異なります)は、出発地の住所(_String originAddress_)から目的地の住所(_String destinationAddress_)道路経由:

_// Build the URI query string.
String uriPath = "https://www.google.com/maps/dir/";
// Format parameters according to documentation at:
// https://developers.google.com/maps/documentation/directions/intro
String uriParams = 
    "?api=1" +
    "&Origin=" + originAddress.replace(" ", "+")
        .replace(",", "") +
    "&destination=" + destinationAddress.replace(" ", "+")
        .replace(",", "") +
    "&travelmode=driving";
Uri queryURI = Uri.parse(uriPath + uriParams);
// Open the map.
Intent intent = new Intent(Intent.ACTION_VIEW, queryURI);
startActivity(activity, intent, null);
_

(ここでactivityは単に現在アクティブなActivityです-現在のプログラミングコンテキストで適切な方法で取得されます)。

次のコードは、StringオブジェクトからアドレスLatLngを取得します(次に、上記のようにURIクエリStringで処理する必要があります)。

_/**
* Retrieves an address `String` from a `LatLng` object.
*/
private void getAddressFromLocation(
    final StringBuilder address, final LatLng latlng) {
    // Create the URI query String.
    String uriPath = 
        "https://maps.googleapis.com/maps/api/geocode/json";
    String uriParams = 
        "?latlng=" + String.format("%f,%f",
            latlng.latitude, latlng.longitude) +
        "&key=" + GOOGLE_MAPS_WEB_API_KEY;
    String uriString = uriPath + uriParams;
    // Issue the query using the Volley library for networking.
    RequestFuture<JSONObject> future = RequestFuture.newFuture();
    JSONObject response = null;
    // Required for JsonObjectRequest, but not important here.
    Map<String, String> jsonParams = new HashMap<String, String>();
    JsonObjectRequest request = 
        new JsonObjectRequest(Request.Method.POST, 
            uriString,
            new JSONObject(jsonParams),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        if (response != null) {
                            String resultString =
                                response.getJSONArray("results")
                                        .getJSONObject(0)
                                        .getString("formatted_address");
                            // Assumes `address` was empty.
                            address.append(resultString);
                        } // end of if
                        // No response was received.
                    } catch (JSONException e) {
                        // Most likely, an assumption about the JSON 
                        // structure was invalid.
                        e.printStackTrace();
                    }
                } // end of `onResponse()`
            }, // end of `new Response.Listener<JSONObject>()`
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e(LOG_TAG, "Error occurred ", error);
                }
            });
    // Add the request to the request queue.
    // `VolleyRequestQueue` is a singleton containing
    // an instance of a Volley `RequestQueue`.
    VolleyRequestQueue.getInstance(activity)
        .addToRequestQueue(request);
}
_

このリクエストは非同期ですが、 同期にすることができます です。 addressを取得するには、originAddressに渡された実際のパラメーターに対してtoString()を呼び出す必要があります。

1
John Rattz