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>