Open Source Routing Machine. Siehe auch OpenStreetMap
Demo https://router.project-osrm.org/route/v1/driving/16.3725,48.2082;16.3738,48.2100?overview=false
#!/usr/bin/env bash set -euo pipefail OSRM_DIR="/opt/osrm-austria" DATA_DIR="${OSRM_DIR}/data" PROFILE_DIR="${OSRM_DIR}/profiles" SERVICE_FILE="/etc/systemd/system/osrm-austria.service" PBF_URL="https://download.geofabrik.de/europe/austria-latest.osm.pbf" PBF_FILE="${DATA_DIR}/austria-latest.osm.pbf" CONTAINER_IMAGE="ghcr.io/project-osrm/osrm-backend:latest" PORT="5000" log() { echo "[+] $1" } require_root() { if [[ "${EUID}" -ne 0 ]]; then echo "Bitte als root oder mit sudo ausführen." exit 1 fi } install_packages() { log "Installiere Basis-Pakete..." apt-get update apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release \ wget \ systemd } install_docker() { if command -v docker >/dev/null 2>&1; then log "Docker ist bereits installiert." return fi log "Installiere Docker..." install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \ > /etc/apt/sources.list.d/docker.list apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin systemctl enable docker systemctl start docker } prepare_dirs() { log "Erzeuge Verzeichnisse..." mkdir -p "${DATA_DIR}" mkdir -p "${PROFILE_DIR}" } download_data() { if [[ -f "${PBF_FILE}" ]]; then log "PBF-Datei existiert bereits: ${PBF_FILE}" else log "Lade Österreich-OSM-Daten herunter..." wget -O "${PBF_FILE}" "${PBF_URL}" fi } download_profile() { local profile_file="${PROFILE_DIR}/foot.lua" if [[ -f "${profile_file}" ]]; then log "Profil existiert bereits: ${profile_file}" return fi log "Lade OSRM foot.lua Profil..." wget -O "${profile_file}" \ "https://raw.githubusercontent.com/Project-OSRM/osrm-backend/master/profiles/foot.lua" } build_osrm_data() { log "Entferne alte OSRM-Artefakte..." rm -f "${DATA_DIR}/austria-latest.osrm"* rm -f "${DATA_DIR}/austria-latest.osrm.datasource_names" rm -f "${DATA_DIR}/austria-latest.osrm.names" rm -f "${DATA_DIR}/austria-latest.osrm.timestamp" log "Starte osrm-extract mit foot.lua ..." docker run --rm \ -t \ -v "${DATA_DIR}:/data" \ -v "${PROFILE_DIR}:/profiles" \ "${CONTAINER_IMAGE}" \ osrm-extract \ -p /profiles/foot.lua \ /data/austria-latest.osm.pbf log "Starte osrm-partition ..." docker run --rm \ -t \ -v "${DATA_DIR}:/data" \ "${CONTAINER_IMAGE}" \ osrm-partition \ /data/austria-latest.osrm log "Starte osrm-customize ..." docker run --rm \ -t \ -v "${DATA_DIR}:/data" \ "${CONTAINER_IMAGE}" \ osrm-customize \ /data/austria-latest.osrm } create_service() { log "Erzeuge systemd-Service ${SERVICE_FILE} ..." cat > "${SERVICE_FILE}" <<EOF [Unit] Description=OSRM Austria Walking Server After=docker.service network-online.target Requires=docker.service Wants=network-online.target [Service] Type=simple Restart=always RestartSec=5 ExecStartPre=-/usr/bin/docker rm -f osrm-austria ExecStart=/usr/bin/docker run --name osrm-austria -p ${PORT}:5000 -t -i -v ${DATA_DIR}:/data ${CONTAINER_IMAGE} osrm-routed --algorithm mld /data/austria-latest.osrm ExecStop=/usr/bin/docker stop osrm-austria [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable osrm-austria.service systemctl restart osrm-austria.service } show_result() { log "Fertig." echo echo "Test lokal:" echo "curl 'http://127.0.0.1:${PORT}/route/v1/walking/16.3725,48.2082;16.3738,48.2100?overview=false'" echo echo "Service-Status:" echo "systemctl status osrm-austria.service" echo echo "Logs:" echo "journalctl -u osrm-austria.service -f" } main() { require_root install_packages install_docker prepare_dirs download_data download_profile build_osrm_data create_service show_result } main "$@"