📜  如何在 Android 中的 Google 地图中生成两个位置之间的路线?(1)

📅  最后修改于: 2023-12-03 14:52:13.046000             🧑  作者: Mango

在 Android 中使用 Google 地图生成两个位置之间的路线

使用 Google 地图 API,可以轻松地在 Android 应用中生成两个位置之间的路线。以下是一些步骤,帮助你在你的项目中使用 Google 地图 API 来生成路线。

步骤
在 build.gradle 文件中添加 Google 地图支持库

在你的应用的 build.gradle 文件中,添加 Google 地图支持库。这可以通过在 dependencies 部分中添加以下行完成:

implementation 'com.google.android.gms:play-services-maps:17.0.0'
在 layout 文件中添加 Google 地图视图

在你的 layout 文件中添加一个 Google 地图视图,如下所示:

<fragment
    android:id="@+id/map_fragment"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

请注意,必须将 android:name 属性设置为 com.google.android.gms.maps.SupportMapFragment,以确保使用 Google 地图支持库中的正確片段。

获取 Google 地图的引用

在你的 Activity 或 Fragment 中,获取对 Google 地图的引用。这可以通过以下方式完成:

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map_fragment);
GoogleMap map = mapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                // map is ready for use
            }
});
在 Google 地图上绘制路线

你可以使用 Google 地图的 Polyline 类,在地图上绘制路线。

PolylineOptions options = new PolylineOptions().width(10).color(Color.BLUE).geodesic(true);
options.add(originLatLng);
options.add(destLatLng);
Polyline line = googleMap.addPolyline(options);

请注意,originLatLngdestLatLng 分别是起点和终点的经纬度坐标。

请求和显示路线

你还需要使用 Google Directions API 将两个位置之间的路线数据作为 JSON 请求,然后将其解析为 Polyline 类,并将其添加到 Google 地图上。

String url = "https://maps.googleapis.com/maps/api/directions/json?origin=" + originLatLng.latitude + "," + originLatLng.longitude + "&destination=" + destLatLng.latitude + "," + destLatLng.longitude + "&mode=driving";
JsonObjectRequest request = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                PolylineOptions options = new PolylineOptions().width(10).color(Color.BLUE).geodesic(true);
                JSONArray routes = response.getJSONArray("routes");
                JSONObject route = routes.getJSONObject(0);
                JSONObject poly = route.getJSONObject("overview_polyline");
                String polyline = poly.getString("points");
                List<LatLng> list = decodePolyline(polyline);
                for (int z = 0; z < list.size(); z++) {
                    LatLng point = list.get(z);
                    options.add(point);
                }
                line = googleMap.addPolyline(options);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, error.getMessage());
            }
});
// Add the request to the RequestQueue.
requestQueue.add(request);

请注意,还需要创建 decodePolyline() 方法来解析 Directions API 返回的 polylines。

private List<LatLng> decodePolyline(String encoded) {
    List<LatLng> poly = new ArrayList<>();
    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;

        LatLng p = new LatLng(((double) lat / 1E5), ((double) lng / 1E5));
        poly.add(p);
    }
    return poly;
}
总结

使用这些步骤,你可以在你的 Android 应用程序中轻松地生成两个位置之间的路线。