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

如何从OSMDroid规划路径中提取密集坐标以获取行程海拔数据

解决方法

核心思路

你不需要用到Projection相关API,OSMR返回的Road对象本身就携带了完整的高精度路径坐标集,只需要对路径段做固定间隔插值就能满足10英尺的采样要求,具体实现如下:

步骤1:确认路径原始点集来源

OSRMRoadManager请求返回的Road实例中,road.mRouteHigh字段存储了整条路径的连续高精度坐标点(不是仅路口的mNodes节点),这是我们做采样的基础数据源。

步骤2:单位转换与采样逻辑实现

10英尺约等于3.048米,我们设置3米为采样间隔即可满足要求。以下是采样工具方法和衔接你现有代码的实现:

import org.osmdroid.util.GeoPoint;
import java.util.ArrayList;
import java.util.List;

// 采样间隔:10英尺≈3.048米,这里取3米
private static final double SAMPLE_INTERVAL_METER = 3;

/**
 * 对路径做固定间隔采样
 * @param rawPath 原始路径点列表,取road.mRouteHigh即可
 * @return 采样后的坐标点列表
 */
private List<GeoPoint> samplePathByInterval(List<GeoPoint> rawPath) {
    List<GeoPoint> sampledPoints = new ArrayList<>();
    if (rawPath == null || rawPath.size() < 2) {
        return rawPath;
    }
    // 加入第一个点
    sampledPoints.add(rawPath.get(0));
    GeoPoint lastSamplePoint = rawPath.get(0);
    double remainingDistance = SAMPLE_INTERVAL_METER;

    for (int i = 1; i < rawPath.size(); i++) {
        GeoPoint currentPoint = rawPath.get(i);
        double segmentDistance = lastSamplePoint.distanceTo(currentPoint);

        while (segmentDistance >= remainingDistance) {
            // 计算插值点
            double ratio = remainingDistance / segmentDistance;
            double lat = lastSamplePoint.getLatitude() + ratio * (currentPoint.getLatitude() - lastSamplePoint.getLatitude());
            double lon = lastSamplePoint.getLongitude() + ratio * (currentPoint.getLongitude() - lastSamplePoint.getLongitude());
            GeoPoint interpolatedPoint = new GeoPoint(lat, lon);
            sampledPoints.add(interpolatedPoint);
            lastSamplePoint = interpolatedPoint;
            segmentDistance -= remainingDistance;
            remainingDistance = SAMPLE_INTERVAL_METER;
        }
        remainingDistance -= segmentDistance;
        lastSamplePoint = currentPoint;
    }
    // 最后加入终点,避免遗漏
    sampledPoints.add(rawPath.get(rawPath.size() - 1));
    return sampledPoints;
}

步骤3:衔接你现有代码的调用示例

你在拿到Road实例之后,直接调用上面的方法即可得到符合要求的采样点:

// ... 你的原有代码不变
Road road = roadManager.getRoad(waypoints);
// 新增采样逻辑
List<GeoPoint> sampledPoints = samplePathByInterval(road.mRouteHigh);
// 拿到sampledPoints之后即可传给你的海拔获取模块,生成海拔变化图表
// ... 你的原有绘图逻辑不变

性能说明

你的使用场景最长路径仅1英里,采样后最多生成约540个点,完全不会有性能问题,不需要做额外优化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:54:05