在Android Studio中基于OSM实现当前位置到目标点路线查询的方法
Android Studio 基于OSM实现两点路线查询方案
1. 环境准备与依赖配置
- 首先在模块级
build.gradle文件中引入osmdroid核心库、OSRM路线规划依赖,同步项目生效 - 在
AndroidManifest.xml中声明两个必要权限:android.permission.ACCESS_FINE_LOCATION:用于获取用户当前位置android.permission.INTERNET:用于加载OSM地图瓦片和请求路线数据
2. 坐标参数准备
- 用户当前位置:通过系统
LocationManager或者融合位置服务获取用户实时经纬度,存入currentLat、currentLon两个变量 - 目标点位置:直接读取数据库中提前存储的
latitude(目标纬度)、longitude(目标经度)变量即可
3. 核心路线查询与绘制逻辑
注意:路线网络请求必须在子线程执行,禁止直接在主线程调用,避免触发ANR错误
核心代码示例:
// 1. 构造起点、终点GeoPoint对象 GeoPoint startPoint = new GeoPoint(currentLat, currentLon); GeoPoint endPoint = new GeoPoint(latitude, longitude); // 2. 初始化路线管理器,可根据需求选择驾车/步行/骑行模式 RoadManager roadManager = new OSRMRoadManager(context, "your-custom-user-agent"); // 设置路线规划模式,可选值:OSRMRoadManager.MEAN_BY_FOOT/MEAN_BY_BIKE/MEAN_BY_CAR roadManager.setMean(OSRMRoadManager.MEAN_BY_CAR); // 3. 构造途径点列表,仅起点终点的话直接添加两个点即可 ArrayList<GeoPoint> wayPoints = new ArrayList<>(); wayPoints.add(startPoint); wayPoints.add(endPoint); // 4. 异步请求路线数据 new Thread(() -> { Road route = roadManager.getRoad(wayPoints); if (route.mStatus == Road.STATUS_OK) { // 路线请求成功,构建路线覆盖物 Polyline routeOverlay = RoadManager.buildRoadOverlay(route, Color.parseColor("#2196F3"), 12f); // 将路线添加到地图 runOnUiThread(() -> { mapView.getOverlays().add(routeOverlay); // 自动调整地图视野,让起点和终点同时显示在可视区域内 mapView.zoomToBoundingBox(new BoundingBox.fromGeoPoints(wayPoints), 80); mapView.invalidate(); }); } }).start();
4. 异常场景处理
- 获取当前位置为空时,优先提示用户检查位置权限是否开启、GPS服务是否正常,也可支持用户手动选择起点
- 路线请求返回失败状态时,可先检查网络连接是否正常,重试1-2次后仍失败则给用户友好提示
- 调用前先校验目标点
latitude、longitude是否在合法经纬度范围内,避免非法参数导致崩溃
内容的提问来源于stack exchange,提问作者chanaka_ayesh
相关产品推荐
相关产品推荐

