docker-osrm


1、安装docker并升级到最新版本,安装时加入到环境变量

2、在docker中拉取osrm镜像,cmd中执行

docker pull osrm/osrm-backend  # 在docker hub上下载旧版(https://hub.docker.com/r/osrm/osrm-backend/tags)  
docker pull ghcr.io/project-osrm/osrm-backend:v5.27.1  # 在github上下载新版(https://github.com/Project-OSRM/osrm-backend/releases)

# 非必要命令
docker run -it --rm ghcr.io/project-osrm/osrm-backend:v5.27.1 /bin/bash  # 进入
ls # 进入查看配置文件

3、下载OSM的地区文件,.osm.pbf格式的,数据放在D:\APP\OSRM\osrm文件夹下,数据名称叫做sjz_car.osm.pbf

4、用osrm配置文件处理数据(共4步)

# 用不同交通方式提取数据,这里的car可以改成bicycle和foot,最后采用不同端口部署(本科5001:foot,5002:bicycle, 5003:car)
docker run -t -v D:\APP\OSRM\osrm:/data ghcr.io/project-osrm/osrm-backend:v5.27.1 osrm-extract -p car.lua /data/sjz_car.osm.pbf  

# 进行数据分区:OSRM使用多级分区技术(MLD)将路网划分为多个层级的区域,以加速路径查询。这种分区结构使得在大型路网中进行路径计算时,可以快速缩小搜索范围,提高查询效率。
docker run -t -v D:\APP\OSRM\osrm:/data ghcr.io/project-osrm/osrm-backend:v5.27.1 osrm-partition /data/sjz_car.osrm  

# 数据订制化,定制化过程根据特定的交通方式和用户需求,对预处理的数据进行调整。例如,针对不同的交通方式,可能需要应用不同的速度限制、道路优先级或其他约束条件。定制化确保了路由引擎能够根据实际需求提供最优的路线规划
docker run -t -v D:\APP\OSRM\osrm:/data ghcr.io/project-osrm/osrm-backend:v5.27.1 osrm-customize /data/sjz_car.osrm  

# 以不同的端口运行
docker run -d -p 5003:5000 --name osrm_backend_car -v D:\APP\OSRM\osrm:/data ghcr.io/project-osrm/osrm-backend:v5.27.1 osrm-routed --algorithm mld /data/sjz_car.osrm  
# 检验, 端口决定交通方式,car位置可填任何字符串,都默认为该端口配置的
http://localhost:5003/route/v1/car/114.557077,38.0156195;114.169827,37.618745  

# 其他命令
docker ps -a 查看所有容器; docker stop 容器id 中断对应容器; docker rm 容器id 删除对应容器

5、爬虫

import requests
import polyline

def get_walking_route(start_coords, end_coords, osrm_url='http://localhost:5001'):
    """
    从 OSRM 获取步行路线的时间、距离和路径坐标
    :param start_coords: 起点的经纬度元组 (纬度, 经度)
    :param end_coords: 终点的经纬度元组 (纬度, 经度)
    :param osrm_url: OSRM 服务的 URL 地址,默认本地服务
    :return: None,直接打印结果
    """
    # 构建请求 URL
    url = f"{osrm_url}/route/v1/walking/{start_coords[1]},{start_coords[0]};{end_coords[1]},{end_coords[0]}"
    
    # 请求参数:overview=full 表示返回完整路线,steps=true 返回每个步骤的详细信息,geometries=polyline 返回 polyline 格式的路径
    params = {
        'overview': 'full',
        'steps': 'true',
        'geometries': 'polyline'  # 返回路径的 polyline 编码
    }
    
    # 发起 GET 请求
    response = requests.get(url, params=params)
    
    if response.status_code == 200:
        data = response.json()
        
        # 获取第一个路径
        route = data['routes'][0]
        
        # 路程和时间
        duration = route['duration'] / 60  # 转换为分钟
        distance = route['distance'] / 1000  # 转换为公里
        
        # 获取路径的 polyline 编码,并解码为坐标
        encoded_polyline = route['geometry']
        decoded_polyline = polyline.decode(encoded_polyline)
        
        # 输出路线信息
        print("步行路线信息:")
        print(f"总路程: {distance:.2f} 公里")
        print(f"预计时间: {duration:.2f} 分钟")
        print("路径坐标 (Polyline 解码):")
        for point in decoded_polyline:
            print(f"({point[0]}, {point[1]})")
        
        # 输出详细的路线步骤
        print("\n路线步骤:")
        for step in route['legs'][0]['steps']:
            print(f"- {step['instruction']} (距离: {step['distance']} 米, 时间: {step['duration'] / 60:.2f} 分钟)")
    
    else:
        print(f"请求失败: {response.status_code}")
        print(response.text)

if __name__ == "__main__":
    # 示例:起点和终点的经纬度(例如,柏林的两个位置)
    start_coordinates = (52.517037, 13.388860)  # 起点:柏林
    end_coordinates = (52.529407, 13.397634)    # 终点:柏林

    # 调用函数获取步行路线信息
    get_walking_route(start_coordinates, end_coordinates)

6、服务的关闭与开启

# 启动:docker start <container_name>
# 停止:docker stop <container_name>

文章作者: 猴猴猴
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 猴猴猴 !
  目录