使用 Docker 安装和运行 OSRM-backend 是一个非常方便的方法,因为 Docker 可以提供一致的环境,避免了许多依赖性和配置问题。以下是如何使用 Docker 安装和运行 OSRM-backend 的步骤:
1. 安装 Docker
确保系统上已经安装了 Docker。如果没有安装,可以使用以下命令安装 Docker:
shell
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
2. 启动 Docker 服务
shell
sudo systemctl start docker
3. 设置 Docker 开机自启
shell
sudo systemctl enable docker
3.1配置 Docker 使用国内镜像加速器
编辑 Docker 配置文件 /etc/docker/daemon.json,添加加速器地址(以阿里云为例):
shell
sudo nano /etc/docker/daemon.json
添加以下内容(将 YOUR_MIRROR_URL 替换为你要获取的加速器地址):
Json
{
"registry-mirrors": ["https://YOUR_MIRROR_URL"]
}
保存并退出编辑器,然后重启 Docker 服务:
shell
sudo systemctl daemon-reload
sudo systemctl restart docker
4. 拉取 OSRM-backend 镜像
shell
sudo docker pull osrm/osrm-backend
5. 启动 OSRM 服务
处理完地图数据后,启动 OSRM 服务:
shell
sudo docker run --rm -t -d --name fot-osrm -v /data/fot/map/europe:/data -p 5000:5000 osrm/osrm-backend osrm-routed --algorithm mld /data/switzerland-latest.osrm
6. 下载地图数据
例如:下载瑞士地图数据文件 switzerland-latest.osm.pbf:
shell
wget http://download.geofabrik.de/europe/switzerland-latest.osm.pbf
7. 创建数据目录并移动地图数据
创建数据目录并将地图数据移动到该目录:
shell
sudo mkdir -p /data/fot/map/europe
sudo mv switzerland-latest.osm.pbf /data/fot/map/europe/
8. 处理地图数据
使用 Docker 容器来处理地图数据:
shell
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/switzerland-latest.osm.pbf
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-partition /data/switzerland-latest.osrm
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-customize /data/switzerland-latest.osrm
9. 测试服务
您可以使用 curl 命令来测试 OSRM 服务是否正常运行:
shell
curl "http://localhost:5000/route/v1/driving/7.4474,46.9481;7.4355,46.9512?overview=false&steps=true"
10.完整的脚本
为了方便,可以将上述步骤整合成一个脚本:
shell
#!/bin/bash
# 安装 Docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 配置 Docker 使用国内镜像加速器
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
"registry-mirrors": ["https://YOUR_MIRROR_URL"]
}
EOF
# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 拉取 OSRM-backend 镜像
sudo docker pull osrm/osrm-backend
# 下载地图数据
wget http://download.geofabrik.de/europe/switzerland-latest.osm.pbf
# 创建数据目录并移动地图数据
sudo mkdir -p /data/fot/map/europe
sudo mv switzerland-latest.osm.pbf /data/fot/map/europe/
# 处理地图数据
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/switzerland-latest.osm.pbf
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-partition /data/switzerland-latest.osrm
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-customize /data/switzerland-latest.osrm
# 启动 OSRM 服务
sudo docker run --rm -t -d --name fot-osrm -v /data/fot/map/europe:/data -p 5000:5000
osrm/osrm-backend osrm-routed --algorithm mld /data/switzerland-latest.osrm
将上述脚本保存为 install_osrm.sh,然后执行:
shell
chmod +x install_osrm.sh
./install_osrm.sh
处理地图数据失败处理
当处理单个地区文件比较大时,如处理的italy约1.9G,在执行osrm-extract 遇到了 std::bad_alloc 错误时总是失败,报错
shell
[root@123 europe]# sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/italy-latest.osm.pbf --threads=1
[info] Parsed 0 location-dependent features with 0 GeoJSON polygons
[info] Using script /opt/car.lua
[info] Input file: italy-latest.osm.pbf
[info] Profile: car.lua
[info] Threads: 1
[info] Parsing in progress..
[info] input file generated by osmium/1.14.0
[info] timestamp: 2024-11-11T21:21:10Z
[info] Using profile api version 4
[info] Found 3 turn restriction tags:
[info] motorcar
[info] motor_vehicle
[info] vehicle
[info] Parse relations ...
[info] Parse ways and nodes ...
TBB Warning: Exact exception propagation is requested by application but the linked library is built without support for it
terminate called after throwing an instance of 'tbb::captured_exception'
what(): std::bad_alloc
这是由于在处理大型 OSM 数据文件时,内存需求超过了系统的实际可用内存。
进一步的解决方案
- 增加系统内存:
如果可能的话,增加系统的物理内存。这对于处理大型 OSM 数据文件非常重要。 - 使用更大的交换空间:
尝试增加交换空间的大小,例如增加到 8GB 或更大。 - 减少线程数:
尽管您已经将线程数设置为 1,但可以尝试进一步减少其他进程的内存使用,确保 osrm-extract 有尽可能多的内存可用。 - 分区域处理:
如果数据文件非常大,可以考虑将数据文件分割成多个较小的区域分别处理。例如,您可以下载意大利不同地区的 OSM 数据文件,然后分别处理每个区域。
方式一、增加交换空间
- 停用当前交换空间:
sudo swapoff -a - 删除旧的交换文件:
sudo rm /swapfile - 创建新的交换文件:
sudo fallocate -l 8G /swapfile
4.设置交换文件的权限:
sudo chmod 600 /swapfile
5.设置交换文件:
sudo mkswap /swapfile
6.启用交换文件:
sudo swapon /swapfile
7.检查交换文件是否已启用:
sudo swapon --show
8.执行命令
sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/italy-latest.osm.pbf --threads=1
方式二、分区域处理
- 下载意大利不同地区的 OSM 数据文件:
从 Geofabrik 下载意大利不同地区的 OSM 数据文件,例如 Lombardy、Sicily 等。 - 分别处理每个区域:
sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/lombardy-latest.osm.pbf --threads=1
sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/sicily-latest.osm.pbf --threads=1