├── .dockerignore ├── .github ├── FUNDING.yml └── workflows │ ├── book.yml │ └── main.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── abstio ├── Cargo.toml └── src │ ├── abst_data.rs │ ├── abst_paths.rs │ ├── download.rs │ ├── http.rs │ ├── io.rs │ ├── io_native.rs │ ├── io_web.rs │ └── lib.rs ├── abstutil ├── Cargo.toml └── src │ ├── cli.rs │ ├── clone.rs │ ├── collections.rs │ ├── lib.rs │ ├── logger.rs │ ├── priority_queue.rs │ ├── process.rs │ ├── serde.rs │ ├── time.rs │ └── utils.rs ├── apps ├── fifteen_min │ ├── Cargo.toml │ └── src │ │ ├── amenities_details.rs │ │ ├── bus.rs │ │ ├── common.rs │ │ ├── from_amenity.rs │ │ ├── isochrone.rs │ │ ├── lib.rs │ │ ├── main.rs │ │ ├── render.rs │ │ ├── score_homes.rs │ │ └── single_start.rs ├── game │ ├── Cargo.toml │ └── src │ │ ├── app.rs │ │ ├── challenges │ │ ├── cutscene.rs │ │ ├── mod.rs │ │ └── prebake.rs │ │ ├── common │ │ ├── mod.rs │ │ ├── route_sketcher.rs │ │ ├── select.rs │ │ ├── share.rs │ │ └── warp.rs │ │ ├── debug │ │ ├── blocked_by.rs │ │ ├── blockfinder.rs │ │ ├── floodfill.rs │ │ ├── mod.rs │ │ ├── objects.rs │ │ ├── path_counter.rs │ │ ├── polygons.rs │ │ ├── routes.rs │ │ ├── select_roads.rs │ │ └── uber_turns.rs │ │ ├── devtools │ │ ├── collisions.rs │ │ ├── compare_counts.rs │ │ ├── destinations.rs │ │ ├── kml.rs │ │ ├── mod.rs │ │ ├── polygon.rs │ │ ├── scenario.rs │ │ └── story.rs │ │ ├── edit │ │ ├── crosswalks.rs │ │ ├── mod.rs │ │ ├── multiple_roads.rs │ │ ├── roads.rs │ │ ├── routes.rs │ │ ├── stop_signs.rs │ │ ├── traffic_signals │ │ │ ├── edits.rs │ │ │ ├── gmns.rs │ │ │ ├── mod.rs │ │ │ ├── offsets.rs │ │ │ ├── picker.rs │ │ │ └── preview.rs │ │ ├── validate.rs │ │ └── zones.rs │ │ ├── id.rs │ │ ├── info │ │ ├── building.rs │ │ ├── debug.rs │ │ ├── intersection.rs │ │ ├── lane.rs │ │ ├── mod.rs │ │ ├── parking_lot.rs │ │ ├── person.rs │ │ ├── transit.rs │ │ └── trip.rs │ │ ├── layer │ │ ├── elevation.rs │ │ ├── favorites.rs │ │ ├── map.rs │ │ ├── mod.rs │ │ ├── pandemic.rs │ │ ├── parking.rs │ │ ├── population.rs │ │ ├── problems.rs │ │ ├── problems_diff.rs │ │ ├── traffic.rs │ │ └── transit.rs │ │ ├── lib.rs │ │ ├── main.rs │ │ ├── pregame │ │ ├── mod.rs │ │ └── proposals.rs │ │ ├── render │ │ ├── agents.rs │ │ ├── bike.rs │ │ ├── car.rs │ │ ├── mod.rs │ │ └── pedestrian.rs │ │ ├── sandbox │ │ ├── dashboards │ │ │ ├── commuter.rs │ │ │ ├── generic_trip_table.rs │ │ │ ├── misc.rs │ │ │ ├── mod.rs │ │ │ ├── mode_shift.rs │ │ │ ├── parking_overhead.rs │ │ │ ├── risks.rs │ │ │ ├── selector.rs │ │ │ ├── traffic_signals.rs │ │ │ ├── travel_times.rs │ │ │ ├── trip_problems.rs │ │ │ └── trip_table.rs │ │ ├── gameplay │ │ │ ├── actdev.rs │ │ │ ├── commute.rs │ │ │ ├── fix_traffic_signals.rs │ │ │ ├── freeform │ │ │ │ ├── area_spawner.rs │ │ │ │ ├── generate_grid2demand.py │ │ │ │ ├── importers.rs │ │ │ │ ├── mod.rs │ │ │ │ └── spawner.rs │ │ │ ├── mod.rs │ │ │ ├── play_scenario.rs │ │ │ └── tutorial.rs │ │ ├── minimap.rs │ │ ├── misc_tools.rs │ │ ├── mod.rs │ │ ├── speed.rs │ │ ├── time_warp.rs │ │ └── turn_explorer.rs │ │ └── ungap │ │ ├── bike_network.rs │ │ ├── explore.rs │ │ ├── layers.rs │ │ ├── mod.rs │ │ ├── predict.rs │ │ ├── quick_sketch.rs │ │ └── trip │ │ ├── mod.rs │ │ └── results.rs ├── ltn │ ├── Cargo.toml │ ├── README.md │ ├── spritesheet.gif │ ├── src │ │ ├── app.rs │ │ ├── components │ │ │ ├── appwide_panel.rs │ │ │ ├── layers.rs │ │ │ ├── left_panel.rs │ │ │ └── mod.rs │ │ ├── export.rs │ │ ├── lib.rs │ │ ├── logic │ │ │ ├── auto_filters.rs │ │ │ ├── existing.rs │ │ │ ├── impact.rs │ │ │ ├── mod.rs │ │ │ ├── partition.rs │ │ │ ├── shortcuts.rs │ │ │ └── turn_restrictions.rs │ │ ├── main.rs │ │ ├── neighbourhood.rs │ │ ├── pages │ │ │ ├── about.rs │ │ │ ├── census.rs │ │ │ ├── crossings.rs │ │ │ ├── customize_boundary.rs │ │ │ ├── cycle_network.rs │ │ │ ├── design_ltn │ │ │ │ ├── filters.rs │ │ │ │ ├── freehand_filters.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── modals.rs │ │ │ │ ├── one_ways.rs │ │ │ │ ├── page.rs │ │ │ │ ├── shortcuts.rs │ │ │ │ ├── speed_limits.rs │ │ │ │ └── turn_restrictions.rs │ │ │ ├── freehand_boundary.rs │ │ │ ├── mod.rs │ │ │ ├── per_resident_impact.rs │ │ │ ├── pick_area.rs │ │ │ ├── predict_impact.rs │ │ │ ├── route_planner.rs │ │ │ └── select_boundary.rs │ │ ├── render │ │ │ ├── cells.rs │ │ │ ├── colors.rs │ │ │ ├── filters.rs │ │ │ └── mod.rs │ │ └── save │ │ │ ├── mod.rs │ │ │ ├── perma.rs │ │ │ ├── proposals_ui.rs │ │ │ ├── save_dialog.rs │ │ │ └── share.rs │ └── tests │ │ └── ltn_tests.rs ├── map_editor │ ├── Cargo.toml │ └── src │ │ ├── app.rs │ │ ├── camera.rs │ │ ├── edit.rs │ │ ├── lib.rs │ │ ├── load.rs │ │ ├── main.rs │ │ └── model.rs ├── osm_viewer │ ├── Cargo.toml │ └── src │ │ ├── lib.rs │ │ ├── main.rs │ │ └── viewer.rs ├── parking_mapper │ ├── Cargo.toml │ └── src │ │ ├── main.rs │ │ └── mapper.rs └── santa │ ├── Cargo.toml │ └── src │ ├── after_level.rs │ ├── animation.rs │ ├── before_level.rs │ ├── buildings.rs │ ├── controls.rs │ ├── game.rs │ ├── levels.rs │ ├── lib.rs │ ├── main.rs │ ├── meters.rs │ ├── music.rs │ ├── player.rs │ ├── session.rs │ ├── title.rs │ └── vehicles.rs ├── blockfinding ├── Cargo.toml └── src │ └── lib.rs ├── cli ├── Cargo.toml └── src │ ├── augment_scenario.rs │ ├── clip_osm.rs │ ├── generate_houses.rs │ ├── import_grid2demand.rs │ ├── import_scenario.rs │ ├── main.rs │ └── one_step_import.rs ├── cloud ├── gather_output.sh ├── start_batch_import.sh └── worker_script.sh ├── collisions ├── Cargo.toml └── src │ └── lib.rs ├── convert_osm ├── Cargo.toml └── src │ ├── elevation.rs │ ├── extract.rs │ ├── gtfs.rs │ ├── lib.rs │ └── parking.rs ├── data ├── MANIFEST.json ├── diff_changed_files.sh ├── diff_changed_map.sh ├── get_fresh_osm.sh ├── regen.sh └── system │ ├── assets │ ├── characters │ │ ├── boss.svg.gz │ │ ├── drone.svg │ │ ├── parents.svg.gz │ │ └── player.svg │ ├── edit │ │ ├── backwards.svg │ │ ├── bike.svg │ │ ├── buffer │ │ │ ├── curb.svg │ │ │ ├── flex_posts.svg │ │ │ ├── jersey_barrier.svg │ │ │ ├── planters.svg │ │ │ └── stripes.svg │ │ ├── bus.svg │ │ ├── construction.svg │ │ ├── driving.svg │ │ ├── forwards.svg │ │ ├── parking.svg │ │ └── sidewalk.svg │ ├── flags │ │ ├── at.svg │ │ ├── au.svg │ │ ├── br.svg │ │ ├── ca.svg │ │ ├── ch.svg │ │ ├── cl.svg │ │ ├── cz.svg │ │ ├── de.svg │ │ ├── fr.svg │ │ ├── gb.svg │ │ ├── hk.svg │ │ ├── il.svg │ │ ├── in.svg │ │ ├── ir.svg │ │ ├── jp.svg │ │ ├── kr.svg │ │ ├── ly.svg │ │ ├── nl.svg │ │ ├── nz.svg │ │ ├── pl.svg │ │ ├── pt.svg │ │ ├── sg.svg │ │ ├── tw.svg │ │ └── us.svg │ ├── map │ │ ├── bus_only.svg │ │ ├── dont_walk.svg │ │ ├── light_rail.svg │ │ ├── national_rail.svg │ │ ├── no_left_turn.svg │ │ ├── no_right_turn.svg │ │ ├── no_right_turn_button.svg │ │ ├── no_straight_ahead.svg │ │ ├── no_u_turn_left_to_right.svg │ │ ├── no_u_turn_right_to_left.svg │ │ ├── parked_car.svg │ │ ├── parking.svg │ │ ├── planter.svg │ │ ├── private_road.svg │ │ ├── school.svg │ │ ├── shared_left_turn.svg │ │ ├── snowflake.svg │ │ ├── tfl_underground.svg │ │ ├── thought_bubble.svg │ │ ├── traffic_signal.svg │ │ ├── under_construction.svg │ │ └── walk.svg │ ├── meters │ │ ├── bike.svg │ │ ├── bus.svg │ │ ├── car.svg │ │ ├── pedestrian.svg │ │ └── trip_histogram.svg │ ├── minimap │ │ ├── down.svg │ │ ├── left.svg │ │ ├── right.svg │ │ ├── up.svg │ │ ├── zoom_in_fully.svg │ │ └── zoom_out_fully.svg │ ├── music │ │ ├── carol_bells.ogg │ │ ├── dance_sugar_plum_fairy.ogg │ │ ├── god_rest_ye_merry_gentlemen.ogg │ │ ├── jingle_bells.ogg │ │ ├── silent_night.ogg │ │ └── sources.md │ ├── pregame │ │ ├── challenges.svg │ │ ├── favicon.ico │ │ ├── icon.png │ │ ├── logo.svg │ │ ├── sandbox.svg │ │ └── tutorial.svg │ ├── santa │ │ ├── bike1.svg │ │ ├── bike2.svg │ │ ├── bike3.svg │ │ ├── cargo_bike1.svg │ │ ├── cargo_bike2.svg │ │ ├── cargo_bike3.svg │ │ └── sleigh.svg │ ├── speed │ │ ├── jump_to_time.svg │ │ ├── minus.svg │ │ ├── pause.svg │ │ ├── plus.svg │ │ ├── reset.svg │ │ ├── triangle.svg │ │ └── zoom_level_rect.svg │ ├── timeline │ │ ├── biking.svg │ │ ├── current_pos.svg │ │ ├── delayed_start.svg │ │ ├── driving.svg │ │ ├── goal_pos.svg │ │ ├── parking.svg │ │ ├── riding_bus.svg │ │ ├── start_pos.svg │ │ ├── waiting_for_bus.svg │ │ └── walking.svg │ └── tools │ │ ├── 20_mph.svg │ │ ├── alert.svg │ │ ├── bus_gate.svg │ │ ├── calendar.svg │ │ ├── circled_next.svg │ │ ├── circled_prev.svg │ │ ├── collapse_panel.svg │ │ ├── eraser.svg │ │ ├── exclude.svg │ │ ├── expand_panel.svg │ │ ├── export.svg │ │ ├── fire.svg │ │ ├── folder.svg │ │ ├── help.svg │ │ ├── home.svg │ │ ├── include.svg │ │ ├── info.svg │ │ ├── inward.svg │ │ ├── layers.svg │ │ ├── lightbulb.svg │ │ ├── location.svg │ │ ├── locked.svg │ │ ├── map.svg │ │ ├── maximize.svg │ │ ├── minimize.svg │ │ ├── modal_filter.svg │ │ ├── mouse.svg │ │ ├── no_entry.svg │ │ ├── one_ways.svg │ │ ├── outward.svg │ │ ├── pan.svg │ │ ├── pencil.svg │ │ ├── pin.svg │ │ ├── redo.svg │ │ ├── save.svg │ │ ├── school_street.svg │ │ ├── search.svg │ │ ├── select.svg │ │ ├── settings.svg │ │ ├── share.svg │ │ ├── shortcut.svg │ │ ├── signalized_crossing.svg │ │ ├── star.svg │ │ ├── time.svg │ │ ├── trash.svg │ │ ├── undo.svg │ │ ├── unsignalized_crossing.svg │ │ ├── uphill.svg │ │ ├── volume_off.svg │ │ ├── volume_on.svg │ │ └── warning.svg │ ├── extra_fonts │ ├── NotoSansArabic-Regular.ttf │ ├── NotoSansHebrew-Regular.ttf │ ├── NotoSansKR-Regular.ttf │ └── NotoSerifCJKtc-Regular.otf │ ├── ltn_proposals │ └── bristol_beaufort_road.json.gz │ └── study_areas │ ├── README.md │ ├── allerton-bywater.geojson │ ├── ashton-park.geojson │ ├── aylesbury.geojson │ ├── aylesham.geojson │ ├── bailrigg.geojson │ ├── bath-riverside.geojson │ ├── bicester.geojson │ ├── castlemead.geojson │ ├── chapelford.geojson │ ├── chapeltown-cohousing.geojson │ ├── clackers-brook.geojson │ ├── cricklewood.geojson │ ├── culm.geojson │ ├── dickens-heath.geojson │ ├── didcot.geojson │ ├── dunton-hills.geojson │ ├── ebbsfleet.geojson │ ├── exeter-red-cow-village.geojson │ ├── great-kneighton.geojson │ ├── halsnead.geojson │ ├── hampton.geojson │ ├── handforth.geojson │ ├── kergilliack.geojson │ ├── kidbrooke-village.geojson │ ├── lcid.geojson │ ├── lockleaze.geojson │ ├── long-marston.geojson │ ├── marsh-barton.geojson │ ├── micklefield.geojson │ ├── newborough-road.geojson │ ├── newcastle-great-park.geojson │ ├── northwick-park.geojson │ ├── poundbury.geojson │ ├── priors-hall.geojson │ ├── taunton-firepool.geojson │ ├── taunton-garden.geojson │ ├── tresham.geojson │ ├── trumpington-meadows.geojson │ ├── tyersal-lane.geojson │ ├── upton.geojson │ ├── water-lane.geojson │ ├── wichelstowe.geojson │ ├── wixams.geojson │ └── wynyard.geojson ├── headless ├── Cargo.toml ├── examples │ ├── abst_helpers.py │ ├── cancel_experiment.py │ ├── generate_traffic.py │ ├── go_client.go │ └── python_client.py └── src │ └── main.rs ├── import.sh ├── importer ├── Cargo.toml ├── actdev_scenario.sh ├── actdev_site.sh ├── config │ ├── at │ │ └── salzburg │ │ │ ├── east.geojson │ │ │ ├── north.geojson │ │ │ ├── south.geojson │ │ │ └── west.geojson │ ├── au │ │ └── melbourne │ │ │ ├── brunswick.geojson │ │ │ ├── dandenong.geojson │ │ │ └── maribyrnong.geojson │ ├── br │ │ └── sao_paulo │ │ │ ├── aricanduva.geojson │ │ │ ├── center.geojson │ │ │ └── sao_miguel_paulista.geojson │ ├── ca │ │ ├── montreal │ │ │ └── plateau.geojson │ │ └── toronto │ │ │ ├── dufferin.geojson │ │ │ └── sw.geojson │ ├── ch │ │ ├── geneva │ │ │ └── center.geojson │ │ └── zurich │ │ │ ├── center.geojson │ │ │ ├── east.geojson │ │ │ ├── north.geojson │ │ │ ├── south.geojson │ │ │ └── west.geojson │ ├── cl │ │ └── santiago │ │ │ └── bellavista.geojson │ ├── cz │ │ └── frydek_mistek │ │ │ └── huge.geojson │ ├── de │ │ ├── berlin │ │ │ ├── center.geojson │ │ │ └── neukolln.geojson │ │ ├── bonn │ │ │ ├── center.geojson │ │ │ ├── nordstadt.geojson │ │ │ └── venusberg.geojson │ │ └── rostock │ │ │ └── center.geojson │ ├── fr │ │ ├── brest │ │ │ └── city.geojson │ │ ├── charleville_mezieres │ │ │ ├── secteur1.geojson │ │ │ ├── secteur2.geojson │ │ │ ├── secteur3.geojson │ │ │ ├── secteur4.geojson │ │ │ └── secteur5.geojson │ │ ├── lyon │ │ │ └── center.geojson │ │ ├── paris │ │ │ ├── center.geojson │ │ │ ├── east.geojson │ │ │ ├── north.geojson │ │ │ ├── south.geojson │ │ │ └── west.geojson │ │ └── strasbourg │ │ │ ├── center.geojson │ │ │ ├── north.geojson │ │ │ └── south.geojson │ ├── gb │ │ ├── allerton_bywater │ │ │ └── center.geojson │ │ ├── ashton_park │ │ │ └── center.geojson │ │ ├── aylesbury │ │ │ └── center.geojson │ │ ├── aylesham │ │ │ └── center.geojson │ │ ├── bailrigg │ │ │ └── center.geojson │ │ ├── bath_riverside │ │ │ └── center.geojson │ │ ├── bicester │ │ │ └── center.geojson │ │ ├── birmingham │ │ │ └── center.geojson │ │ ├── bournemouth │ │ │ └── center.geojson │ │ ├── bradford │ │ │ └── center.geojson │ │ ├── brighton │ │ │ ├── center.geojson │ │ │ └── shoreham_by_sea.geojson │ │ ├── bristol │ │ │ ├── east.geojson │ │ │ ├── huge.geojson │ │ │ ├── north.geojson │ │ │ └── south.geojson │ │ ├── burnley │ │ │ └── center.geojson │ │ ├── cambridge │ │ │ └── north.geojson │ │ ├── cardiff │ │ │ └── center.geojson │ │ ├── castlemead │ │ │ └── center.geojson │ │ ├── chapelford │ │ │ └── center.geojson │ │ ├── chapeltown_cohousing │ │ │ └── center.geojson │ │ ├── chichester │ │ │ └── center.geojson │ │ ├── chorlton │ │ │ └── center.geojson │ │ ├── clackers_brook │ │ │ └── center.geojson │ │ ├── cricklewood │ │ │ └── center.geojson │ │ ├── culm │ │ │ └── center.geojson │ │ ├── darlington │ │ │ └── center.geojson │ │ ├── derby │ │ │ └── center.geojson │ │ ├── dickens_heath │ │ │ └── center.geojson │ │ ├── didcot │ │ │ └── center.geojson │ │ ├── dunton_hills │ │ │ └── center.geojson │ │ ├── ebbsfleet │ │ │ └── center.geojson │ │ ├── edinburgh │ │ │ └── center.geojson │ │ ├── exeter_red_cow_village │ │ │ └── center.geojson │ │ ├── glenrothes │ │ │ └── center.geojson │ │ ├── great_kneighton │ │ │ └── center.geojson │ │ ├── halsnead │ │ │ └── center.geojson │ │ ├── hampton │ │ │ └── center.geojson │ │ ├── handforth │ │ │ └── center.geojson │ │ ├── inverness │ │ │ └── center.geojson │ │ ├── keighley │ │ │ └── center.geojson │ │ ├── kergilliack │ │ │ └── center.geojson │ │ ├── kidbrooke_village │ │ │ └── center.geojson │ │ ├── lcid │ │ │ └── center.geojson │ │ ├── leeds │ │ │ ├── central.geojson │ │ │ ├── huge.geojson │ │ │ ├── north.geojson │ │ │ └── west.geojson │ │ ├── lockleaze │ │ │ └── center.geojson │ │ ├── london │ │ │ ├── barking_and_dagenham.geojson │ │ │ ├── barnet.geojson │ │ │ ├── bexley.geojson │ │ │ ├── brent.geojson │ │ │ ├── bromley.geojson │ │ │ ├── camden.geojson │ │ │ ├── central.geojson │ │ │ ├── city_of_london.geojson │ │ │ ├── croydon.geojson │ │ │ ├── ealing.geojson │ │ │ ├── enfield.geojson │ │ │ ├── greenwich.geojson │ │ │ ├── hackney.geojson │ │ │ ├── hammersmith_and_fulham.geojson │ │ │ ├── haringey.geojson │ │ │ ├── harrow.geojson │ │ │ ├── havering.geojson │ │ │ ├── highgate.geojson │ │ │ ├── hillingdon.geojson │ │ │ ├── hounslow.geojson │ │ │ ├── islington.geojson │ │ │ ├── islington_hackney.geojson │ │ │ ├── kennington.geojson │ │ │ ├── kensington_and_chelsea.geojson │ │ │ ├── kingston_upon_thames.geojson │ │ │ ├── lambeth.geojson │ │ │ ├── lewisham.geojson │ │ │ ├── merton.geojson │ │ │ ├── newham.geojson │ │ │ ├── newham_waltham_forest.geojson │ │ │ ├── redbridge.geojson │ │ │ ├── regents_park.geojson │ │ │ ├── richmond_upon_thames.geojson │ │ │ ├── southwark.geojson │ │ │ ├── sutton.geojson │ │ │ ├── tower_hamlets.geojson │ │ │ ├── waltham_forest.geojson │ │ │ ├── wandsworth.geojson │ │ │ └── westminster.geojson │ │ ├── long_marston │ │ │ ├── center.geojson │ │ │ └── leeds │ │ │ │ ├── central.geojson │ │ │ │ ├── huge.geojson │ │ │ │ ├── north.geojson │ │ │ │ └── west.geojson │ │ ├── manchester │ │ │ ├── levenshulme.geojson │ │ │ └── stockport.geojson │ │ ├── marsh_barton │ │ │ └── center.geojson │ │ ├── micklefield │ │ │ └── center.geojson │ │ ├── newborough_road │ │ │ └── center.geojson │ │ ├── newcastle_great_park │ │ │ └── center.geojson │ │ ├── newcastle_upon_tyne │ │ │ └── center.geojson │ │ ├── northwick_park │ │ │ └── center.geojson │ │ ├── nottingham │ │ │ ├── center.geojson │ │ │ ├── huge.geojson │ │ │ └── stapleford.geojson │ │ ├── oxford │ │ │ └── center.geojson │ │ ├── poundbury │ │ │ └── center.geojson │ │ ├── priors_hall │ │ │ └── center.geojson │ │ ├── sheffield │ │ │ ├── center.geojson │ │ │ ├── darnall.geojson │ │ │ ├── hillsborough.geojson │ │ │ └── woodseats.geojson │ │ ├── st_albans │ │ │ └── center.geojson │ │ ├── taunton_firepool │ │ │ └── center.geojson │ │ ├── taunton_garden │ │ │ └── center.geojson │ │ ├── tresham │ │ │ └── center.geojson │ │ ├── trumpington_meadows │ │ │ └── center.geojson │ │ ├── tyersal_lane │ │ │ └── center.geojson │ │ ├── upton │ │ │ └── center.geojson │ │ ├── water_lane │ │ │ └── center.geojson │ │ ├── wichelstowe │ │ │ └── center.geojson │ │ ├── wixams │ │ │ └── center.geojson │ │ ├── wokingham │ │ │ └── center.geojson │ │ └── wynyard │ │ │ └── center.geojson │ ├── hk │ │ └── kowloon │ │ │ └── tsim_sha_tsui.geojson │ ├── il │ │ └── tel_aviv │ │ │ └── center.geojson │ ├── in │ │ └── pune │ │ │ └── center.geojson │ ├── ir │ │ └── tehran │ │ │ ├── boundary0.geojson │ │ │ ├── boundary1.geojson │ │ │ ├── boundary2.geojson │ │ │ ├── boundary3.geojson │ │ │ ├── boundary4.geojson │ │ │ ├── boundary5.geojson │ │ │ ├── boundary6.geojson │ │ │ ├── boundary7.geojson │ │ │ ├── boundary8.geojson │ │ │ └── parliament.geojson │ ├── jp │ │ ├── hiroshima │ │ │ └── uni.geojson │ │ └── tokyo │ │ │ └── shibuya.geojson │ ├── kr │ │ └── seoul │ │ │ └── itaewon_dong.geojson │ ├── ly │ │ └── tripoli │ │ │ └── center.geojson │ ├── nl │ │ ├── groningen │ │ │ ├── center.geojson │ │ │ └── huge.geojson │ │ └── valkenburg │ │ │ └── center.geojson │ ├── nz │ │ └── auckland │ │ │ └── mangere.geojson │ ├── pl │ │ ├── krakow │ │ │ └── center.geojson │ │ └── warsaw │ │ │ └── center.geojson │ ├── pt │ │ └── lisbon │ │ │ └── center.geojson │ ├── sg │ │ └── jurong │ │ │ └── center.geojson │ ├── tw │ │ ├── keelung │ │ │ └── center.geojson │ │ └── taipei │ │ │ └── center.geojson │ └── us │ │ ├── anchorage │ │ └── downtown.geojson │ │ ├── bellevue │ │ └── huge.geojson │ │ ├── beltsville │ │ └── i495.geojson │ │ ├── detroit │ │ └── downtown.geojson │ │ ├── houston │ │ └── montrose.geojson │ │ ├── lynnwood │ │ └── hazelwood.geojson │ │ ├── milwaukee │ │ ├── downtown.geojson │ │ └── oak_creek.geojson │ │ ├── missoula │ │ └── center.geojson │ │ ├── mt_vernon │ │ ├── burlington.geojson │ │ └── downtown.geojson │ │ ├── new_haven │ │ └── center.geojson │ │ ├── nyc │ │ ├── downtown_brooklyn.geojson │ │ ├── fordham.geojson │ │ ├── lower_manhattan.geojson │ │ └── midtown_manhattan.geojson │ │ ├── phoenix │ │ ├── gilbert.geojson │ │ └── tempe.geojson │ │ ├── providence │ │ └── downtown.geojson │ │ ├── san_francisco │ │ └── downtown.geojson │ │ ├── seattle │ │ ├── arboretum.geojson │ │ ├── central_seattle.geojson │ │ ├── downtown.geojson │ │ ├── huge_seattle.geojson │ │ ├── lakeslice.geojson │ │ ├── montlake.geojson │ │ ├── north_seattle.geojson │ │ ├── phinney.geojson │ │ ├── qa.geojson │ │ ├── slu.geojson │ │ ├── south_seattle.geojson │ │ ├── udistrict_ravenna.geojson │ │ ├── wallingford.geojson │ │ └── west_seattle.geojson │ │ └── tucson │ │ └── center.geojson ├── external_scenarios.sh ├── sao_miguel_paulista_scenario.sh └── src │ ├── berlin.rs │ ├── configuration.rs │ ├── lib.rs │ ├── map_config.rs │ ├── pick_geofabrik.rs │ ├── seattle.rs │ ├── soundcast │ ├── mod.rs │ ├── popdat.rs │ └── trips.rs │ ├── uk.rs │ └── utils.rs ├── kml ├── Cargo.toml └── src │ └── lib.rs ├── map_gui ├── Cargo.toml ├── build.rs └── src │ ├── colors.rs │ ├── lib.rs │ ├── load.rs │ ├── options.rs │ ├── render │ ├── area.rs │ ├── building.rs │ ├── intersection.rs │ ├── lane.rs │ ├── map.rs │ ├── mod.rs │ ├── parking_lot.rs │ ├── road.rs │ ├── traffic_signal.rs │ ├── transit_stop.rs │ └── turn.rs │ ├── simple_app.rs │ └── tools │ ├── camera.rs │ ├── city_picker.rs │ ├── colors.rs │ ├── command.rs │ ├── compare_counts.rs │ ├── draw_overlapping_paths.rs │ ├── heatmap.rs │ ├── icons.rs │ ├── importer.rs │ ├── labels.rs │ ├── minimap.rs │ ├── mod.rs │ ├── navigate.rs │ ├── polygon.rs │ ├── title_screen.rs │ ├── trip_files.rs │ ├── ui.rs │ ├── updater.rs │ └── waypoints.rs ├── map_model ├── Cargo.toml └── src │ ├── city.rs │ ├── connectivity │ ├── mod.rs │ └── walking.rs │ ├── edits │ ├── apply.rs │ ├── compat.rs │ ├── mod.rs │ ├── perma.rs │ └── perma_traffic_signal.rs │ ├── lib.rs │ ├── make │ ├── bridges.rs │ ├── buildings.rs │ ├── mod.rs │ ├── parking_lots.rs │ ├── traffic_signals │ │ ├── lagging_green.rs │ │ └── mod.rs │ ├── transit.rs │ ├── turns.rs │ └── walking_turns.rs │ ├── map.rs │ ├── objects │ ├── area.rs │ ├── building.rs │ ├── intersection.rs │ ├── lane.rs │ ├── mod.rs │ ├── modal_filter.rs │ ├── movement.rs │ ├── parking_lot.rs │ ├── road.rs │ ├── stop_signs.rs │ ├── traffic_signals.rs │ ├── transit.rs │ ├── turn.rs │ └── zone.rs │ ├── pathfind │ ├── engine.rs │ ├── mod.rs │ ├── node_map.rs │ ├── pathfinder.rs │ ├── uber_turns.rs │ ├── v1.rs │ ├── v2.rs │ ├── vehicles.rs │ └── walking.rs │ └── traversable.rs ├── piggyback ├── Cargo.toml ├── README.md ├── bundle_static_files.sh ├── data ├── index.html ├── serve_locally.py └── src │ ├── lib.rs │ └── piggyback.rs ├── popdat ├── Cargo.toml ├── scripts │ └── build_population_areas.sh └── src │ ├── activities.rs │ ├── distribute_people.rs │ ├── import_census.rs │ ├── lib.rs │ ├── make_person.rs │ └── od.rs ├── popgetter ├── Cargo.toml ├── README.md └── src │ └── lib.rs ├── raw_map ├── Cargo.toml └── src │ ├── lib.rs │ └── types.rs ├── release ├── INSTRUCTIONS.txt ├── build.sh ├── deploy_actdev.sh ├── deploy_web.sh ├── finalize.sh └── update_docs.sh ├── rgrep.sh ├── sim ├── Cargo.toml └── src │ ├── analytics.rs │ ├── bin │ └── run_scenario.rs │ ├── events.rs │ ├── lib.rs │ ├── make │ ├── load.rs │ ├── mod.rs │ └── spawner.rs │ ├── mechanics │ ├── car.rs │ ├── driving.rs │ ├── intersection.rs │ ├── mod.rs │ ├── parking.rs │ ├── queue.rs │ └── walking.rs │ ├── pandemic │ ├── mod.rs │ └── model.rs │ ├── prebake.rs │ ├── recorder.rs │ ├── render.rs │ ├── router.rs │ ├── scheduler.rs │ ├── sim │ ├── mod.rs │ ├── queries.rs │ └── scenario.rs │ ├── transit.rs │ └── trips.rs ├── synthpop ├── Cargo.toml └── src │ ├── borders.rs │ ├── counts.rs │ ├── endpoint.rs │ ├── external.rs │ ├── lib.rs │ ├── make │ ├── activity_model.rs │ ├── generator.rs │ └── mod.rs │ ├── modifier.rs │ └── scenario.rs ├── tests ├── Cargo.toml ├── goldenfiles │ ├── blockfinding.txt │ ├── bus_routes │ │ ├── br_sao_paulo_aricanduva.txt │ │ ├── br_sao_paulo_center.txt │ │ └── us_seattle_arboretum.txt │ ├── ltn_proposals │ │ └── edit_turn_restrictions.json │ ├── prebaked_summaries.json │ └── turn_types │ │ ├── divided_highway_split.txt │ │ ├── false_positive_u_turns.txt │ │ ├── left_turn_and_bike_lane.txt │ │ ├── multiple_left_turn_lanes.txt │ │ └── turn_restriction_ltn_boundary.txt ├── input │ ├── divided_highway_split.osm │ ├── false_positive_u_turns.osm │ ├── lane_selection.osm │ ├── left_turn_and_bike_lane.osm │ ├── multiple_left_turn_lanes.osm │ └── turn_restriction_ltn_boundary.osm └── src │ ├── lib.rs │ └── main.rs ├── traffic_seitan ├── Cargo.toml ├── src │ └── main.rs └── traffic_seitan.png ├── updater ├── Cargo.toml └── src │ └── main.rs ├── web ├── .gitignore ├── Makefile ├── README.md ├── bin │ ├── build-wasm │ └── bundle-widgetry-js ├── package-lock.json ├── package.json └── src │ ├── abstreet │ └── abstreet.ts │ ├── fifteen_min │ └── fifteen_min.ts │ ├── ltn │ └── ltn.ts │ ├── map_editor │ └── map_editor.ts │ ├── osm_viewer │ └── osm_viewer.ts │ ├── santa │ └── santa.ts │ ├── web_root │ ├── abstreet.css │ ├── abstreet.html │ ├── blog_root │ │ ├── 2021 │ │ │ └── 03 │ │ │ │ └── 31 │ │ │ │ └── example-post.html │ │ └── static_assets │ │ │ └── snow_bike.jpg │ ├── fifteen_min.html │ ├── index.html │ ├── ltn.html │ ├── map_editor.html │ ├── osm_viewer.html │ ├── santa.html │ └── widgetry_demo.html │ ├── widgetry.ts │ └── widgetry_demo │ └── widgetry_demo.ts ├── widgetry ├── Cargo.toml ├── README.md ├── demo.gif ├── fonts │ ├── Bungee-Regular.ttf │ ├── BungeeInline-Regular.ttf │ ├── Overpass-Bold.ttf │ ├── Overpass-Regular.ttf │ ├── Overpass-SemiBold.ttf │ └── OverpassMono-Bold.ttf ├── icons │ ├── arrow_down.svg │ ├── arrow_drop_down.svg │ ├── arrow_keys.svg │ ├── arrow_left.svg │ ├── arrow_right.svg │ ├── arrow_up.svg │ ├── checkbox_checked.svg │ ├── checkbox_no_border_checked.svg │ ├── checkbox_no_border_unchecked.svg │ ├── checkbox_unchecked.svg │ ├── close.svg │ ├── loading.svg │ ├── nav_back.svg │ ├── next.svg │ ├── prev.svg │ ├── switch_off.svg │ ├── switch_on.svg │ ├── toggle_left.svg │ └── toggle_right.svg ├── shaders │ ├── fragment_140.glsl │ ├── fragment_300.glsl │ ├── fragment_webgl1.glsl │ ├── vertex_140.glsl │ ├── vertex_300.glsl │ └── vertex_webgl1.glsl ├── src │ ├── app_state.rs │ ├── assets.rs │ ├── backend_glow.rs │ ├── backend_glow_native.rs │ ├── backend_glow_wasm.rs │ ├── canvas.rs │ ├── color.rs │ ├── drawing.rs │ ├── event.rs │ ├── event_ctx.rs │ ├── geom │ │ ├── geom_batch_stack.rs │ │ └── mod.rs │ ├── input.rs │ ├── lib.rs │ ├── mapspace │ │ ├── mod.rs │ │ ├── unzoomed.rs │ │ └── world.rs │ ├── runner.rs │ ├── screen_geom.rs │ ├── style │ │ ├── button_style.rs │ │ └── mod.rs │ ├── svg.rs │ ├── text.rs │ ├── tools │ │ ├── choose_something.rs │ │ ├── colors.rs │ │ ├── lasso.rs │ │ ├── load.rs │ │ ├── mod.rs │ │ ├── popup.rs │ │ ├── prompt_input.rs │ │ ├── screenshot.rs │ │ ├── url.rs │ │ └── warper.rs │ └── widgets │ │ ├── autocomplete.rs │ │ ├── button.rs │ │ ├── compare_times.rs │ │ ├── containers.rs │ │ ├── drag_drop.rs │ │ ├── dropdown.rs │ │ ├── fan_chart.rs │ │ ├── filler.rs │ │ ├── image.rs │ │ ├── just_draw.rs │ │ ├── line_plot.rs │ │ ├── menu.rs │ │ ├── mod.rs │ │ ├── panel.rs │ │ ├── persistent_split.rs │ │ ├── plots.rs │ │ ├── scatter_plot.rs │ │ ├── slider.rs │ │ ├── spinner.rs │ │ ├── stash.rs │ │ ├── table.rs │ │ ├── tabs.rs │ │ ├── text_box.rs │ │ └── toggle.rs └── textures │ └── spritesheet.png └── widgetry_demo ├── Cargo.toml └── src ├── lib.rs └── main.rs /.dockerignore: -------------------------------------------------------------------------------- 1 | # Everything is ignored, except for the following 2 | * 3 | !target/release/importer 4 | !target/release/updater 5 | !data/MANIFEST.json 6 | !importer/config/* 7 | !cloud/* 8 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: dabreegster 2 | -------------------------------------------------------------------------------- /abstio/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "abstio" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstutil = { path = "../abstutil" } 9 | anyhow = { workspace = true } 10 | base64 = "0.21.5" 11 | bincode = { workspace = true } 12 | fs-err = { workspace = true } 13 | instant = { workspace = true } 14 | log = { workspace = true } 15 | reqwest = { version = "0.11.22", default-features=false, features=["rustls-tls"] } 16 | serde = { workspace = true, features=["derive"] } 17 | serde_json = { workspace = true } 18 | 19 | [target.'cfg(not(target_arch = "wasm32"))'.dependencies] 20 | futures-channel = { workspace = true } 21 | # Don't use workspace, because that includes features=full 22 | tokio = "1.34.0" 23 | 24 | [target.'cfg(target_arch = "wasm32")'.dependencies] 25 | include_dir = { git = "https://github.com/dabreegster/include_dir", branch = "union" } 26 | js-sys = "0.3.65" 27 | wasm-bindgen = { workspace = true } 28 | web-sys = { workspace = true, features=["HtmlElement", "Storage", "Window"] } 29 | -------------------------------------------------------------------------------- /abstutil/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "abstutil" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | anyhow = { workspace = true } 9 | bincode = { workspace = true } 10 | env_logger = { version = "0.10.1" } 11 | fs-err = { workspace = true } 12 | instant = { workspace = true } 13 | itertools = "0.12.0" 14 | log = { workspace = true } 15 | num_cpus = "1.16.0" 16 | scoped_threadpool = "0.1.9" 17 | serde = { workspace = true, features=["derive"] } 18 | serde_json = { workspace = true } 19 | 20 | [target.'cfg(unix)'.dependencies] 21 | termion = "2.0.3" 22 | 23 | [target.'cfg(target_arch = "wasm32")'.dependencies] 24 | console_log = "1.0.0" 25 | web-sys = { workspace = true, features=["Location", "Window"] } 26 | -------------------------------------------------------------------------------- /abstutil/src/clone.rs: -------------------------------------------------------------------------------- 1 | use std::any::Any; 2 | 3 | /// Trick to make a cloneable Any from 4 | /// https://stackoverflow.com/questions/30353462/how-to-clone-a-struct-storing-a-boxed-trait-object/30353928#30353928. 5 | pub trait CloneableAny: CloneableImpl {} 6 | 7 | pub trait CloneableImpl { 8 | fn clone_box(&self) -> Box; 9 | fn as_any(&self) -> &dyn Any; 10 | } 11 | 12 | impl CloneableImpl for T 13 | where 14 | T: 'static + CloneableAny + Clone, 15 | { 16 | fn clone_box(&self) -> Box { 17 | Box::new(self.clone()) 18 | } 19 | 20 | fn as_any(&self) -> &dyn Any { 21 | self 22 | } 23 | } 24 | 25 | impl Clone for Box { 26 | fn clone(&self) -> Box { 27 | self.clone_box() 28 | } 29 | } 30 | 31 | impl CloneableAny for Vec {} 32 | -------------------------------------------------------------------------------- /abstutil/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! The contents of this crate need to be organized better: 2 | //! 3 | //! - Timer (a mix of logging, profiling, and even parallel execution) 4 | //! - true utility functions (collections, prettyprinting, CLI parsing 5 | 6 | #![allow(clippy::new_without_default)] 7 | 8 | #[macro_use] 9 | extern crate anyhow; 10 | #[macro_use] 11 | extern crate log; 12 | 13 | // I'm not generally a fan of wildcard exports, but they're more maintainable here. 14 | pub use crate::serde::*; 15 | pub use cli::*; 16 | pub use clone::*; 17 | pub use collections::*; 18 | pub use logger::*; 19 | pub use priority_queue::*; 20 | pub use process::*; 21 | pub use time::*; 22 | pub use utils::*; 23 | 24 | mod cli; 25 | mod clone; 26 | mod collections; 27 | pub mod logger; 28 | mod priority_queue; 29 | mod process; 30 | mod serde; 31 | pub mod time; 32 | mod utils; 33 | 34 | pub const PROGRESS_FREQUENCY_SECONDS: f64 = 0.2; 35 | -------------------------------------------------------------------------------- /abstutil/src/priority_queue.rs: -------------------------------------------------------------------------------- 1 | use std::cmp::Ordering; 2 | 3 | use serde::{Deserialize, Serialize}; 4 | 5 | /// Use with `BinaryHeap`. Since it's a max-heap, reverse the comparison to get the smallest cost 6 | /// first. 7 | #[derive(Serialize, Deserialize, PartialEq, Eq, Clone)] 8 | pub struct PriorityQueueItem { 9 | pub cost: K, 10 | pub value: V, 11 | } 12 | 13 | impl PartialOrd for PriorityQueueItem { 14 | fn partial_cmp(&self, other: &Self) -> Option { 15 | Some(self.cmp(other)) 16 | } 17 | } 18 | 19 | impl Ord for PriorityQueueItem { 20 | fn cmp(&self, other: &Self) -> Ordering { 21 | let ord = other.cost.cmp(&self.cost); 22 | if ord != Ordering::Equal { 23 | return ord; 24 | } 25 | // The tie-breaker is arbitrary, based on the value 26 | self.value.cmp(&other.value) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /abstutil/src/process.rs: -------------------------------------------------------------------------------- 1 | use std::process::Command; 2 | 3 | /// Runs a command, asserts success. STDOUT and STDERR aren't touched. 4 | pub fn must_run_cmd(cmd: &mut Command) { 5 | println!("- Running {:?}", cmd); 6 | match cmd.status() { 7 | Ok(status) => { 8 | if !status.success() { 9 | panic!("{:?} failed", cmd); 10 | } 11 | } 12 | Err(err) => { 13 | panic!("Failed to run {:?}: {:?}", cmd, err); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/fifteen_min/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "fifteen_min" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | 10 | [features] 11 | default = ["map_gui/native", "widgetry/native-backend"] 12 | wasm = ["getrandom/js", "map_gui/wasm", "wasm-bindgen", "widgetry/wasm-backend"] 13 | 14 | [dependencies] 15 | abstio = { path = "../../abstio" } 16 | abstutil = { path = "../../abstutil" } 17 | contour = { workspace = true } 18 | geojson = { workspace = true } 19 | geom = { workspace = true } 20 | getrandom = { workspace = true, optional = true } 21 | log = { workspace = true } 22 | map_gui = { path = "../../map_gui" } 23 | map_model = { path = "../../map_model" } 24 | structopt = { workspace = true } 25 | synthpop = { path = "../../synthpop" } # TODO Remove 26 | wasm-bindgen = { workspace = true, optional = true } 27 | widgetry = { path = "../../widgetry" } 28 | -------------------------------------------------------------------------------- /apps/fifteen_min/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | fifteen_min::main(); 3 | } 4 | -------------------------------------------------------------------------------- /apps/game/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | game::main(); 3 | } 4 | -------------------------------------------------------------------------------- /apps/ltn/README.md: -------------------------------------------------------------------------------- 1 | The photos in `spritesheet.gif` were taken around London by Dustin Carlino in 2 | October 2022, and are released under 3 | [CC0](https://creativecommons.org/share-your-work/public-domain/cc0/). 4 | -------------------------------------------------------------------------------- /apps/ltn/spritesheet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/apps/ltn/spritesheet.gif -------------------------------------------------------------------------------- /apps/ltn/src/components/mod.rs: -------------------------------------------------------------------------------- 1 | mod appwide_panel; 2 | mod layers; 3 | mod left_panel; 4 | 5 | pub use appwide_panel::AppwidePanel; 6 | pub use layers::{legend_entry, Layers}; 7 | pub use left_panel::{BottomPanel, LeftPanel}; 8 | 9 | #[derive(Clone, Copy, PartialEq)] 10 | pub enum Mode { 11 | PickArea, 12 | FreehandBoundary, 13 | ModifyNeighbourhood, 14 | SelectBoundary, 15 | PerResidentImpact, 16 | RoutePlanner, 17 | Crossings, 18 | Impact, 19 | CycleNetwork, 20 | Census, 21 | } 22 | -------------------------------------------------------------------------------- /apps/ltn/src/logic/mod.rs: -------------------------------------------------------------------------------- 1 | mod auto_filters; 2 | mod existing; 3 | pub mod impact; 4 | mod partition; 5 | mod shortcuts; 6 | pub mod turn_restrictions; 7 | 8 | pub use auto_filters::AutoFilterHeuristic; 9 | pub use existing::transform_existing; 10 | pub use impact::Impact; 11 | pub use partition::{BlockID, CustomBoundary, NeighbourhoodID, Partitioning}; 12 | pub use shortcuts::Shortcuts; 13 | pub use turn_restrictions::possible_destination_roads; 14 | -------------------------------------------------------------------------------- /apps/ltn/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | ltn::main(); 3 | } 4 | -------------------------------------------------------------------------------- /apps/ltn/src/pages/mod.rs: -------------------------------------------------------------------------------- 1 | mod about; 2 | mod census; 3 | mod crossings; 4 | mod customize_boundary; 5 | mod cycle_network; 6 | pub mod design_ltn; 7 | mod freehand_boundary; 8 | mod per_resident_impact; 9 | mod pick_area; 10 | mod predict_impact; 11 | mod route_planner; 12 | mod select_boundary; 13 | 14 | pub use about::About; 15 | pub use census::Census; 16 | pub use crossings::Crossings; 17 | pub use customize_boundary::CustomizeBoundary; 18 | pub use cycle_network::CycleNetwork; 19 | pub use design_ltn::{turn_restrictions::handle_edited_turn_restrictions, DesignLTN, EditMode}; 20 | pub use freehand_boundary::FreehandBoundary; 21 | pub use per_resident_impact::PerResidentImpact; 22 | pub use pick_area::{PickArea, PickAreaStyle}; 23 | pub use predict_impact::ShowImpactResults; 24 | pub use route_planner::RoutePlanner; 25 | pub use select_boundary::SelectBoundary; 26 | -------------------------------------------------------------------------------- /apps/map_editor/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "map_editor" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | 10 | [features] 11 | default = ["widgetry/native-backend"] 12 | wasm = ["getrandom/js", "wasm-bindgen", "widgetry/wasm-backend"] 13 | 14 | [dependencies] 15 | abstio = { path = "../../abstio" } 16 | abstutil = { path = "../../abstutil" } 17 | fs-err = { workspace = true } 18 | geom = { workspace = true } 19 | getrandom = { workspace = true, optional = true } 20 | log = { workspace = true } 21 | raw_map = { path = "../../raw_map" } 22 | serde = { workspace = true, features=["derive"] } 23 | osm2streets = { git = "https://github.com/a-b-street/osm2streets" } 24 | structopt = { workspace = true } 25 | wasm-bindgen = { workspace = true, optional = true } 26 | widgetry = { path = "../../widgetry" } 27 | -------------------------------------------------------------------------------- /apps/map_editor/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | map_editor::main(); 3 | } 4 | -------------------------------------------------------------------------------- /apps/osm_viewer/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "osm_viewer" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | 10 | [features] 11 | default = ["map_gui/native", "widgetry/native-backend"] 12 | wasm = ["getrandom/js", "map_gui/wasm", "wasm-bindgen", "widgetry/wasm-backend"] 13 | 14 | [dependencies] 15 | abstio = { path = "../../abstio" } 16 | abstutil = { path = "../../abstutil" } 17 | geom = { workspace = true } 18 | getrandom = { workspace = true, optional = true } 19 | map_gui = { path = "../../map_gui" } 20 | map_model = { path = "../../map_model" } 21 | structopt = { workspace = true } 22 | wasm-bindgen = { workspace = true, optional = true } 23 | widgetry = { path = "../../widgetry" } 24 | -------------------------------------------------------------------------------- /apps/osm_viewer/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | osm_viewer::main(); 3 | } 4 | -------------------------------------------------------------------------------- /apps/parking_mapper/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "parking_mapper" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [features] 8 | default = ["map_gui/native", "reqwest", "widgetry/native-backend"] 9 | 10 | [dependencies] 11 | abstio = { path = "../../abstio" } 12 | abstutil = { path = "../../abstutil" } 13 | anyhow = { workspace = true } 14 | fs-err = { workspace = true } 15 | geom = { workspace = true } 16 | log = { workspace = true } 17 | map_gui = { path = "../../map_gui" } 18 | map_model = { path = "../../map_model" } 19 | reqwest = { version = "0.11.17", optional = true, default-features=false, features=["blocking", "rustls-tls"] } 20 | structopt = { workspace = true } 21 | widgetry = { path = "../../widgetry" } 22 | xmltree = "0.10.1" 23 | -------------------------------------------------------------------------------- /apps/parking_mapper/src/main.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate log; 3 | 4 | use structopt::StructOpt; 5 | 6 | mod mapper; 7 | 8 | fn main() { 9 | let mut options = map_gui::options::Options::load_or_default(); 10 | options.canvas_settings.min_zoom_for_detail = 2.0; 11 | let args = map_gui::SimpleAppArgs::from_iter(abstutil::cli_args()); 12 | args.override_options(&mut options); 13 | 14 | let settings = args 15 | .update_widgetry_settings(widgetry::Settings::new("OSM parking mapper")) 16 | .canvas_settings(options.canvas_settings.clone()); 17 | widgetry::run(settings, |ctx| { 18 | map_gui::SimpleApp::new( 19 | ctx, 20 | options, 21 | Some(args.map_name()), 22 | args.cam, 23 | (), 24 | |ctx, app| vec![mapper::ParkingMapper::new_state(ctx, app)], 25 | ) 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /apps/santa/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "santa" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | 10 | [features] 11 | default = ["map_gui/native", "widgetry/native-backend"] 12 | wasm = ["getrandom/js", "map_gui/wasm", "wasm-bindgen", "widgetry/wasm-backend"] 13 | 14 | [dependencies] 15 | abstio = { path = "../../abstio" } 16 | abstutil = { path = "../../abstutil" } 17 | anyhow = { workspace = true } 18 | geom = { workspace = true } 19 | getrandom = { workspace = true, optional = true } 20 | kml = { path = "../../kml" } 21 | log = { workspace = true } 22 | map_gui = { path = "../../map_gui" } 23 | map_model = { path = "../../map_model" } 24 | rand = { workspace = true } 25 | rand_xorshift = { workspace = true } 26 | rodio = { version = "0.17.3", default-features = false, features = ["vorbis"] } 27 | serde = { workspace = true, features=["derive"] } 28 | wasm-bindgen = { workspace = true, optional = true } 29 | widgetry = { path = "../../widgetry" } 30 | -------------------------------------------------------------------------------- /apps/santa/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | santa::main(); 3 | } 4 | -------------------------------------------------------------------------------- /blockfinding/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "blockfinding" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | abstutil = { path = "../abstutil" } 8 | anyhow = { workspace = true } 9 | geom = { workspace = true } 10 | log = { workspace = true } 11 | map_model = { path = "../map_model" } 12 | serde = { workspace = true, features=["derive"] } 13 | -------------------------------------------------------------------------------- /cli/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cli" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | abstio = { path = "../abstio" } 8 | abstutil = { path = "../abstutil" } 9 | anyhow = { workspace = true } 10 | convert_osm = { path = "../convert_osm" } 11 | csv = { workspace = true } 12 | fs-err = { workspace = true } 13 | geo = { workspace = true } 14 | geom = { workspace = true } 15 | importer = { path = "../importer" } 16 | log = { workspace = true } 17 | map_model = { path = "../map_model" } 18 | osmio = "0.8.1" 19 | rand = "0.8.3" 20 | rand_xorshift = { workspace = true } 21 | raw_map = { path = "../raw_map" } 22 | serde = { workspace = true, features=["derive"] } 23 | sim = { path = "../sim" } 24 | synthpop = { path = "../synthpop" } 25 | structopt = { workspace = true } 26 | tokio = { workspace = true } 27 | -------------------------------------------------------------------------------- /cloud/gather_output.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This script grabs all files changed by VMs, copying them locally. 3 | # 4 | # This process is only runnable by Dustin, due to current S3 permissions. 5 | # 6 | # Run from the repo's root dir: cloud/gather_output.sh 7 | 8 | set -e 9 | set -x 10 | 11 | EXPERIMENT_TAG=$1 12 | if [ "$EXPERIMENT_TAG" == "" ]; then 13 | echo Missing args; 14 | exit 1; 15 | fi 16 | 17 | aws s3 cp --recursive s3://abstreet/$EXPERIMENT_TAG/data/ data/ 18 | # gunzip all of the changed files, overwriting the local copies 19 | find data/ -path data/system/assets -prune -o -name '*.gz' -print -exec gunzip -f '{}' ';' 20 | 21 | echo "Done! Validate the files, run 'updater upload' as usual, and don't forget to clean up s3://abstreet/$EXPERIMENT_TAG" 22 | -------------------------------------------------------------------------------- /collisions/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "collisions" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | geom = { workspace = true } 9 | kml = { path = "../kml" } 10 | log = { workspace = true } 11 | serde = { workspace = true, features=["derive"] } 12 | -------------------------------------------------------------------------------- /convert_osm/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "convert_osm" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | csv = { workspace = true } 12 | elevation = { git = "https://github.com/dabreegster/elevation" } 13 | fs-err = { workspace = true } 14 | geom = { workspace = true } 15 | kml = { path = "../kml" } 16 | log = { workspace = true } 17 | osm2streets = { git = "https://github.com/a-b-street/osm2streets" } 18 | popgetter = { path = "../popgetter" } 19 | raw_map = { path = "../raw_map" } 20 | serde = { workspace = true, features=["derive"] } 21 | streets_reader = { git = "https://github.com/a-b-street/osm2streets" } 22 | -------------------------------------------------------------------------------- /data/diff_changed_files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # If `updater --dry` says a file changed, like 3 | # `data/system/us/seattle/maps/montlake.bin`, call this to dump the old and new 4 | # versions of the file to JSON and compare them manually. This only works if 5 | # you have a copy of the S3 directory in ~/s3_abst_data. 6 | 7 | set -e 8 | 9 | FILE=$1 10 | if [ "$FILE" == "" ]; then 11 | echo Missing args; 12 | exit 1; 13 | fi 14 | 15 | cp ~/s3_abst_data/dev/${FILE}.gz old.bin.gz 16 | gunzip old.bin.gz 17 | ./target/release/cli dump-json old.bin > old.json 18 | rm -f old.bin 19 | 20 | ./target/release/cli dump-json $FILE > new.json 21 | 22 | echo "diff old.json new.json" 23 | echo "mold old.json new.json # slower" 24 | -------------------------------------------------------------------------------- /data/diff_changed_map.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # If `updater --dry` says a mapchanged, call this to launch a UI and compare. 3 | # This only works if you have a copy of the S3 directory in ~/s3_abst_data. 4 | 5 | set -e 6 | 7 | FILE=$1 8 | if [ "$FILE" == "" ]; then 9 | echo Missing args; 10 | exit 1; 11 | fi 12 | 13 | rm -f old.bin 14 | cp ~/s3_abst_data/dev/${FILE}.gz old.bin.gz 15 | gunzip old.bin.gz 16 | ./target/release/game --dev $FILE --diff old.bin 17 | -------------------------------------------------------------------------------- /data/get_fresh_osm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This tool needs https://wiki.openstreetmap.org/wiki/Osmupdate#Download 4 | # This is just for Seattle 5 | 6 | set -e 7 | 8 | # From http://download.geofabrik.de/north-america/us/washington.html 9 | curl -L -O http://download.geofabrik.de/north-america/us/washington-latest.osm.pbf 10 | # TODO Ideally limit update size with a clipping polygon, but it clips too 11 | # aggressively for the huge_seattle map. I guess we'd need an even bigger 12 | # boundary for that. 13 | osmupdate -v washington-latest.osm.pbf updated_wa.osm.pbf 14 | -------------------------------------------------------------------------------- /data/regen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # TODO It's probably more useful to now manually run commands from this file. 3 | 4 | set -e 5 | 6 | rm -fv data/input/us/seattle/raw_maps/huge_seattle.bin data/system/us/seattle/maps/huge_seattle.bin data/input/us/seattle/popdat.bin 7 | 8 | RUST_BACKTRACE=1 cargo run --release --bin cli --features importer/scenarios -- regenerate-everything 9 | # Or more efficiently: 10 | # ./target/release/cli regenerate-everything-externally 11 | 12 | # If a map changes that has external JSON scenarios, enable this! 13 | # importer/external_scenarios.sh 14 | 15 | # London has a bunch of maps that run in parallel, so calculate the overview after all of those finish above 16 | ./import.sh --city-overview --city=gb/london 17 | 18 | RUST_BACKTRACE=1 cargo run --release --bin game -- --prebake 19 | 20 | RUST_BACKTRACE=1 cargo run --release --bin tests 21 | -------------------------------------------------------------------------------- /data/system/assets/characters/boss.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/characters/boss.svg.gz -------------------------------------------------------------------------------- /data/system/assets/characters/parents.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/characters/parents.svg.gz -------------------------------------------------------------------------------- /data/system/assets/edit/backwards.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/edit/buffer/curb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/edit/buffer/flex_posts.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /data/system/assets/edit/buffer/jersey_barrier.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/edit/buffer/stripes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /data/system/assets/edit/construction.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/edit/forwards.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/edit/parking.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/edit/sidewalk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/flags/at.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/ca.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/ch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/cl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /data/system/assets/flags/cz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/flags/de.svg: -------------------------------------------------------------------------------- 1 | 2 | Flag of Germany 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /data/system/assets/flags/fr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/gb.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/hk.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/il.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/in.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/jp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/flags/kr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/ly.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /data/system/assets/flags/nl.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/pl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/flags/sg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /data/system/assets/flags/tw.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/flags/us.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/map/light_rail.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /data/system/assets/map/national_rail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/map/parked_car.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/map/parking.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/map/private_road.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/map/school.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/map/shared_left_turn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/meters/bus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/meters/car.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/meters/pedestrian.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/meters/trip_histogram.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/minimap/down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/minimap/left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/minimap/right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/minimap/up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/minimap/zoom_in_fully.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/minimap/zoom_out_fully.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/music/carol_bells.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/music/carol_bells.ogg -------------------------------------------------------------------------------- /data/system/assets/music/dance_sugar_plum_fairy.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/music/dance_sugar_plum_fairy.ogg -------------------------------------------------------------------------------- /data/system/assets/music/god_rest_ye_merry_gentlemen.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/music/god_rest_ye_merry_gentlemen.ogg -------------------------------------------------------------------------------- /data/system/assets/music/jingle_bells.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/music/jingle_bells.ogg -------------------------------------------------------------------------------- /data/system/assets/music/silent_night.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/music/silent_night.ogg -------------------------------------------------------------------------------- /data/system/assets/music/sources.md: -------------------------------------------------------------------------------- 1 | # Music 2 | 3 | - Dance of the Sugar Plum Fairy by Kevin MacLeod, CC by 3.0: 4 | - Carol of the Bells by Live Action Fezz, CC BY-NC-SA 4.0: 5 | - God Rest Ye Merry Gentlemen by Dee Yan-Key, CC BY-NC-ND 4.0: 6 | - Silent Night & Jingle Bells by Royalty Free Music, CC-BY-NC-ND 4.0: 7 | -------------------------------------------------------------------------------- /data/system/assets/pregame/challenges.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /data/system/assets/pregame/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/pregame/favicon.ico -------------------------------------------------------------------------------- /data/system/assets/pregame/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/assets/pregame/icon.png -------------------------------------------------------------------------------- /data/system/assets/pregame/sandbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /data/system/assets/pregame/tutorial.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/speed/jump_to_time.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/speed/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/speed/pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/speed/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/speed/reset.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/speed/triangle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/speed/zoom_level_rect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/timeline/current_pos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/timeline/delayed_start.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/timeline/goal_pos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/timeline/parking.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/timeline/riding_bus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/timeline/start_pos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/timeline/walking.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/tools/alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/tools/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/circled_next.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/tools/circled_prev.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/tools/collapse_panel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/eraser.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/exclude.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /data/system/assets/tools/expand_panel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/export.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/help.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/tools/home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/include.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /data/system/assets/tools/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/tools/inward.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/tools/layers.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/lightbulb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/location.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/locked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/map.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/maximize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/tools/minimize.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/tools/mouse.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /data/system/assets/tools/no_entry.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/tools/one_ways.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /data/system/assets/tools/outward.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/system/assets/tools/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/pin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/system/assets/tools/redo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/save.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/tools/select.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /data/system/assets/tools/share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/shortcut.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /data/system/assets/tools/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/time.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/undo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/assets/tools/uphill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/system/assets/tools/volume_off.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /data/system/assets/tools/volume_on.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /data/system/assets/tools/warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/system/extra_fonts/NotoSansArabic-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/extra_fonts/NotoSansArabic-Regular.ttf -------------------------------------------------------------------------------- /data/system/extra_fonts/NotoSansHebrew-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/extra_fonts/NotoSansHebrew-Regular.ttf -------------------------------------------------------------------------------- /data/system/extra_fonts/NotoSansKR-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/extra_fonts/NotoSansKR-Regular.ttf -------------------------------------------------------------------------------- /data/system/extra_fonts/NotoSerifCJKtc-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/extra_fonts/NotoSerifCJKtc-Regular.otf -------------------------------------------------------------------------------- /data/system/ltn_proposals/bristol_beaufort_road.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/data/system/ltn_proposals/bristol_beaufort_road.json.gz -------------------------------------------------------------------------------- /data/system/study_areas/README.md: -------------------------------------------------------------------------------- 1 | These files are `site.geojson` from 2 | and 3 | other directories. They were manually downloaded once; this might be scripted 4 | in the future. 5 | -------------------------------------------------------------------------------- /headless/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "headless" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | geojson = { workspace = true } 12 | geom = { workspace = true } 13 | hyper = { version = "0.14.26", features = ["full"] } 14 | lazy_static = "1.4.0" 15 | log = { workspace = true } 16 | map_model = { path = "../map_model" } 17 | rand = { workspace = true } 18 | rand_xorshift = { workspace = true } 19 | serde = { workspace = true, features=["derive"] } 20 | serde_json = { workspace = true } 21 | sim = { path = "../sim" } 22 | synthpop = { path = "../synthpop" } 23 | structopt = { workspace = true } 24 | tokio = { workspace = true } 25 | url = "2.5.0" 26 | -------------------------------------------------------------------------------- /import.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # If true, display importer progress from the Timer (dumped to STDOUT) in one 4 | # pane, and all logs (on STDERR) in another. This is disabled by default until 5 | # some issues with multitail are fixed: 6 | # 7 | # 1) Automatically exit when the importer is done 8 | # 2) Stop having part of the logs blink 9 | # 3) Get the \r / clear-line thing working for the Timer 10 | USE_MULTITAIL=false 11 | 12 | SPEED=--release 13 | if [ "$1" == "--dev" ]; then 14 | shift 15 | SPEED= 16 | fi 17 | 18 | if ! command -v multitail &> /dev/null; then 19 | USE_MULTITAIL=false 20 | fi 21 | 22 | if $USE_MULTITAIL; then 23 | RUST_BACKTRACE=1 RUST_LOG_STYLE=always cargo run --bin cli $SPEED --features importer/scenarios -- import $@ > /tmp/abst_stdout 2> /tmp/abst_stderr & 24 | multitail /tmp/abst_stdout -cT ANSI /tmp/abst_stderr 25 | else 26 | RUST_BACKTRACE=1 cargo run --bin cli $SPEED --features importer/scenarios -- import $@ 27 | fi 28 | -------------------------------------------------------------------------------- /importer/config/au/melbourne/brunswick.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 144.9349021911621, 9 | -37.75510841351982 10 | ], 11 | [ 12 | 144.93267059326172, 13 | -37.79093020979956 14 | ], 15 | [ 16 | 144.94588851928708, 17 | -37.79703446640547 18 | ], 19 | [ 20 | 144.98399734497067, 21 | -37.80056114033423 22 | ], 23 | [ 24 | 144.99635696411133, 25 | -37.760265650392505 26 | ], 27 | [ 28 | 144.9349021911621, 29 | -37.75510841351982 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/au/melbourne/dandenong.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 145.14159769705395, 9 | -38.01831419099497 10 | ], 11 | [ 12 | 145.14137733592045, 13 | -37.95596397611464 14 | ], 15 | [ 16 | 145.21343542656885, 17 | -37.95596397611464 18 | ], 19 | [ 20 | 145.21365578770232, 21 | -38.01831419099497 22 | ], 23 | [ 24 | 145.14159769705395, 25 | -38.01831419099497 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/au/melbourne/maribyrnong.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | 144.82131350593255, 12 | -37.747288068173866 13 | ], 14 | [ 15 | 144.82131350593255, 16 | -37.83633025453211 17 | ], 18 | [ 19 | 144.9244578088135, 20 | -37.83633025453211 21 | ], 22 | [ 23 | 144.9244578088135, 24 | -37.747288068173866 25 | ], 26 | [ 27 | 144.82131350593255, 28 | -37.747288068173866 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/ca/toronto/dufferin.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -79.45371754153781, 12 | 43.64034006561096 13 | ], 14 | [ 15 | -79.40371098267262, 16 | 43.649606454402715 17 | ], 18 | [ 19 | -79.41735763238168, 20 | 43.68395401758562 21 | ], 22 | [ 23 | -79.46727072104369, 24 | 43.67401688130525 25 | ], 26 | [ 27 | -79.45371754153781, 28 | 43.64034006561096 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/ch/geneva/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 6.105823516845703, 9 | 46.18577297934235 10 | ], 11 | [ 12 | 6.189937591552734, 13 | 46.18577297934235 14 | ], 15 | [ 16 | 6.189937591552734, 17 | 46.218208093170574 18 | ], 19 | [ 20 | 6.105823516845703, 21 | 46.218208093170574 22 | ], 23 | [ 24 | 6.105823516845703, 25 | 46.18577297934235 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/ch/zurich/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 8.520455, 9 | 47.396229 10 | ], 11 | [ 12 | 8.495264, 13 | 47.3765 14 | ], 15 | [ 16 | 8.51243, 17 | 47.361327 18 | ], 19 | [ 20 | 8.538008, 21 | 47.356153 22 | ], 23 | [ 24 | 8.55689, 25 | 47.367315 26 | ], 27 | [ 28 | 8.553543, 29 | 47.387542 30 | ], 31 | [ 32 | 8.545313, 33 | 47.393547 34 | ], 35 | [ 36 | 8.520455, 37 | 47.396229 38 | ] 39 | ] 40 | ], 41 | "type": "Polygon" 42 | }, 43 | "properties": {}, 44 | "type": "Feature" 45 | } 46 | ], 47 | "type": "FeatureCollection" 48 | } -------------------------------------------------------------------------------- /importer/config/cl/santiago/bellavista.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -70.70714471777148, 12 | -33.440697401646055 13 | ], 14 | [ 15 | -70.59785179190433, 16 | -33.44358006159245 17 | ], 18 | [ 19 | -70.5816034870058, 20 | -33.4062468041792 21 | ], 22 | [ 23 | -70.70434985682016, 24 | -33.390396118901684 25 | ], 26 | [ 27 | -70.70714471777148, 28 | -33.440697401646055 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/de/berlin/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 13.361434936523436, 9 | 52.49532344352079 10 | ], 11 | [ 12 | 13.432674407958984, 13 | 52.49532344352079 14 | ], 15 | [ 16 | 13.432674407958984, 17 | 52.53199183474197 18 | ], 19 | [ 20 | 13.361434936523436, 21 | 52.53199183474197 22 | ], 23 | [ 24 | 13.361434936523436, 25 | 52.49532344352079 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/de/berlin/neukolln.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 13.372764587402344, 9 | 52.44502446029299 10 | ], 11 | [ 12 | 13.516616821289062, 13 | 52.44502446029299 14 | ], 15 | [ 16 | 13.516616821289062, 17 | 52.51225111854443 18 | ], 19 | [ 20 | 13.372764587402344, 21 | 52.51225111854443 22 | ], 23 | [ 24 | 13.372764587402344, 25 | 52.44502446029299 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/fr/brest/city.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -4.549977266245776, 12 | 48.35112096321657 13 | ], 14 | [ 15 | -4.42146691507142, 16 | 48.38290771778398 17 | ], 18 | [ 19 | -4.464560402357165, 20 | 48.43512568316484 21 | ], 22 | [ 23 | -4.501832529976298, 24 | 48.43594391060566 25 | ], 26 | [ 27 | -4.523346221286147, 28 | 48.41048177327892 29 | ], 30 | [ 31 | -4.568566082000757, 32 | 48.38855593346918 33 | ], 34 | [ 35 | -4.549977266245776, 36 | 48.35112096321657 37 | ] 38 | ] 39 | ], 40 | "type": "Polygon" 41 | } 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /importer/config/fr/paris/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 2.31039047241211, 9 | 48.876683442021886 10 | ], 11 | [ 12 | 2.3091888427734375, 13 | 48.83997794833464 14 | ], 15 | [ 16 | 2.376995086669922, 17 | 48.840655832092224 18 | ], 19 | [ 20 | 2.378368377685547, 21 | 48.87318346383355 22 | ], 23 | [ 24 | 2.31039047241211, 25 | 48.876683442021886 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/fr/paris/east.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 2.3758792877197266, 9 | 48.8412772174772 10 | ], 11 | [ 12 | 2.3994827270507812, 13 | 48.82449710612528 14 | ], 15 | [ 16 | 2.4259185791015625, 17 | 48.84799898474839 18 | ], 19 | [ 20 | 2.41973876953125, 21 | 48.87803820654905 22 | ], 23 | [ 24 | 2.4053192138671875, 25 | 48.890455171696374 26 | ], 27 | [ 28 | 2.3740768432617188, 29 | 48.87397380289261 30 | ], 31 | [ 32 | 2.3758792877197266, 33 | 48.8412772174772 34 | ] 35 | ] 36 | ], 37 | "type": "Polygon" 38 | }, 39 | "properties": {}, 40 | "type": "Feature" 41 | } 42 | ], 43 | "type": "FeatureCollection" 44 | } -------------------------------------------------------------------------------- /importer/config/fr/paris/north.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 2.2839546203613277, 9 | 48.89022943621114 10 | ], 11 | [ 12 | 2.3109054565429688, 13 | 48.875328640803154 14 | ], 15 | [ 16 | 2.3768234252929688, 17 | 48.87194147722911 18 | ], 19 | [ 20 | 2.4068641662597656, 21 | 48.88921361391563 22 | ], 23 | [ 24 | 2.39278793334961, 25 | 48.90365892392729 26 | ], 27 | [ 28 | 2.315025329589844, 29 | 48.90241769404667 30 | ], 31 | [ 32 | 2.2839546203613277, 33 | 48.89022943621114 34 | ] 35 | ] 36 | ], 37 | "type": "Polygon" 38 | }, 39 | "properties": {}, 40 | "type": "Feature" 41 | } 42 | ], 43 | "type": "FeatureCollection" 44 | } -------------------------------------------------------------------------------- /importer/config/fr/paris/south.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 2.3751068115234375, 9 | 48.84201157208408 10 | ], 11 | [ 12 | 2.2861862182617188, 13 | 48.8434802489964 14 | ], 15 | [ 16 | 2.2691917419433594, 17 | 48.82980859101558 18 | ], 19 | [ 20 | 2.35982894897461, 21 | 48.813307242831165 22 | ], 23 | [ 24 | 2.400341033935547, 25 | 48.82347994904826 26 | ], 27 | [ 28 | 2.3751068115234375, 29 | 48.84201157208408 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/fr/paris/west.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 2.2841262817382812, 9 | 48.89124523786898 10 | ], 11 | [ 12 | 2.2530555725097656, 13 | 48.863133778674346 14 | ], 15 | [ 16 | 2.2458457946777344, 17 | 48.83195562723763 18 | ], 19 | [ 20 | 2.3088455200195312, 21 | 48.820993478172554 22 | ], 23 | [ 24 | 2.3146820068359375, 25 | 48.87578024528628 26 | ], 27 | [ 28 | 2.2841262817382812, 29 | 48.89124523786898 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/gb/birmingham/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -1.9738541793697948, 12 | 52.459017316543935 13 | ], 14 | [ 15 | -1.9684387752567432, 16 | 52.41099441031142 17 | ], 18 | [ 19 | -1.8212382453043858, 20 | 52.40709057829696 21 | ], 22 | [ 23 | -1.7375456363005526, 24 | 52.55849751315722 25 | ], 26 | [ 27 | -1.9162539719961842, 28 | 52.565680127264955 29 | ], 30 | [ 31 | -1.9738541793697948, 32 | 52.459017316543935 33 | ] 34 | ] 35 | ], 36 | "type": "Polygon" 37 | } 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /importer/config/gb/bournemouth/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -1.8210641594806134, 12 | 50.76149968087796 13 | ], 14 | [ 15 | -1.918632901062125, 16 | 50.788000172013824 17 | ], 18 | [ 19 | -1.9576603976945535, 20 | 50.71817649896391 21 | ], 22 | [ 23 | -1.9183130035484055, 24 | 50.70946653752054 25 | ], 26 | [ 27 | -1.8257026734246722, 28 | 50.72526480766831 29 | ], 30 | [ 31 | -1.8210641594806134, 32 | 50.76149968087796 33 | ] 34 | ] 35 | ], 36 | "type": "Polygon" 37 | } 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /importer/config/gb/brighton/shoreham_by_sea.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -0.2306785001767082, 12 | 50.8467597277743 13 | ], 14 | [ 15 | -0.2938691071150856, 16 | 50.84885067027889 17 | ], 18 | [ 19 | -0.2898413772116726, 20 | 50.822791965855515 21 | ], 22 | [ 23 | -0.22987295419568454, 24 | 50.823866256350755 25 | ], 26 | [ 27 | -0.2306785001767082, 28 | 50.8467597277743 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/bristol/huge.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -2.67498660865445, 12 | 51.545979673849814 13 | ], 14 | [ 15 | -2.725072320187934, 16 | 51.50533419979146 17 | ], 18 | [ 19 | -2.639211100415366, 20 | 51.4555425006248 21 | ], 22 | [ 23 | -2.6398332831680023, 24 | 51.396186531571374 25 | ], 26 | [ 27 | -2.5247294740525206, 28 | 51.396768827096 29 | ], 30 | [ 31 | -2.5026419863566787, 32 | 51.49507032185082 33 | ], 34 | [ 35 | -2.67498660865445, 36 | 51.545979673849814 37 | ] 38 | ] 39 | ], 40 | "type": "Polygon" 41 | } 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /importer/config/gb/bristol/north.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -2.606722198160469, 12 | 51.4943702286902 13 | ], 14 | [ 15 | -2.606722198160469, 16 | 51.4570896008407 17 | ], 18 | [ 19 | -2.5553484302073457, 20 | 51.4570896008407 21 | ], 22 | [ 23 | -2.5553484302073457, 24 | 51.4943702286902 25 | ], 26 | [ 27 | -2.606722198160469, 28 | 51.4943702286902 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/darlington/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -1.601149809542136, 12 | 54.54478887354304 13 | ], 14 | [ 15 | -1.601149809542136, 16 | 54.50218353438706 17 | ], 18 | [ 19 | -1.4987249147464183, 20 | 54.50218353438706 21 | ], 22 | [ 23 | -1.4987249147464183, 24 | 54.54478887354304 25 | ], 26 | [ 27 | -1.601149809542136, 28 | 54.54478887354304 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/derby/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -1.5579986572265625, 9 | 52.910558435943194 10 | ], 11 | [ 12 | -1.4100265502929688, 13 | 52.90538201259785 14 | ], 15 | [ 16 | -1.4031600952148435, 17 | 52.94677608229801 18 | ], 19 | [ 20 | -1.4532852172851562, 21 | 52.948637884883205 22 | ], 23 | [ 24 | -1.5226364135742188, 25 | 52.94905160790896 26 | ], 27 | [ 28 | -1.5579986572265625, 29 | 52.910558435943194 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/gb/edinburgh/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -3.2410283361183474, 12 | 55.97055881462245 13 | ], 14 | [ 15 | -3.211892598106971, 16 | 55.924944761029025 17 | ], 18 | [ 19 | -3.1090256047172034, 20 | 55.93649208155364 21 | ], 22 | [ 23 | -3.1177465058906932, 24 | 55.962793793843446 25 | ], 26 | [ 27 | -3.1508462898915184, 28 | 55.980207454482695 29 | ], 30 | [ 31 | -3.2410283361183474, 32 | 55.97055881462245 33 | ] 34 | ] 35 | ], 36 | "type": "Polygon" 37 | } 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /importer/config/gb/keighley/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -1.9205474853515625, 9 | 53.89017731096211 10 | ], 11 | [ 12 | -1.9431209564208984, 13 | 53.872418900515235 14 | ], 15 | [ 16 | -1.928873062133789, 17 | 53.852931627074035 18 | ], 19 | [ 20 | -1.8867301940917969, 21 | 53.85348853228283 22 | ], 23 | [ 24 | -1.874284744262695, 25 | 53.87338037509761 26 | ], 27 | [ 28 | -1.9205474853515625, 29 | 53.89017731096211 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/gb/london/highgate.geojson: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"coordinates":[[[-0.16497358838319087,51.577700615376784],[-0.16497358838319087,51.548034858372404],[-0.12366324227289738,51.548034858372404],[-0.12366324227289738,51.577700615376784],[-0.16497358838319087,51.577700615376784]]],"type":"Polygon"}}]} 2 | -------------------------------------------------------------------------------- /importer/config/gb/london/islington_hackney.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -0.06994388196983437, 12 | 51.56703203303198 13 | ], 14 | [ 15 | -0.12282714977172304, 16 | 51.56703203303198 17 | ], 18 | [ 19 | -0.12282714977172304, 20 | 51.52408614177858 21 | ], 22 | [ 23 | -0.06994388196983437, 24 | 51.52408614177858 25 | ], 26 | [ 27 | -0.06994388196983437, 28 | 51.56703203303198 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/london/kennington.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -0.0993490219116211, 9 | 51.492072179764314 10 | ], 11 | [ 12 | -0.1224374771118164, 13 | 51.49661436652498 14 | ], 15 | [ 16 | -0.12342453002929686, 17 | 51.49169809715384 18 | ], 19 | [ 20 | -0.13282299041748047, 21 | 51.48501753370923 22 | ], 23 | [ 24 | -0.11110782623291016, 25 | 51.47836271950517 26 | ], 27 | [ 28 | -0.0993490219116211, 29 | 51.492072179764314 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/gb/london/newham_waltham_forest.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -0.00789642333984375, 9 | 51.56095786414904 10 | ], 11 | [ 12 | 0.00102996826171875, 13 | 51.538114321228925 14 | ], 15 | [ 16 | 0.035533905029296875, 17 | 51.54601478768334 18 | ], 19 | [ 20 | 0.029869079589843747, 21 | 51.56778734991679 22 | ], 23 | [ 24 | -0.004978179931640625, 25 | 51.56533312154746 26 | ], 27 | [ 28 | -0.00789642333984375, 29 | 51.56095786414904 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/gb/london/regents_park.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -0.19718718999854445, 12 | 51.54970425003464 13 | ], 14 | [ 15 | -0.19718718999854445, 16 | 51.516185213662 17 | ], 18 | [ 19 | -0.12965421349036887, 20 | 51.516185213662 21 | ], 22 | [ 23 | -0.12965421349036887, 24 | 51.54970425003464 25 | ], 26 | [ 27 | -0.19718718999854445, 28 | 51.54970425003464 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/manchester/levenshulme.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -2.2285079956054688, 9 | 53.45524692229334 10 | ], 11 | [ 12 | -2.2195816040039062, 13 | 53.4284579241976 14 | ], 15 | [ 16 | -2.183361053466797, 17 | 53.41352237422499 18 | ], 19 | [ 20 | -2.13632583618164, 21 | 53.42150229336731 22 | ], 23 | [ 24 | -2.12259292602539, 25 | 53.4471711023092 26 | ], 27 | [ 28 | -2.1797561645507812, 29 | 53.46689793061778 30 | ], 31 | [ 32 | -2.2285079956054688, 33 | 53.45524692229334 34 | ] 35 | ] 36 | ], 37 | "type": "Polygon" 38 | }, 39 | "properties": {}, 40 | "type": "Feature" 41 | } 42 | ], 43 | "type": "FeatureCollection" 44 | } -------------------------------------------------------------------------------- /importer/config/gb/manchester/stockport.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -2.206665257949254, 12 | 53.42653841205211 13 | ], 14 | [ 15 | -2.195441716427439, 16 | 53.36868867798205 17 | ], 18 | [ 19 | -2.101912203729313, 20 | 53.38609648214202 21 | ], 22 | [ 23 | -2.1221145784727184, 24 | 53.43872292312591 25 | ], 26 | [ 27 | -2.206665257949254, 28 | 53.42653841205211 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/newcastle_upon_tyne/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -1.6014289855957031, 9 | 54.98697158617666 10 | ], 11 | [ 12 | -1.6573905944824217, 13 | 54.97574182583224 14 | ], 15 | [ 16 | -1.6261482238769531, 17 | 54.93789214980652 18 | ], 19 | [ 20 | -1.5719032287597656, 21 | 54.9545543424688 22 | ], 23 | [ 24 | -1.6014289855957031, 25 | 54.98697158617666 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/gb/nottingham/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -1.197509765625, 9 | 52.965390502423425 10 | ], 11 | [ 12 | -1.1968231201171875, 13 | 52.9536023000285 14 | ], 15 | [ 16 | -1.1865234375, 17 | 52.93218918956182 18 | ], 19 | [ 20 | -1.1235237121582031, 21 | 52.94491419958012 22 | ], 23 | [ 24 | -1.1367416381835935, 25 | 52.97262727982499 26 | ], 27 | [ 28 | -1.197509765625, 29 | 52.965390502423425 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/gb/sheffield/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -1.4904574337349459, 12 | 53.39097179861591 13 | ], 14 | [ 15 | -1.5008616882630292, 16 | 53.3639006151611 17 | ], 18 | [ 19 | -1.4641147467382325, 20 | 53.35445466659732 21 | ], 22 | [ 23 | -1.44507717462281, 24 | 53.38707724924589 25 | ], 26 | [ 27 | -1.4749617355020064, 28 | 53.39532799094883 29 | ], 30 | [ 31 | -1.4904574337349459, 32 | 53.39097179861591 33 | ] 34 | ] 35 | ], 36 | "type": "Polygon" 37 | } 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /importer/config/gb/sheffield/hillsborough.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -1.5221043392339766, 12 | 53.42477447106094 13 | ], 14 | [ 15 | -1.5221043392339766, 16 | 53.38771771397259 17 | ], 18 | [ 19 | -1.470767661259032, 20 | 53.38771771397259 21 | ], 22 | [ 23 | -1.470767661259032, 24 | 53.42477447106094 25 | ], 26 | [ 27 | -1.5221043392339766, 28 | 53.42477447106094 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/sheffield/woodseats.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -1.524008209849967, 12 | 53.36281335303062 13 | ], 14 | [ 15 | -1.524008209849967, 16 | 53.330844805580796 17 | ], 18 | [ 19 | -1.4544310982844308, 20 | 53.330844805580796 21 | ], 22 | [ 23 | -1.4544310982844308, 24 | 53.36281335303062 25 | ], 26 | [ 27 | -1.524008209849967, 28 | 53.36281335303062 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/gb/wokingham/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -0.8589935302734375, 9 | 51.43592548034068 10 | ], 11 | [ 12 | -0.9017372131347656, 13 | 51.40884344813291 14 | ], 15 | [ 16 | -0.8399391174316406, 17 | 51.37981682750073 18 | ], 19 | [ 20 | -0.7748794555664062, 21 | 51.41066369238453 22 | ], 23 | [ 24 | -0.8589935302734375, 25 | 51.43592548034068 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/il/tel_aviv/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 34.774346351623535, 9 | 32.103080123633355 10 | ], 11 | [ 12 | 34.757137298583984, 13 | 32.08926482384275 14 | ], 15 | [ 16 | 34.73808288574219, 17 | 32.0293258802485 18 | ], 19 | [ 20 | 34.771385192871094, 21 | 32.02670629333614 22 | ], 23 | [ 24 | 34.80846405029297, 25 | 32.04184065020709 26 | ], 27 | [ 28 | 34.81494426727295, 29 | 32.1006080655837 30 | ], 31 | [ 32 | 34.774346351623535, 33 | 32.103080123633355 34 | ] 35 | ] 36 | ], 37 | "type": "Polygon" 38 | }, 39 | "properties": {}, 40 | "type": "Feature" 41 | } 42 | ], 43 | "type": "FeatureCollection" 44 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary0.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.54956817626953, 9 | 35.72951315979672 10 | ], 11 | [ 12 | 51.551284790039055, 13 | 35.74149650946868 14 | ], 15 | [ 16 | 51.49394989013672, 17 | 35.743725770906416 18 | ], 19 | [ 20 | 51.48399353027344, 21 | 35.715298012125295 22 | ], 23 | [ 24 | 51.514892578125, 25 | 35.7072137578392 26 | ], 27 | [ 28 | 51.54853820800781, 29 | 35.711674137467945 30 | ], 31 | [ 32 | 51.54956817626953, 33 | 35.72951315979672 34 | ] 35 | ] 36 | ], 37 | "type": "Polygon" 38 | }, 39 | "properties": {}, 40 | "type": "Feature" 41 | } 42 | ], 43 | "type": "FeatureCollection" 44 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary1.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.52965545654297, 9 | 35.715298012125295 10 | ], 11 | [ 12 | 51.524505615234375, 13 | 35.725611214962285 14 | ], 15 | [ 16 | 51.47369384765625, 17 | 35.725332497303015 18 | ], 19 | [ 20 | 51.476097106933594, 21 | 35.68602354632837 22 | ], 23 | [ 24 | 51.532745361328125, 25 | 35.68574469022575 26 | ], 27 | [ 28 | 51.52965545654297, 29 | 35.715298012125295 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary2.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.53377532958984, 9 | 35.65143795734638 10 | ], 11 | [ 12 | 51.45687103271485, 13 | 35.659806812589956 14 | ], 15 | [ 16 | 51.45755767822265, 17 | 35.65060102359122 18 | ], 19 | [ 20 | 51.46339416503906, 21 | 35.62186097976455 22 | ], 23 | [ 24 | 51.53308868408203, 25 | 35.62604706595698 26 | ], 27 | [ 28 | 51.53377532958984, 29 | 35.65143795734638 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary3.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.49566650390625, 9 | 35.746512259918504 10 | ], 11 | [ 12 | 51.42219543457031, 13 | 35.746233615406624 14 | ], 15 | [ 16 | 51.42356872558594, 17 | 35.71446174798392 18 | ], 19 | [ 20 | 51.49394989013672, 21 | 35.71613426749111 22 | ], 23 | [ 24 | 51.49566650390625, 25 | 35.746512259918504 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary4.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.4845085144043, 9 | 35.72421761691415 10 | ], 11 | [ 12 | 51.42528533935547, 13 | 35.7221271741312 14 | ], 15 | [ 16 | 51.42974853515625, 17 | 35.65534353225703 18 | ], 19 | [ 20 | 51.49274826049804, 21 | 35.65394870599763 22 | ], 23 | [ 24 | 51.4845085144043, 25 | 35.72421761691415 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary5.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.4599609375, 9 | 35.66426984346965 10 | ], 11 | [ 12 | 51.41532897949219, 13 | 35.663711978252095 14 | ], 15 | [ 16 | 51.40434265136719, 17 | 35.62716331859532 18 | ], 19 | [ 20 | 51.42631530761718, 21 | 35.61739557961012 22 | ], 23 | [ 24 | 51.46339416503906, 25 | 35.634418580855424 26 | ], 27 | [ 28 | 51.4599609375, 29 | 35.66426984346965 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary6.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.424598693847656, 9 | 35.74846274418969 10 | ], 11 | [ 12 | 51.35078430175781, 13 | 35.746233615406624 14 | ], 15 | [ 16 | 51.35078430175781, 17 | 35.6960617168288 18 | ], 19 | [ 20 | 51.432838439941406, 21 | 35.70024391500173 22 | ], 23 | [ 24 | 51.424598693847656, 25 | 35.74846274418969 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary7.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.430435180664055, 9 | 35.703031925256354 10 | ], 11 | [ 12 | 51.35284423828125, 13 | 35.69912868360278 14 | ], 15 | [ 16 | 51.35284423828125, 17 | 35.65673833415701 18 | ], 19 | [ 20 | 51.4324951171875, 21 | 35.66008575932827 22 | ], 23 | [ 24 | 51.430435180664055, 25 | 35.703031925256354 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/boundary8.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.41841888427734, 9 | 35.66203835921229 10 | ], 11 | [ 12 | 51.35456085205078, 13 | 35.66008575932827 14 | ], 15 | [ 16 | 51.35490417480469, 17 | 35.620186483925615 18 | ], 19 | [ 20 | 51.40708923339843, 21 | 35.62967483004926 22 | ], 23 | [ 24 | 51.41841888427734, 25 | 35.66203835921229 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/ir/tehran/parliament.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 51.442365646362305, 9 | 35.696619355925044 10 | ], 11 | [ 12 | 51.408419609069824, 13 | 35.696619355925044 14 | ], 15 | [ 16 | 51.40623092651367, 17 | 35.68124800099281 18 | ], 19 | [ 20 | 51.43408298492432, 21 | 35.679191291222374 22 | ], 23 | [ 24 | 51.442365646362305, 25 | 35.696619355925044 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/jp/hiroshima/uni.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 132.70596027374268, 9 | 34.38920423064027 10 | ], 11 | [ 12 | 132.7211952209473, 13 | 34.38920423064027 14 | ], 15 | [ 16 | 132.7211952209473, 17 | 34.407724015985856 18 | ], 19 | [ 20 | 132.70596027374268, 21 | 34.407724015985856 22 | ], 23 | [ 24 | 132.70596027374268, 25 | 34.38920423064027 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/jp/tokyo/shibuya.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | 139.68037337025942, 12 | 35.66696129802982 13 | ], 14 | [ 15 | 139.68037337025942, 16 | 35.64551935993049 17 | ], 18 | [ 19 | 139.72764182456154, 20 | 35.64551935993049 21 | ], 22 | [ 23 | 139.72764182456154, 24 | 35.66696129802982 25 | ], 26 | [ 27 | 139.68037337025942, 28 | 35.66696129802982 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/kr/seoul/itaewon_dong.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | 126.96255019339702, 12 | 37.5504166249313 13 | ], 14 | [ 15 | 126.96255019339702, 16 | 37.521140208573286 17 | ], 18 | [ 19 | 127.01019531611081, 20 | 37.521140208573286 21 | ], 22 | [ 23 | 127.01019531611081, 24 | 37.5504166249313 25 | ], 26 | [ 27 | 126.96255019339702, 28 | 37.5504166249313 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/ly/tripoli/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 13.149948120117186, 9 | 32.88074047366183 10 | ], 11 | [ 12 | 13.171062469482422, 13 | 32.85752741152312 14 | ], 15 | [ 16 | 13.233890533447266, 17 | 32.871369471965444 18 | ], 19 | [ 20 | 13.225650787353516, 21 | 32.90322683541996 22 | ], 23 | [ 24 | 13.149948120117186, 25 | 32.88074047366183 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/nl/valkenburg/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | 5.813662891056282, 12 | 50.87293106115146 13 | ], 14 | [ 15 | 5.8137120160117775, 16 | 50.86467401572352 17 | ], 18 | [ 19 | 5.848492483805728, 20 | 50.86471535626444 21 | ], 22 | [ 23 | 5.8480994841695235, 24 | 50.872982727669296 25 | ], 26 | [ 27 | 5.813662891056282, 28 | 50.87293106115146 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/pl/krakow/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 19.91220474243164, 9 | 50.075099742705696 10 | ], 11 | [ 12 | 19.926795959472656, 13 | 50.039722339360004 14 | ], 15 | [ 16 | 19.975547790527344, 17 | 50.04810065472004 18 | ], 19 | [ 20 | 19.974689483642578, 21 | 50.07587092194771 22 | ], 23 | [ 24 | 19.940528869628906, 25 | 50.07917583535689 26 | ], 27 | [ 28 | 19.91220474243164, 29 | 50.075099742705696 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/pl/warsaw/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 20.967, 9 | 52.257604 10 | ], 11 | [ 12 | 20.948298, 13 | 52.228544 14 | ], 15 | [ 16 | 20.959368, 17 | 52.207674 18 | ], 19 | [ 20 | 21.034009, 21 | 52.192783 22 | ], 23 | [ 24 | 21.075877, 25 | 52.22485 26 | ], 27 | [ 28 | 21.057654, 29 | 52.257604 30 | ], 31 | [ 32 | 20.967, 33 | 52.257604 34 | ] 35 | ] 36 | ], 37 | "type": "Polygon" 38 | }, 39 | "properties": {}, 40 | "type": "Feature" 41 | } 42 | ], 43 | "type": "FeatureCollection" 44 | } -------------------------------------------------------------------------------- /importer/config/sg/jurong/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 103.65763664245604, 9 | 1.3154113921738335 10 | ], 11 | [ 12 | 103.7501621246338, 13 | 1.3154113921738335 14 | ], 15 | [ 16 | 103.7501621246338, 17 | 1.365694407838087 18 | ], 19 | [ 20 | 103.65763664245604, 21 | 1.365694407838087 22 | ], 23 | [ 24 | 103.65763664245604, 25 | 1.3154113921738335 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/tw/keelung/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 121.81383132934567, 9 | 25.151034037912243 10 | ], 11 | [ 12 | 121.72971725463869, 13 | 25.18148594421608 14 | ], 15 | [ 16 | 121.6732406616211, 17 | 25.11078236157986 18 | ], 19 | [ 20 | 121.73812866210936, 21 | 25.082023046682096 22 | ], 23 | [ 24 | 121.81383132934567, 25 | 25.151034037912243 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/tw/taipei/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | 121.5783977508545, 9 | 25.02767282061471 10 | ], 11 | [ 12 | 121.56655311584474, 13 | 25.05551185571547 14 | ], 15 | [ 16 | 121.51556968688968, 17 | 25.070284194936395 18 | ], 19 | [ 20 | 121.51368141174318, 21 | 25.04167089074307 22 | ], 23 | [ 24 | 121.50887489318848, 25 | 25.026584014885884 26 | ], 27 | [ 28 | 121.5783977508545, 29 | 25.02767282061471 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/us/beltsville/i495.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -76.97184562683105, 9 | 39.01091428117347 10 | ], 11 | [ 12 | -76.91665649414062, 13 | 39.01091428117347 14 | ], 15 | [ 16 | -76.91665649414062, 17 | 39.04265287290379 18 | ], 19 | [ 20 | -76.97184562683105, 21 | 39.04265287290379 22 | ], 23 | [ 24 | -76.97184562683105, 25 | 39.01091428117347 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/us/houston/montrose.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -95.43636136022205, 12 | 29.77754759808201 13 | ], 14 | [ 15 | -95.43636136022205, 16 | 29.708736438180182 17 | ], 18 | [ 19 | -95.37260851610043, 20 | 29.708736438180182 21 | ], 22 | [ 23 | -95.37260851610043, 24 | 29.77754759808201 25 | ], 26 | [ 27 | -95.43636136022205, 28 | 29.77754759808201 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/us/lynnwood/hazelwood.geojson: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-122.291993,47.813659],[-122.290781,47.81358],[-122.279053,47.813457],[-122.279536,47.812333],[-122.279664,47.811094],[-122.271896,47.811058],[-122.272025,47.810525],[-122.271531,47.809999],[-122.270061,47.810078],[-122.268763,47.810345],[-122.267003,47.80971],[-122.263279,47.807664],[-122.258333,47.807779],[-122.254395,47.815849],[-122.25506,47.82028],[-122.256659,47.823262],[-122.255253,47.824876],[-122.252721,47.825841],[-122.244877,47.82569],[-122.241379,47.824933],[-122.238267,47.823853],[-122.237591,47.82708],[-122.237602,47.830076],[-122.236079,47.835298],[-122.236443,47.836126],[-122.240811,47.83609],[-122.243203,47.834786],[-122.244105,47.835989],[-122.252421,47.836832],[-122.254728,47.836976],[-122.255607,47.836918],[-122.260726,47.835262],[-122.261885,47.830912],[-122.264224,47.828607],[-122.291993,47.813659]]]}}]} 2 | -------------------------------------------------------------------------------- /importer/config/us/milwaukee/downtown.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -87.89968013763428, 9 | 43.023772650062504 10 | ], 11 | [ 12 | -87.88320064544678, 13 | 43.025749189659685 14 | ], 15 | [ 16 | -87.87135601043701, 17 | 43.05962282888517 18 | ], 19 | [ 20 | -87.93572902679443, 21 | 43.06106517973023 22 | ], 23 | [ 24 | -87.9391622543335, 25 | 43.02261179555704 26 | ], 27 | [ 28 | -87.89968013763428, 29 | 43.023772650062504 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/us/milwaukee/oak_creek.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -87.95259475708008, 9 | 42.85507804595658 10 | ], 11 | [ 12 | -87.83088684082031, 13 | 42.85507804595658 14 | ], 15 | [ 16 | -87.83088684082031, 17 | 42.917840727946206 18 | ], 19 | [ 20 | -87.95259475708008, 21 | 42.917840727946206 22 | ], 23 | [ 24 | -87.95259475708008, 25 | 42.85507804595658 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/us/missoula/center.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": { 8 | "coordinates": [ 9 | [ 10 | [ 11 | -114.21950373179355, 12 | 47.000689764068284 13 | ], 14 | [ 15 | -114.21767277229122, 16 | 46.73572870284798 17 | ], 18 | [ 19 | -113.85392215112287, 20 | 46.73865666373186 21 | ], 22 | [ 23 | -113.85697375029372, 24 | 46.99944105421895 25 | ], 26 | [ 27 | -114.21950373179355, 28 | 47.000689764068284 29 | ] 30 | ] 31 | ], 32 | "type": "Polygon" 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /importer/config/us/nyc/downtown_brooklyn.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -73.99532318115234, 9 | 40.660847697284815 10 | ], 11 | [ 12 | -73.96090507507324, 13 | 40.660847697284815 14 | ], 15 | [ 16 | -73.96090507507324, 17 | 40.69502138563757 18 | ], 19 | [ 20 | -73.99532318115234, 21 | 40.69502138563757 22 | ], 23 | [ 24 | -73.99532318115234, 25 | 40.660847697284815 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/us/nyc/lower_manhattan.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -73.9706039428711, 9 | 40.727096155848784 10 | ], 11 | [ 12 | -74.01317596435547, 13 | 40.743355347975395 14 | ], 15 | [ 16 | -74.02356147766113, 17 | 40.69892583453415 18 | ], 19 | [ 20 | -74.00733947753906, 21 | 40.69697363868991 22 | ], 23 | [ 24 | -73.9940357208252, 25 | 40.706864174918 26 | ], 27 | [ 28 | -73.97601127624512, 29 | 40.70998719702583 30 | ], 31 | [ 32 | -73.9706039428711, 33 | 40.727096155848784 34 | ] 35 | ] 36 | ], 37 | "type": "Polygon" 38 | }, 39 | "properties": {}, 40 | "type": "Feature" 41 | } 42 | ], 43 | "type": "FeatureCollection" 44 | } -------------------------------------------------------------------------------- /importer/config/us/phoenix/gilbert.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -111.8002223968506, 9 | 33.34834705786776 10 | ], 11 | [ 12 | -111.78099632263182, 13 | 33.34834705786776 14 | ], 15 | [ 16 | -111.78099632263182, 17 | 33.36626974573022 18 | ], 19 | [ 20 | -111.8002223968506, 21 | 33.36626974573022 22 | ], 23 | [ 24 | -111.8002223968506, 25 | 33.34834705786776 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/us/phoenix/tempe.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -111.94542841553847, 9 | 33.43282289244656 10 | ], 11 | [ 12 | -111.94469122865176, 13 | 33.406700744981435 14 | ], 15 | [ 16 | -111.90749886317239, 17 | 33.406378738387026 18 | ], 19 | [ 20 | -111.90779254363723, 21 | 33.434076358794556 22 | ], 23 | [ 24 | -111.92552761225701, 25 | 33.43224044501562 26 | ], 27 | [ 28 | -111.94542841553847, 29 | 33.43282289244656 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/us/providence/downtown.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -71.43799781799316, 9 | 41.84168771910253 10 | ], 11 | [ 12 | -71.42838478088379, 13 | 41.81789647342126 14 | ], 15 | [ 16 | -71.39533996582031, 17 | 41.80631742775632 18 | ], 19 | [ 20 | -71.3785171508789, 21 | 41.82090284460583 22 | ], 23 | [ 24 | -71.37551307678223, 25 | 41.84155983282107 26 | ], 27 | [ 28 | -71.43799781799316, 29 | 41.84168771910253 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/us/seattle/central_seattle.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -122.4458687410514, 9 | 47.67750221978498 10 | ], 11 | [ 12 | -122.24285988622086, 13 | 47.67710896173522 14 | ], 15 | [ 16 | -122.27297248263926, 17 | 47.61798595677795 18 | ], 19 | [ 20 | -122.42668216203236, 21 | 47.617714637744726 22 | ], 23 | [ 24 | -122.4458687410514, 25 | 47.67750221978498 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/us/seattle/downtown.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -122.3818750678073, 9 | 47.630146449617136 10 | ], 11 | [ 12 | -122.32103102008703, 13 | 47.62926060822875 14 | ], 15 | [ 16 | -122.30375101253018, 17 | 47.62246109538229 18 | ], 19 | [ 20 | -122.3026905427932, 21 | 47.59758538760763 22 | ], 23 | [ 24 | -122.34603313933346, 25 | 47.59793290526139 26 | ], 27 | [ 28 | -122.3818750678073, 29 | 47.630146449617136 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/us/seattle/montlake.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -122.3218, 9 | 47.6475 10 | ], 11 | [ 12 | -122.29836222206139, 13 | 47.64731214195986 14 | ], 15 | [ 16 | -122.29823763124188, 17 | 47.631526343508874 18 | ], 19 | [ 20 | -122.32188980178574, 21 | 47.631503395519445 22 | ], 23 | [ 24 | -122.3218, 25 | 47.6475 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/us/seattle/phinney.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -122.36767963055081, 9 | 47.69509103573898 10 | ], 11 | [ 12 | -122.34079983522672, 13 | 47.69506495001649 14 | ], 15 | [ 16 | -122.33988919383442, 17 | 47.6798694599812 18 | ], 19 | [ 20 | -122.34511643939156, 21 | 47.672441542855594 22 | ], 23 | [ 24 | -122.36754969974456, 25 | 47.67248978606382 26 | ], 27 | [ 28 | -122.36767963055081, 29 | 47.69509103573898 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/config/us/seattle/qa.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -122.36975253143484, 9 | 47.642869122612666 10 | ], 11 | [ 12 | -122.35156189520607, 13 | 47.64287292764238 14 | ], 15 | [ 16 | -122.35130977810462, 17 | 47.63107964408693 18 | ], 19 | [ 20 | -122.36946550282275, 21 | 47.63123030563691 22 | ], 23 | [ 24 | -122.36975253143484, 25 | 47.642869122612666 26 | ] 27 | ] 28 | ], 29 | "type": "Polygon" 30 | }, 31 | "properties": {}, 32 | "type": "Feature" 33 | } 34 | ], 35 | "type": "FeatureCollection" 36 | } -------------------------------------------------------------------------------- /importer/config/us/seattle/slu.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "geometry": { 5 | "coordinates": [ 6 | [ 7 | [ 8 | -122.34334128035991, 9 | 47.630150806746016 10 | ], 11 | [ 12 | -122.3434292284645, 13 | 47.61820860452586 14 | ], 15 | [ 16 | -122.32900295155186, 17 | 47.61822385881894 18 | ], 19 | [ 20 | -122.32873656565454, 21 | 47.6300153113556 22 | ], 23 | [ 24 | -122.33198347320273, 25 | 47.630028296660264 26 | ], 27 | [ 28 | -122.34334128035991, 29 | 47.630150806746016 30 | ] 31 | ] 32 | ], 33 | "type": "Polygon" 34 | }, 35 | "properties": {}, 36 | "type": "Feature" 37 | } 38 | ], 39 | "type": "FeatureCollection" 40 | } -------------------------------------------------------------------------------- /importer/external_scenarios.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Scenarios for some cities are based on JSON files produced by external travel 3 | # demand models, such as https://github.com/a-b-street/abstr. This script 4 | # re-imports all of them. When a map's road or intersection IDs change, this 5 | # must be re-run, or the binary scenario will get out-of-sync. 6 | 7 | set -e 8 | 9 | # Keep this list in sync with release/deploy_actdev.sh 10 | for city in allerton_bywater ashton_park aylesbury aylesham bailrigg bath_riverside bicester castlemead chapelford chapeltown_cohousing clackers_brook cricklewood culm dickens_heath didcot dunton_hills ebbsfleet exeter_red_cow_village great_kneighton halsnead hampton handforth kergilliack kidbrooke_village lcid lockleaze long_marston marsh_barton micklefield newborough_road newcastle_great_park northwick_park poundbury priors_hall taunton_firepool taunton_garden tresham trumpington_meadows tyersal_lane upton water_lane wichelstowe wixams wynyard; do 11 | ./importer/actdev_scenario.sh $city; 12 | done 13 | -------------------------------------------------------------------------------- /importer/sao_miguel_paulista_scenario.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Generates a scenario from external JSON data, for 3 | # https://github.com/a-b-street/abstreet/issues/861. 4 | # 5 | # Along with actdev_scenario.sh, this should eventually be expressed as part of 6 | # the Rust pipeline directly somehow, so that --scenario uses the original data 7 | # (or a cached S3 version, rather) 8 | 9 | set -e 10 | 11 | wget https://github.com/spstreets/OD2017/releases/download/1/all_trips.json 12 | cargo run --release --bin cli -- import-scenario --map=data/system/br/sao_paulo/maps/sao_miguel_paulista.bin --input=all_trips.json 13 | # Cancel 80% of all driving trips, so the scenario doesn't gridlock 14 | cargo run --release --bin cli -- augment-scenario --input-scenario=data/system/br/sao_paulo/scenarios/sao_miguel_paulista/Full.bin --scenario-modifiers='[{"ChangeMode":{"pct_ppl":80,"departure_filter":[0,864000000],"from_modes":["Drive"],"to_mode":null}}]' --delete-cancelled-trips 15 | -------------------------------------------------------------------------------- /importer/src/configuration.rs: -------------------------------------------------------------------------------- 1 | use serde::Deserialize; 2 | 3 | #[derive(Deserialize)] 4 | #[serde(default)] 5 | pub struct ImporterConfiguration { 6 | pub osmium: String, 7 | pub unzip: String, 8 | pub gunzip: String, 9 | pub gunzip_args: String, 10 | } 11 | 12 | impl Default for ImporterConfiguration { 13 | fn default() -> ImporterConfiguration { 14 | ImporterConfiguration { 15 | osmium: String::from("osmium"), 16 | unzip: String::from("unzip"), 17 | gunzip: String::from("gunzip"), 18 | gunzip_args: String::from(""), 19 | } 20 | } 21 | } 22 | 23 | impl ImporterConfiguration { 24 | pub fn load() -> Self { 25 | // Safe to assume that {} can be parsed given struct-level Default implementation. 26 | let default = serde_json::from_str("{}").unwrap(); 27 | 28 | match fs_err::read_to_string("importer.json") { 29 | Ok(contents) => serde_json::from_str(&contents).unwrap_or(default), 30 | Err(_) => default, 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /importer/src/soundcast/mod.rs: -------------------------------------------------------------------------------- 1 | pub use self::popdat::{import_data, PopDat}; 2 | pub use self::trips::make_scenario; 3 | 4 | mod popdat; 5 | mod trips; 6 | -------------------------------------------------------------------------------- /kml/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "kml" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | csv = { workspace = true } 12 | geom = { workspace = true } 13 | log = { workspace = true } 14 | roxmltree = { version = "0.19.0", features=["std"] } 15 | serde = { workspace = true, features=["derive"] } 16 | -------------------------------------------------------------------------------- /map_gui/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | built::write_built_file().expect("Failed to acquire build-time information"); 3 | } 4 | -------------------------------------------------------------------------------- /map_gui/src/tools/icons.rs: -------------------------------------------------------------------------------- 1 | use geom::Pt2D; 2 | use widgetry::{GeomBatch, Prerender, RewriteColor}; 3 | 4 | /// Draw a start marker pointing at something. 5 | pub fn start_marker>(prerender: &P, pt: Pt2D, scale: f64) -> GeomBatch { 6 | GeomBatch::load_svg(prerender, "system/assets/timeline/start_pos.svg") 7 | .scale(scale) 8 | .centered_on(pt) 9 | .color(RewriteColor::ChangeAlpha(0.8)) 10 | } 11 | 12 | /// Draw a goal marker pointing at something. 13 | pub fn goal_marker>(prerender: &P, pt: Pt2D, scale: f64) -> GeomBatch { 14 | GeomBatch::load_svg(prerender, "system/assets/timeline/goal_pos.svg") 15 | .scale(scale) 16 | .centered_on(pt) 17 | .color(RewriteColor::ChangeAlpha(0.8)) 18 | } 19 | -------------------------------------------------------------------------------- /map_model/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "map_model" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | enumset = { version = "1.1.3", features=["serde"] } 12 | fast_paths = { git = "https://github.com/easbar/fast_paths", rev = "9a954e02f01ed16939d3c4a2dc9dd3fb4f6c03ee"} 13 | geojson = { workspace = true } 14 | geom = { workspace = true } 15 | kml = { path = "../kml" } 16 | log = { workspace = true } 17 | lyon = "1.0.1" 18 | md5 = "0.7.0" 19 | petgraph = { version = "0.6.4", features=["serde-1"] } 20 | popgetter = { path = "../popgetter" } 21 | rand = { workspace = true } 22 | rand_xorshift = { workspace = true } 23 | raw_map = { path = "../raw_map" } 24 | serde = { workspace = true, features=["derive"] } 25 | serde_json = { workspace = true } 26 | osm2streets = { git = "https://github.com/a-b-street/osm2streets" } 27 | structopt = { workspace = true } 28 | thread_local = "1.1.7" 29 | -------------------------------------------------------------------------------- /map_model/src/objects/area.rs: -------------------------------------------------------------------------------- 1 | use std::fmt; 2 | 3 | use serde::{Deserialize, Serialize}; 4 | 5 | use abstutil::{deserialize_usize, serialize_usize, Tags}; 6 | use geom::Polygon; 7 | 8 | use crate::{osm, AreaType}; 9 | 10 | #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord, Serialize, Deserialize)] 11 | pub struct AreaID( 12 | #[serde( 13 | serialize_with = "serialize_usize", 14 | deserialize_with = "deserialize_usize" 15 | )] 16 | pub usize, 17 | ); 18 | 19 | impl fmt::Display for AreaID { 20 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 21 | write!(f, "Area #{}", self.0) 22 | } 23 | } 24 | 25 | /// Areas are just used for drawing. 26 | #[derive(Serialize, Deserialize, Clone, Debug)] 27 | pub struct Area { 28 | pub id: AreaID, 29 | pub area_type: AreaType, 30 | pub polygon: Polygon, 31 | pub osm_tags: Tags, 32 | /// The importing process also automatically creates some areas, so they don't come from OSM. 33 | pub osm_id: Option, 34 | } 35 | -------------------------------------------------------------------------------- /map_model/src/objects/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod area; 2 | pub mod building; 3 | pub mod intersection; 4 | pub mod lane; 5 | pub mod modal_filter; 6 | pub mod movement; 7 | pub mod parking_lot; 8 | pub mod road; 9 | pub mod stop_signs; 10 | pub mod traffic_signals; 11 | pub mod transit; 12 | pub mod turn; 13 | pub mod zone; 14 | -------------------------------------------------------------------------------- /piggyback/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "piggyback" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | 10 | [features] 11 | wasm = ["getrandom/js", "js-sys", "map_gui/wasm", "wasm-bindgen", "web-sys", "widgetry/wasm-backend"] 12 | 13 | [dependencies] 14 | abstio = { path = "../abstio" } 15 | abstutil = { path = "../abstutil" } 16 | geom = { workspace = true } 17 | getrandom = { workspace = true, optional = true } 18 | js-sys = { version = "0.3.51", optional = true } 19 | log = { workspace = true } 20 | map_gui= { path = "../map_gui" } 21 | map_model = { path = "../map_model" } 22 | sim = { path = "../sim" } 23 | wasm-bindgen = { workspace = true, optional = true } 24 | web-sys = { workspace = true, optional = true } 25 | widgetry = { path = "../widgetry" } 26 | -------------------------------------------------------------------------------- /piggyback/bundle_static_files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This creates a .zip with all of the files needed to serve a copy of the Mapbox demo. 3 | 4 | set -x 5 | set -e 6 | 7 | wasm-pack build --release --target web -- --features wasm 8 | 9 | mkdir mapbox_demo 10 | cp -Rv index.html serve_locally.py pkg mapbox_demo 11 | 12 | mkdir -p mapbox_demo/data/system/us/seattle/maps 13 | mkdir -p mapbox_demo/data/system/de/berlin/maps 14 | # Just include a few maps 15 | cp ../data/system/us/seattle/maps/montlake.bin mapbox_demo/data/system/us/seattle/maps 16 | cp ../data/system/de/berlin/maps/neukolln.bin mapbox_demo/data/system/de/berlin/maps 17 | 18 | # Uncomment with caution! 19 | # Note this embeds a tiny slice of the data/ directory underneath mapbox_demo. 20 | # The S3 bucket has gzipped map files, but the JS / Rust layers don't handle 21 | # reading both yet. 22 | #aws s3 sync mapbox_demo s3://abstreet/dev/mapbox_demo 23 | -------------------------------------------------------------------------------- /piggyback/data: -------------------------------------------------------------------------------- 1 | ../data/ -------------------------------------------------------------------------------- /piggyback/serve_locally.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # This serves the current directory over HTTP. We need something more than 3 | # `python3 -m http.server 8000` to inject the CORS header. 4 | 5 | from http.server import HTTPServer, SimpleHTTPRequestHandler, test 6 | import sys 7 | 8 | class CORSRequestHandler (SimpleHTTPRequestHandler): 9 | def end_headers (self): 10 | self.send_header('Access-Control-Allow-Origin', '*') 11 | SimpleHTTPRequestHandler.end_headers(self) 12 | 13 | if __name__ == '__main__': 14 | test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000) 15 | -------------------------------------------------------------------------------- /piggyback/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate log; 3 | 4 | #[cfg(target_arch = "wasm32")] 5 | mod piggyback; 6 | 7 | #[cfg(target_arch = "wasm32")] 8 | pub use piggyback::*; 9 | 10 | #[cfg(not(target_arch = "wasm32"))] 11 | pub fn dummy() { 12 | info!("Just avoiding an unused warning"); 13 | } 14 | -------------------------------------------------------------------------------- /popdat/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "popdat" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | flatgeobuf = { version = "3.25.0" } 12 | futures = { workspace = true } 13 | geo = { workspace = true } 14 | geojson = { workspace = true } 15 | geom = { workspace = true } 16 | geozero = "0.9.9" 17 | log = { workspace = true } 18 | map_model = { path = "../map_model" } 19 | rand = { workspace = true } 20 | rand_distr = "0.4.3" 21 | rand_xorshift = { workspace = true } 22 | serde = { workspace = true, features=["derive"] } 23 | serde_json = { workspace = true } 24 | sim = { path = "../sim" } 25 | synthpop = { path = "../synthpop" } 26 | -------------------------------------------------------------------------------- /popgetter/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "popgetter" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | anyhow = { workspace = true } 8 | fs-err = { workspace = true } 9 | geo = { workspace = true } 10 | geo-types = "0.7.12" 11 | geojson = { workspace = true } 12 | serde = { workspace = true, features=["derive"] } 13 | topojson = { git = "https://github.com/georust/topojson" } 14 | -------------------------------------------------------------------------------- /popgetter/README.md: -------------------------------------------------------------------------------- 1 | Temporarily, old code from is copied here to upgrade dependencies. When the upstream repo is ready again, depend on it. 2 | -------------------------------------------------------------------------------- /raw_map/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "raw_map" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | geom = { workspace = true } 11 | serde = { workspace = true, features=["derive"] } 12 | osm2streets = { git = "https://github.com/a-b-street/osm2streets" } 13 | popgetter = { path = "../popgetter" } 14 | strum = "0.24.1" 15 | strum_macros = "0.24.3" 16 | -------------------------------------------------------------------------------- /release/deploy_web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -x 4 | VERSION=dev 5 | # S3_ROOT=s3://mjk_asdf/abstreet 6 | S3_ROOT=s3://abstreet 7 | 8 | set -e 9 | 10 | cd web; 11 | # To quickly deploy just one app, modify APPS in the Makefile 12 | make release 13 | aws s3 sync build/dist/ $S3_ROOT/$VERSION/ 14 | 15 | # Set the content type for .wasm files, to speed up how browsers load them 16 | aws s3 cp \ 17 | $S3_ROOT/$VERSION \ 18 | $S3_ROOT/$VERSION \ 19 | --exclude '*' \ 20 | --include '*.wasm' \ 21 | --no-guess-mime-type \ 22 | --content-type="application/wasm" \ 23 | --metadata-directive="REPLACE" \ 24 | --recursive 25 | 26 | echo "Have the appropriate amount of fun: http://abstreet.s3-website.us-east-2.amazonaws.com/$VERSION" 27 | -------------------------------------------------------------------------------- /release/finalize.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Run from ~/Downloads. Work around Github Actions annoyances. 3 | 4 | set -e 5 | 6 | VERSION=$1 7 | if [ "$VERSION" == "" ]; then 8 | echo You forgot to pass version 9 | exit 1 10 | fi 11 | 12 | echo y | unzip abst_linux.zip 13 | unzip abst_linux.zip 14 | rm -f abst_linux.zip 15 | mv abst_linux abstreet_linux_$VERSION 16 | 17 | echo y | unzip abst_mac.zip 18 | unzip abst_mac.zip 19 | rm -f abst_mac.zip 20 | mv abst_mac abstreet_mac_$VERSION 21 | 22 | mkdir abstreet_windows_$VERSION 23 | cd abstreet_windows_$VERSION 24 | unzip ../abst_windows.zip 25 | cd .. 26 | rm -f abst_windows.zip 27 | 28 | zip -r abstreet_linux_$VERSION abstreet_linux_$VERSION 29 | zip -r abstreet_mac_$VERSION abstreet_mac_$VERSION 30 | zip -r abstreet_windows_$VERSION abstreet_windows_$VERSION 31 | -------------------------------------------------------------------------------- /rgrep.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | grep -IR --exclude-dir=.git --exclude-dir=target --exclude-dir=data --exclude-dir=pkg --exclude=Cargo.lock --exclude-dir=node_modules --color=auto "$@" 4 | -------------------------------------------------------------------------------- /sim/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "sim" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | ctrlc = { version = "3.4.1", optional = true } 12 | downcast-rs = "1.2.0" 13 | enum_dispatch = "0.3.12" 14 | geom = { workspace = true } 15 | instant = { workspace = true } 16 | libm = "0.2.8" 17 | log = { workspace = true } 18 | map_model = { path = "../map_model" } 19 | rand = { workspace = true } 20 | rand_distr = "0.4.3" 21 | rand_xorshift = { workspace = true } 22 | serde = { workspace = true, features=["derive"] } 23 | structopt = { workspace = true } 24 | synthpop = { path = "../synthpop" } 25 | 26 | [[bin]] 27 | name = "run_scenario" 28 | required-features = ["ctrlc"] 29 | -------------------------------------------------------------------------------- /sim/src/make/mod.rs: -------------------------------------------------------------------------------- 1 | //! Everything needed to setup a simulation. 2 | 3 | pub use self::load::SimFlags; 4 | pub(crate) use self::spawner::{StartTripArgs, TripSpec}; 5 | 6 | mod load; 7 | mod spawner; 8 | -------------------------------------------------------------------------------- /sim/src/mechanics/mod.rs: -------------------------------------------------------------------------------- 1 | pub(crate) use self::driving::DrivingSimState; 2 | pub(crate) use self::intersection::IntersectionSimState; 3 | pub(crate) use self::parking::{ParkingSim, ParkingSimState}; 4 | pub(crate) use self::queue::Queue; 5 | pub(crate) use self::walking::WalkingSimState; 6 | 7 | mod car; 8 | mod driving; 9 | mod intersection; 10 | mod parking; 11 | mod queue; 12 | mod walking; 13 | -------------------------------------------------------------------------------- /synthpop/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "synthpop" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | abstio = { path = "../abstio" } 8 | abstutil = { path = "../abstutil" } 9 | anyhow = { workspace = true } 10 | geom = { workspace = true } 11 | log = { workspace = true } 12 | map_model = { path = "../map_model" } 13 | rand = "0.8.5" 14 | rand_xorshift = { workspace = true } 15 | serde = { workspace = true, features=["derive"] } 16 | -------------------------------------------------------------------------------- /synthpop/src/make/mod.rs: -------------------------------------------------------------------------------- 1 | //! for context. 2 | 3 | use rand::{RngCore, SeedableRng}; 4 | use rand_xorshift::XorShiftRng; 5 | 6 | pub use self::generator::{BorderSpawnOverTime, ScenarioGenerator, SpawnOverTime}; 7 | 8 | mod activity_model; 9 | mod generator; 10 | 11 | /// Need to explain this trick -- basically keeps consistency between two different simulations when 12 | /// each one might make slightly different sequences of calls to the RNG. 13 | pub fn fork_rng(base_rng: &mut XorShiftRng) -> XorShiftRng { 14 | XorShiftRng::seed_from_u64(base_rng.next_u64()) 15 | } 16 | -------------------------------------------------------------------------------- /tests/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "tests" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | blockfinding = { path = "../blockfinding" } 12 | convert_osm = { path = "../convert_osm" } 13 | fs-err = { workspace = true } 14 | geom = { workspace = true } 15 | map_model = { path = "../map_model" } 16 | rand = { workspace = true } 17 | sim = { path = "../sim" } 18 | synthpop = { path = "../synthpop" } 19 | ltn = { path = "../apps/ltn" } 20 | prettydiff = "0.6.4" 21 | -------------------------------------------------------------------------------- /tests/goldenfiles/prebaked_summaries.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "map": "sao_miguel_paulista (in sao_paulo (br))", 4 | "scenario": "Full", 5 | "finished_trips": 114679, 6 | "cancelled_trips": 6665, 7 | "total_trip_duration_seconds": 59147450.89379932 8 | } 9 | ] -------------------------------------------------------------------------------- /tests/goldenfiles/turn_types/divided_highway_split.txt: -------------------------------------------------------------------------------- 1 | Turns: 2 | ------ 3 | TurnID(Lane #69, Lane #64, Intersection #0) is a Crosswalk 4 | TurnID(Lane #32, Lane #67, Intersection #0) is a Right 5 | TurnID(Lane #33, Lane #68, Intersection #0) is a Right 6 | TurnID(Lane #65, Lane #1, Intersection #0) is a Right 7 | TurnID(Lane #66, Lane #0, Intersection #0) is a Right 8 | TurnID(Lane #67, Lane #65, Intersection #3) is a UTurn 9 | TurnID(Lane #67, Lane #66, Intersection #3) is a UTurn 10 | TurnID(Lane #68, Lane #65, Intersection #3) is a UTurn 11 | TurnID(Lane #68, Lane #66, Intersection #3) is a UTurn 12 | TurnID(Lane #69, Lane #64, Intersection #3) is a SharedSidewalkCorner 13 | 14 | ------------ 15 | Restrictions: 16 | ------------ 17 | Turn from Road #1 into Road #0, at intersection IntersectionID(0) is a BanTurns, type Left, location Pt2D(20060.4075, -19949.2126) 18 | 19 | -------------------------------------------------------------------------------- /traffic_seitan/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "traffic_seitan" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstutil = { path = "../abstutil" } 9 | geom = { workspace = true } 10 | log = { workspace = true } 11 | map_model = { path = "../map_model" } 12 | rand = { workspace = true } 13 | rand_xorshift = { workspace = true } 14 | sim = { path = "../sim" } 15 | structopt = { workspace = true } 16 | -------------------------------------------------------------------------------- /traffic_seitan/traffic_seitan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/traffic_seitan/traffic_seitan.png -------------------------------------------------------------------------------- /updater/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "updater" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | abstio = { path = "../abstio" } 9 | abstutil = { path = "../abstutil" } 10 | anyhow = { workspace = true } 11 | flate2 = { workspace = true } 12 | fs-err = { workspace = true } 13 | futures-channel = { workspace = true } 14 | md5 = "0.7.0" 15 | structopt = { workspace = true } 16 | tokio = { workspace = true } 17 | walkdir = "2.4.0" 18 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | -------------------------------------------------------------------------------- /web/bin/build-wasm: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euf -o pipefail 3 | 4 | PROJECT_ROOT=$(git rev-parse --show-toplevel) 5 | 6 | BIN_NAME=$0 7 | function usage { 8 | cat < 11 | Example: 12 | $BIN_NAME widgetry_demo 13 | $BIN_NAME game abstreet 14 | EOS 15 | } 16 | 17 | if [ $# -eq 0 ]; then 18 | usage 19 | exit1 20 | fi 21 | 22 | CRATE_NAME="${1}" 23 | 24 | shift 25 | 26 | if [ $# -eq 0 ]; then 27 | JS_NAME="${CRATE_NAME}" 28 | else 29 | JS_NAME="${1}" 30 | fi 31 | 32 | # Default to a dev build 33 | WASM_PACK_FLAGS="${WASM_PACK_FLAGS:-"--dev"}" 34 | 35 | if [ $CRATE_NAME == widgetry_demo ]; then 36 | cd $PROJECT_ROOT/$CRATE_NAME 37 | else 38 | cd $PROJECT_ROOT/apps/$CRATE_NAME 39 | fi 40 | wasm-pack build $WASM_PACK_FLAGS --target web --out-dir "${PROJECT_ROOT}/web/src/${JS_NAME}/wasm_pkg" -- --no-default-features --features wasm 41 | -------------------------------------------------------------------------------- /web/bin/bundle-widgetry-js: -------------------------------------------------------------------------------- 1 | for file in "$@" 2 | do 3 | # concatenate all input files, removing any reference to importing widgetry 4 | # assuming it's one of the input files being concatenated 5 | cat $file | grep -v "from '../widgetry.js'" | grep -v 'from "../widgetry.js"' 6 | done 7 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Michael Kirk { 7 | initializeWasm( 8 | module_or_path?: InitInput | Promise 9 | ): Promise { 10 | return wasm_pkg.default(module_or_path); 11 | } 12 | 13 | run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { 14 | wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); 15 | } 16 | 17 | wasmURL(): string { 18 | return modRoot(import.meta.url) + wasm_bg_path; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/src/fifteen_min/fifteen_min.ts: -------------------------------------------------------------------------------- 1 | import * as wasm_pkg from "./wasm_pkg/fifteen_min.js"; 2 | let wasm_bg_path = "wasm_pkg/fifteen_min_bg.wasm"; 3 | 4 | import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; 5 | 6 | export class FifteenMinute extends WidgetryApp { 7 | initializeWasm( 8 | module_or_path?: InitInput | Promise 9 | ): Promise { 10 | return wasm_pkg.default(module_or_path); 11 | } 12 | 13 | run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { 14 | wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); 15 | } 16 | 17 | wasmURL(): string { 18 | return modRoot(import.meta.url) + wasm_bg_path; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/src/ltn/ltn.ts: -------------------------------------------------------------------------------- 1 | import * as wasm_pkg from "./wasm_pkg/ltn.js"; 2 | let wasm_bg_path = "wasm_pkg/ltn_bg.wasm"; 3 | 4 | import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; 5 | 6 | export class LTN extends WidgetryApp { 7 | initializeWasm( 8 | module_or_path?: InitInput | Promise 9 | ): Promise { 10 | return wasm_pkg.default(module_or_path); 11 | } 12 | 13 | run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { 14 | wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); 15 | } 16 | 17 | wasmURL(): string { 18 | return modRoot(import.meta.url) + wasm_bg_path; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/src/map_editor/map_editor.ts: -------------------------------------------------------------------------------- 1 | import * as wasm_pkg from "./wasm_pkg/map_editor.js"; 2 | let wasm_bg_path = "wasm_pkg/map_editor_bg.wasm"; 3 | 4 | import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; 5 | 6 | export class MapEditor extends WidgetryApp { 7 | initializeWasm( 8 | module_or_path?: InitInput | Promise 9 | ): Promise { 10 | return wasm_pkg.default(module_or_path); 11 | } 12 | 13 | run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { 14 | wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); 15 | } 16 | 17 | wasmURL(): string { 18 | return modRoot(import.meta.url) + wasm_bg_path; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/src/osm_viewer/osm_viewer.ts: -------------------------------------------------------------------------------- 1 | import * as wasm_pkg from "./wasm_pkg/osm_viewer.js"; 2 | let wasm_bg_path = "wasm_pkg/osm_viewer_bg.wasm"; 3 | 4 | import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; 5 | 6 | export class OSMViewer extends WidgetryApp { 7 | initializeWasm( 8 | module_or_path?: InitInput | Promise 9 | ): Promise { 10 | return wasm_pkg.default(module_or_path); 11 | } 12 | 13 | run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { 14 | wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); 15 | } 16 | 17 | wasmURL(): string { 18 | return modRoot(import.meta.url) + wasm_bg_path; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/src/santa/santa.ts: -------------------------------------------------------------------------------- 1 | import * as wasm_pkg from "./wasm_pkg/santa.js"; 2 | let wasm_bg_path = "wasm_pkg/santa_bg.wasm"; 3 | 4 | import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; 5 | 6 | export class Santa extends WidgetryApp { 7 | initializeWasm( 8 | module_or_path?: InitInput | Promise 9 | ): Promise { 10 | return wasm_pkg.default(module_or_path); 11 | } 12 | 13 | run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { 14 | wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); 15 | } 16 | 17 | wasmURL(): string { 18 | return modRoot(import.meta.url) + wasm_bg_path; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/src/web_root/abstreet.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Arial; 3 | background: white; 4 | color: #4a4a4a; 5 | } 6 | 7 | .full-screen-widgetry-app { 8 | height: 100%; 9 | width: 100%; 10 | } 11 | 12 | .widgetry-app .preloading { 13 | padding: 16px; 14 | color: white; 15 | } 16 | -------------------------------------------------------------------------------- /web/src/web_root/abstreet.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 15 | 16 |
17 |
18 |

