{ "cells": [ { "cell_type": "markdown", "id": "090a62df-5868-4be1-b01d-da3ffa5a7251", "metadata": {}, "source": [ "# Level of Traffic Stress\n", "\n", "based on https://github.com/mbonsma/LTS-OSM, inspired by https://muenchen.social/@scooooooott@urbanists.social/111745338643572229\n", "\n", "This is in progress. Results are not accurate. https://peterfurth.sites.northeastern.edu/level-of-traffic-stress/" ] }, { "cell_type": "code", "execution_count": 35, "id": "1f0502e1-f1f9-4941-9685-462caeaae1d9", "metadata": { "scrolled": true }, "outputs": [], "source": [ "from pyrosm import OSM, get_data\n", "\n", "region = \"district-of-columbia\"\n", "fp = get_data(region)\n", "osm = OSM(fp)\n", "network = osm.get_network(\"all\")" ] }, { "cell_type": "code", "execution_count": 78, "id": "4002e526-9089-419b-aa3a-4a13ee68c78a", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "\n", "def biking_permitted(row):\n", " if row[\"bicycle\"] == \"no\":\n", " return False\n", " if row[\"access\"] == \"no\":\n", " return False\n", " if row[\"highway\"] == \"motorway\":\n", " return False\n", " if row[\"highway\"] == \"motorway_link\":\n", " return False\n", " if row[\"highway\"] == \"proposed\":\n", " return False\n", " if (\n", " (row[\"footway\"] == \"sidewalk\")\n", " & ~(row[\"bicycle\"] == \"yes\")\n", " & ((row[\"highway\"] == \"footway\") | (row[\"highway\"] == \"path\"))\n", " ):\n", " return False\n", " return True\n", "\n", "\n", "def is_separated_path(row):\n", " if row[\"highway\"] == \"cycleway\":\n", " return True\n", " if row[\"highway\"] == \"path\":\n", " return True\n", " if (row[\"highway\"] == \"footway\") & ~(row[\"footway\"] == \"crossing\"):\n", " return True\n", " if row[\"cycleway\"] == \"track\":\n", " return True\n", " if row[\"cycleway\"] == \"opposite_track\":\n", " return True\n", " return False\n", "\n", "\n", "def is_bike_lane(row):\n", " if row[\"cycleway\"] in [\n", " \"crossing\",\n", " \"lane\",\n", " \"left\",\n", " \"opposite\",\n", " \"opposite_lane\",\n", " \"right\",\n", " \"yes\",\n", " ]:\n", " return True\n", " return False\n", "\n", "\n", "def parking_present(\n", " row,\n", "): # Unfortunately, there is little parking data in OpenStreetMap. We will assume parking.\n", " return True\n", "\n", "\n", "def get_max_speed(\n", " row,\n", " motorway=55.0,\n", " trunk=40.0,\n", " primary=30.0,\n", " secondary=30.0,\n", " tertiary=20.0,\n", " residential=20.0,\n", "):\n", " if row[\"maxspeed\"] == None:\n", " if row[\"highway\"] in [\"motorway\", \"motorway_link\"]:\n", " return motorway\n", " if row[\"highway\"] in [\"trunk\", \"trunk_link\"]:\n", " return trunk\n", " if row[\"highway\"] in [\"primary\", \"primary_link\"]:\n", " return primary\n", " if row[\"highway\"] in [\"tertiary\", \"tertiary_link\"]:\n", " return tertiary\n", " return residential\n", " if \"mph\" in row[\"maxspeed\"]:\n", " return float(row[\"maxspeed\"].split(\" \")[0])\n", " return float(row[\"maxspeed\"])\n", "\n", "\n", "def get_lanes(row):\n", " if row[\"lanes\"]:\n", " return int(row[\"lanes\"])\n", " if row[\"oneway\"]:\n", " if row[\"maxspeed\"] == None:\n", " if row[\"highway\"] in [\"motorway\", \"motorway_link\"]:\n", " return 3\n", " if row[\"highway\"] in [\"trunk\", \"trunk_link\"]:\n", " return 2\n", " if row[\"highway\"] in [\"primary\", \"primary_link\"]:\n", " return 2\n", " if row[\"highway\"] in [\"tertiary\", \"tertiary_link\"]:\n", " return 1\n", " return 1\n", " if row[\"maxspeed\"] == None:\n", " if row[\"highway\"] in [\"motorway\", \"motorway_link\"]:\n", " return 6\n", " if row[\"highway\"] in [\"trunk\", \"trunk_link\"]:\n", " return 4\n", " if row[\"highway\"] in [\"primary\", \"primary_link\"]:\n", " return 4\n", " if row[\"highway\"] in [\"tertiary\", \"tertiary_link\"]:\n", " return 1\n", " return 1" ] }, { "cell_type": "code", "execution_count": 79, "id": "198135da-e6b8-41b3-afc4-7d799e381efe", "metadata": {}, "outputs": [], "source": [ "def level_of_traffic_stress_way_mixed_traffic(row):\n", " if row[\"oneway\"] == \"yes\":\n", " if row[\"lanes_assumed\"] >= 3:\n", " return 4\n", " if row[\"lanes_assumed\"] >= 2:\n", " if row[\"maxspeed_assumed\"] <= 25:\n", " return 3\n", " return 4\n", " if row[\"maxspeed_assumed\"] >= 35:\n", " return 4\n", " if row[\"maxspeed_assumed\"] >= 30:\n", " return 2\n", " return 1\n", " if row[\"lanes_assumed\"] >= 6:\n", " return 4\n", " if row[\"lanes_assumed\"] >= 4:\n", " if row[\"maxspeed_assumed\"] <= 25:\n", " return 3\n", " return 4\n", " if row[\"maxspeed_assumed\"] >= 35:\n", " return 4\n", " if row[\"maxspeed_assumed\"] >= 30:\n", " return 2\n", " return 1\n", "\n", "\n", "def level_of_traffic_stress_way_bike_lane_no_parking(row):\n", " if row[\"maxspeed_assumed\"] >= 40:\n", " return 4\n", " if row[\"maxspeed_assumed\"] >= 35:\n", " return 3\n", " if row[\"oneway\"] == \"yes\":\n", " if row[\"lanes_assumed\"] > 2:\n", " return 3\n", " if row[\"lanes_assumed\"] == 2:\n", " return 2\n", " if row[\"lanes_assumed\"] >= 4:\n", " return 3\n", " if row[\"maxspeed_assumed\"] >= 30:\n", " return 2\n", " return 1\n", "\n", "\n", "def level_of_traffic_stress_way_bike_lane_parking(row):\n", " if row[\"maxspeed_assumed\"] >= 40:\n", " return 4\n", " if row[\"maxspeed_assumed\"] >= 35:\n", " return 3\n", " if row[\"oneway\"] == \"yes\":\n", " if row[\"lanes_assumed\"] >= 2:\n", " return 3\n", " if row[\"lanes_assumed\"] >= 4:\n", " return 3\n", " if row[\"maxspeed_assumed\"] >= 30:\n", " return 2\n", " return 1\n", "\n", "\n", "def level_of_traffic_stress_way(row):\n", " if not row[\"biking_permitted\"]:\n", " return 0\n", " if row[\"is_separated_path\"]:\n", " return 1\n", " if row[\"is_bike_lane\"]:\n", " if row[\"parking_present\"]:\n", " return level_of_traffic_stress_way_bike_lane_parking(row)\n", " return level_of_traffic_stress_way_bike_lane_no_parking(row)\n", " return level_of_traffic_stress_way_mixed_traffic(row)" ] }, { "cell_type": "code", "execution_count": 80, "id": "a9aff4fc-4e6a-4718-9a2b-73d33a0f1f51", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "level_of_traffic_stress\n", "1 42856\n", "0 12026\n", "4 3169\n", "3 1348\n", "2 474\n", "Name: count, dtype: int64\n" ] } ], "source": [ "network[\"is_separated_path\"] = network.apply(is_separated_path, axis=1)\n", "network[\"biking_permitted\"] = network.apply(biking_permitted, axis=1)\n", "network[\"is_bike_lane\"] = network.apply(is_bike_lane, axis=1)\n", "network[\"parking_present\"] = network.apply(parking_present, axis=1)\n", "network[\"lanes_assumed\"] = network.apply(get_lanes, axis=1)\n", "network[\"maxspeed_assumed\"] = network.apply(get_max_speed, axis=1)\n", "network[\"level_of_traffic_stress\"] = network.apply(level_of_traffic_stress_way, axis=1)\n", "print(network[\"level_of_traffic_stress\"].value_counts())" ] }, { "cell_type": "code", "execution_count": 83, "id": "cdec96b8-1ed8-4058-9f91-9d2694036a05", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "96d1ff04095941c2b9ea31d6e53bc955", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map(layers=[PathLayer(get_color=\n", "[\n", " [\n", " 0,\n", " 128,\n", " …" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from lonboard import Map, PathLayer\n", "from lonboard.colormap import apply_categorical_cmap\n", "\n", "layer = PathLayer.from_geopandas(\n", " gdf=network[\n", " [\n", " \"geometry\",\n", " \"level_of_traffic_stress\",\n", " \"name\",\n", " \"highway\",\n", " \"is_separated_path\",\n", " \"biking_permitted\",\n", " \"is_bike_lane\",\n", " \"parking_present\",\n", " \"oneway\",\n", " \"lanes\",\n", " \"lanes_assumed\",\n", " \"maxspeed\",\n", " \"maxspeed_assumed\",\n", " \"length\",\n", " ]\n", " ],\n", " width_scale=10,\n", ")\n", "layer.get_color = apply_categorical_cmap(\n", " values=network[\"level_of_traffic_stress\"],\n", " cmap={\n", " 0: [0, 0, 0], # black\n", " 1: [0, 128, 0], # green\n", " 2: [255, 255, 0], # yellow\n", " 3: [255, 165, 0], # orange\n", " 4: [255, 0, 0], # red\n", " },\n", ")\n", "\n", "Map(layers=[layer])" ] }, { "cell_type": "code", "execution_count": 82, "id": "8607d42d-a07a-4b38-b15e-8f51f3f0e023", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "network[\"length\"] = network.to_crs(\"EPSG:4087\").length\n", "network.groupby([\"level_of_traffic_stress\"])[\"length\"].sum().plot(kind=\"barh\")" ] }, { "cell_type": "code", "execution_count": null, "id": "59122a4b-9527-4467-9af7-83412b3532b5", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 5 }