You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Maps v2中基于POI沿可通行道路绘制折线而非直线?

嘿,我完全懂你的困扰!直接用Polyline连点绘制路径确实会不管三七二十一穿楼而过,完全不符合实际道路通行逻辑。好在Google Maps v2里是可以实现沿可通行道路绘制路径的,而且还支持多点的情况,不用局限于只有起终点两个点~

实现沿可通行道路绘制多点路径的方案

核心思路是借助Google Maps Directions API的路线服务,把多点路径拆分成多段相邻点的路线请求,再合并所有路段的道路路径坐标,最终生成贴合道路的Polyline。

具体操作步骤:

  • 拆分路径点序列:把你要绘制的所有路径点按顺序两两分组,比如有A→B→C→D四个点,就拆成A到B、B到C、C到D三组起点终点对。
  • 逐段请求道路路线:针对每一组点,调用Directions API的驾车模式路线请求,获取该段沿道路的路径数据。
  • 合并路径坐标:把每一段路线的Encoded Polyline解码成坐标列表,合并成一个完整的路径坐标集合(注意去掉重复的相邻点)。
  • 生成道路Polyline:用合并后的坐标集合创建Polyline,这样绘制出来的路径就会严格沿着汽车可通行的道路走了。

关键代码示例(Android端)

// 假设你已经有一个存储所有路径点的列表 waypoints
List<LatLng> fullRoadPath = new ArrayList<>();
int totalSegments = waypoints.size() - 1;
int completedSegments = 0;

for (int i = 0; i < totalSegments; i++) {
    LatLng currentStart = waypoints.get(i);
    LatLng currentEnd = waypoints.get(i + 1);

    // 调用Directions API获取该段驾车路线
    DirectionsApi.newRequest(getApplicationContext())
            .origin(currentStart)
            .destination(currentEnd)
            .travelMode(TravelMode.DRIVING) // 指定驾车模式,确保是可通行道路
            .key("你的Google Maps API密钥")
            .setCallback(new DirectionsCallback() {
                @Override
                public void onDirectionsSuccess(DirectionsResult result, GoogleLog log) {
                    if (result.routes.isEmpty()) {
                        Log.w("Directions", "该路段未找到可用路线");
                        completedSegments++;
                        return;
                    }
                    // 解码该路段的概览路径Polyline
                    List<LatLng> segmentPath = PolyUtil.decode(
                            result.routes.get(0).overviewPolyline.getEncodedPath()
                    );
                    // 合并路径:避免重复添加相邻段的连接点
                    if (!fullRoadPath.isEmpty()) {
                        segmentPath.remove(0);
                    }
                    fullRoadPath.addAll(segmentPath);

                    completedSegments++;
                    // 所有路段都处理完成后,绘制最终的道路Polyline
                    if (completedSegments == totalSegments) {
                        PolylineOptions roadPolylineOpts = new PolylineOptions()
                                .addAll(fullRoadPath)
                                .width(12)
                                .color(Color.parseColor("#2196F3"))
                                .geodesic(false);
                        mGoogleMap.addPolyline(roadPolylineOpts);
                    }
                }

                @Override
                public void onDirectionsFailure(Throwable throwable) {
                    Log.e("Directions", "路段请求失败:" + throwable.getMessage());
                    completedSegments++;
                }
            });
}

注意事项:

  • 确保你的Google Cloud项目已经启用了Directions API,并且API密钥配置正确,否则请求会被拒绝。
  • 如果路径点数量较多,要注意API的调用配额限制,避免超出免费额度。可以考虑合并距离较近的路径点,减少请求次数。
  • 如果你需要更精准的路径细节,可以用路线中legs下的steps里的Polyline数据,而不是overviewPolyline,后者是概览路径,数据量更小但精度稍低。

这样处理后,你的路径就会完全沿着可通行道路绘制,不会再出现穿楼的问题啦~

内容的提问来源于stack exchange,提问作者NullPointerException

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:13:44