A/B Street

19 |
20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /web/src/web_root/blog_root/static_assets/snow_bike.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/web/src/web_root/blog_root/static_assets/snow_bike.jpg -------------------------------------------------------------------------------- /web/src/web_root/fifteen_min.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 14 | 15 |
16 |
17 |

Fifteen Minute Neighborhood

18 |
19 |
20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /web/src/web_root/ltn.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 14 | 15 |
16 |
17 |

Low Traffic Neighborhoods

18 |
19 |
20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /web/src/web_root/map_editor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 15 | 16 |
17 |
18 |

RawMap Editor

19 |
20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /web/src/web_root/osm_viewer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 15 | 16 |
17 |
18 |

OSM Viewer

19 |
20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /web/src/web_root/santa.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 15 | 16 |
17 |
18 |

Fifteen Minute Santa

19 |
20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /web/src/web_root/widgetry_demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 15 | 16 |
17 |

Widgetry Demo

18 |
19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /web/src/widgetry_demo/widgetry_demo.ts: -------------------------------------------------------------------------------- 1 | import * as wasm_pkg from "./wasm_pkg/widgetry_demo.js"; 2 | let wasm_bg_path = "wasm_pkg/widgetry_demo_bg.wasm"; 3 | 4 | import { InitInput, modRoot, WidgetryApp } from "../widgetry.js"; 5 | 6 | export class WidgetryDemo extends WidgetryApp { 7 | initializeWasm( 8 | module_or_path?: InitInput | Promise 9 | ): Promise { 10 | return wasm_pkg.default(module_or_path); 11 | } 12 | 13 | run(rootDomId: string, assetsBaseURL: string, assetsAreGzipped: boolean) { 14 | wasm_pkg.run(rootDomId, assetsBaseURL, assetsAreGzipped); 15 | } 16 | 17 | wasmURL(): string { 18 | return modRoot(import.meta.url) + wasm_bg_path; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /widgetry/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/demo.gif -------------------------------------------------------------------------------- /widgetry/fonts/Bungee-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/fonts/Bungee-Regular.ttf -------------------------------------------------------------------------------- /widgetry/fonts/BungeeInline-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/fonts/BungeeInline-Regular.ttf -------------------------------------------------------------------------------- /widgetry/fonts/Overpass-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/fonts/Overpass-Bold.ttf -------------------------------------------------------------------------------- /widgetry/fonts/Overpass-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/fonts/Overpass-Regular.ttf -------------------------------------------------------------------------------- /widgetry/fonts/Overpass-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/fonts/Overpass-SemiBold.ttf -------------------------------------------------------------------------------- /widgetry/fonts/OverpassMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/fonts/OverpassMono-Bold.ttf -------------------------------------------------------------------------------- /widgetry/icons/arrow_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/arrow_drop_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/arrow_keys.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/arrow_left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/arrow_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/arrow_up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/checkbox_checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/checkbox_no_border_checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/checkbox_no_border_unchecked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /widgetry/icons/checkbox_unchecked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /widgetry/icons/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/loading.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /widgetry/icons/nav_back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /widgetry/icons/next.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /widgetry/icons/prev.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /widgetry/icons/toggle_left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /widgetry/icons/toggle_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /widgetry/shaders/fragment_140.glsl: -------------------------------------------------------------------------------- 1 | #version 410 2 | 3 | // (x offset, y offset, zoom) 4 | uniform vec3 transform; 5 | // (window width, window height, z value) 6 | uniform vec3 window; 7 | uniform vec2 texture_scale; 8 | // textures grid 9 | uniform sampler2DArray textures; 10 | 11 | in vec4 fs_color; 12 | in vec3 fs_texture_coord; 13 | 14 | out vec4 out_color; 15 | 16 | void main() { 17 | vec4 x = fs_color * texture(textures, fs_texture_coord); 18 | out_color = vec4(x.a * x.r, x.a * x.g, x.a * x.b, x.a); 19 | 20 | // Enable this to quickly see everything in greyscale. 21 | // https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems 22 | //float gray = dot(fs_color.rgb, vec3(0.299, 0.587, 0.114)); 23 | //out_color = vec4(vec3(gray), fs_color.a); 24 | } 25 | -------------------------------------------------------------------------------- /widgetry/shaders/fragment_300.glsl: -------------------------------------------------------------------------------- 1 | #version 300 es 2 | 3 | precision mediump float; 4 | precision mediump sampler2DArray; 5 | 6 | // (x offset, y offset, zoom) 7 | uniform vec3 transform; 8 | // (window width, window height, z value) 9 | uniform vec3 window; 10 | uniform vec2 texture_scale; 11 | // textures grid 12 | uniform sampler2DArray textures; 13 | 14 | in vec4 fs_color; 15 | in vec3 fs_texture_coord; 16 | 17 | out vec4 out_color; 18 | 19 | void main() { 20 | vec4 x = fs_color * texture(textures, fs_texture_coord); 21 | out_color = vec4(x.a * x.r, x.a * x.g, x.a * x.b, x.a); 22 | } 23 | -------------------------------------------------------------------------------- /widgetry/src/widgets/stash.rs: -------------------------------------------------------------------------------- 1 | use std::cell::RefCell; 2 | use std::rc::Rc; 3 | 4 | use crate::{EventCtx, GfxCtx, ScreenDims, ScreenPt, Widget, WidgetImpl, WidgetOutput}; 5 | 6 | /// An invisible widget that stores some arbitrary data on the Panel. Users of the panel can read 7 | /// and write the value. This is one method for "returning" data when a State completes. 8 | pub struct Stash { 9 | value: Rc>, 10 | } 11 | 12 | impl Stash { 13 | pub fn new_widget(name: &str, value: T) -> Widget { 14 | Widget::new(Box::new(Stash { 15 | value: Rc::new(RefCell::new(value)), 16 | })) 17 | .named(name) 18 | } 19 | 20 | pub(crate) fn get_value(&self) -> Rc> { 21 | self.value.clone() 22 | } 23 | } 24 | 25 | impl WidgetImpl for Stash { 26 | fn get_dims(&self) -> ScreenDims { 27 | ScreenDims::square(0.0) 28 | } 29 | 30 | fn set_pos(&mut self, _: ScreenPt) {} 31 | 32 | fn event(&mut self, _: &mut EventCtx, _: &mut WidgetOutput) {} 33 | fn draw(&self, _: &mut GfxCtx) {} 34 | } 35 | -------------------------------------------------------------------------------- /widgetry/textures/spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a-b-street/abstreet/a28b107825adfbc48acc90c7cbc1c1ab545e3252/widgetry/textures/spritesheet.png -------------------------------------------------------------------------------- /widgetry_demo/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "widgetry_demo" 3 | version = "0.1.0" 4 | authors = ["Dustin Carlino "] 5 | edition = "2021" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | 10 | [features] 11 | default = ["widgetry/native-backend"] 12 | wasm = ["getrandom/js", "wasm-bindgen", "widgetry/wasm-backend"] 13 | 14 | [dependencies] 15 | abstio = { path = "../abstio" } 16 | abstutil = { path = "../abstutil" } 17 | geom = { workspace = true } 18 | getrandom = { workspace = true, optional = true } 19 | log = { workspace = true } 20 | rand = { workspace = true } 21 | rand_xorshift = { workspace = true } 22 | svg_face = "0.1.3" 23 | wasm-bindgen = { workspace = true, optional = true } 24 | widgetry = { path = "../widgetry" } 25 | -------------------------------------------------------------------------------- /widgetry_demo/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | widgetry_demo::main(); 3 | } 4 | --------------------------------------------------------------------------------