{"id":28183985,"url":"https://github.com/ad-freiburg/loom","last_synced_at":"2025-10-26T23:32:11.683Z","repository":{"id":42985896,"uuid":"465749031","full_name":"ad-freiburg/loom","owner":"ad-freiburg","description":"Software suite for the automated generation of geographically correct or schematic transit maps. ","archived":false,"fork":false,"pushed_at":"2025-02-13T15:19:25.000Z","size":70736,"stargazers_count":166,"open_issues_count":10,"forks_count":18,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-03-04T20:41:09.731Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ad-freiburg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-03T14:18:21.000Z","updated_at":"2025-03-01T17:11:17.000Z","dependencies_parsed_at":"2023-01-28T13:03:47.244Z","dependency_job_id":"bb536125-60d2-419b-904d-cd580d5c32af","html_url":"https://github.com/ad-freiburg/loom","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ad-freiburg%2Floom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ad-freiburg%2Floom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ad-freiburg%2Floom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ad-freiburg%2Floom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ad-freiburg","download_url":"https://codeload.github.com/ad-freiburg/loom/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254470983,"owners_count":22076587,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-16T05:11:51.190Z","updated_at":"2025-10-26T23:32:11.606Z","avatar_url":"https://github.com/ad-freiburg.png","language":"C++","funding_links":[],"categories":["Using Data"],"sub_categories":["Visualizations"],"readme":"[![2015 Stuttgart light rail network maps generated from GTFS data, with optimal line orderings, geographically correct (left), octilinear (middle), and  orthoradial (right).](examples/render/stuttgart-example-small.png?raw=true)](examples/render/stuttgart-example.png?raw=true)\n*2015 Stuttgart light rail network maps generated from GTFS data, with optimal line orderings, geographically correct (left), octilinear (middle), and  orthoradial (right).*\n\n[![Build](https://github.com/ad-freiburg/loom/actions/workflows/build.yml/badge.svg)](https://github.com/ad-freiburg/loom/actions/workflows/build.yml)\n\nLOOM\n====\n\nSoftware suite for the automated generation of geographically correct or schematic transit maps.\n\nBased on our work in the following papers:\n[Bast H., Brosi P., Storandt S., Efficient Generation of Geographically Accurate Transit Maps, SIGSPATIAL 2018](http://ad-publications.informatik.uni-freiburg.de/SIGSPATIAL_transitmaps_2018.pdf)\n[Bast H., Brosi P., Storandt S., Efficient Generation of Geographically Accurate Transit Maps (extended version), ACM TSAS, Vol. 5, No. 4, Article 25, 2019](http://ad-publications.informatik.uni-freiburg.de/ACM_efficient%20Generation%20of%20%20Geographically%20Accurate%20Transit%20Maps_extended%20version.pdf)\n[Bast H., Brosi P., Storandt S., Metro Maps on Octilinear Grid Graphs, EuroVis 2020](http://ad-publications.informatik.uni-freiburg.de/EuroVis%20octi-maps.pdf)\n[Bast H., Brosi P., Storandt S., Metro Maps on Flexible Base Grids, SSTD 2021](http://ad-publications.informatik.uni-freiburg.de/SSTD_Metro%20Maps%20on%20Flexible%20Base%20Grids.pdf).\nA pipeline for generating geographically accurate transit maps which appears to be similar to ours was described by Anton Dubrau in a [blog post](https://blog.transitapp.com/how-we-built-the-worlds-prettiest-auto-generated-transit-maps-12d0c6fa502f).\n\nAlso see our web demos [here](https://loom.cs.uni-freiburg.de/), [here](https://loom.cs.uni-freiburg.de/global), and [here](https://octi.cs.uni-freiburg.de).\n\nRequirements\n------------\n\n * `cmake`\n * `gcc \u003e= 5.0` (or `clang \u003e= 3.9`)\n * Optional: `libglpk-dev`, `coinor-libcbc-dev`, `gurobi`, `libzip-dev`, `libprotobuf-dev`\n\n\nBuilding and Installation\n-------------------------\n\nFetch this repository and init submodules:\n\n```\ngit clone --recurse-submodules https://github.com/ad-freiburg/loom.git\n```\n\nBuild and install:\n\n```\ncd loom\nmkdir build \u0026\u0026 cd build\ncmake ..\nmake -j\n```\n\nTo (optionally) install, type\n```\nmake install\n```\n\nYou can also use the binaries in `./build` directly.\n\nUsage\n=====\n\nThis suite consists of several tools:\n\n* `gtfs2graph`, create a GeoJSON line graph from GTFS data\n* `topo`, create an overlapping-free line graph from an arbitrary line graph\n* `loom`, find optimal line orderings on a line graph\n* `octi`, create a schematic version of a line graph\n* `transitmap`, render a line graph into an SVG map (`--render-engine=svg`) or into vector tiles (`--render-engine=mvt`)\n\nAll tools output a graph, in the GeoJSON format, to `stdout`, and expect a GeoJSON graph at `stdin`. Exceptions are `gtfs2graph`, where the input is a GTFS feed, and `transitmap`, which writes SVG to `stdout` or MVT vector tiles to a specified folder. Running a tool with `-h` will show a help message with all allowed options.\n\nThe `example` folder contains several overlapping-free line graphs.\n\nTo render the geographically correct Stuttgart map from above, use\n```\ncat examples/stuttgart.json | loom | transitmap \u003e stuttgart.svg\n```\n\nTo also render labels, use\n\n```\ncat examples/stuttgart.json | loom | transitmap -l \u003e stuttgart-label.svg\n```\n\nTo render an *octilinear* map, put the `octi` tool into the pipe:\n\n```\ncat examples/stuttgart.json | loom | octi | transitmap -l \u003e stuttgart-octilin.svg\n```\n\nTo render for example the orthoradial map from above, use a different base graph for `octi`:\n\n```\ncat examples/stuttgart.json | loom | octi -b orthoradial | transitmap -l \u003e stuttgart-orthorad.svg\n```\n\nLine graph extraction from GTFS\n-------------------------------\n\nTo extract for example a line graph for streetcars from GTFS data, use `gtfs2graph` as follows:\n\n```\ngtfs2graph -m tram freiburg.zip \u003e freiburg.json\n```\n\nThis line graph will have many overlapping edges and stations. To create an overlapping-free line graph ready for rendering, add `topo`:\n\n```\ngtfs2graph -m tram freiburg.zip | topo \u003e freiburg.json\n```\n\nA full pipeline for creating an octilinear map of the Freiburg tram network would look like this:\n```\ngtfs2graph -m tram freiburg.zip | topo | loom | octi | transitmap \u003e freiburg-tram.svg\n```\n\nUsage via Docker\n================\n\nYou can also use any tool in a Docker container via the provided Dockerfile.\n\nTo build the container:\n\n```\ndocker build -t loom\n```\n\nTo run a tool from the suite, use\n\n```\ndocker run -i loom \u003cTOOL\u003e\n```\n\nFor example, to octilinearize the Freiburg example, use\n\n```\ncat examples/freiburg.json | sudo docker run -i loom octi\n```\n\n*Note*: if you want to use gurobi for ILP optimization, you *must* mount a folder container a valid gurobi license file `gurobi.lic` to `/gurobi/` in the container. For example, if your `gurobi.lic` is in `/home/user/gurobi`:\n\n```\ndocker run -v /home/user/gurobi:/gurobi loom \u003cTOOL\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fad-freiburg%2Floom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fad-freiburg%2Floom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fad-freiburg%2Floom/lists"}