traffix-live / scripts /import_osm.py
REBELLION2002's picture
Deploy live TraffiX app (fix/live-container-ci e8a6317, showcase network omitted)
ec5ee81 verified
Raw History Blame Contribute Delete
2.99 kB
"""
Imports the REAL street network of central Tunis from OpenStreetMap.
Run this on your own machine (it needs internet access to openstreetmap.org).
python scripts/import_osm.py # default: Bourguiba area
python scripts/import_osm.py --bbox 10.160,36.790,10.195,36.810
Then use it for everything else:
Windows (PowerShell): $env:TRAFFIX_NETWORK="tunis_osm"
Mac / Linux: export TRAFFIX_NETWORK=tunis_osm
python scripts/build_demand.py
python scripts/run_experiments.py
The agents read junctions, phases and crossings from whatever network is
loaded, so no code changes are needed. Bus lines and the incident location
fall back to automatic choices on this network (see build_demand.py).
Check the result in sumo-gui (netedit can fix odd junctions by hand).
"""
import argparse
import os
import subprocess
import sys
import sumo
import _path # noqa: F401
from traffix.core import config
NET_DIR = config.path("data", "networks")
YELLOW = config.agents()["safety"]["yellow"]
SUMO_HOME = os.environ.get("SUMO_HOME", sumo.SUMO_HOME)
TOOLS = os.path.join(SUMO_HOME, "tools")
# west, south, east, north: Avenue Habib Bourguiba from Bab Bhar to beyond
# Place du 14 Janvier, with Av. de Paris, Av. de Carthage, Av. Mohamed V and
# Av. Farhat Hached. Widen it if you want more of the city.
DEFAULT_BBOX = "10.168,36.793,10.192,36.806"
NETCONVERT_OPTS = [
"--geometry.remove", "--roundabouts.guess", "--ramps.guess",
"--junctions.join", "--tls.guess-signals", "--tls.discard-simple", "--tls.join",
"--sidewalks.guess", "--crossings.guess",
"--keep-edges.by-vclass", "passenger,pedestrian,bus",
"--remove-edges.isolated", "--no-turnarounds", "true",
"--tls.yellow.time", str(YELLOW),
"--output.street-names",
]
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--bbox", default=DEFAULT_BBOX, help="west,south,east,north")
args = ap.parse_args()
os.makedirs(NET_DIR, exist_ok=True)
print("Downloading OpenStreetMap data for", args.bbox)
subprocess.run([sys.executable, os.path.join(TOOLS, "osmGet.py"),
"--bbox", args.bbox, "--prefix", os.path.join(NET_DIR, "tunis_osm")], check=True)
osm = os.path.join(NET_DIR, "tunis_osm_bbox.osm.xml")
if not os.path.exists(osm):
osm = os.path.join(NET_DIR, "tunis_osm.osm.xml")
for tls_type, out in (("static", os.path.join(NET_DIR, "tunis_osm.net.xml")),
("actuated", os.path.join(NET_DIR, "tunis_osm_actuated.net.xml"))):
subprocess.run([os.path.join(SUMO_HOME, "bin", "netconvert"), "--osm-files", osm,
"--tls.default-type", tls_type, "-o", out] + NETCONVERT_OPTS,
check=True)
print("Built", out)
print("\nNext: set TRAFFIX_NETWORK=tunis_osm, then build_demand.py and run_experiments.py")
if __name__ == "__main__":
main()