如何在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
相关产品推荐
相关产品推荐

